IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> обработка текста из внешнего текстового файла, определить количество строк, баланс
футбик
сообщение 22.10.2008 13:16
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 17
Пол: Мужской

Репутация: -  0  +


полное описание: Выполнить обработку текста из внешнего текстового файла, созданного в редакторе . Результаты обработки поместить во внешний файл. Определить количество строк в исходном тексте. Проверить имеется ли в каждой строке баланс.
количество строк определил так:
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.


кто знает, подскажите пожалуйста, что означает: проверить имеется ли в каждой строке баланс.

Сообщение отредактировано: футбик - 22.10.2008 13:17
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 22.10.2008 14:19
Сообщение #2


Гость






Цитата
что означает: проверить имеется ли в каждой строке баланс.
Почему-то есть ощущение, что это не полное предложение... Баланс не может быть сам по себе, должен быть баланс чего-то (открытых/закрытых скобок, например)... Уточни задание у того, кто его тебе дал.
 К началу страницы 
+ Ответить 
футбик
сообщение 26.10.2008 16:34
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 17
Пол: Мужской

Репутация: -  0  +


в задании была ошибка, нужно проверить баланс скобок, будем разбираться что это означает rolleyes.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 26.10.2008 23:54
Сообщение #4


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


Это значит, что каждой открывающейся скобке поставлена в соответствие закрывающаяся.
Поищи по форуму, такое решалось неоднократно


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
футбик
сообщение 27.10.2008 18:12
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 17
Пол: Мужской

Репутация: -  0  +


всегда выводит 'баланс не нарушен', подскажите пожалуйста в чем дело
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.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 27.10.2008 18:28
Сообщение #6


Гость






Во-первых, уточняй, вот это должно признаться как существование баланса, или нет:
)(())(
? Вроде бы количество открытых и закрытых скобок совпадает, но речи о правильной вложенности нет...

Во-вторых:
       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 или нет...
 К началу страницы 
+ Ответить 
футбик
сообщение 27.10.2008 20:11
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 17
Пол: Мужской

Репутация: -  0  +


все понял, еще раз спасибо smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
футбик
сообщение 29.10.2008 13:41
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 17
Пол: Мужской

Репутация: -  0  +


еще маленький вопросик по файлам, делаю программу, она преобразует текстовый файл в типизированный, элементы которого - вектора из 8 –и чисел типа Integer. Текстовый файл содержит 5 строк по 8 чисел в строке, числа выбирается из интервала [ 0,100] . Не получается преобразовать текст. файл в типиз. blink.gif
код
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.

заранее благодарен
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 29.10.2008 14:11
Сообщение #9


Гость






Цитата
{ на выходе типиз. файл пустой }
Неправда... То, что он содержит Нули (символ 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-а, который остался...
 К началу страницы 
+ Ответить 
футбик
сообщение 29.10.2008 19:05
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 17
Пол: Мужской

Репутация: -  0  +


а почему типизированый файл выдает: '^ L c I M ...', там же должны быть цифры rolleyes.gif ?
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.

спасибо

Сообщение отредактировано: футбик - 29.10.2008 19:10
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 29.10.2008 19:21
Сообщение #11


Гость






Цитата
там же должны быть цифры
Цифры у тебя были в текстовом файле... В типизированнои информация хранится без перевода в понятную тебе форму, прямо так, как она понятна компьютеру... То есть, просто берется содержимое ячейки памяти, и пишется в файл. Если ты потом открываешь этот файл текстовым редактором - то это твоя ошибка, файл НЕтекстовый, несмотря на расширение, и чтобы просмотреть его, надо либо написать еще одну программу, которая будет читать данные из файла, и показывать их тебе WriteLn-ом (то есть, опять же, переводя это в текстовую форму, удобную тебе), или каким-нибудь Hex-редактором, он покажет тебе содержимое файла "как оно есть", правда в 16-ричной СС...
 К началу страницы 
+ Ответить 
футбик
сообщение 29.10.2008 20:37
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 17
Пол: Мужской

Репутация: -  0  +


огромное спаибо за предоставленую информацию smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
футбик
сообщение 2.11.2008 18:34
Сообщение #13


Новичок
*

Группа: Пользователи
Сообщений: 17
Пол: Мужской

Репутация: -  0  +


помогите пожалуйста еще с файлами, есть проблемка. Нужно разделить все элементы вектора типизированного файла на максимальный элемент, и поместить результат в типиз. файл.
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.

работает не правильно:
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
читаю результат так:
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.


эта прога работает, проверял. Спасибо
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 2.11.2008 19:21
Сообщение #14


Гость






Цитата
работает не правильно:
Естественно... Смотри, что ты делаешь:

Цитата
// зачем тебе цикл 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. Форматируй программы, таких ошибок будет меньше...
 К началу страницы 
+ Ответить 
футбик
сообщение 3.11.2008 10:21
Сообщение #15


Новичок
*

Группа: Пользователи
Сообщений: 17
Пол: Мужской

Репутация: -  0  +


работает . Контрольные по паскалю готовы, спасибо за помощь smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 21.07.2025 11:33
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"