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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2012, 12:13   #1
Reaper052
Пользователь
 
Аватар для Reaper052
 
Регистрация: 07.06.2012
Сообщений: 16
По умолчанию Delphi, цикл while

Привет всем. Сегодня писал экзамен, не доделал одно задание, препод разрешил дома доделать, но я не знаю в чем проблема

Условие: "В файле input.pas дана строка символов. Добавить после каждой запятой одну точку, используя цикл while."

Вот что у меня есть, вроде все как надо, но в файл не записывает.
Код:
PROGRAM exam;
{$APPTYPE CONSOLE}

uses
  SysUtils;

VAR
  I:Integer;
  S:string;
  F:TEXT;
BEGIN
  ASSIGN(F,'input.PAS');
        reset(F);
  readln(F, s);
  
  WHILE NOT EOLN(F) DO BEGIN
    for I := 1 to length(s) do
     IF S[I]=',' THEN
     write(S, ',.')

   END;
   
  CLOSEfile(F);
  ASSIGN(F,'output.PAS');
  REWRITE(F);
   CLOSE(F);
  END.
И еще, есть одно доп. задание, но я совершенно не знаю как его сделать, если кто поможет буду благодарен: "В файле input.pas задана матрица n x m (где n - кол-во строк, m - кол-во столбцов). В файл output.pas записать номера строк и сумму значений тех строк матрицы, где нет отрицательных элементов; записать ноль, если в строке есть отрицательные элементы."
Reaper052 вне форума Ответить с цитированием
Старый 11.06.2012, 13:30   #2
Niro
Форумчанин
 
Аватар для Niro
 
Регистрация: 23.09.2010
Сообщений: 682
По умолчанию

даже не знаю как бы сказать, в чём ваша ошибка... Просто логика программы абсолютно неверная или её нет. Я уверен - если вы возьмете справочник по паскалю/дельфи и подпишите что делает каждый оператов, вы это поймёте. Ну в этом помогу вам
Цитата:
Код:
BEGIN
  ASSIGN(F,'input.PAS');  //связали файл  с файловой переменной, в дельфи следует использовать assignfile
        reset(F);               // открыли файл на чтение
  readln(F, s);                 // считали первую строку файла
  
  WHILE NOT EOLN(F) DO    // пока не конец строки файла, продолжаем 
   BEGIN       
    for I := 1 to length(s) do    // цикл от начала до конца  строки
     IF S[I]=',' THEN
     write(S, ',.')                    //если выполнилось условие, то записываем (а вы открыли на чтение) в файл

   END;
   
  CLOSEfile(F);                      //закрыли файл
  ASSIGN(F,'output.PAS');       //связали файл инпут.паз с файловой переменной
  REWRITE(F);                       //открыли файл на запись
   CLOSE(F);		//закрыли файл
  END.
Проблема заключается в том, что вы считаете файл input.pas текстовым,
а это не удобно, т.к. текстовые файлы не позволяют себя читать и записывать одновременно
логичнее будет считать что у вас типизированный файл символов: file of char
В этом случае можно будет открыть файл чтение, и + он будет доступен для записи

Итого
Код:
связать файл с переменной
открыть файл

цикл до конца файла, (а не строки)
  считываем посимвольно
  если символл = запятой,
   то записываем в файл точку
 конец цикла

закрываем файл
Проще всего признать свою ошибку.
Гораздо труднее еЁ осознать и исправить.
Niro вне форума Ответить с цитированием
Старый 11.06.2012, 17:37   #3
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Niro Посмотреть сообщение
Код:
  считываем посимвольно
  если символл = запятой,
   то записываем в файл точку
Куда записываем точку? В текущую позицию?
Нам ведь нужно добавить в файл точку, а не заменить точкой символ после запятой.
Ваша программа будет делать совсем не то, что нужно в задании.

И вообще, одновременно читать из файла и писать в файл следует только с том случае, когда прекрасно осознаете, зачем это нужно.
Во всех остальных случаях читать из файла и писать в тот же файл категорически не следует.
В данной задаче можно предложить два варианта решения:
1. Если известно, что объем доступной памяти заведомо больше файла - считать файл целиком, а потом перезаписать его в измененном виде.
2. Иначе читать из одного файла, а писать в другой. По окончакнии один файл удалить, а другой - переименовать.
s-andriano вне форума Ответить с цитированием
Старый 12.06.2012, 08:56   #4
Reaper052
Пользователь
 
Аватар для Reaper052
 
Регистрация: 07.06.2012
Сообщений: 16
По умолчанию

Переписал по другому, вот результат:
1)
Код:
PROGRAM exam;
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
VAR
  I:Integer;
  c : Char
  F,F1:TEXT;
BEGIN
  ASSIGNFile(F,'input.PAS');
  reset(F); //Открываем исходный файл для чтения
 
  ASSIGNFile(F1,'output.PAS'); //И выходной для записи
  REWRITE(F); 
 
  WHILE NOT EOLN(F) DO //До конца строки EOLn
  BEGIN 
    read(F, c); //Читаем символ
    Write(F1,c); //Пишем символ в выходной файл
    IF S[I]=',' THEN //Если символ запятая
    write(F1, '.');    //-выдадим ещё и точку
  END;
  //Закрыли оба файла...
  CloseFile(F); 
  CloseFile(F1); 
END.
Не компилится, не знаю в чем дело.

Так-же и со второй:
Код:
PROGRAM exam2;
{$APPTYPE CONSOLE}
 
uses
  SysUtils;

VAR
  n,m : Integer;
  I,J,K:Integer;
  F,F1:TEXT;
BEGIN
  ASSIGNFile(F,'input.PAS');
  RESET(F); //Открываем исходный файл для чтения
 
  ASSIGNFile(F1,'output.PAS'); //И выходной для записи
  REWRITE(F1); 
 
  READLN(F,n,m); //Считаем размерность матрицы - первая строка
 
  J:=0;
  WHILE ((NOT EOF(F)) AND (J<n)) DO //До конца файла EOF или количества строк массива
  BEGIN
    Sum:=0;
    FOR I:=0 TO m-1 DO 
    BEGIN
      Read(F,K); //Читаем элемент строки массива
      //Проверим на отрицательный элемент и накопим сумму
      IF K>=0 Then INC(Sum,K) Else
      BEGIN
        Sum:=0;
        SEEKEOLN(F); //Пропускаем до конца строки
        BREAK;
      END;
    END;
    //Выведем номер строки и сумму
    WRITELN(F1,J,' ',Sum);
    INC(J); //Считаем количество строк
  END;
 
  FINALIZE(Arr); //Освободили память массива
  //Закрыли оба файла...
  CloseFile(F); 
  CloseFile(F1); 
END.
Reaper052 вне форума Ответить с цитированием
Старый 12.06.2012, 09:50   #5
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Не компилится, не знаю в чем дело.
Это как? :O
Когда не компилится, компилятор ВСЕГДА пишет диагностику.
s-andriano вне форума Ответить с цитированием
Старый 12.06.2012, 10:33   #6
Reaper052
Пользователь
 
Аватар для Reaper052
 
Регистрация: 07.06.2012
Сообщений: 16
По умолчанию

В первой проге при попытке запуска такая ошибка:

[Error] Project2.dpr(10): Invalid compiler directive: 'F'
[Error] Project2.dpr(22): Undeclared identifier: 'S'


Во второй:

[Error] Project2.dpr(23): Undeclared identifier: 'Sum'
[Error] Project2.dpr(40): Undeclared identifier: 'Arr'
Reaper052 вне форума Ответить с цитированием
Старый 12.06.2012, 13:17   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

А зачем Вы сюда это пишите?
Компилятор Вам четко указал место двух ошибок.
По первой: судя по AssignFile, у Вас Делфи, а не Паскаль. Проверьте, как следует объявлять текстовый файл в Делфи.
Со второй же ошибкой все совершенно прозрачно: и место и тип ошибки указаны совершенно правильно.
s-andriano вне форума Ответить с цитированием
Старый 12.06.2012, 14:14   #8
Reaper052
Пользователь
 
Аватар для Reaper052
 
Регистрация: 07.06.2012
Сообщений: 16
По умолчанию

Если все так понятно, может поможете правильно написать, чего вам это стоит? Я уже второй день не могу это сделать, а завтра сдавать. Разумеется потом я направлю свои усилия чтобы понять в чем я был неправ.
Reaper052 вне форума Ответить с цитированием
Старый 12.06.2012, 14:41   #9
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Reaper052 Посмотреть сообщение
Если все так понятно, может поможете правильно написать, чего вам это стоит? Я уже второй день не могу это сделать, а завтра сдавать. Разумеется потом я направлю свои усилия чтобы понять в чем я был неправ.
Чего мне это стоит?
Ну, во-первых, установить Делфи на свой компьютер.
Потому как вопрос по первой строке диагностики упирается исключительно во встроенную справку Делфи, которая Вам доступна, а мне - нет (в силу, как уже сказано, отсутствия Делфи на моем компьютере).

По второй строке диагностики: Вы сами можете объяснить, что именно вы в ней (т.е. 22 строке кода) хотите сделать?
s-andriano вне форума Ответить с цитированием
Старый 12.06.2012, 15:08   #10
Максим_83
Пользователь
 
Регистрация: 09.02.2012
Сообщений: 39
По умолчанию

Цитата:
Сообщение от Reaper052 Посмотреть сообщение
В первой проге при попытке запуска такая ошибка:

[Error] Project2.dpr(10): Invalid compiler directive: 'F'
[Error] Project2.dpr(22): Undeclared identifier: 'S'


Во второй:

[Error] Project2.dpr(23): Undeclared identifier: 'Sum'
[Error] Project2.dpr(40): Undeclared identifier: 'Arr'
Что мешает вам в VAR добавить запись типа:
S:Integer; //Integer или чем оно является
так же
Sum,Arr:Integer; //Integer или чем оно является

За [Error] Project2.dpr(10): Invalid compiler directive: 'F' разбирайтесь сами, не решать же нам за вас всё.
Максим_83 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл в Delphi Marikka Общие вопросы Delphi 11 08.06.2012 23:21
Цикл for в Delphi AlexandЯ Помощь студентам 8 18.11.2011 08:12
Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until) Mr.User Помощь студентам 9 23.11.2007 01:34