![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Статистика использования символов в файле [D7]
xrumas © (2011-12-10 13:02:00)Файл, содержащая произвольный русский текст, состоит не более чем из 200 символов. Написать, какие буквы и сколько раз встречаются в этом тексте. Ответ должен приводиться в грамматически правильной форме, например а — 25 раз, к — 3 раза и т.д.
По примерам, найденым сдесь написал программу, считает все правельно, НО, как сделать что бы был вывод правильный Ответ должен приводиться в грамматически правильной форме, например а — 25 раз, к — 3 раза
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
const
//buffer, inache zavisaet
BLenMax = 100000;
//mnozhestvo russkih bukv
D = ['À'..'Ï', 'Ð'..'ß', '¨'];
var
F : File;
Buff : array of Char;
AStat : array[Char] of Integer;
Ch : Char;
i, BLenRes : Integer;
razi : string;
begin
if OpenDialog1.InitialDir = '' then
OpenDialog1.InitialDir := ExtractFilePath( Application.ExeName )
;
if not OpenDialog1.Execute then Exit;
if not FileExists(Opendialog1.FileName) then begin
MessageDlg(
'ôàéë ñ òàêèì èìåíåì íå íàéäåí',
mtWarning, [mbOk], 0
);
Exit;
end;
//obnilyaem massiv
for Ch := #0 to #255 do AStat[Ch] := 0;
SetLength(Buff, BLenMax);
//Open and read selected file
AssignFile(F, OpenDialog1.FileName);
Reset(F, 1);
while not Eof(F) do begin
BlockRead(F, Pointer(Buff)^, BLenMax, BLenRes);
for i := 0 to BLenRes - 1 do begin
Ch := AnsiUpperCase(Buff[i])[1];
Inc(AStat[Ch]);
end;
end;
CloseFile(F);
//vivod v memo1
Memo1.Lines.Add('Èñïîëüçîâà 37;û áóêâû:');
for Ch := #0 to #255 do begin
if not (Ch in D) then Continue;
Memo1.Lines.Add('Буква: "' + Ch + '", использована = ' + IntToStr(AStat[Ch]));
end;
end;
end.
В вывод нужно добавить что то вроде такого, но как вставить это вывод не знаю:
if mod 2,3,4 then raza
if mod 5,6,7,8,9 then raz
if 4uslo mod 10=1 then raz
xrumas (2011-12-10 23:10:00) [1]
> пример [11] для кого?
Блин, ларчик то просто открывался, по вашему примеру сделал первоначальную функцию, которая была у меня.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
OpenDialog1: TOpenDialog;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
function RaziliRazi(N: cardinal): string;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.RaziliRazi(N: cardinal): string;
begin
if (N in [5..21]) or ((N mod 10) in [0, 1, 5..9]) then
Result := 'раз'
else
Result := 'раза';
end;
procedure TForm1.Button1Click(Sender: TObject);
const
//buffer, inache zavisaet
BLenMax = 100000;
//mnozhestvo russkih bukv
D = ['А'..'П', 'Р'..'Я', 'Ё'];
battle: array[0..2] of string=(' ðàç',' ðàç',' ðàçà');
var
F : File;
Buff : array of Char;
AStat : array[Char] of Integer;
Ch : Char;
i, BLenRes : Integer;
begin
if OpenDialog1.InitialDir = '' then
OpenDialog1.InitialDir := ExtractFilePath( Application.ExeName )
;
if not OpenDialog1.Execute then Exit;
if not FileExists(Opendialog1.FileName) then begin
MessageDlg(
'Файл не найден',
mtWarning, [mbOk], 0
);
Exit;
end;
//obnгlyaem massiv
for Ch := #0 to #255 do AStat[Ch] := 0;
SetLength(Buff, BLenMax);
//Open and read selected file
AssignFile(F, OpenDialog1.FileName);
Reset(F, 1);
while not Eof(F) do begin
BlockRead(F, Pointer(Buff)^, BLenMax, BLenRes);
for i := 0 to BLenRes - 1 do begin
Ch := AnsiUpperCase(Buff[i])[1];
Inc(AStat[Ch]);
end;
end;
CloseFile(F);
//vivod v memo1
Memo1.Lines.Add('Использованы буквы:');
for Ch := #0 to #255 do begin
if not (Ch in D) then Continue;
Memo1.Lines.Add('Буква: "' + Ch + '", использована = ' + IntToStr(AStat[Ch]) + ' ' + RaziliRazi(AStat[Ch]));
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
form1.close;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
memo1.Clear;
end;
end.
Плохиш (2011-12-10 23:00:00) [2]Ты выпендривайся, выпендривайся. Проблема-то у тебя.
xrumas (2011-12-10 22:55:00) [3]
> > Файл, содержащая
> ..
> > найденым сдесь написал
>
>
> Спасибо :
> Cегодня я буду спать тоже спокойно, т.к. есс-ный отбор продолжает
> работать и это правильно.
>
>
> > Ответ должен приводиться в грамматически правильной форме
>
>
> Вопрос - тем более.
>
>
Ок, грамарнази, ваше мнение очень интересно.
Jeer (2011-12-10 22:45:00) [4]
> Файл, содержащая
..
> найденым сдесь написал
Спасибо :
Cегодня я буду спать тоже спокойно, т.к. есс-ный отбор продолжает работать и это правильно.
> Ответ должен приводиться в грамматически правильной форме
Вопрос - тем более.
Sha (2011-12-10 22:27:00) [5]пример [11] для кого?
xrumas (2011-12-10 22:26:00) [6]
> это потому, что надо выводить бутылки
> procedure TForm1.Button4Click(Sender: TObject);
> const
> battle: array[0..2] of string=(' бутылок',' бутылка','
> бутылки');
> var
> i: integer;
> begin;
> for i:=0 to 100 do Memo1.Lines.Add(IntToStr(i)+battle[RussianGrammarEnding(i)]);
>
> end;
К сожалению все то же самое :)
Я похоже функцию не так вставляю.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
OpenDialog1: TOpenDialog;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
function Raz(n: integer): integer;
// function RaziliRazi(N: cardinal): string;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.Raz(n: integer): integer;
begin;
Result:=0; //áóòûëîê
n:=abs(n) mod 100;
if (n>=11) and (n=2) and (n
Sha (2011-12-10 22:20:00) [7]battle - это все WarCraft, блин
Sha (2011-12-10 22:18:00) [8]это потому, что надо выводить бутылки
procedure TForm1.Button4Click(Sender: TObject);
const
battle: array[0..2] of string=(' бутылок',' бутылка',' бутылки');
var
i: integer;
begin;
for i:=0 to 100 do Memo1.Lines.Add(IntToStr(i)+battle[RussianGrammarEnding(i)]);
end;
xrumas (2011-12-10 21:58:00) [9]
> function EhRazEscheRazEscheMnogoMnogoRaz(N: cardinal): string;
>
> begin
> if (N in [5..21]) or ((N mod 10) in [0, 1, 5..9]) then
> Result := 'раз';
> else
> Result := 'раза';
> end;
>
>
Не получаеться так, всегда выводит раз.
Sha (2011-12-10 20:09:00) [10]
function RussianGrammarEnding(n: integer): integer;
begin;
Result:=0; //бутылок
n:=abs(n) mod 100;
if (n>=11) and (n<=14) then exit;
n:=n mod 10;
if n=1 then Result:=1 //бутылка
else if (n>=2) and (n<=4) then Result:=2; //бутылки
end;
xrumas (2011-12-10 19:55:00) [11]
> Грамматически правильно в современном языке - букаф. Многа
> букаф. Низнаю букаф.
Не суть, исправленно после копипаста.
Inovet (2011-12-10 19:48:00) [12]> [6] xrumas © (10.12.11 18:03)
> Букыв
Грамматически правильно в современном языке - букаф. Многа букаф. Низнаю букаф.
xrumas (2011-12-10 18:03:00) [13]
Memo1.Lines.Add('Букыв: "' + Ch + '", используется = ' + IntToStr(AStat[Ch])+' '+RaziliRazi(N));
xrumas (2011-12-10 17:35:00) [14]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
OpenDialog1: TOpenDialog;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
function RaziliRazi(N: cardinal): string;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.RaziliRazi(N: cardinal): string;
begin
if (N in [5..21]) or ((N mod 10) in [0, 1, 5..9]) then
Result := 'ðàç'
else
Result := 'ðàçà';
end;
procedure TForm1.Button1Click(Sender: TObject);
const
//buffer, inache zavisaet
BLenMax = 100000;
//mnozhestvo russkih bukv
D = ['À'..'Ï', 'Ð'..'ß', '¨'];
var
F : File;
Buff : array of Char;
AStat : array[Char] of Integer;
Ch : Char;
n, i, BLenRes : Integer;
begin
if OpenDialog1.InitialDir = '' then
OpenDialog1.InitialDir := ExtractFilePath( Application.ExeName )
;
if not OpenDialog1.Execute then Exit;
if not FileExists(Opendialog1.FileName) then begin
MessageDlg(
'ôàéë ñ òàêèì èìåíåì íå íàéäåí',
mtWarning, [mbOk], 0
);
Exit;
end;
//obnilyaem massiv
for Ch := #0 to #255 do AStat[Ch] := 0;
SetLength(Buff, BLenMax);
//Open and read selected file
AssignFile(F, OpenDialog1.FileName);
Reset(F, 1);
while not Eof(F) do begin
BlockRead(F, Pointer(Buff)^, BLenMax, BLenRes);
for i := 0 to BLenRes - 1 do begin
Ch := AnsiUpperCase(Buff[i])[1];
Inc(AStat[Ch]);
end;
end;
CloseFile(F);
//vivod v memo1
Memo1.Lines.Add('Èñïîëüçîâà 37;û áóêâû:');
for Ch := #0 to #255 do begin
if not (Ch in D) then Continue;
Memo1.Lines.Add('Áóêâà: "' + Ch + '", Èñïîëüçîâàëàñ 252; = ' + IntToStr(AStat[Ch])+' '+Inttostr(RaziliRazi(N));
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
form1.close;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
memo1.Clear;
end;
end;
end.
Юрий Зотов (2011-12-10 17:03:00) [15]
> xrumas © (10.12.11 16:51) [3]
Наверное, надо показать, как Вы ее встраиваете? Тем более, что ноль она выводить не может в принципе.
xrumas (2011-12-10 16:51:00) [16]
> Юрий Зотов © (10.12.11 16:11) [2]
>
> > xrumas © (10.12.11 13:02)
>
> Что-то вроде этого:
>
> function EhRazEscheRazEscheMnogoMnogoRaz(N: cardinal): string;
>
> begin
> if (N in [5..21]) or ((N mod 10) in [0, 1, 5..9]) then
> Result := 'раз';
> else
> Result := 'раза';
> end;
Что то не получаеться вашу функцию встроить правильно в программу, или 0 выводит или просто пробелы.
Юрий Зотов (2011-12-10 16:11:00) [17]
> xrumas © (10.12.11 13:02)
Что-то вроде этого:
function EhRazEscheRazEscheMnogoMnogoRaz(N: cardinal): string;
begin
if (N in [5..21]) or ((N mod 10) in [0, 1, 5..9]) then
Result := 'раз';
else
Result := 'раза';
end;
Dimka Maslov (2011-12-10 15:14:00) [18]Двойственное число, которое выродилось в большинстве славянских языков, тем не менее существует в форме использования различных падежей множественного числа, и имеет строго формализуемые правила:
Если числительное оканчивается на 2, 3 или 4 - используется форма именительного падежа множественного числа. Если числительное оканчивается на 1 - именительный падеж единственного числа. Но, если числительное оканчивается на 11, 12, 13 или 14 - используется родительный падеж множественного числа, как и во всех остальных случаях
Например:
1 раз
2 раза
3 раза
4 раза
5 раз
6 раз
..
10 раз
11 раз
12 раз
13 раз
14 раз
15 раз
....
20 раз
21 раз
22 раза
23 раза
24 раза