Kirjainyhdistelmät

WaeltajaW

Yleistä Ohjemoinnissa oli esillä kirjainyhdistelmistä eli tehtävänä oli muodostaan sanojen kirjaimista
aina kaksi kirjainta peräkkäin olevia yhdistelmiä ja laskea niiden määrä tekstistä.

Tässä on tarkoitus keskustella vain Pascal-kielisestä toteutuksesta.

3

401

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • WaeltajaW

      Kokeilin tälläistä ratkaisua koska Pascal saallii taulukon koon määrittelyn myös merkkeinä.
      Ideana tässä koodissa on että sanat on TStringList-tyyppisessä oliossa ja tuloksenkin voi työntää
      TStringList olioon. Koodista puuttuu skandimerkkien käsittely. Se on tarkoituksella jätetty pois.
      Se voidaan toteuttaa niin kuin ennenvanhaan eli merkkien {,| ja } tilalla on ääkköset. Mutta
      monella muullakin tapaa.

      type // tyyppien määrittely


      TKP1=Class
      private
      lkm:array['a'..'}'] of integer;
      public
      constructor Create;
      procedure Add(ch:char);
      function KerroLKM(ch:char):integer;
      end;

      { TKP }

      TKP =Class
      private
      destructor Free;
      procedure kasitteleErikoisTapaukset(mjono: string);
      function KerroSanojenMaara(s: string): integer;
      function onaz(ch:char):boolean;
      tau:array ['a'..'}'] of TKP1;
      procedure sana(s: string);
      function tarkistaMerkit(s: string): boolean;
      public
      constructor Create;
      procedure Add(kaksiMerkkia:string);
      end;

      { TForm1 }

      TForm1 = class(TForm)
      Button1: TButton;
      Label1: TLabel;
      Memo1: TMemo;
      Memo2: TMemo;
      procedure Button1Click(Sender: TObject);
      procedure FormCreate(Sender: TObject);
      procedure FormDestroy(Sender: TObject);
      private
      { private declarations }
      merkkiYhdistelmat:TKP;
      sanat:TStringList;
      procedure KerroMerkkiYhdistelmienEsiintymiset;
      procedure LueSanatStringListiin;
      procedure VieSanakerrallaanTutkittavaksi;
      public
      { public declarations }
      end;


      .............


      ja varsinainen toteutusosa:


      constructor TKP1.Create;
      var ch:char;
      begin
      for ch:= 'a' to '}' do lkm[ch]:=0;
      end;

      procedure TKP1.Add(ch:char);
      begin
      lkm[ch]:=lkm[ch] 1;
      end;

      function TKP1.KerroLKM(ch:char):integer;
      begin
      result:=lkm[ch];
      end;

      constructor TKP.Create;
      var ch:char;
      begin
      for ch:= 'a' to '}' do tau[ch]:= TKP1.Create;
      end;

      procedure TKP.add(kaksiMerkkia:string);
      var mjono:string; ch1,ch2:char;
      ok:boolean;
      begin
      mjono:=lowercase(kaksiMerkkia);
      if tarkistaMerkit(mjono)
      then tau[mjono[1]].Add(mjono[2])
      else kasitteleErikoisTapaukset(mjono);
      end;

      function TKP.onaz(ch:char):boolean;
      begin
      if ch in['a'..'z']
      then result := true
      else result := false;
      end;

      function TKP.tarkistaMerkit(s:string):boolean;
      begin
      if onaz(s[1]) and onaz(s[2])
      then result := true
      else result := false;
      end;

      procedure TKP.kasitteleErikoisTapaukset(mjono:string);
      begin
      end;

      function TKP.KerroSanojenMaara(s:string):integer;
      begin
      if tarkistaMerkit(s)
      then result :=tau[s[1]].KerroLKM(s[2]);
      end;

      procedure TKP.sana(s:string);
      var mjono:string;
      paikka:integer;
      begin
      paikka :=1;
      for paikka :=1 to length(s) do
      begin
      mjono := copy(s,paikka,2);
      add(mjono);
      end;
      end;

      destructor TKP.Free;
      var ch:char;
      begin
      for ch:= 'a' to '}' do tau[ch].Free;
      end;

      procedure TForm1.Button1Click(Sender: TObject);
      begin
      LueSanatStringListiin;
      VieSanakerrallaanTutkittavaksi;
      KerroMerkkiYhdistelmienEsiintymiset;
      end;

      procedure TForm1.LueSanatStringListiin;
      begin
      Sanat.Text:=Memo1.Text;
      end;

      procedure TForm1.VieSanakerrallaanTutkittavaksi;
      var i:integer ;
      begin
      for i:=0 to sanat.count-1 do
      merkkiYhdistelmat.Sana(sanat[i]);
      end;

      procedure TForm1.KerroMerkkiYhdistelmienEsiintymiset;
      var ch1,ch2:char; mjono:string; i:integer;
      begin
      for ch1 := 'a' to 'z' do
      for ch2 := 'a' to 'z' do
      begin
      mjono:=ch1 ch2;
      i:=merkkiYhdistelmat.KerroSanojenMaara(mjono);
      if i > 0 then Memo2.Lines.add(mjono ' :' IntToStr(i));
      end;
      end;

      procedure TForm1.FormCreate(Sender: TObject);
      begin
      merkkiYhdistelmat := TKP.Create;
      sanat := TStringList.Create;
      end;

      procedure TForm1.FormDestroy(Sender: TObject);
      begin
      sanat.Free;
      merkkiYhdistelmat.Free;
      end;

      • RikuR

        Vai on muutkin olleet kiinnostuneita kirjainyhdistelmistä kuin minä.

        Pascal / Delphi akseli on itsellä aika pimennossa ja neuvot ovat tarpeen mikäli tämän kääntää.

        Koodi tarvitsisi melkein täydellisen kommentoinnin että siintä amatööri saa edes mitään tolkkua.

        Hmmm. WaeltajaW jos viitsit vielä helppiä lisää että itse saisin kanssa toimimaan.
        Olet varmaan testannut koodin toimivaksi? Koodi näyttää hyvältä kuhan siintä jotain ymmärtäisi.


      • M_aave_M
        RikuR kirjoitti:

        Vai on muutkin olleet kiinnostuneita kirjainyhdistelmistä kuin minä.

        Pascal / Delphi akseli on itsellä aika pimennossa ja neuvot ovat tarpeen mikäli tämän kääntää.

        Koodi tarvitsisi melkein täydellisen kommentoinnin että siintä amatööri saa edes mitään tolkkua.

        Hmmm. WaeltajaW jos viitsit vielä helppiä lisää että itse saisin kanssa toimimaan.
        Olet varmaan testannut koodin toimivaksi? Koodi näyttää hyvältä kuhan siintä jotain ymmärtäisi.

        Ensin pitää ymmärtää minkälaista Pascal-ohjelmointi perustasolla on.
        Parhaiten sen tajuaa itse kokeilemalla.

        Eli ensin tehdään graafinen käyttöliittymä tuomalla ikkunaan (tässä ikkuna, lomake ja form ovat samoja asioita) tarvittavat käyttöliittymäelementit.

        Kuten esim. tässä on tuotu painonappi (button1), (periaatteessa) yksirivinen tekstikenttä (label1) ja
        kaksi monirivistä tekstikenttää eli muistiota (memo1 ja memo2).

        Käyttöliittymän teko on (Delphissä ja Lazaruksessa) yhtä helppoa (tai samanlaista) kuin piirto-ohjelmien käyttö.

        Kun käyttöliittymä on saatu halutunlaiseksi niin sitten näille käyttöliittymäelementeille luodaan
        tapahtumia. Esim painonapille klikkaus.

        Tuossa on myös tapahtumat ikkunnan luonnin (procedure TForm1.FormCreate)ja sen sulkemisen (procedure TForm1.FormDestroy) yhteydessä.

        Tämän jälkeen täydennetään muu koodi.


        Ohjelma alkaa ikkunan luonnilla (procedure TForm1.FormCreate) jossa luodaan (ikkunan luonnin ohella) kaksi oliota (merkkiYhdistelmat ja sanat).

        Tämän jälkeen ei tapahdu "mitään" muuta kuin odotetaan kunnes käyttäjä painaa nappia. Napin painalluksen (procedure TForm1.Button1Click(Sender: TObject); ) yhteydessä suoritetaan "aliohjelmat": LueSanatStringListiin, VieSanakerrallaanTutkittavaksi ja KerroMerkkiYhdistelmienEsiintymiset

        Sitten kun ohjelma lopetetaan (procedure TForm1.FormDestroy) vapautetaan luodut oliot.

        Aliohjelma LueSanatStringListiin lukee memosta siellä olevan tekstin.

        Aliohjelma procedure TForm1.VieSanakerrallaanTutkittavaksi ottaa aina yhden sanan kerrallaan ja antaa sen
        merkkiYhdistelmat olion sana metodille (aliohjelmalle). Tässä (procedure TKP.sana(s:string);) metodissa
        käydään sana kirjain kerrallaan kahden kirjaimen osissa läpi. Siis jos sana on astia niin läpi käynti tapahtuu näin: as st ti ia

        Nämä kahden kirjaimen palaset annetaan metodille (procedure TKP.add) joka muuttaa kaikki kirjaimet pieniksi
        ja vie ne taulukkoon joka on aakkosjärjestyksessä.


        Aliohjelma KerroMerkkiYhdistelmienEsiintymiset tulostaa aakkosjärjestyksessä ne kahden kirjaimen merkkiyhdistelmät joita esiintyy Memo2:seen.


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Jalankulkija kuoli. Poliisi etsii mustaa BMW Coupe -autoa, jossa on punertavat vanteet.

      Jalankulkija kuoli jäätyään auton alle Joensuussa – kuljettaja pakeni, poliisi pyytää havaintoja https://www.mtvuutiset.
      Joensuu
      135
      3180
    2. Mikä vasemmistolaisista jankkaavaa vaivaa?

      Pahasti on ihon alle, siis korvien väliin sinne tyhjään tilaan, päässeet kummittelemaan. Ei ole terveen ihmisen merkki
      Maailman menoa
      9
      2985
    3. Ohjelma "Rikollisjengien Ruotsi" hyvin paljasti jakautuneen maan

      eli ns. ruotsalaiset yhdellä puolella, muslimit ja muut kehitysmaalaiset toisella puolella. Siinäkin hyvin näki mitä ma
      Maailman menoa
      24
      2734
    4. Vassarina hymyilyttää vaurastuminen persujen kustannuksella

      Olen sijottanut määrätietoisesti osan Kelan tuista pörssiosakkeisiin, ja salkku on paisunut jo toiselle sadalle tuhanne
      Maailman menoa
      48
      2604
    5. Riikka runnoo: Elisalta potkut 400:lle

      Erinomaisen hallitusohjelman tavoite 100 000 työllistä lisää yksityisellä sektorilla on kohta saavutettu. Toivotaan toiv
      Maailman menoa
      86
      2486
    6. PÄIVÄN PARAS: Nigerialainen haki turvapaikkaa Suomesta, lähti takas huilaamaan

      kotimaahansa, koska turvapaikan saaminen kesti niin kauan. Ja tämän kertoo ihan Yle, eikä yhtään toimittaja kyseenalaist
      Maailman menoa
      47
      2440
    7. Pidennetään viikko 8 päiväiseksi

      Ja jätetään työpäivien määrä nykyiseen 5:een. Tuo olisi kompromissiratkaisu vellovaan keskusteluun työajan lyhentämisest
      Maailman menoa
      10
      2284
    8. Pääseekö kuka tahansa hoitaja katselemaan kenen tahansa ihmisen terveystietoja?

      "Meeri selaili puhelinta uteliaisuuttaan ja katuu nyt – Moni hoitaja on tehnyt saman rikoksen Tuttujen ihmisten asiat k
      Maailman menoa
      80
      1952
    9. Niinistö neliraajajarrutteli Natoon liittymistä vielä sodan alettua

      Myöntää nyt itsekin, mikä jo aikaisemmin tiedettiin. Marin vei Suomen ja Ruotsin Natoon. "”Myönnän auliisti jarruttelle
      Maailman menoa
      199
      1808
    10. Nainen rakas

      Mulle on alkanut tulla sellainen olo että meistä tulee ehkä pariskunta vielä 😌
      Ikävä
      134
      1715
    Aihe