полное описание: Выполнить обработку текста из внешнего текстового файла, созданного в редакторе . Результаты обработки поместить во внешний файл. Определить количество строк в исходном тексте. Проверить имеется ли в каждой строке баланс.
количество строк определил так:
var oldf,newf:text;
oldn,newn:string;
s:integer;
begin
writeln('Введите имя файла');
readln(oldn);
writeln('Введите новое имя');
readln(newn);
assign(oldf,oldn);
assign(newf,newn);
reset(oldf);
rewrite(newf);
s:=1; {это смущает}
while not eof(oldf) do
begin
readln(oldf);
begin
s:=s+1;
end;
end;
writeln(newf,'строк: ',s);
close(newf)
end.
в задании была ошибка, нужно проверить баланс скобок, будем разбираться что это означает
Это значит, что каждой открывающейся скобке поставлена в соответствие закрывающаяся.
Поищи по форуму, такое решалось неоднократно
всегда выводит 'баланс не нарушен', подскажите пожалуйста в чем дело
var oldf,newf:text;{Файловые пеpеменные для
стаpого и нового файлов}
oldn,newn:string;{Стpоковые пеpеменные, для хранения
имен нового и стаpого файлов}
bal:string;
i,s:integer;
a:integer;
begin
writeln('Введите имя файла');
readln(oldn);
writeln('Введите новое имя');
readln(newn);
assign(oldf,oldn);
assign(newf,newn);
reset(oldf); {Откpыть стаpый файл по чтению}
rewrite(newf); {Откpыть новый файл по записи}
s:=1;
a:=0;
while not eof(oldf) do
begin
readln(oldf);{Читаем стpоку из стаpого файла}
begin
s:=s+1;
end;
for i:=1 to length(bal) do
if bal[i]='(' then inc(a);
if bal[i]=')' then dec(a);
end;
if a=0 then writeln('баланс не нарушен')
else writeln('баланс нарушен');
writeln(newf,'строк: ',s);
close(newf)
end.
Во-первых, уточняй, вот это должно признаться как существование баланса, или нет:
)(())(
? Вроде бы количество открытых и закрытых скобок совпадает, но речи о правильной вложенности нет...
Во-вторых:
readln(oldf, bal); { <--- Раз: читать надо строку из файла }Если нужно контролировать еще и вложенность, то во втором условии (при проверке на закрывающуюся скобку) надо смотреть, а есть ли открытые, то есть, A > 0 или нет...
...
for i:=1 to length(bal) do
BEGIN { <--- Два }
if bal[i]='(' then inc(a);
if bal[i]=')' then dec(a);
END; { <--- Три }
все понял, еще раз спасибо
еще маленький вопросик по файлам, делаю программу, она преобразует текстовый файл в типизированный, элементы которого - вектора из 8 –и чисел типа Integer. Текстовый файл содержит 5 строк по 8 чисел в строке, числа выбирается из интервала [ 0,100] . Не получается преобразовать текст. файл в типиз.
код
var f:text;
newf: file of integer;
el:string;
a:array[1..5,1..8] of integer;
i,j:integer;
begin
assign(f,'C:\PABCWork\p1.txt');
reset(f); {Откpыть стаpый файл по чтению}
assign(newf,'C:\PABCWork\p2.txt');
rewrite(newf); {Откpыть новый файл по записи}
while not eof(f) do
begin
readln(f,el);
for i:=1 to 5 do {просто хочу прочитать текстовый и перезаписать в типиз.файл}
begin
for j:=1 to 8 do
write(newf,a[i,j]); { на выходе типиз. файл пустой }
writeln;
end;
end;
close(newf)
end.
var f:text;
a:array[1..5,1..8] of integer;
i,j:integer;
begin
assign(f,'C:\PABCWork\p1.txt'); {Откpыть стаpый файл по чтению}
rewrite(f); {Откpыть новый файл по записи}
for i:=1 to 5 do
for j:=1 to 8 do a[i,j]:=random(100);
for i:=1 to 5 do
begin
for j:=1 to 8 do
write(f,a[i,j]);
writeln;
end;
close(f);
end.
for i:=1 to 5 do, то будет то, чего ты ждешь: числа, разделенные пробелами, по 8 штук в строке.
begin
for j:=1 to 8 do
write(f,a[i,j], ' ');
writeln(f);
end;
var x: integer;
...
while not eof(f) do
begin
for j:=1 to 8 do begin
read(f, X);
write(newf,X);
end;
readln(f); { <--- Переводим строку в текстовом файле }
end;
а почему типизированый файл выдает: '^ L c I M ...', там же должны быть цифры ?
begin
assign(f,'C:\PABCWork\p1.txt');
reset(f);
assign(newf,'C:\PABCWork\p2.txt');
rewrite(newf);
while not eof(f) do
begin
While not eoln(f) do
begin
read(f, x);
write(newf,x);
end;
readln(f);
end;
close(newf)
end.
огромное спаибо за предоставленую информацию
помогите пожалуйста еще с файлами, есть проблемка. Нужно разделить все элементы вектора типизированного файла на максимальный элемент, и поместить результат в типиз. файл.
var
newf: file of real;
oldf: file of integer;
a:array[1..5,1..8] of integer;
b:array[1..5,1..8] of real;
i,j:integer;
amax:real;
begin
assign(oldf,'C:\PABCWork\p2.txt');
reset(oldf);
assign(newf,'C:\PABCWork\p3.txt');
rewrite(newf);
while not eof(oldf) do
begin
for i:=1 to 5 do
for j:=1 to 8 do
begin
read(oldf,a[i,j]);
for i:=1 to 5 do //перебираю строки
begin
amax := a[i,1]; //1й элемент в каждой строке максимальный
for j:=2 to 8 do //перебираю столбцы, с 2го
begin
if a[i,j]>amax then amax:=a[i,j];//сравниваю 1й элемент строки с остальными и присваиваю значение amax = максимальное
end;
for j:=1 to 8 do
begin
if amax<>0 then b[i,j]:=(a[i,j]/amax); //делю каждый элемент строки на макс. значение этой строки
end;
end;
end;
end;
for i:=1 to 5 do
begin
for j:=1 to 8 do
write(newf,b[i,j]);
end;
close(newf);
end.
var f:file of real;
newf:text;
x:integer;
a:array[1..5,1..8] of real;
i,j:integer;
begin
assign(f,'C:\PABCWork\p3.txt');
reset(f); {Откpыть стаpый файл по чтению}
assign(newf,'C:\PABCWork\p4.txt');
rewrite(newf); {Откpыть новый файл по записи}
while not eof(f) do
begin
for i:=1 to 5 do
begin
for j:=1 to 8 do
read(f,a[i,j]);
for j:=1 to 8 do
write(newf,a[i,j],' ');
writeln(newf);
end;
end;
close(newf)
end.
// зачем тебе цикл while not eof, ты ж используешь точную
// размерность массива ?
while not eof(oldf) do
begin
for i:=1 to 5 do
for j:=1 to 8 do
begin
read(oldf,a[i,j]); // <--- Внимание! Прочитал один элемент, и уже перебираешь строки?
// Вот тут точно end не забыл ???
for i:=1 to 5 do //перебираю строки
begin
amax := a[i,1];
for j:=2 to 8 do
begin
if a[i,j]>amax then amax:=a[i,j];
end;
for j:=1 to 8 do
begin
if amax<>0 then b[i,j]:=(a[i,j]/amax);
end;
end;
end;
end;
работает . Контрольные по паскалю готовы, спасибо за помощь