
Новичок
Профиль
Группа: Участник
Сообщений: 26
Регистрация: 17.3.2007
Где: Мелитополь
Репутация: нет Всего: нет
|
Мне нужно написать программу подсчета частот букв и биграмм в тесте(тест написан большими буквами и без заков припинания). Вот что я делаю(вопросы отмечу в самом коде): Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls;
type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; StringGrid1: TStringGrid; OpenDialog1: TOpenDialog; Button2: TButton; Button3: TButton; Label1: TLabel; Button4: TButton; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; letters:array[0..31] of char =('А','Б','В','Г','Д','Е','Ж','З','И','Й', 'К','Л','М','Н','О','П','Р','С','Т', 'У','Ф','Х','Ц','Ч','Ш','Щ','Ы','Ь','Э', 'Ю','Я',' '); chast:array[0..31,1..2] of real;
implementation
{$R *.DFM} function poisk(x:char):integer; //функция поиска буквы var i:integer; begin for i:=0 to 32 do if x=letters[i] then begin result:=i; break;
end; end;
function poisk_bi(x,y:char):integer; //тут должна быть функция поиска биграмм, но я не знаю //как её правильно реализовать var i:integer; begin for i:=0 to 32 do for j:=0 to 32 do if x=letters[i,j] then begin result:=i; break;
end; end;
procedure TForm1.Button2Click(Sender: TObject); begin if OpenDialog1.Execute then Memo1.Lines.LoadFromFile(Opendialog1.FileName); end;
procedure TForm1.Button1Click(Sender: TObject);
var i,j,n,p,ob:integer; s:string; sum:real; begin StringGrid1.Cells[0,0]:=('Буквы'); StringGrid1.Cells[1,0]:=('Кол-во'); StringGrid1.Cells[2,0]:=('Частота');
for i:= 0 to memo1.lines.count-1 do begin //ну непосредственно подсчёт кол-ва и частот букв.. ну и далее вывод s:=memo1.lines[i]; for j:=1 to length(s) do begin n:=poisk(s[j]); chast[n,1]:=chast[n,1]+1; end; end; for i:=0 to 31 do sum:=sum+ chast[i,1]; for i:=0 to 31 do chast[i,2]:=chast[i,1]/sum;
for i:=0 to 31 do begin Stringgrid1.cells[0,i+1]:=letters[i]; StringGrid1.Cells[1,i+1]:=floattostr(chast[i,1]); StringGrid1.Cells[2,i+1]:=floaTtOSTR( chast[i,2]); end; end;
procedure TForm1.Button3Click(Sender: TObject); //сдесь мне надо сделать сортировку ,но //так чтобы в таблице буквы были //отсоритированы вместе с частотами, а не так как у меня тут получаеться. Хелп! var i,j,ob:integer;
begin for i:=0 to 31 do begin for j:=1 to 31-i do if chast[i]>chast[i+1] then begin ob:=chast[i+1]; chast[j+1]:=chast[j]; chast[j]:=ob; end; end; Stringgrid1.cells[0,i+1]:=letters[i]; StringGrid1.Cells[1,i+1]:=floattostr(chast[i,1]); StringGrid1.Cells[2,i+1]:=floaTtOSTR(chast[i,2]);
end;
procedure TForm1.Button4Click(Sender: TObject); // тут я пыталась вычислить количестов и //частоту биграмм {если кто,вдруг, не знает биграмма - это сочетания двух букв. Номер биграммы вычисляеться по формуле: у=a*m+b*(mod k), где a-первая буква биграммы, b- вторая буква, m-номер первой буквы,а k - количество букв в алфавите. Но я не могу связать эти буквы...а потом же их нужно ещё и расшифровать. Помогите, пожалст! } var i,n,m,y1,y2:integer; begin StringGrid1.Cells[3,0]:=('Биграммы'); StringGrid1.Cells[4,0]:=('Кол-во'); StringGrid1.Cells[5,0]:=('Частота');
for i:=0 to 31 do
end;
end
|
|