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.
Kirjainyhdistelmät
3
448
Vastaukset 3
- 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
Kuinkahan monen
Naisen puolisoa olet nainen vikitellyt ja eron aiheuttanut? Toivottavasti karma on ku*sut muroihisi useamman kuin kerran99939Mies, kumman ottaisit mieluummin
176 cm vai 154 cm naisen, jos molemmat muuten yhtä viehättäviä? Mikä on oma pituutesi?157896- 64740
Pettymys TTK-parketilla! Anna Hanski tippui - Sami-opelta erikoinen heitto: "Nyt sä pääset..."
Toisena parina Tanssii Tähtien Kanssa -kisasta tippuivat Anna Hanski ja Sami Helenius. Pettymys oli käsinkosketeltava y26692Anteeksi mies
En jaksa tätä…, en halua, että sinulla on paha mieli tämän takia. Viestiä Sinulle.47684Tekisi mieli vetäistä kunnon jurrit sinun kanssasi
Ja keskustella asiat, ei tästä tule hevonvttua.46654- 50628
Poliisi etsii kadonnutta henkilöä Lapualla
Henkilö on kadonnut 18-19.9.2026 välisenä yönä. Henkilö on hoikka,n 185 cm pitkä. Kadonneella on ollut katoamishetkellä32572Mieti oikeasti
Ollaan lähes tuntemattomia, mutta samalla on tämä erityinen vuosien tilanne takana, joka on ollut monella tapaa väärin.30567Olen nainen pahoillani, että tykkään sinusta niin paljon, että
Haluaisin panna sua. Tuntuu vaan siltä, että olet sen suhteen ihan haluton. Ei minulle riitä pelkkä ystävyyssuhde.37546- 31541
Oot komea
etkä näytä vanhenevan. Mieskarkki. Mä en yritä mitään, mä oon sulle liian vanha. Olis kuitenkin kiva tutustua suhun. n20533Venäjä häviämässä 30 vuoden sodan
Ukraina vapautti kolme aluetta, operaatio Vivaldi laajenee456528- 6496
Se oli molemminpuolinen limerenssi
Limerenssi myös sinulla kun näin pitkän ajan jälkeen päivystää palstaa. 🤭81489- 43483
- 44471
- 31465
- 68451
Rydman, herätys!
"Veikkauksen toimitusjohtaja Olli Sarekoski tienasi kiinteää palkkaa 445 891 euroa ja lisiä 72 157. Kuukausipalkka oli 364437