Форум «Всё о Паскале» _ Задачи _ Строки в текстовом файле.
Автор: Ellsa 9.12.2006 17: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 пишет. Просто когда я не начинала считать среднее значение-программа шла и все верно считала.А теперь перестала.Я не могу понять,что ему не нравится.
и еще вопросик...не подскажите,что значит:Предусмотреть проверку существования файла и файла частот с выдачей диагностических сообщений?Проверку существования файла проверяют функцией IOResult? А файл частот-это что такое? Спасибо заранее.
Автор: Алена 9.12.2006 17:48
Цитата
Я не могу понять,что ему не нравится.
А не нравится ему то, что I описывается, как Real, а по правилам, индексация может производиться только перечислимыми (целые/символьные/пользовательские) типами, но никак не вещественными ...
Автор: Ellsa 9.12.2006 17:52
Цитата(Алена @ 9.12.2006 17:48)
А не нравится ему то, что I описывается, как Real, а по правилам, индексация может производиться только перечислимыми (целые/символьные/пользовательские) типами, но никак не вещественными ...
спасибо большое!Действительно так.А можно еще один вопрос...я вот не могу понять....как по строкам идти?То есть завести цикл до окончания файла,а потом надо идти построчно....как перейти от строки к строке...можете подсказать?Пожалуйста.... и насчет частотного файла...я извиняюсь,что много прошу так... мне правда неудобно...
Автор: Ellsa 9.12.2006 18:24
ну хотя бы просто о файле частот....хрен с ними со строками...ща поковыряюсь.А вот про этот файл,если что-нибудь знаете,подскажите пожалуйста.Вообще не понимаю что это....
Автор: мисс_граффити 9.12.2006 19:52
со строками все просто: если ты сделаешь
readln(f,s); readln(f,s);
у тебя считается сначала первая, а потом вторая строка, то есть переход осуществляется автоматически.
что за файл частот - не знаю... у меня подозрение, что у кого-то в вашей группе есть задание "определить частоту вхождения букв в файл", и тебе досталось второе предложение от него... то есть на самом деле там должно быть "файл длин". но это так... гадание на кофейной гуще.
Автор: Ellsa 9.12.2006 19:56
да нет,так написано почти у всех,у кого курсовик на файлы.... я вот по строкам пытаюсь перейти...но столкнулась с проблемой открытия файла....это я сейчас поищу на форуме...но меня интересует еще одна проблема...мне надо знать количество строк,чтоб потом сделать массив из средних длин слова,который будет иметь столько составляющих,сколько строк в файле...но когда я пишу что sred=array[1..n] of real; и вычисляю n в программе самой,то он пишет,что он его не знает....я понимаю,что в тот момент,когда я описываю массив в разделе описаний он действительно не знает n...но я не знаю как написать по-другому....
Автор: Ellsa 9.12.2006 20:20
нет,не знаю я как избавится от ошибки 104...в поиске ничего не нашла.
Автор: мисс_граффити 9.12.2006 20:25
а зачем тебе массив, собственно? пиши сразу в результирующий файл.
Автор: Ellsa 9.12.2006 20:28
Цитата(мисс_граффити @ 9.12.2006 20:25)
а зачем тебе массив, собственно? пиши сразу в результирующий файл.
хм...наверно это возможно,да....попробую....спасибо. Только я все-таки не понимаю...что такое ошибка 104....
я может плохо умею пользоваться поиском....но у меня пока никаких мыслей на ее исправление.....
Автор: Ellsa 9.12.2006 20:48
что-то я еще больше во всем этом запуталась....
не буду я делать проверку на существование исходного файла частот...но хоть прогу сделать бы...ведь еще блок-схему потом рисовать....
скажите,пожалуйста,может я не тем методом каким-нибудь решаю? Может надо другой подход? Что-то ничерта не идет ничего....
Автор: Bokul 9.12.2006 20:55
С каждым своим сообщением ты все больше запутываешь задачу, опиши, где возникли проблемы и выложи исходник, тогда поговорим .
Автор: Ellsa 9.12.2006 21: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....я уже сама не пойму,чего от меня хотят.... а ты не знаешь что такое частотный файл?
Автор: Bokul 9.12.2006 21:20
Цитата
а ты не знаешь что такое частотный файл?
По условию я понял, что это файл-результат, куда ты записываешь среднею длину слов в строке. Или это не то?
Автор: Ellsa 9.12.2006 21:22
Цитата(Bokul @ 9.12.2006 21:20)
По условию я понял, что это файл-результат, куда ты записываешь среднею длину слов в строке. Или это не то?
знала не спрашивала бы. ну...а насчет программы,ничего нет?Или я такая молодец,у меня все правильно?
Автор: мисс_граффити 9.12.2006 21:43
не вижу строчки assign(f1,чего-нибудь) и сделай нормальные отступы! невозможно читать код
Автор: Bokul 9.12.2006 21: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.
я здесь ничего не понимаююююююююю..... мы с такими функциями на уроках не решали....я конечно же узнаю все,как это делал ты....пойму,но на это нужно определенное время и я не знаю,то ли это..... и еще...у меня сейчас проблема главная в том,что файл не открывается....а так я даже не знаю....пашет ли у меня программа. Спасибо тебе большое,что отликнулся!Просто я пока не знаю,то ли это.Но наверно то.
Автор: Bokul 9.12.2006 22:03
Цитата
мы с такими функциями на уроках не решали....я конечно же узнаю все,как это делал ты....пойму,но на это нужно определенное время и я не знаю,то ли это...
Если надо, могу написать комментарии или написать тоже самое, но без функций.
Цитата
а так я даже не знаю....пашет ли у меня программа.
Сейчас посмотрим
Автор: Ellsa 9.12.2006 22:06
Bokul просто я боюсь,что она подумает,что я не сама решила и подумает правильно. если я правильно понимаю,то первая функция равнозначна по сути ioresult.... вторая-режет на слова. Дальше я еще не успела даже прочитать,но я увидела
Цитата
begin if not(FileExist(SourceFile)) then begin writeln('SourceFile does not exist'); exit; end;
и меня последнее слово смутило...надеюсь это не что-то типа break?Она тада заброкует прогу.
Автор: Bokul 9.12.2006 22:18
Цитата
вторая-режет на слова.
А нам и на слова резать не надо, только посчитать количество букв и слов в строке.
Цитата
и меня последнее слово смутило...надеюсь это не что-то типа 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 9.12.2006 22:21
что-тоо я неочень поняла свои ошибки...только одну нашла...и лишний цикл бегин и енд...ты то напечатал?
Автор: Bokul 9.12.2006 22:32
Цитата
ты то напечатал?
Да, его я убрал.
Цитата
что-тоо я неочень поняла свои ошибки...только одну нашла...
Ну с ошибками я погорячился, но одну из-за которой прога, вылетает не отработав до конца, видно отчётливо: Для чего ты в цикле закрываешь файл?
Цитата
close(f1); close(f2)
Исправив это, хоть увидишь, что она делает...
Автор: Ellsa 9.12.2006 22:34
Bokul
черт,спасибо большое! А если у меня будет опять ошибка 104:?Файл недоступен для чтения?
я повешусь тогда.... а как тут плюсики поставить?Или нельзя?
Автор: Bokul 9.12.2006 22:37
Цитата
А если у меня будет опять ошибка 104:?Файл недоступен для чтения?
То приходи еще
Цитата
а как тут плюсики поставить?Или нельзя?
Какие плюсики?
Автор: мисс_граффити 9.12.2006 22:39
к репутации Ellsa, ты пока что сама не можешь - мало сообщений.
Автор: Ellsa 9.12.2006 22:39
я приду еще с домашним заданием за весь курс.... ну надеюсь,я смогу его сделать....ну если не сегодня,то до 24-го-то.... а чем может быть вызвана ошибка 104?Я ввожу с расширенем,и с кавычками пробовала и без....и файл в папке лежит,что я указываю.... а плюсики-репутация....я ждумала это как респекты на многих форумах.
Автор: Bokul 9.12.2006 22:44
Цитата
а чем может быть вызвана ошибка 104?Я ввожу с расширенем,и с кавычками пробовала и без....и файл в папке лежит,что я указываю....
А что ты вводишь и где лежит файл с данными? У меня твоя прога отработала, хоть и с не правильным результатом, ну это уже пустяки...
Цитата
а плюсики-репутация....я ждумала это как респекты на многих форумах.
И в нас такое есть...
Автор: Ellsa 9.12.2006 22:46
у тебя неправильно отработала та прога,что ты исправил?ТО есть она неверна? а я указываю как у вас тут кто-то указывал в какой-то теме C:\pascal.txt
Автор: Bokul 9.12.2006 22:54
Цитата
у тебя неправильно отработала та прога,что ты исправил?ТО есть она неверна?
Не понял. Та, что полностью моя, работает отлично, в твоей же я только сделал форматирование и убрал пару очевидных ошибок. С алгоритмом я не разбирался...
Цитата
а я указываю как у вас тут кто-то указывал в какой-то теме C:\pascal.txt
А файл с таким именем там есть? + исправь в своем коде
assign(f2,'d:\result.txt');
на путь, где ты хочешь получить файл-ответ, например с:\result.txt, у тебя нету, наверное, диска d и
write(f2,sred);
на writeln(f2,sred);
Автор: Ellsa 9.12.2006 23:01
спасибо.Я попробую сегодня ночью еще. Большое всем спасибо!
Автор: Bokul 9.12.2006 23: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 11:07
и все-таки знаете...никак от ошибки 104 не могу избавится... уже почти несмешно....все-таки в пн сдавать....а он находит файл,но открыть для чтения не может,если я правильно понимаю.... ну подскажите что-нибудь,пожалуйста!
Автор: Bokul 10.12.2006 20:16
Цитата
никак от ошибки 104 не могу избавится...
Возьми мой код, или там тоже самое?
Автор: Ellsa 10.12.2006 20:45
ну ведь у тебя она шла....твоя прога работает и работает даже в моими файлами.И я не могу понять,почему моя не работает с ними.Ты говорил,что моя у тебя пошла,хоть и результат неверн был...
Автор: Bokul 10.12.2006 20:55
Цитата
Ты говорил,что моя у тебя пошла,хоть и результат неверн был..
Так оно и есть. Попробуй запустить это:
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 10.12.2006 21:01
зачем ты пишешь readln exit и в самомо конце еще readln? что это дает?
Автор: Bokul 10.12.2006 21: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 10.12.2006 21:26
ошибку вроде твоя не выдает,но считает неправильно... у меня цикл работал...а теперь нет....странно.... но... что ты изменил такого значительного,что открывает файл? Просто readln и exit добавил.... не понимаю... =( мне просто отладку надо будет писать еще....
Автор: Bokul 10.12.2006 21:35
Цитата
что ты изменил такого значительного,что открывает файл?
assign(f2,'c:\result.txt'); Было d, прога нормально открывала файл данных, но она не могла создать файл-ответ.
Цитата
но считает неправильно
Я ж тебе уже давно говорил.
Цитата
у меня цикл работал...а теперь нет....странно....
В цикле я ничего не менял, он как был не рабочим, таким и остался...
Автор: Ellsa 10.12.2006 21:38
просто дело в том,что цикл работал и считал правильно для одной строки....безошибочно...а теперь.... а про диск c... я его и в своей проге уже меняла...все равно не открывал....я не понимаю... не понимаю,что ему там не нравилось.
утопия какая-то....
Автор: Bokul 10.12.2006 22:02
Цитата
просто дело в том,что цикл работал и считал правильно для одной строки....безошибочно...а теперь....
Во-первых, у тебя к разделителям слов относится только пробел, а как же другие знаки пунктуации? Для каждого будешь делать свою проверку? Во-вторых, в твоей проге не учтено много ситуаций, например какой ответ будет при такой строке:
ааа ааа
? Должно выдать 3, но так как между словами 2 пробела, твоя прога даст 2... А если строка будет состоять только из одного пробела, она вообще вылетит с ошибкой Division by zero, - деление на ноль.
Так что возьми мой код и не мучься.
Автор: Ellsa 10.12.2006 22:05
Цитата(Bokul @ 10.12.2006 22:02)
Так что возьми мой код и не мучься.
я не смогу его защитить.... не смогу его описать.... построить блок-схему.... не смогу.... блин.Надо переводиться,короче.... чувствую себя просто бревном.
Автор: Bokul 10.12.2006 22:08
Почему не сможешь? Спрашивай что не ясно!
Автор: Ellsa 10.12.2006 22:10
не могу я все спрашивать...итак из исправления ошибки получилось написание всей курсовой.... неудобно мне.
Автор: Bokul 10.12.2006 22: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 10.12.2006 22:59
большое тебе спасибо....но боюсь это не по моим мозговым возможностям....я сделаю все,что смогу.тебе большое очень спасибо за то,что отозвался и так помог! вот только один и последний вопрос....ибо времени все равно уже не будет....либо сдам,либо нет.
Цитата
Separators=',.!? '
почему '' стоит?Я просто с таким вообще не сталкивалась никогда....
и
Цитата
writeln(tr,s/n:0:2); {запишем результат}
что такое s/n:0:2? кста,эта прога неверно у меня посчитала. trunc надо.
Автор: Bokul 10.12.2006 23: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 10.12.2006 23: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 10.12.2006 23:15
просто букв не может быть дробное число...среднее значение количества букв... в этой строке среднее количество букв в слове равно 2.22 хм...
Автор: Bokul 10.12.2006 23:18
Цитата
просто букв не может быть дробное число...среднее значение количества букв... в этой строке среднее количество букв в слове равно 2.22
Ни черта не понял...
Автор: Ellsa 10.12.2006 23:43
опять я неправа думаю.
Автор: Алена 10.12.2006 23:47
Цитата(Bokul @ 10.12.2006 22:13)
Форматированный вывод. Первая цифра отвечает за количество цифр в целой части числа, вторая - дробной
Ни в коем случае: первая показывает, поле какой ширины отдавать на ВСЁ число, а вторая - сколько из этого количества пойдет на представление дробной части...
Автор: Bokul 11.12.2006 0:03
Цитата
Ни в коем случае: первая показывает, поле какой ширины отдавать на ВСЁ число, а вторая - сколько из этого количества пойдет на представление дробной части...
Точно..
Цитата
опять я неправа думаю.
В чем ты не права? Я не понял, что ты хотела сказать. Просто старайся меньше использовать "..."
Автор: Ellsa 11.12.2006 0:59
Цитата
if ((pos(buf[i-1],separators)=0) and ((i-1)<>0)) then {..это разделитель, то (более подробно ниже}
зачем ((i-1)<>0)) ?
а нет проги,которая бы сделала мне блок - схему,зная прогу? Обратную я просто видела когда-то в интернете...
Bokul слушай,а ты учебник издать не хочешь?
Автор: Bokul 11.12.2006 1:11
Цитата
зачем ((i-1)<>0)) ?
Цикл идет от 1 и до длинны строки. В следующим коде
(pos(buf[i-1],separators)=0)
как ты думаешь какой символ хранится в buf[i-1] при i=1? Ответ: там хранится длинна строки. Если интересно то ord(buf[0]) тоже самое, что и length(buf). Так вот, было бы не правильно, если бы мы попытались обратится к этому числу, как к символу, и чтобы не делать этой ошибки я и сделал эту проверку.
Цитата
а нет проги,которая бы сделала мне блок - схему,зная прогу?
Есть http://forum.pascalnet.ru/index.php?s=&showtopic=4270&view=findpost&p=78172
Цитата
Обратную я просто видела когда-то в интернете...
Сильно сомневаюсь, просто одну и туже схему можно реализовать многими способами.
Автор: Ellsa 11.12.2006 1:14
Цитата
Сильно сомневаюсь, просто одну и туже схему можно реализовать многими способами.
я правда видела.... блин,спасибо тебе громадное!А по каким книгам ты это все изучал?или ты по паскалю просто шарил? Так все хорошо объяснять...почему не ты у меня преподаешь!!!!!! я бы весь паскаль выучила....
Автор: Bokul 11.12.2006 1:20
Цитата
А по каким книгам ты это все изучал?или ты по паскалю просто шарил?
Форум этот научил, за что ему спасибо Потусуешься здесь, сама начнешь понимать . Так что не пропадай...
Автор: Ellsa 11.12.2006 3:01
Цитата
if pos(buf[i],separators)=0 then {если этот элемент буква (не разделитель)...}
Цитата
if ((pos(buf[i-1],separators)=0) and ((i-1)<>0)) then {..это разделитель,
программа работает,но я не понимаю....опознование разделителя и не разделителя выглядят одинаково?
Автор: Bokul 11.12.2006 3:05
Цитата
опознование разделителя и не разделителя выглядят одинаково?
Конечно нет. Как ты думаешь эта строка определяет разделитель или не разделитель?
pos(buf[i],separators)=0
Автор: Ellsa 11.12.2006 3:06
Цитата(Bokul @ 11.12.2006 3:05)
Конечно нет. Как ты думаешь эта строка определяет разделитель или не разделитель?
pos(buf[i],separators)=0
неразделитель....
Автор: Bokul 11.12.2006 3:16
Цитата
неразделитель...
Молодец! Наверно я чуть не понятно написал коментарии. Вот переписал паскалевский код:
Если i-ый символ строки buf не есть разделитель то увеличим счетчик количества букв в строке в другом случае если (символ перед i-ым элементом строки buf был не разделителем) и (i не является единицей) то увеличим счетчик количества слов в строке
Может так будет понятнее.
Автор: Ellsa 11.12.2006 3:19
так...написано в твоем сообщении,что если i-тый символ-буква,прибавляем ее... если i-1-ый элемент не буква и не начало строки,то прибавляем слово....так я поняла?
Автор: Bokul 11.12.2006 3:30
Цитата
так...написано в твеом сообщении,что если i-тый символ-буква,прибавляем ее... если i-1-ый элемент не буква и перед 1-ыи и не начало строки,то прибавляем слово....так я поняла?
Почти...
Цитата
если i-1-ый элемент не буква
убери не, тогда будет правильно. У нас есть два множества: 1 разделители 2 не разделители = буквы =>
Цитата
символ перед i-ым элементом строки buf был не разделителем
можно заменить на
Цитата
символ перед i-ым элементом строки buf был буквой
Автор: Ellsa 11.12.2006 3:32
Цитата
символ перед i-ым элементом строки buf был букой
а почему тогда слово-то прибавляем?
Автор: Bokul 11.12.2006 3:40
Мы делаем проверку символа перед i, только чтобы бороться с ситуациями когда несколько разделителей идут в подряд, например
123 1
{три пробела} Представь что у нас нету этой проверки. Тогда алгоритм упростится до такового:
Если i-ый символ строки buf есть буквой то увеличим счетчик количества букв в строке в другом случае увеличим счетчик количества слов в строке
Пройдись с этим алгоритмом по приведенной строке и ты увидишь необходимость делать эту поверку.
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.pascalnet.ru/index.php?s=&showtopic=14294&view=findpost&p=83029 Естественно изменив соответствующие переменные.
Цитата
а меня не забанят за такую "активность"?
За желание знать тут не банят.
Автор: Ellsa 11.12.2006 4:10
блок-схемки теперь мне нарисовать только....=) но знаки http://forum.pascalnet.ru/index.php?s=&showtopic=14294&view=findpost&p=83029 я все равно не ставила в ответе. ты уж извини.
Автор: Bokul 11.12.2006 4:19
Цитата
но знаки эти я все равно не ставила в ответе.
Знаки (форматированный вывод) не главное, главное - эта проверка количества слов на 0
if n<>0 then writeln(tr,s/n) else writeln(tr,0);
Без проверки прога вылетит с ошибкой Division by zero в случае, когда n=0.
Автор: Ellsa 11.12.2006 4:20
Цитата(Bokul @ 11.12.2006 4:19)
Знаки (форматированный вывод) не главное, главное - эта проверка количества слов на 0
if n<>0 then writeln(tr,s/n) else writeln(tr,0);
Без проверки прога вылетит с ошибкой Division by zero в случае, когда n=0.
никогда еще в жизни не встречалась с такой отзывчивостью.Спасибо.