1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
обработка текста из внешнего текстового файла, определить количество строк, баланс
полное описание: Выполнить обработку текста из внешнего текстового файла, созданного в редакторе . Результаты обработки поместить во внешний файл. Определить количество строк в исходном тексте. Проверить имеется ли в каждой строке баланс. количество строк определил так:
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); { <--- Раз: читать надо строку из файла } ... for i:=1 to length(bal) do BEGIN { <--- Два } if bal[i]='(' then inc(a); if bal[i]=')' then dec(a); END; { <--- Три }
Если нужно контролировать еще и вложенность, то во втором условии (при проверке на закрывающуюся скобку) надо смотреть, а есть ли открытые, то есть, A > 0 или нет...
еще маленький вопросик по файлам, делаю программу, она преобразует текстовый файл в типизированный, элементы которого - вектора из 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.
Неправда... То, что он содержит Нули (символ NUL, с кодом = 0) - не значит, что он пустой... На размер файла посмотри.
Цитата
Текстовый файл содержит 5 строк по 8 чисел в строке
Опять неправда... Текстовый файл содержит все числа, записанные одно после другого, даже не разделенные пробелами (ты пробелы в текстовый файл не записывал, поэтому не удивляйся, что их там нет), и в одну строку (да, опять не удивляйся, writeln и writeln(f) - это совсем разные вещи)...
Если сделать в первой программе так:
for i:=1 to 5 do begin for j:=1 to 8 do write(f,a[i,j], ' '); writeln(f); end;
, то будет то, чего ты ждешь: числа, разделенные пробелами, по 8 штук в строке.
Теперь по перезаписи в типизированный файл. Вот этого:
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;
вполне достаточно. Чтобы не быть привязанным к числу столбцов, можно воспользоваться While not eoln(f) do вместо того For-а, который остался...
а почему типизированый файл выдает: '^ 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.
Цифры у тебя были в текстовом файле... В типизированнои информация хранится без перевода в понятную тебе форму, прямо так, как она понятна компьютеру... То есть, просто берется содержимое ячейки памяти, и пишется в файл. Если ты потом открываешь этот файл текстовым редактором - то это твоя ошибка, файл НЕтекстовый, несмотря на расширение, и чтобы просмотреть его, надо либо написать еще одну программу, которая будет читать данные из файла, и показывать их тебе WriteLn-ом (то есть, опять же, переводя это в текстовую форму, удобную тебе), или каким-нибудь Hex-редактором, он покажет тебе содержимое файла "как оно есть", правда в 16-ричной СС...
помогите пожалуйста еще с файлами, есть проблемка. Нужно разделить все элементы вектора типизированного файла на максимальный элемент, и поместить результат в типиз. файл.
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;
На самом деле тебе даже не надо выделять память подо всю матрицу 5 * 8, достаточно описАть вектор из 8-ми integer-ов, и читать в него "построчно", правда для этого придется чуть-чуть переделать программу. И массив B не нужен. И даже вектор не нужен, достаточно вообще одной переменной типа Real, ты все равно делишь каждый элемент строки на максимум, вот сразу дели и записывай в файл...
Кстати, вопрос на засыпку: ты ничего не хочешь сделать, если максимум в строке = 0? Что тогда будет записываться в файл? Ты ж в этом случае не пишешь ничего в матрицу B...
P.S. Форматируй программы, таких ошибок будет меньше...