Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Простая программа Paskal

Тихон Сапелкин Знаток (340), закрыт 2 месяца назад
Объясните мне значение строки программы, где начинается r:= r+copy(s,i,1) и т.д.


var s, r:string;
var i:integer;
begin
write('Введи предложение - '); Readln(s);
for i:=1 to length(s) do
begin
r:=r+copy(s, i, 1)+copy(s, i, 1);
end;
writeln('Результат = ', r);
end.
Дополнен 2 месяца назад
Меня интересует почему Паскаль не ругается на r в начале, ведь до первого запуска счётчика его не существует
Лучший ответ
Cogni Просветленный (48836) 2 месяца назад
Функция copy(s, i, 1):
Эта функция извлекает из строки s подстроку, начиная с позиции i длиной 1 символ. То есть, она получает именно один символ из строки s.

Конкатенация строк:
Оператор + используется для объединения (конкатенации) строк. Здесь мы к текущей строке r последовательно добавляем:

copy(s, i, 1) — текущий символ из s.
copy(s, i, 1) — тот же символ, снова.
Таким образом, для каждого символа в исходной строке s цикл добавляет его в строку r два раза. Если, например, пользователь ввёл строку "Привет", то программа сформирует строку "ППррииввеетт", где каждый символ удвоен.
Тихон СапелкинЗнаток (340) 2 месяца назад
Почему паскаль не ругается на r, которому до первого запуска счётчика не было присвоено значения
Cogni Просветленный (48836) Тихон Сапелкин, В данном случае компилятор не выдаёт ошибку, потому что переменная r уже содержит корректное значение — пустую строку
Тихон СапелкинЗнаток (340) 2 месяца назад
Ооо... Спасибо, понял
Остальные ответы
Андрей Панарин Искусственный Интеллект (273273) 2 месяца назад
Потому что компилятор Паскаля такой. Он не требует инициализации переменных, в отличие от компилятора Java или C#. Но лучше бы не полагаться на гипотезу о том, что там всегда будет пусто и 0.
Тихон СапелкинЗнаток (340) 2 месяца назад
Спасибо. А если у r уже будет значение то к этому значению добавятся остальные символы?
Андрей Панарин Искусственный Интеллект (273273) Да. Вы можете задать его перед началом цикла for:
 r := ''; 
Или так, например:
 r := 'Двоящийся текст: '; 
Jurijus Zaksas Искусственный Интеллект (470640) 2 месяца назад
>Меня интересует почему Паскаль не ругается на r в начале
Потому что ему пофигу. Паскалевский компилятор делался с упором на скорость компиляции и в течение десятилетий был самым быстрым компилятором в мире. Но он не водит программиста за ручку и не требует обязательной инициализации переменных, потому что такое "разматывание" назад по коду в поисках инициализации требует больших ресурсов. В данном случае, если в r[0] вдруг случайно окажется какое-то число, отличное от 0, получится ой.
Похожие вопросы