Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Строки в текстовом файле.

Автор: Ellsa 9.12.2006 21:22

Здравствуйте всем!Пожалуйста,помогите мне немного...у меня курсач звучит так:
разработать программу анализа текстового файла:определение средней длины слова в каждой строке и формирование файла средних длин построчно.Предусмотреть проверку существования файла и файла частот с выдачей диагностических сообщений.

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

Код
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?
А файл частот-это что такое?
Спасибо заранее.

Автор: Алена 9.12.2006 21:48

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

Автор: Ellsa 9.12.2006 21:52

Цитата(Алена @ 9.12.2006 17:48) *

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

спасибо большое!Действительно так.А можно еще один вопрос...я вот не могу понять....как по строкам идти?То есть завести цикл до окончания файла,а потом надо идти построчно....как перейти от строки к строке...можете подсказать?Пожалуйста.... unsure.gif
и насчет частотного файла...я извиняюсь,что много прошу так... unsure.gif мне правда неудобно... blush.gif

Автор: Ellsa 9.12.2006 22:24

ну хотя бы просто о файле частот....хрен с ними со строками...ща поковыряюсь.А вот про этот файл,если что-нибудь знаете,подскажите пожалуйста.Вообще не понимаю что это.... unsure.gif

Автор: мисс_граффити 9.12.2006 23:52

со строками все просто:
если ты сделаешь

readln(f,s);
readln(f,s);

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

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

Автор: Ellsa 9.12.2006 23:56

да нет,так написано почти у всех,у кого курсовик на файлы....
я вот по строкам пытаюсь перейти...но столкнулась с проблемой открытия файла....это я сейчас поищу на форуме...но меня интересует еще одна проблема...мне надо знать количество строк,чтоб потом сделать массив из средних длин слова,который будет иметь столько составляющих,сколько строк в файле...но когда я пишу что sred=array[1..n] of real;
и вычисляю n в программе самой,то он пишет,что он его не знает....я понимаю,что в тот момент,когда я описываю массив в разделе описаний он действительно не знает n...но я не знаю как написать по-другому....

Автор: Ellsa 10.12.2006 0:20

нет,не знаю я как избавится от ошибки 104...в поиске ничего не нашла. unsure.gif

Автор: мисс_граффити 10.12.2006 0:25

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

Автор: Ellsa 10.12.2006 0:28

Цитата(мисс_граффити @ 9.12.2006 20:25) *

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

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

я может плохо умею пользоваться поиском....но у меня пока никаких мыслей на ее исправление..... sad.gif

Автор: Ellsa 10.12.2006 0:48

что-то я еще больше во всем этом запуталась....
wacko.gif
не буду я делать проверку на существование исходного файла частот...но хоть прогу сделать бы...ведь еще блок-схему потом рисовать....
unsure.gif
скажите,пожалуйста,может я не тем методом каким-нибудь решаю?
Может надо другой подход?
Что-то ничерта не идет ничего....

Автор: Bokul 10.12.2006 0:55

С каждым своим сообщением ты все больше запутываешь задачу, опиши, где возникли проблемы и выложи исходник, тогда поговорим smile.gif .

Автор: Ellsa 10.12.2006 1:14

я пока вот на этом остановилась:

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 10.12.2006 1:20

Цитата
а ты не знаешь что такое частотный файл?

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

Автор: Ellsa 10.12.2006 1:22

Цитата(Bokul @ 9.12.2006 21:20) *

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

знала не спрашивала бы. no1.gif unsure.gif
ну...а насчет программы,ничего нет?Или я такая молодец,у меня все правильно? lol.gif

Автор: мисс_граффити 10.12.2006 1:43

не вижу строчки assign(f1,чего-нибудь)
и сделай нормальные отступы! невозможно читать код

Автор: Bokul 10.12.2006 1:48

Вот, глянь, что я накалякал:


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.


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


Прикрепленные файлы
Прикрепленный файл  source.txt ( 33 байт ) Кол-во скачиваний: 240

Автор: Ellsa 10.12.2006 1:53

 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 10.12.2006 2:03

Цитата
мы с такими функциями на уроках не решали....я конечно же узнаю все,как это делал ты....пойму,но на это нужно определенное время и я не знаю,то ли это...

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

Сейчас посмотрим smile.gif

Автор: Ellsa 10.12.2006 2:06

Bokul
просто я боюсь,что она подумает,что я не сама решила и подумает правильно. wink.gif
если я правильно понимаю,то первая функция равнозначна по сути ioresult....
вторая-режет на слова.
Дальше я еще не успела даже прочитать,но я увидела

Цитата
begin
if not(FileExist(SourceFile)) then
begin
writeln('SourceFile does not exist');
exit;
end;


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

Автор: Bokul 10.12.2006 2:18

Цитата
вторая-режет на слова.

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 10.12.2006 2:21

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

Автор: Bokul 10.12.2006 2:32

Цитата
ты то напечатал?

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

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

           
close(f1);
close(f2)


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

Автор: Ellsa 10.12.2006 2:34

Bokul


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

Автор: Bokul 10.12.2006 2:37

Цитата
А если у меня будет опять ошибка 104:?Файл недоступен для чтения?

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

Какие плюсики?

Автор: мисс_граффити 10.12.2006 2:39

к репутации smile.gif
Ellsa, ты пока что сама не можешь - мало сообщений.

Автор: Ellsa 10.12.2006 2:39

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

Автор: Bokul 10.12.2006 2:44

Цитата
а чем может быть вызвана ошибка 104?Я ввожу с расширенем,и с кавычками пробовала и без....и файл в папке лежит,что я указываю....

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

И в нас такое есть...

Автор: Ellsa 10.12.2006 2:46

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

Автор: Bokul 10.12.2006 2:54

Цитата
у тебя неправильно отработала та прога,что ты исправил?ТО есть она неверна?

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

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

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

на
writeln(f2,sred);

Автор: Ellsa 10.12.2006 3:01

спасибо.Я попробую сегодня ночью еще. smile.gif
Большое всем спасибо! wub.gif

Автор: Bokul 10.12.2006 3:19

Вот моя прога без функций:

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 10.12.2006 15:07

и все-таки знаете...никак от ошибки 104 не могу избавится... crazy.gif crazy.gif crazy.gif
уже почти несмешно....все-таки в пн сдавать....а он находит файл,но открыть для чтения не может,если я правильно понимаю.... blink.gif blink.gif norespect.gif
ну подскажите что-нибудь,пожалуйста! unsure.gif

Автор: Bokul 11.12.2006 0:16

Цитата
никак от ошибки 104 не могу избавится...

Возьми мой код, или там тоже самое?

Автор: Ellsa 11.12.2006 0:45

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

Автор: Bokul 11.12.2006 0:55

Цитата
Ты говорил,что моя у тебя пошла,хоть и результат неверн был..

Так оно и есть. 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 11.12.2006 1:01

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

Автор: Bokul 11.12.2006 1:13

Цитата
что это дает?

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

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


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

Ну как, не было 104-ой?

Автор: Ellsa 11.12.2006 1:26

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

Автор: Bokul 11.12.2006 1:35

Цитата
что ты изменил такого значительного,что открывает файл?

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

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

В цикле я ничего не менял, он как был не рабочим, таким и остался... smile.gif

Автор: Ellsa 11.12.2006 1:38

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

Автор: Bokul 11.12.2006 2:02

Цитата
просто дело в том,что цикл работал и считал правильно для одной строки....безошибочно...а теперь....

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

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

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

Автор: Ellsa 11.12.2006 2:05

Цитата(Bokul @ 10.12.2006 22:02) *



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

cray.gif
я не смогу его защитить....
не смогу его описать....
построить блок-схему....
не смогу....
блин.Надо переводиться,короче....
чувствую себя просто бревном.
unsure.gif

Автор: Bokul 11.12.2006 2:08

Почему не сможешь? Спрашивай что не ясно! smile.gif

Автор: Ellsa 11.12.2006 2:10

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

Автор: Bokul 11.12.2006 2:40

До этой части должно быть все понятно


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 11.12.2006 2:59

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

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

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

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

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

Автор: Bokul 11.12.2006 3:01

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

Так мы объявляем константу-строку, тоже самое, что и переменная, но ее нельзя изменять. Если констант не учили, то объяви в 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 11.12.2006 3:13

Цитата

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 11.12.2006 3:15

просто букв не может быть дробное число...среднее значение количества букв...
в этой строке среднее количество букв в слове равно 2.22
хм... blink.gif

Автор: Bokul 11.12.2006 3:18

Цитата
просто букв не может быть дробное число...среднее значение количества букв...
в этой строке среднее количество букв в слове равно 2.22

Ни черта не понял... blink.gif

Автор: Ellsa 11.12.2006 3:43

опять я неправа думаю. unsure.gif

Автор: Алена 11.12.2006 3:47

Цитата(Bokul @ 10.12.2006 22:13) *
Форматированный вывод. Первая цифра отвечает за количество цифр в целой части числа, вторая - дробной
Ни в коем случае: первая показывает, поле какой ширины отдавать на ВСЁ число, а вторая - сколько из этого количества пойдет на представление дробной части...

Автор: Bokul 11.12.2006 4:03

Цитата
Ни в коем случае: первая показывает, поле какой ширины отдавать на ВСЁ число, а вторая - сколько из этого количества пойдет на представление дробной части...

Точно..
Цитата
опять я неправа думаю.

В чем ты не права? Я не понял, что ты хотела сказать. Просто старайся меньше использовать "..." smile.gif

Автор: Ellsa 11.12.2006 4:59

Цитата
if ((pos(buf[i-1],separators)=0) and ((i-1)<>0)) then {..это разделитель, то (более подробно ниже}

зачем ((i-1)<>0)) ? unsure.gif


а нет проги,которая бы сделала мне блок - схему,зная прогу?
Обратную я просто видела когда-то в интернете...

Bokul слушай,а ты учебник издать не хочешь? wink.gif

Автор: Bokul 11.12.2006 5:11

Цитата
зачем ((i-1)<>0)) ?

Цикл идет от 1 и до длинны строки.
В следующим коде
(pos(buf[i-1],separators)=0)

как ты думаешь какой символ хранится в buf[i-1] при i=1? Ответ: там хранится длинна строки. Если интересно то ord(buf[0]) тоже самое, что и length(buf). Так вот, было бы не правильно, если бы мы попытались обратится к этому числу, как к символу, и чтобы не делать этой ошибки я и сделал эту проверку. smile.gif

Цитата
а нет проги,которая бы сделала мне блок - схему,зная прогу?

Есть http://forum.pascal.net.ru/index.php?s=&showtopic=4270&view=findpost&p=78172
Цитата
Обратную я просто видела когда-то в интернете...

Сильно сомневаюсь, просто одну и туже схему можно реализовать многими способами. wink.gif

Автор: Ellsa 11.12.2006 5:14

Цитата
Сильно сомневаюсь, просто одну и туже схему можно реализовать многими способами.

я правда видела.... unsure.gif
блин,спасибо тебе громадное!А по каким книгам ты это все изучал?или ты по паскалю просто шарил?
Так все хорошо объяснять...почему не ты у меня преподаешь!!!!!! aggressive.gif
я бы весь паскаль выучила.... smile.gif

Автор: Bokul 11.12.2006 5:20

Цитата
А по каким книгам ты это все изучал?или ты по паскалю просто шарил?

Форум этот научил, за что ему спасибо good.gif Потусуешься здесь, сама начнешь понимать yes2.gif . Так что не пропадай... smile.gif

Автор: Ellsa 11.12.2006 7:01

Цитата
if pos(buf[i],separators)=0 then {если этот элемент буква (не разделитель)...}

Цитата
if ((pos(buf[i-1],separators)=0) and ((i-1)<>0)) then {..это разделитель,

программа работает,но я не понимаю....опознование разделителя и не разделителя выглядят одинаково? unsure.gif

Автор: Bokul 11.12.2006 7:05

Цитата
опознование разделителя и не разделителя выглядят одинаково?

Конечно нет. Как ты думаешь эта строка определяет разделитель или не разделитель?
pos(buf[i],separators)=0

Автор: Ellsa 11.12.2006 7:06

Цитата(Bokul @ 11.12.2006 3:05) *

Конечно нет. Как ты думаешь эта строка определяет разделитель или не разделитель?
pos(buf[i],separators)=0


blush.gif неразделитель....

Автор: Bokul 11.12.2006 7:16

Цитата
неразделитель...

good.gif good.gif good.gif
Молодец!
Наверно я чуть не понятно написал коментарии.
Вот переписал паскалевский код:

Если i-ый символ строки buf не есть разделитель то
увеличим счетчик количества букв в строке
в другом случае
если (символ перед i-ым элементом строки buf был не разделителем) и (i не является единицей) то
увеличим счетчик количества слов в строке


Может так будет понятнее. smile.gif

Автор: Ellsa 11.12.2006 7:19

так...написано в твоем сообщении,что если i-тый символ-буква,прибавляем ее...
если i-1-ый элемент не буква и не начало строки,то прибавляем слово....так я поняла? unsure.gif

Автор: Bokul 11.12.2006 7:30

Цитата
так...написано в твеом сообщении,что если i-тый символ-буква,прибавляем ее...
если i-1-ый элемент не буква и перед 1-ыи и не начало строки,то прибавляем слово....так я поняла?

good.gif Почти...
Цитата
если i-1-ый элемент не буква

убери не, тогда будет правильно.
У нас есть два множества:
1 разделители
2 не разделители = буквы
=>
Цитата
символ перед i-ым элементом строки buf был не разделителем

можно заменить на
Цитата
символ перед i-ым элементом строки buf был буквой

Автор: Ellsa 11.12.2006 7:32

Цитата
символ перед i-ым элементом строки buf был букой

а почему тогда слово-то прибавляем? blink.gif

Автор: Bokul 11.12.2006 7:40

Мы делаем проверку символа перед i, только чтобы бороться с ситуациями когда несколько разделителей идут в подряд, например

123   1

{три пробела}
Представь что у нас нету этой проверки. Тогда алгоритм упростится до такового:

Если i-ый символ строки buf есть буквой то
увеличим счетчик количества букв в строке
в другом случае
увеличим счетчик количества слов в строке


Пройдись с этим алгоритмом по приведенной строке и ты увидишь необходимость делать эту поверку.

Автор: Ellsa 11.12.2006 7:50

черт!Я поняла! lol.gif
неужели в самом деле. lol.gif

решила вставить процедуру....

program kyrs;
const
Iscl=',.!?:;- ';
var f1,f2:text;
kolb,kolc,i:byte;
str,SourceFile,ResultFile:string;
procedure schet_slov (var kolc:byte;var str:string);
var i:byte;
begin
if ((pos(str[i-1],Iscl)=0) and ((i-1)<>0)) then
inc(kolc);
if pos(str[length(str)],Iscl)=0 then
inc(kolc);
end;
begin
writeln('‚ўҐ¤ЁвҐ Ё¬п д ©« -Ёбв®з­ЁЄ ');
readln(SourceFile);
assign(f1,SourceFile);
{$I-}
reset(f1);
{$I+}
if IoResult<>0 then
begin
writeln('ЋиЁЎЄ  ў Ё¬Ґ­Ё д ©« ');
readln;
exit;
end;
writeln('‚ўҐ¤ЁвҐ Ё¬п д ©« -१г«мв в ');
readln(ResultFile);
assign(f2,ResultFile);
{$I-}
rewrite(f2);
{$I+}
if IoResult<>0 then
begin
writeln('ЋиЁЎЄ  ў Ё¬Ґ­Ё д ©« ');
readln;
exit;
end;
while not eof(f1) do
begin
readln(f1,str);
kolb:=0;
kolc:=0;
for i:=1 to length(str) do
if pos(str[i],Iscl)=0 then
inc(kolb)
else
schet_slov(kolc,str);
writeln(f2,kolb/kolc);
end;
close(f1);
close(f2);
end.

считает неверно. unsure.gif


а меня не забанят за такую "активность"? unsure.gif

Автор: Bokul 11.12.2006 8:00

              
kolb:=0;
kolc:=0;
for i:=1 to length(str) do
if pos(str[i],Iscl)=0 then
inc(kolb)
else
schet_slov(kolc,str);


Ты должна сделать процедуру с всего этого. Посмотри на мой процедурный вариант этой проги, там так и есть.
 writeln(f2,kolb/kolc);

Вместо этой строки поставь то, что написано здесь: http://forum.pascal.net.ru/index.php?s=&showtopic=14294&view=findpost&p=83029
Естественно изменив соответствующие переменные.
Цитата
а меня не забанят за такую "активность"?

За желание знать тут не банят. smile.gif

Автор: Ellsa 11.12.2006 8:10

give_rose.gif blush.gif applause.gif respect.gif respect2.gif rolleyes.gif tease.gif
блок-схемки теперь мне нарисовать только....=)
но знаки http://forum.pascal.net.ru/index.php?s=&showtopic=14294&view=findpost&p=83029 я все равно не ставила в ответе. blum.gif
ты уж извини. blush.gif

Автор: Bokul 11.12.2006 8:19

good.gif

Цитата
но знаки эти я все равно не ставила в ответе.

Знаки (форматированный вывод) не главное, главное - эта проверка количества слов на 0

if n<>0 then
writeln(tr,s/n)
else
writeln(tr,0);


Без проверки прога вылетит с ошибкой Division by zero в случае, когда n=0.

Автор: Ellsa 11.12.2006 8:20

Цитата(Bokul @ 11.12.2006 4:19) *

good.gif

Знаки (форматированный вывод) не главное, главное - эта проверка количества слов на 0

if n<>0 then
writeln(tr,s/n)
else
writeln(tr,0);


Без проверки прога вылетит с ошибкой Division by zero в случае, когда n=0.

никогда еще в жизни не встречалась с такой отзывчивостью.Спасибо. rolleyes.gif