Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Статистика использования символов в файле [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 раза


Наверх

Титульная страница Поиск, карта сайта Написать письмо