Версия для печати темы
Форум «Всё о Паскале» _ Задачи _ Помогите решить задачу с строками!
Автор: KolDun 18.06.2004 8:17
Дан текстовый файл. Какой буквой чаще всего начинаются слава данного текста.Ответ должен быть записан в другом текстовом файле.
Ну с файлами я справлю тока прошу помочь с:
Какой буквой чаще всего начинаются слава данного текста.
Помогите пожалуйста сильно парюсь.
Автор: Altair 18.06.2004 11:09
Мое предложение такое:
создаем массив из 26 эл-тов (кол-во букв).
Писимвольно читаем файл, если встечаем пробел, то следующую букву смотрим и увеличиваем содержимое нужной ячейки массива. (например встретилась буква A, тогда 1 эл-т массива увеличиваем.)
Потом просто смотрим, в какой ячейке массива больше значение.
--------
Это если в условии не сказанно, что буквы могут быть кирилические и заглавные.
Автор: KolDun 19.06.2004 19:46
Можно кодом записать пожалуйста так как в строках я 0 =(
Автор: HelpAusHeaven 21.06.2004 4:01
Цитата(KolDun @ 18.06.04 4:17)
Дан текстовый файл. Какой буквой чаще всего начинаются слава данного текста.Ответ должен быть записан в другом текстовом файле.
Ну с файлами я справлю тока прошу помочь с:
Какой буквой чаще всего начинаются слава данного текста.Помогите пожалуйста сильно парюсь.
Свои типы данных вводить можно?
Вообще можно и без них, чистой комбинаторикой, но получится двумерная голимотья страшно жрущая ресурсы машины))) хотя человеку это не заметно...
Автор: APAL 21.06.2004 13:40
Цитата(Oleg_Z @ 18.06.04 8:09)
Писимвольно читаем файл, если встечаем пробел, то следующую букву смотрим и ....
Не забудь про первый символ - перед ним нет пробела!
А также проверка переноса на предидущей строке...
Автор: BlackShadow 21.06.2004 14:45
Если без излишеств, то вариант предложенный Олегом выглядит примерно так:
Код
Const
Separators=[' ',',','.','!','?',':',';'];
Var
Count:Array['a'..'z'] Of Integer;
c:Char;
Max:Integer;
MaxC:Char;
f:File Of Char;
Begin
For c:='a' To 'z' Do
Count[c]:=0;
Assign(f,'In.Txt');
Reset(f);
While Not Eof(f) Do
Begin
While Not Eof(f) Do
Begin
Read(f,c);
If Not (c In Separators) Then
Break;
End;
If Not (c In Separators) Then
Inc(Count[c]);
While Not Eof(f) Do
Begin
Read(f,c);
If c In Separators Then
Break
End
End;
Close(f);
Max:=Count['a'];
MaxC:='a';
For c:='a' To 'z' Do
If (Count[c] > Max) Then
Begin
Max:=Count[c];
MaxC:=c
End;
Assign(f,'Out.Txt');
ReWrite(f);
Write(f,MaxC);
Close(f)
End.
Или что-то похожее...
Автор: APAL 21.06.2004 22:32
А вот мой вариант - вроде даже покороче будет....
Код
Var
f0,f : Text;
St,S : String;
i : Byte;
m : Array[1..30] of Word;
function IntToStr(j: Longint): String;
var
Sa: string[11];
begin
Str(j, Sa);
IntToStr := Sa;
end;
Begin
If ParamCount<1 then halt else Assign(f0,ParamStr(1));
Assign(f,'!Result.txt');
Reset(f0);
s:=''; For i:=1 to 30 do m[i]:=0;i:=1;
While Not EOF(f0) do
Begin
Readln(f0,St);
While Length(St)>0 do
If St[1]=' ' then Delete(St,1,1)
else
Begin
If Pos(UpCase(St[1]),S)=0 then
Begin
S:=S+UpCase(St[1]);
Inc(m[Length(S)]);
End
else Inc(m[Pos(UpCase(St[1]),S)]);
While (St[i]<>' ') and (i<Length(St)) do Inc(i);
Delete(St,1,i);
i:=1;
End;
End;
Close(f0);
ReWrite(f);
For i:=1 to Length(s) do Writeln(f,s[1]+' = '+IntToStr(m[i]));
Close(f);
End.
Автор: KolDun 28.06.2004 22:49
Цитата
Const
Separators=[' ',',','.','!','?',':',';'];
Var
Count:Array['a'..'z'] Of Integer;
c:Char;
Max:Integer;
MaxC:Char;
f:File Of Char;
Begin
For c:='a' To 'z' Do
Count[c]:=0;
Assign(f,'In.Txt');
Reset(f);
While Not Eof(f) Do
Begin
While Not Eof(f) Do
Begin
Read(f,c);
If Not (c In Separators) Then
Break;
End;
If Not (c In Separators) Then
Inc(Count[c]);
While Not Eof(f) Do Выкидывает ERROR1: Invalid DOS function code.
Begin
Read(f,c);
If c In Separators Then
Break
End
End;
Close(f);
Max:=Count['a'];
MaxC:='a';
For c:='a' To 'z' Do
If (Count[c] > Max) Then
Begin
Max:=Count[c];
MaxC:=c
End;
Assign(f,'Out.Txt');
ReWrite(f);
Write(f,MaxC);
Close(f)
End.
Код предоставленный Apal вообще нечего не делает =( или мне так кажется =(
Автор: APAL 29.06.2004 2:41
Цитата
Код предоставленный Apal вообще нечего не делает =( или мне так кажется =(
Еще как работает! Я тестировал.
Я уверен, что такой вывод сделан из-за того, что "кто-то" не удосужился хотя бы разобраться как работает эта програмка.
(а я думал мою "оригинальность" оценят - обидно)
Чтобы "делала":
В качестве параметра в программу передается имя входного файла. Если его нет - работа программы завершается. Если есть - она работает и результат помещает в файл !RESULT.TXT - его и смотри.
P.S.: Действительно немного обидно. Что-то делаешь - думаешь вот, человеку помог, он чего то новое узнал, научился.... А оказывается человеку это и не особо нужно, ему бы побыстрее зачет получить...
Автор: APAL 29.06.2004 2:55
По поводу передачи в программу данных как параметры:
1. Если програмку откомпилировать на диск, т.е. получить запускаемый файл с расширением EXE , то параметр задается в командной строке.
Пример:
MYPROG.EXE InFile.txt
где InFile.txt - это и есть параметр
2. Если вы находитесь на стадии отладки программы и Вам нужно передать параметры в нее, то для этого используйте меню:
Run -> Parameters
в появившемся окошке вбейте нужные параметры. Если взять пример выше, то вбить следует InFile.txt.
Параметры отделяются друг от друга пробелом.
Автор: KolDun 29.06.2004 4:43
Цитата
uses crt;
Var
f0,f : text;
St,S : String;
i : Byte;
m : Array[1..30] of Word;
function IntToStr(j: Longint): String;
var
Sa: string[11];
begin
Str(j, Sa);
IntToStr := Sa;
end;
Begin
If ParamCount<1 then halt else Assign(f0,'in.txt');
Assign(f,'in2.txt');
Reset(f0);
s:=''; For i:=1 to 30 do m[i]:=0;i:=1;
While Not EOF(f0) do
Begin
Readln(f,St);
While Length(St)>0 do
If St[1]=' ' then Delete(St,1,1)
else
Begin
If Pos(UpCase(St[1]),S)=0 then
Begin
S:=S+UpCase(St[1]);
Inc(m[Length(S)]);
End
else Inc(m[Pos(UpCase(St[1]),S)]);
While (St[i]<>' ') and (i<Length(St)) do Inc(i);
Delete(St,1,i);
i:=1;
End;
End;
Close(f0);
ReWrite(f);
For i:=1 to Length(s) do Writeln(f,s[1]+' = '+IntToStr(m[i]));
Close(f);
End.
Програму я записал так.
В файле in.txt записанно:
Hwllow My wordld wholw things
По товим словам программа в файл In2.txt должна записать букву w.
Но этого не происходит
Вышесказанными словами я не хочу обижать тебя и твой талант програмирование. и в предпоследнем топе я не имел ввиду что программа плохая так как она не работает у меня. Я сразу дописал что я что-то не так делаю, просто я програмирую не так уж долга и всех функций не знаю, и проект по Паскалю у меня большой это одно задание из 10 и на над ним я бился 2 дня прежде чем написать сюда.
Я не хочу сор и оскарблением, и не говорю что код полхой, просто у меня что-то не получается...
Автор: KolDun 29.06.2004 4:46
Цитата(APAL @ 28.06.04 22:55)
По поводу передачи в программу данных как параметры:
1. Если програмку откомпилировать на диск, т.е. получить запускаемый файл с расширением EXE , то параметр задается в командной строке.
Пример:
MYPROG.EXE InFile.txt
где InFile.txt - это и есть параметр
2. Если вы находитесь на стадии отладки программы и Вам нужно передать параметры в нее, то для этого используйте меню:
Run -> Parameters
в появившемся окошке вбейте нужные параметры. Если взять пример выше, то вбить следует InFile.txt.
Параметры отделяются друг от друга пробелом.
Спосибо заработало. Но хочу чтобы и твоя заработала.
Автор: APAL 29.06.2004 16:17
Assign(f,'in2.txt'); исправь на Assign(f0,'in2.txt'); - это твоя ошибка
Здесь опечатка:
For i:=1 to Length(s) do Writeln(f,s[1]+' = '+IntToStr(m[i]));
замени на
For i:=1 to Length(s) do Writeln(f,s[i]+' = '+IntToStr(m[i])); - это моя ошибка
И т.к. ты задаешь имя входного файла жестко, то
If ParamCount<1 then halt else Assign(f0,'in.txt');
можно сократить до
Assign(f0,'in.txt'); - это оптимизация
Автор: APAL 29.06.2004 16:18
Вот что у меня получилось в файле in2.txt для твоей строки "Hwllow My wordld wholw things":
Цитата
H = 1
M = 1
W = 2
T = 1
P.S.: Извини вспылил.
Я вобще миролюбивый!
Удачи тебе в изучении TP.
P.P.S.: Вывод в файл происходит сразу всех букв с указанием сколько раз каждая встречается. Ты сможешь сам написать поиск "самой частовстречающейся буквы"? Или надо помочь?
Автор: BlackShadow 29.06.2004 16:21
KolDun, посмотрю дома. Завтра выложу.