Другие языки программирования и технологии

помогите найти ошибка в программе на PASCAL тема: "файлы".

задание: Дан текстовый файл в каждой его строке идет сначала текст, а потом - вещественное число. Создать два файла: файл, содержащий текстовую часть исходного файла, и файл, содержащий числа из исходного файла. вот сама программа. var s,t,r:string; i:integer; f,f1,f2:text; begin Assign(f,'C:\Users\serega\Desktop\f.txt'); Assign(f1,'C:\Users\serega\Desktop\f1.txt'); Assign(f2,'C:\Users\serega\Desktop\f2.txt'); reset(f); rewrite(f1); rewrite(f2); while not Eof(f) do begin for i:=1 to length(s) do begin if (s='0') or (s='1') or (s='2') or (s='3') or (s='4') or (s='5') or (s='6') or (s='7') or (s='8') or (s='9') then begin t:=copy(s,1,i-1); r:=copy(s,i,length(s)-i+1); end; writeln(f1,t); writeln(f2,r); end; end; close(f1); close(f2); close(f); exit; end. когда запускаю, пишет, что программа выполняется и ВСЁ!!!
Ну и не должно ничего отображаться! Напишете строчку writeln ('Запись в файлы завершена'); - вот тогда программа не будет закрываться сразу.. .

В файл пишется или нет?

if (s='0') or (s='1') or ...-мне кажется, надо s писать
И вообще, эту строчку можно упростить: if s in ['0'..'9'] then...


Если не разберетесь - пишите мне. Помогу.
B.
Baur .........
75 530
Лучший ответ
Про то, что не пишет вам уже ответили, но в программе есть еще один прокол и существенный

while not Eof(f) do begin {цикл пока не конец файла}
for i:=1 to length(s) do begin {цикл по строке}
if s[ i ] in ['0'..'9'] then begin {пока не найдем перыую цифру}
t:=copy(s,1,i-1); {скопировали все до первй цифры}
r:=copy(s,i,length(s)-i+1); {скопировали все, начиная с первой цифры}
{и самое время прервать цикл, иначе в t будет копироваться до 2 цифры и т. д. }
{в результате в t будет исходная строка, а r - пустая}
Break;
end;
writeln(f1,t);
writeln(f2,r);
end;
end;

Кстати, копировать до конца файла можно и не вычисляя, сколько символов копировать (length(s)-i+1), а просто указать третьим параметром длину строки. Больше, чем есть не скопирует.

r:=copy(s,i,length(s));

2 Advisor: >> А у тя цикл "while not Eof(f) do begin " по какому параметру изменяется? Я не вижу передвижения по файлу исходному, следовательно и достигнуть конца невозможно.

Плохо смотрите. Цикл выполняется пока значение, возвращаемое логической функцией Eof(f), является ЛОЖЬЮ.
Zviadi Jijavadze
Zviadi Jijavadze
59 613
1. Из входного файла нужно ЧИТАТЬ. В программе отсутствует какой-либо оператор чтения из файла. Кроме того, Вы пытаетесь обрабатывать строку s, в которую забыли что-либо занести.
Другими словами, после while... нужно вставить readln(f,s).

2. Исходный алгоритм теоретически был неспособен читать вещественные числа хотя бы потому, что в вещественном числе обязательно содержится десятичный разделитель, а процедура такие разделители пропускает. В третьем ответе была попытка обойти эту проблему. Более того, такой способ даже ИНОГДА будет работать. Правда, даже в тех случаях, когда будет - не всегда правильно. Приведу два контрпримера - в первом вообще работать не будет, во втором - будет работать неправильно.
Моя 1-ая строка. 3.14
Моя вторая строка. -3.14

Вообще-то при записи чисел и строк в текстовый файл вперемешку принято либо применять какие-либо сепараторы (например, символ табуляции) , либо заключать строку в кавычки.
Другой вариант - сначала записать ВСЕ числа, а в конце - единственную строку. Иначе - ОЧЕНЬ большой геморрой с разделением строк и чисел. Как в данном случае.
Валерий Мосин
Валерий Мосин
11 765
А у тя цикл "while not Eof(f) do begin " по какому параметру изменяется? Я не вижу передвижения по файлу исходному, следовательно и достигнуть конца невозможно. Прога просто зацыкливается. и ничего не делает. .
Да и с заполнением строки S что-то непонятно...
Sasha Gucal
Sasha Gucal
2 476