Помогите горит

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
krot56
Сообщения: 4
Зарегистрирован: 28 янв 2007, 15:03

Народ помогите решить задачи на pascal:
проанализировать текст хранящийся в файле:
А) подсчитать количество строк, длина которых меньше 10 символов.
В) в каждой строке подсчитать количество слов ( слова разделены пробелами), вывести на печать номер строки и количество слов;
С) переписать файл таким образом, чтобы в каждой строке поменять местами первое и последнее слова.

Что нужно что бы он считал строки длина которых меньше 10 символов ОТРЕДАКТИРУЙТЕ;

Program n9;
Uses Crt;
Var
f: text;
file_name,
s: string;
i,commas,points,blanks,lines: integer;

Begin
ClrScr;
commas := 0;
points := 0;
blanks := 0;
lines := 0;
Write ('введите имя файла:');
ReadLn (file_name);
Assign (f, file_name);
Reset (f);
while not Eof (f) do
begin
ReadLn (f, s);
for i := 1 to Length (s) do
begin
case s of
',': Inc (commas);
'.': Inc (points);
' ': Inc (blanks);
end;
end;
Inc (lines);
end;
Close (f);
GotoXY (1, 3);
WriteLn ('количество запятых: ', commas);
WriteLn ('количество предложений: ', points);
WriteLn ('количество пробелов : ', blanks);
WriteLn ('количество строк: ', lines);
WriteLn ('Enter');
ReadLn;
End.


как вывести на печать номер строки и количество слов ОТРЕДАКТИРУЙТЕ;

program z38;
uses crt;
label m;
var i,l,k : longint;
a,s,tt,c : string;
fail : text;
begin
clrscr;
assign(fail,'file_1.pas');
reset(fail);
readln(fail,a);
{-- Кол-во слов: --}
REPEAT
c:=a;
l:=length(a);
m:for i:=1 to l do
if (a=' ')and(a[i+1]=' ')
then begin
delete(a,i,1);l:=l-1;goto m;
end;
if a[1]=' 'then begin delete(a,1,1);l:=l-1; end;
if a[l]<>' ' then begin inc(l);a[l]:=' '; end;
for i:=1 to l do if a=' 'then inc(k);
readln(fail,a);
UNTIL c=a;
dec(k);str(k,s);
tt:=' кол-во слов в файле: '+s;
write(tt);
readln;
append(fail);
writeln(fail,tt);
close(fail);
end.
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

первое делается в пять строк
count:=0
repeat
readln(f,s);
if length(s)<10 then inc(count);
end;
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
krot56
Сообщения: 4
Зарегистрирован: 28 янв 2007, 15:03

Хыиуду писал(а):первое делается в пять строк
count:=0
repeat
readln(f,s);
if length(s)<10 then inc(count);
end;
Огромное спасибо!
Аватара пользователя
Oleg_Rus
Сообщения: 335
Зарегистрирован: 16 окт 2006, 09:56
Откуда: г.Улан-Удэ, респ.Бурятия, Российская Федерация
Контактная информация:

В) решается довольно просто:
строишь цикл по-строчно, а дальше я приведу код:

Number:=0; // Обнуление Данных
Flag:=True;
Text:=Edit1.Text; //Чтение Текста
For i:=1 to Length(Text) Do //Цикл По-Буквенно
Begin
Letter:=Text; //Раcсматриваем i-тый символ текста
If (Letter<>' ') and Flag Then Number:=Number+1;
//Если текущий символ не равен <пробелу> и Flag=1
//то увеличивай количество Слов
Flag:=(Letter=' ');
End;

Должно сработать!
e-mail: garmayev@yandex.ru
---------------------------------------------------------------------------
<a href="http://nick-name.ru/sertificates/711965/"><img src="http://nick-name.ru/img.php?nick=Garmay ... =2&text=t5" alt="Никнейм Garmayev зарегистрирован!" /></a>
Аватара пользователя
Oleg_Rus
Сообщения: 335
Зарегистрирован: 16 окт 2006, 09:56
Откуда: г.Улан-Удэ, респ.Бурятия, Российская Федерация
Контактная информация:

С) еще проще:
строишь два цикла While навстречу друг другу (один - от 1 до Length(s), другой - от Length(s) до 1) пока S<>' ' тогда забивай их в другие переменные, удаляй из исходника и вставляй...
e-mail: garmayev@yandex.ru
---------------------------------------------------------------------------
<a href="http://nick-name.ru/sertificates/711965/"><img src="http://nick-name.ru/img.php?nick=Garmay ... =2&text=t5" alt="Никнейм Garmayev зарегистрирован!" /></a>
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Oleg_Rus писал(а):В) решается довольно просто:
строишь цикл по-строчно, а дальше я приведу код:

Number:=0; // Обнуление Данных
Flag:=True;
Text:=Edit1.Text; //Чтение Текста
For i:=1 to Length(Text) Do //Цикл По-Буквенно
Begin
Letter:=Text; //Раcсматриваем i-тый символ текста
If (Letter<>' ') and Flag Then Number:=Number+1;
//Если текущий символ не равен <пробелу> и Flag=1
//то увеличивай количество Слов
Flag:=(Letter=' ');
End;

Должно сработать!


Строго говоря, эта процедура считает словами все, что окаймлено двумя пробелами. В том числе и знаки препинания. Поэтому во фразе "Кошка - это зверь" она найдет 4 слова (включая тире). Если исключать все знаки препинания, то код меняется так:
1. Вводится какая-нибудь константа, например, const delims=' -,.!?()';
2. (Letter<>' ') заменяется на (pos(letter,delims)=0)
3. Соответственно (Letter=' ') заменяется на (pos(letter,delims)<>0)
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
Oleg_Rus
Сообщения: 335
Зарегистрирован: 16 окт 2006, 09:56
Откуда: г.Улан-Удэ, респ.Бурятия, Российская Федерация
Контактная информация:

Блин, всегда про знаки препинания забываю!!!
e-mail: garmayev@yandex.ru
---------------------------------------------------------------------------
<a href="http://nick-name.ru/sertificates/711965/"><img src="http://nick-name.ru/img.php?nick=Garmay ... =2&text=t5" alt="Никнейм Garmayev зарегистрирован!" /></a>
Ответить