Помощь - Поиск - Пользователи - Календарь
Полная версия: Строки в текстовом файле.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Страницы: 1, 2
Ellsa
Здравствуйте всем!Пожалуйста,помогите мне немного...у меня курсач звучит так:
разработать программу анализа текстового файла:определение средней длины слова в каждой строке и формирование файла средних длин построчно.Предусмотреть проверку существования файла и файла частот с выдачей диагностических сообщений.

я решила сначала составить программу для одной строки.

Код
program dddd;
var str:string;
kol,k,i,n,c,sred:real;
begin
readln(str);
n:=length (str);
i:=1;
kol:=0;
while i<=n do
begin
k:=0;
repeat
k:=k+1;
i:=i+1;
until (str[i]=' ') or (i>n);
kol:=kol+k;
i:=i+1;
end;
writeln(kol);

for i:=1 to n do
if (str[i]=' ') then c:=c+1;
if (str[1]=' ') then c:=c-1;
if str[n]=' ' then c:=c-1;
writeln(c+1);
sred:=kol/(c+1);
end.


но он выдает ошибку на until (str[i]=' ') or (i>n);,а именно на квадратной скобке tupe mismatch пишет.
Просто когда я не начинала считать среднее значение-программа шла и все верно считала.А теперь перестала.Я не могу понять,что ему не нравится. unsure.gif

и еще вопросик...не подскажите,что значит:Предусмотреть проверку существования файла и файла частот с выдачей диагностических сообщений?Проверку существования файла проверяют функцией IOResult?
А файл частот-это что такое?
Спасибо заранее.
Алена
Цитата
Я не могу понять,что ему не нравится.
А не нравится ему то, что I описывается, как Real, а по правилам, индексация может производиться только перечислимыми (целые/символьные/пользовательские) типами, но никак не вещественными ...
Ellsa
Цитата(Алена @ 9.12.2006 17:48) *

А не нравится ему то, что I описывается, как Real, а по правилам, индексация может производиться только перечислимыми (целые/символьные/пользовательские) типами, но никак не вещественными ...

спасибо большое!Действительно так.А можно еще один вопрос...я вот не могу понять....как по строкам идти?То есть завести цикл до окончания файла,а потом надо идти построчно....как перейти от строки к строке...можете подсказать?Пожалуйста.... unsure.gif
и насчет частотного файла...я извиняюсь,что много прошу так... unsure.gif мне правда неудобно... blush.gif
Ellsa
ну хотя бы просто о файле частот....хрен с ними со строками...ща поковыряюсь.А вот про этот файл,если что-нибудь знаете,подскажите пожалуйста.Вообще не понимаю что это.... unsure.gif
мисс_граффити
со строками все просто:
если ты сделаешь
readln(f,s);
readln(f,s);

у тебя считается сначала первая, а потом вторая строка, то есть переход осуществляется автоматически.

что за файл частот - не знаю... у меня подозрение, что у кого-то в вашей группе есть задание "определить частоту вхождения букв в файл", и тебе досталось второе предложение от него... то есть на самом деле там должно быть "файл длин". но это так... гадание на кофейной гуще.
Ellsa
да нет,так написано почти у всех,у кого курсовик на файлы....
я вот по строкам пытаюсь перейти...но столкнулась с проблемой открытия файла....это я сейчас поищу на форуме...но меня интересует еще одна проблема...мне надо знать количество строк,чтоб потом сделать массив из средних длин слова,который будет иметь столько составляющих,сколько строк в файле...но когда я пишу что sred=array[1..n] of real;
и вычисляю n в программе самой,то он пишет,что он его не знает....я понимаю,что в тот момент,когда я описываю массив в разделе описаний он действительно не знает n...но я не знаю как написать по-другому....
Ellsa
нет,не знаю я как избавится от ошибки 104...в поиске ничего не нашла. unsure.gif
мисс_граффити
а зачем тебе массив, собственно?
пиши сразу в результирующий файл.
Ellsa
Цитата(мисс_граффити @ 9.12.2006 20:25) *

а зачем тебе массив, собственно?
пиши сразу в результирующий файл.

хм...наверно это возможно,да....попробую....спасибо.
Только я все-таки не понимаю...что такое ошибка 104.... unsure.gif

я может плохо умею пользоваться поиском....но у меня пока никаких мыслей на ее исправление..... sad.gif
Ellsa
что-то я еще больше во всем этом запуталась....
wacko.gif
не буду я делать проверку на существование исходного файла частот...но хоть прогу сделать бы...ведь еще блок-схему потом рисовать....
unsure.gif
скажите,пожалуйста,может я не тем методом каким-нибудь решаю?
Может надо другой подход?
Что-то ничерта не идет ничего....
Bokul
С каждым своим сообщением ты все больше запутываешь задачу, опиши, где возникли проблемы и выложи исходник, тогда поговорим smile.gif .
Ellsa
я пока вот на этом остановилась:
program ddd;
var str1,str2,imya1,imya2:string;
f1,f2:text;
kol,k,i,n:integer;
sred,c:integer;
begin
writeln('vvedite imya fajla:');
readln(imya1);
{$I-} reset(f1){$I+};
if IOResult<>0 then writeln('owibka v imeni fajla');
assign(f2,'imya2.txt');
rewrite(f2);
while not(eof(f1)) do
begin
readln(f1,str1);
begin
n:=length(str1);
i:=1;
kol:=0;
while i<=n do
begin
k:=0;
repeat k:=k+1;
i:=i+1;
until (str1[i]=' ') or (i>n);
kol:=kol+k;
i:=i+1;
end;
writeln(kol);
for i:=1 to n do
if (str1[i]=' ') then c:=c+1;
if (str1[1]=' ') then c:=c-1;
if (str1[n]=' ') then c:=c-1;
writeln(c+1);
sred:=trunc(kol/(c+1));
write(f2,sred);
close(f1);
close(f2);
end;
end;
end.



не открывает файл...f1....я уже сама не пойму,чего от меня хотят.... wacko.gif
а ты не знаешь что такое частотный файл? unsure.gif
Bokul
Цитата
а ты не знаешь что такое частотный файл?

По условию я понял, что это файл-результат, куда ты записываешь среднею длину слов в строке. Или это не то?
Ellsa
Цитата(Bokul @ 9.12.2006 21:20) *

По условию я понял, что это файл-результат, куда ты записываешь среднею длину слов в строке. Или это не то?

знала не спрашивала бы. no1.gif unsure.gif
ну...а насчет программы,ничего нет?Или я такая молодец,у меня все правильно? lol.gif
мисс_граффити
не вижу строчки assign(f1,чего-нибудь)
и сделай нормальные отступы! невозможно читать код
Bokul
Вот, глянь, что я накалякал:

const
SourceFile='с:\source.txt';
ResultFile='с:\result.txt';
function FileExist(path:string):boolean;
var t:text;
begin
assign(t,path);
{$I-}
reset(t);
{$I+}
FileExist:=ioresult=0;
close(t);
end;

procedure CountWords(st:string; var s,n:byte);
const
separators=',.!? ';
var i:byte;
begin
s:=0;
n:=0;
for i:=1 to length(st) do
if pos(st[i],separators)=0 then
inc(s)
else
if ((pos(st[i-1],separators)=0) and ((i-1)<>0)) then
inc(n);
if pos(st[length(st)],separators)=0 then
inc(n);

end;

var ts,tr:text;
sum,num:byte;
buf:string;
begin
if not(FileExist(SourceFile)) then
begin
writeln('SourceFile does not exist');
exit;
end;
assign(ts,SourceFile);
reset(ts);
assign(tr,ResultFile);
rewrite(tr);
while not eof(ts) do
begin
readln(ts,buf);
CountWords(buf,sum,num);
writeln(tr,sum/num:0:2);
end;
close(ts);
close(tr);
readln;
end.


Скажи, это то, что тебе надо?
Файл для испытаний:
Ellsa
 program ddd;

var str1,str2,imya1,imya2:string;
f1,f2:text;
kol,k,i,n:integer;
sred,c:integer;

begin

writeln('vvedite imya fajla:');
readln(imya1);assign(f1,imya1);

{$I-} reset(f1){$I+};

if IOResult<>0 then writeln('owibka v imeni fajla');
assign(f2,'imya2.txt');
rewrite(f2);

while not(eof(f1)) do
begin
readln(f1,str1);
begin
n:=length(str1);
i:=1;
kol:=0;

while i<=n do
begin
k:=0;

repeat k:=k+1;
i:=i+1;
until (str1[i]=' ') or (i>n);
kol:=kol+k;
i:=i+1;
end;

writeln(kol);


for i:=1 to n do
if (str1[i]=' ') then c:=c+1;
if (str1[1]=' ') then c:=c-1;
if (str1[n]=' ') then c:=c-1;

writeln(c+1);
sred:=trunc(kol/(c+1));
write(f2,sred);

close(f1);
close(f2);

end;
end;
end.


Bokul


я здесь ничего не понимаююююююююю..... blink.gif
мы с такими функциями на уроках не решали....я конечно же узнаю все,как это делал ты....пойму,но на это нужно определенное время и я не знаю,то ли это.....
и еще...у меня сейчас проблема главная в том,что файл не открывается....а так я даже не знаю....пашет ли у меня программа.
Спасибо тебе большое,что отликнулся!Просто я пока не знаю,то ли это.Но наверно то. unsure.gif
Bokul
Цитата
мы с такими функциями на уроках не решали....я конечно же узнаю все,как это делал ты....пойму,но на это нужно определенное время и я не знаю,то ли это...

Если надо, могу написать комментарии или написать тоже самое, но без функций.
Цитата
а так я даже не знаю....пашет ли у меня программа.

Сейчас посмотрим smile.gif
Ellsa
Bokul
просто я боюсь,что она подумает,что я не сама решила и подумает правильно. wink.gif
если я правильно понимаю,то первая функция равнозначна по сути ioresult....
вторая-режет на слова.
Дальше я еще не успела даже прочитать,но я увидела
Цитата
begin
if not(FileExist(SourceFile)) then
begin
writeln('SourceFile does not exist');
exit;
end;


и меня последнее слово смутило...надеюсь это не что-то типа break?Она тада заброкует прогу.
Bokul
Цитата
вторая-режет на слова.

no1.gif А нам и на слова резать не надо, только посчитать количество букв и слов в строке. smile.gif
Цитата
и меня последнее слово смутило...надеюсь это не что-то типа break?Она тада заброкует прогу.

Она выйдет из проги в случае неправильного открытия файла. В твоем коде, если пользователь введет неправильное имя файла, прога напишет сообщения об этом, и потом вылетит с ошибкой, а при помощью exit она сделает тоже самое, но без ошибки.
Смотри, что дает хорошое форматирование кода

var str1,str2,imya1,imya2:string;
f1,f2:text;
kol,k,i,n:integer;
sred,c:integer;
begin
writeln('vvedite imya fajla:');
readln(imya1);assign(f1,imya1);
{$I-}
reset(f1);
{$I+}
if IOResult<>0 then
writeln('owibka v imeni fajla');
assign(f2,'d:\result.txt');
rewrite(f2);
while not(eof(f1)) do
begin
readln(f1,str1);
n:=length(str1);
i:=1;
kol:=0;
while i<=n do
begin
k:=0;
repeat k:=k+1;
i:=i+1;
until (str1[i]=' ') or (i>n);
kol:=kol+k;
i:=i+1;
end;
writeln(kol);
for i:=1 to n do
if (str1[i]=' ') then c:=c+1;
if (str1[1]=' ') then c:=c-1;
if (str1[n]=' ') then c:=c-1;
writeln(c+1);
sred:=trunc(kol/(c+1));
write(f2,sred);
close(f1);
close(f2);

end;
end.



Столько ошибок видно, конечно она не правильно работает
Ellsa
что-тоо я неочень поняла свои ошибки...только одну нашла...и лишний цикл бегин и енд...ты то напечатал? unsure.gif
Bokul
Цитата
ты то напечатал?

Да, его я убрал. smile.gif
Цитата
что-тоо я неочень поняла свои ошибки...только одну нашла...

Ну с ошибками я погорячился, но одну из-за которой прога, вылетает не отработав до конца, видно отчётливо:
Для чего ты в цикле закрываешь файл? wink.gif
Цитата

           
close(f1);
close(f2)


Исправив это, хоть увидишь, что она делает...
Ellsa
Bokul


черт,спасибо большое! give_rose.gif А если у меня будет опять ошибка 104:?Файл недоступен для чтения?
unsure.gif
я повешусь тогда.... wacko.gif
а как тут плюсики поставить?Или нельзя?
Bokul
Цитата
А если у меня будет опять ошибка 104:?Файл недоступен для чтения?

То приходи еще smile.gif
Цитата
а как тут плюсики поставить?Или нельзя?

Какие плюсики?
мисс_граффити
к репутации smile.gif
Ellsa, ты пока что сама не можешь - мало сообщений.
Ellsa
я приду еще с домашним заданием за весь курс.... lol.gif
ну надеюсь,я смогу его сделать....ну если не сегодня,то до 24-го-то....
а чем может быть вызвана ошибка 104?Я ввожу с расширенем,и с кавычками пробовала и без....и файл в папке лежит,что я указываю.... unsure.gif
а плюсики-репутация....я ждумала это как респекты на многих форумах. smile.gif
Bokul
Цитата
а чем может быть вызвана ошибка 104?Я ввожу с расширенем,и с кавычками пробовала и без....и файл в папке лежит,что я указываю....

А что ты вводишь и где лежит файл с данными? У меня твоя прога отработала, хоть и с не правильным результатом, ну это уже пустяки... smile.gif
Цитата
а плюсики-репутация....я ждумала это как респекты на многих форумах.

И в нас такое есть...
Ellsa
у тебя неправильно отработала та прога,что ты исправил?ТО есть она неверна? mega_chok.gif
а я указываю как у вас тут кто-то указывал в какой-то теме
C:\pascal.txt
Bokul
Цитата
у тебя неправильно отработала та прога,что ты исправил?ТО есть она неверна?

Не понял. Та, что полностью моя, работает отлично, в твоей же я только сделал форматирование и убрал пару очевидных ошибок. С алгоритмом я не разбирался...
Цитата
а я указываю как у вас тут кто-то указывал в какой-то теме C:\pascal.txt

А файл с таким именем там есть?
+
исправь в своем коде
assign(f2,'d:\result.txt');

на путь, где ты хочешь получить файл-ответ, например с:\result.txt, у тебя нету, наверное, диска d
и
write(f2,sred);

на
writeln(f2,sred);
Ellsa
спасибо.Я попробую сегодня ночью еще. smile.gif
Большое всем спасибо! wub.gif
Bokul
Вот моя прога без функций:
uses crt;
const
Separators=',.!? ';
var ts,tr:text;
s,n,i:byte;
buf,SourceFile,ResultFile:string;
begin
clrscr;
writeln('Enter the path to source file');
readln(SourceFile);
assign(ts,SourceFile);
{$I-}
reset(ts);
{$I+}
if IoResult<>0 then
begin
writeln('SourceFile does not exist');
readln;
exit;
end;
writeln('Enter the path to result file');
readln(ResultFile);
assign(tr,ResultFile);
{$I-}
rewrite(tr);
{$I+}
if IoResult<>0 then
begin
writeln('Cannot create result-file');
readln;
exit;
end;
while not eof(ts) do
begin
readln(ts,buf);
s:=0;
n:=0;
for i:=1 to length(buf) do
if pos(buf[i],separators)=0 then
inc(s)
else
if ((pos(buf[i-1],separators)=0) and ((i-1)<>0)) then
inc(n);
if pos(buf[length(buf)],separators)=0 then
inc(n);
writeln(tr,s/n:0:2);
end;
close(ts);
close(tr);
end.
Ellsa
и все-таки знаете...никак от ошибки 104 не могу избавится... crazy.gif crazy.gif crazy.gif
уже почти несмешно....все-таки в пн сдавать....а он находит файл,но открыть для чтения не может,если я правильно понимаю.... blink.gif blink.gif norespect.gif
ну подскажите что-нибудь,пожалуйста! unsure.gif
Bokul
Цитата
никак от ошибки 104 не могу избавится...

Возьми мой код, или там тоже самое?
Ellsa
ну ведь у тебя она шла....твоя прога работает и работает даже в моими файлами.И я не могу понять,почему моя не работает с ними.Ты говорил,что моя у тебя пошла,хоть и результат неверн был... unsure.gif
Bokul
Цитата
Ты говорил,что моя у тебя пошла,хоть и результат неверн был..

Так оно и есть. smile.gif Попробуй запустить это:
 
var str1,str2,imya1,imya2:string;
f1,f2:text;
kol,k,i,n:integer;
sred,c:integer;
begin
writeln('vvedite imya fajla:');
readln(imya1);
assign(f1,imya1);
{$I-}
reset(f1);
{$I+}
if IOResult<>0 then
begin
writeln('owibka v imeni fajla-source');
readln;
exit;
end;
assign(f2,'c:\result.txt');
{$I-}
rewrite(f2);
{$I+}
if IOResult<>0 then
begin
writeln('owibka v imeni fajla-result');
readln;
exit;
end;
while not(eof(f1)) do
begin
readln(f1,str1);
n:=length(str1);
i:=1;
kol:=0;
while i<=n do
begin
k:=0;
repeat k:=k+1;
i:=i+1;
until (str1[i]=' ') or (i>n);
kol:=kol+k;
i:=i+1;
end;
writeln(kol);
for i:=1 to n do
if (str1[i]=' ') then c:=c+1;
if (str1[1]=' ') then c:=c-1;
if (str1[n]=' ') then c:=c-1;
writeln(c+1);
sred:=trunc(kol/(c+1));
writeln(f2,sred);
end;
close(f1);
close(f2);
readln;
end.



Ellsa
зачем ты пишешь
readln
exit
и в самомо конце еще readln? blink.gif
что это дает?
Bokul
Цитата
что это дает?

Делает задержку. Программа не будет выполнятся дальше, пока ты не нажмешь на Enter. Для чего надо? Без задержки, в случае возникновения ошибки, например здесь,

if IOResult<>0 then
begin
writeln('owibka v imeni fajla-source');
readln;
exit;
end;


ты бы не успела увидеть вывод твоего сообщения writeln('owibka v imeni fajla-source');, для тебя прога просто бы закрылась. А по какой причине, ты бы не узнала. Попробуй специально ввести неверный путь к файлу, з readln, а потом - без. Увидела разницу?

Ну как, не было 104-ой?
Ellsa
ошибку вроде твоя не выдает,но считает неправильно... у меня цикл работал...а теперь нет....странно....
но...
что ты изменил такого значительного,что открывает файл?
Просто readln и exit добавил....
не понимаю... =(
мне просто отладку надо будет писать еще....
Bokul
Цитата
что ты изменил такого значительного,что открывает файл?

assign(f2,'c:\result.txt');
Было d, прога нормально открывала файл данных, но она не могла создать файл-ответ.
Цитата
но считает неправильно

Я ж тебе уже давно говорил.
Цитата
у меня цикл работал...а теперь нет....странно....

В цикле я ничего не менял, он как был не рабочим, таким и остался... smile.gif
Ellsa
просто дело в том,что цикл работал и считал правильно для одной строки....безошибочно...а теперь....
а про диск c...
я его и в своей проге уже меняла...все равно не открывал....я не понимаю...
не понимаю,что ему там не нравилось.
unsure.gif dry.gif
утопия какая-то.... wacko.gif
Bokul
Цитата
просто дело в том,что цикл работал и считал правильно для одной строки....безошибочно...а теперь....

no1.gif
Во-первых, у тебя к разделителям слов относится только пробел, а как же другие знаки пунктуации? Для каждого будешь делать свою проверку?
Во-вторых, в твоей проге не учтено много ситуаций, например какой ответ будет при такой строке:
ааа  ааа

?
Должно выдать 3, но так как между словами 2 пробела, твоя прога даст 2...
А если строка будет состоять только из одного пробела, она вообще вылетит с ошибкой Division by zero, - деление на ноль.

Так что возьми мой код и не мучься. smile.gif
Ellsa
Цитата(Bokul @ 10.12.2006 22:02) *



Так что возьми мой код и не мучься. smile.gif

cray.gif
я не смогу его защитить....
не смогу его описать....
построить блок-схему....
не смогу....
блин.Надо переводиться,короче....
чувствую себя просто бревном.
unsure.gif
Bokul
Почему не сможешь? Спрашивай что не ясно! smile.gif
Ellsa
не могу я все спрашивать...итак из исправления ошибки получилось написание всей курсовой.... неудобно мне.
Bokul
До этой части должно быть все понятно

const
Separators=',.!? ';{перечислим все разделители слов}
{-------------------------------------}
while not eof(ts) do {пока не закончится файл... }
begin
readln(ts,buf); {...читаем его построчно, каждою строку записываем в buf}
s:=0; {количетво букв в строке}
n:=0; {количество слов в строке}
for i:=1 to length(buf) do {с каждым элементом строки buf проделываем действие:}
if pos(buf[i],separators)=0 then {если этот элемент буква (не разделитель)...}
inc(s) {...то увеличиваем их (букв) количество}
else{в противном случае...}
if ((pos(buf[i-1],separators)=0) and ((i-1)<>0)) then {..это разделитель, то (более подробно ниже}
inc(n); {увеличиваем количество слов}

if pos(buf[length(buf)],separators)=0 then {если последний символ не разделитель}
inc(n); {то увеличиваем количество слов}
writeln(tr,s/n:0:2); {запишем результат}
end;


inc(n) равносильно n:=n+1;
Ты знакома с функцией pos(s1,s2)? Она возвращает номер первого вхождения подстроки s1 в строку s2. Если же такой подстроки нету в s2, то она возвращает 0.
А с помощью pos(buf[i],separators)=0 мы проверяем является ли i-ый элемент строки buf не разделителем - если мы не нашли buf[i] в separators, то там его и нету.
else{в противном случае...}
if ((pos(buf[i-1],separators)=0)

Обрати внимание на buf[i-1]! Так мы боремся с ситуацией, когда разделители идут в подряд, в этом случае не надо повышать количество слов.
if ((pos(buf[i-1],separators)=0) and ((i-1)<>0))

((i-1)<>0)) добавили, чтобы эта проверка не делалась для первого элемента.

             
if pos(buf[length(buf)],separators)=0 then {если последний символ не разделитель}
inc(n); {то увеличиваем количество слов}


Последняя проверка нужна чтобы исключить ситуацию, когда последним символом строки является разделитель, если это так то незачем поднимать количество слов - мы его уже подняли в else
Ellsa
большое тебе спасибо....но боюсь это не по моим мозговым возможностям....я сделаю все,что смогу.тебе большое очень спасибо за то,что отозвался и так помог!
вот только один и последний вопрос....ибо времени все равно уже не будет....либо сдам,либо нет.

Цитата
Separators=',.!? '

почему '' стоит?Я просто с таким вообще не сталкивалась никогда.... unsure.gif

и
Цитата
writeln(tr,s/n:0:2); {запишем результат}

что такое s/n:0:2?
кста,эта прога неверно у меня посчитала.
trunc надо.
Bokul
Цитата
почему '' стоит?Я просто с таким вообще не сталкивалась никогда....

Так мы объявляем константу-строку, тоже самое, что и переменная, но ее нельзя изменять. Если констант не учили, то объяви в Var строковую переменную Separators (в принципе можно любое имя, но только потом на всех местах Separators в проге, поставь имя новой переменной), а потом, перед циклом while, присвой ей значение ',.!? '.

Еще!
вместо
writeln(tr,s/n:0:2)

поставь

if n<>0 then
writeln(tr,s/n:0:2)
else
writeln(tr,0);
Bokul
Цитата

trunc надо.

trunc - обрежет дробовую часть, а как же тогда быть 2.5, 2.6, 2 - одно и тоже?
Цитата
кста,эта прога неверно у меня посчитала.

Что значит неверно? Ответ был вроде 2.00?
Цитата
что такое s/n:0:2?

Форматированный вывод. Первая цифра отвечает за количество цифр в целой части числа, вторая - дробной, 0 - для любого количества. Попробуй запустить прогу с writeln(tr,s/n) или writeln(tr,s/n:0:5), поймешь разницу...
Ellsa
просто букв не может быть дробное число...среднее значение количества букв...
в этой строке среднее количество букв в слове равно 2.22
хм... blink.gif
Bokul
Цитата
просто букв не может быть дробное число...среднее значение количества букв...
в этой строке среднее количество букв в слове равно 2.22

Ни черта не понял... blink.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.