1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
просто дело в том,что цикл работал и считал правильно для одной строки....безошибочно...а теперь....
Во-первых, у тебя к разделителям слов относится только пробел, а как же другие знаки пунктуации? Для каждого будешь делать свою проверку? Во-вторых, в твоей проге не учтено много ситуаций, например какой ответ будет при такой строке:
ааа ааа
? Должно выдать 3, но так как между словами 2 пробела, твоя прога даст 2... А если строка будет состоять только из одного пробела, она вообще вылетит с ошибкой Division by zero, - деление на ноль.
Так что возьми мой код и не мучься.
Сообщение отредактировано: 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
--------------------
Лао-Цзы : Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
большое тебе спасибо....но боюсь это не по моим мозговым возможностям....я сделаю все,что смогу.тебе большое очень спасибо за то,что отозвался и так помог! вот только один и последний вопрос....ибо времени все равно уже не будет....либо сдам,либо нет.
Цитата
Separators=',.!? '
почему '' стоит?Я просто с таким вообще не сталкивалась никогда....
и
Цитата
writeln(tr,s/n:0:2); {запишем результат}
что такое s/n:0:2? кста,эта прога неверно у меня посчитала. trunc надо.
почему '' стоит?Я просто с таким вообще не сталкивалась никогда....
Так мы объявляем константу-строку, тоже самое, что и переменная, но ее нельзя изменять. Если констант не учили, то объяви в 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 - обрежет дробовую часть, а как же тогда быть 2.5, 2.6, 2 - одно и тоже?
Цитата
кста,эта прога неверно у меня посчитала.
Что значит неверно? Ответ был вроде 2.00?
Цитата
что такое s/n:0:2?
Форматированный вывод. Первая цифра отвечает за количество цифр в целой части числа, вторая - дробной, 0 - для любого количества. Попробуй запустить прогу с writeln(tr,s/n) или writeln(tr,s/n:0:5), поймешь разницу...
--------------------
Лао-Цзы : Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
просто букв не может быть дробное число...среднее значение количества букв... в этой строке среднее количество букв в слове равно 2.22
Ни черта не понял...
--------------------
Лао-Цзы : Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
Форматированный вывод. Первая цифра отвечает за количество цифр в целой части числа, вторая - дробной
Ни в коем случае: первая показывает, поле какой ширины отдавать на ВСЁ число, а вторая - сколько из этого количества пойдет на представление дробной части...
Ни в коем случае: первая показывает, поле какой ширины отдавать на ВСЁ число, а вторая - сколько из этого количества пойдет на представление дробной части...
Точно..
Цитата
опять я неправа думаю.
В чем ты не права? Я не понял, что ты хотела сказать. Просто старайся меньше использовать "..."
--------------------
Лао-Цзы : Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
Цикл идет от 1 и до длинны строки. В следующим коде
(pos(buf[i-1],separators)=0)
как ты думаешь какой символ хранится в buf[i-1] при i=1? Ответ: там хранится длинна строки. Если интересно то ord(buf[0]) тоже самое, что и length(buf). Так вот, было бы не правильно, если бы мы попытались обратится к этому числу, как к символу, и чтобы не делать этой ошибки я и сделал эту проверку.
Цитата
а нет проги,которая бы сделала мне блок - схему,зная прогу?
Сильно сомневаюсь, просто одну и туже схему можно реализовать многими способами.
--------------------
Лао-Цзы : Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
Сильно сомневаюсь, просто одну и туже схему можно реализовать многими способами.
я правда видела.... блин,спасибо тебе громадное!А по каким книгам ты это все изучал?или ты по паскалю просто шарил? Так все хорошо объяснять...почему не ты у меня преподаешь!!!!!! я бы весь паскаль выучила....
А по каким книгам ты это все изучал?или ты по паскалю просто шарил?
Форум этот научил, за что ему спасибо Потусуешься здесь, сама начнешь понимать . Так что не пропадай...
--------------------
Лао-Цзы : Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
опознование разделителя и не разделителя выглядят одинаково?
Конечно нет. Как ты думаешь эта строка определяет разделитель или не разделитель?
pos(buf[i],separators)=0
--------------------
Лао-Цзы : Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.