Wątek przeniesiony 2018-12-15 17:01 z Ogłoszenia drobne przez furious programming.

Analiza tekstu i zliczanie różnych znaków

0

Witam,
Mam za zadanie napisać na zajęcia program, który po wklejeniu tekstu do niego określi mi:

  • ilość cyfr w tekście
  • ile jest samogłosek
  • ile spółgłosek
  • ile znaków interpunkcyjnych
  • która litera występuje najczęściej

Kompletnie nie wiem jak się za to zabrać. Pomocy

0

Jaki język i jaki budżet przeznaczasz na jego realizację?

0

Delphi i jak najmniejszy :3

0

To zacząłbym od instalacji IDE ;) "wkleić" jak ze schowka? Potrzebujesz więc GUI np. TMemo. Tam dodasz akcję do wykrywania wklejania np. https://stackoverflow.com/questions/10158861/how-to-intercept-detect-a-paste-command-into-a-tmemo która przeliczy wszystko. Wystarczy dokonać iteracji po tekście i ikrementować liczniki np.:

spolgloski := 0
for c in yourStr do
begin
    if CharInSet(C, [wpisz tu spółgłoski]) then
         Inc(spolgloski);
end;
0
unit Unit3;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm3 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
var
s,c,spolgloski:string;
begin
 s:=Memo1.Text
 spolgloski:=0
 for c  in s do
   begin
     if charinset(c,['q','w','r','t','p','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m']) then
     inc (spolgloski)
   end;
end;

end.

Mam coś takiego a skończyć muszę na edycji editu tak aby wyświetlał wartości

0

Zadeklaruj sobie stałe przechowujące zbiory znaków – dzięki temu kod będzie czytelny, a i łatwiej będzie je określić:

const
  CHARSET_DIGITS       = ['0' .. '9'];
  CHARSET_PUNCTUACIONS = ['.', ',', ':', ';', '!', '?', '-'];
  CHARSET_VOWELS       = ['a', 'e', 'i', 'o', 'u', 'y'];
  CHARSET_CONSONANTS   = ['a' .. 'z'] - CHARSET_VOWELS;
  CHARSET_LETTERS      = CHARSET_VOWELS + CHARSET_CONSONANTS;

Teraz wystarczy w pętli iterować po znakach wejściowego ciągu i sprawdzać czy bieżący znak znajduje się w danym zbiorze. Można to zrobić za pomocą operatora in:

uses
  SysUtils;
var
  Text: String;
  Character: Char;
begin
  {..}

  Text := Text.ToLower();

  for Character in Text do
    if Character in CHARSET_DIGITS then
      // doliczamy cyferkę
    else if Character in CHARSET_VOWELS then
      // doliczamy samogłoskę
    else if Character in CHARSET_CONSONANTS then
      // doliczamy spółgłoskę
    else if Character in CHARSET_PUNCTUACIONS then
      // doliczamy znak interpunktyjny
    ;
end.

Masz jeszcze wyłonić literkę najczęściej występującą w ciągu znaków, więc przyda się tablica z licznikami dla każdej literki. Na końcu pętli sprawdzasz czy bieżący znak znajduje się w zbiorze znaków liter i inkrementujesz jej licznik. Przykład:

type
  TLetters = array ['a' .. 'z'] of Integer;
var
  Letters: TLetters;
begin
  {..}

  for Character in Text do
  begin
    if Character in CHARSET_DIGITS then
      // tu reszta drabinki

    if Character in CHARSET_LETTERS then
      Letters[Character] += 1;
  end;
end.

Na koniec wystarczy przeiterować po tablicy Letters i znaleźć licznik o największej wartości.

1 użytkowników online, w tym zalogowanych: 0, gości: 1