Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2012, 20:45   #1
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию Не могу понять. str2[i]:=str[i] не работает!

Здравствуйте, форумчане.

Давненько я здесь не был. Попросили помочь сделать простенькую задачку.
Ну думал справлюсь за 10 минут. Пока вспомню что такое Паскаль и как там с файлами работать. И затянулось всё это у меня часа на 2,5.

Обратите внимание на выделенный фрагмент кода и объясните мне, пожалуйста, в чём проблема? Почему способ str2[i]:=str[i] не работает? Пробовал и в Delphi в консольном приложении и во FreePascal. По брейкпоинтам после этой строки сразу идёт в конец кода.

Вот код:
Код:
program f2g;
uses
  SysUtils;
var
 f,g:text;
 str,str2:string;
 i:integer;
begin
  assign(f,'f.txt');
  reset(f);
  writeln('File "f.txt" is OPEN');
  rewrite(g,'g.txt');
  writeln('File "g.txt" is CREATE / OPEN');
  writeln;
  while not eof(f) do
  begin
    readln(f,str);
    str2:='';
    for i:=1 to length(str) do
    begin
    //if (i mod 3) <> 0 then str2[i]:=str[i]; // так НЕ работает
      if (i mod 3) <> 0 then str2:=str2+str[i]; // так работает
    end;
    writeln(g,str2);
    writeln('Old string: ',str);
    writeln('New string: ',str2);
  end;
  writeln;
  writeln('File "g.txt" is WRITED');
  close(f);
  writeln('File "f.txt" is CLOSED');
  close(g);
  writeln('File "g.txt" is CLOSED');
  writeln;
  write('Press ENTER to exit');
  readln;
end.
Arkuz вне форума Ответить с цитированием
Старый 03.12.2012, 20:48   #2
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

Понял )))

По запарке... Надо так, тогда работает.

Код:
while not eof(f) do
  begin
    readln(f,str);
 // str2:='';
    str2:='0';// любой один символ, так как в цикле i=1
    for i:=1 to length(str) do
    begin
    if (i mod 3) <> 0 then str2[i]:=str[i]; // так ТОЖЕ работает
   // if (i mod 3) <> 0 then str2:=str2+str[i]; // так работает
    end;
    writeln(g,str2);
    writeln('Old string: ',str);
    writeln('New string: ',str2);
  end;
Arkuz вне форума Ответить с цитированием
Старый 03.12.2012, 20:54   #3
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
str
Дак это ж процедурка!
А Вы еще как имечко переменной используете? Наверное, не очень хорошо..
Poma][a вне форума Ответить с цитированием
Старый 03.12.2012, 20:57   #4
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Дак это ж процедурка!
А Вы еще как имечко переменной используете? Наверное, не очень хорошо..
Сколько писал мелкие лабораторки и прочее, всегда называл переменные str, никогда проблем не было.
Arkuz вне форума Ответить с цитированием
Старый 03.12.2012, 21:01   #5
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Сколько писал мелкие лабораторки и прочее, всегда называл переменные str, никогда проблем не было.
А я всегда программу так начинаю :
Код:
program PorovozLetitNaSever;
И тож проблем нет
И пользовательские процедуры\функции называю Ugadai, и тож проблем нет
Poma][a вне форума Ответить с цитированием
Старый 03.12.2012, 21:10   #6
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
А я всегда программу так начинаю :
Код:
program PorovozLetitNaSever;
И тож проблем нет
И пользовательские процедуры\функции называю Ugadai, и тож проблем нет
Не понял Вашей иронии

А что касается процедуры или переменной str.

Если нет резервированного слова str, то его вполне можно использовать.

Лексический анализатор определит сам по наличию или отсутствию параметров переменная это или процедура.
Arkuz вне форума Ответить с цитированием
Старый 03.12.2012, 21:10   #7
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

Цитата:
Сообщение от Arkuz Посмотреть сообщение
Сколько писал мелкие лабораторки и прочее, всегда называл переменные str, никогда проблем не было.
Такая же фигня, проблем и не будет. Однако переназначать ни есть хорошо, теперь стараюсь такое имя переменной не использовать
Все тривиальное просто
whatever вне форума Ответить с цитированием
Старый 03.12.2012, 21:30   #8
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
всегда называл переменные str, никогда проблем не было.
Ну это скорее проблемы несовершенства компилятора
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 03.12.2012, 21:57   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
А что касается процедуры или переменной str.
Если нет резервированного слова str, то его вполне можно использовать.
слова то нет, а вот системная процедура с таким именем - есть.

Код:
var i: integer;
  s : string;
begin
  i := 3578;
  str(i,s);
  WriteLn(s);
  Readln
end.
Зачем переопределять имя системной процедуры? Назвовите хоть одну вескую причину, пожалуйста.

Вам приятно и понятно будет читать такой код?
Код:
var 
   Readln : string;
begin
  Readln := 'ddddd';
  WriteLn(ReadLn);
end.
он тоже компилируется и работает нормально...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.12.2012, 22:08   #10
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Зачем переопределять имя системной процедуры? Назвовите хоть одну вескую причину, пожалуйста.
Нет ни одной причины.
Просто даже преподы в институте писали str в простых примерах, мне вообще казалось все так пишут.
Честно говоря я даже и забыл что есть процедура с таким именем.

просто я так привык на аналогиях str от string - сразу понятно, что строковая переменная. обычно я даю нормальные имена переменным, а str это что-то типа tmp переменной.

Вот и всё.
Arkuz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу понять как работает скрип Sylar9 PHP 6 06.01.2012 17:04
Не могу понять, как работает тест? fs444 PHP 8 16.02.2011 01:20
Не могу понять почему не работает микрофон Stilet Компьютерное железо 8 08.10.2010 16:54
str+str2+str3=белиберда Richard22 Общие вопросы Delphi 4 17.05.2010 09:17
Почему не работает...хм....понять не могу! Артур Иваныч Microsoft Office Excel 9 01.12.2009 17:58