Hogyan oldhatom meg az karaktersorozat ékezettelenítését free pascal-ban?
Íme a kód, csak épp a közepében lévő pozícióegyeztetés elhasal azon, hogy a az angol és a magyar változó nem egyforma hosszú. (szebb, behúzásos változat)
function ekezettelen(szoveg:string):string;
var magyar,angol: string;
f,m: Byte;
begin
m:=0;
magyar:='áéíóöőúüűÁÉÍÓÖŐÚÜŰ';
angol:= 'aeiooouuuAEIOOOUUU';
for f:=1 to length(szoveg) do begin
Write(szoveg[f]);
m:=pos(szoveg[f],magyar);
WriteLn(m,' ',szoveg[f],' ');
if (m<>0) then szoveg[f]:=angol[m];
m:=0;
end;
ekezettelen:=szoveg;
end;
begin
write(ekezettelen('Árvíztűrő tükörfúrógép'));
end.
- 5494 megtekintés
Hozzászólások
ezzel nem menne egyszrubben? : http://www.freepascal.org/docs-html/rtl/strutils/stringsreplace.html , a ket tombbe betolod az ekezetes es az ekezetlen betuket.
- A hozzászóláshoz be kell jelentkezni
elvileg de igen
(valamiért nem toom futtani:
egy.pas(8,58) Error: Identifier not found "rfReplaceAll"
a hívás meg ilyen:
uses strutils;
var egy,ketto: array [1..2] of string;
begin
egy[1]:='Egy-egy';
egy[2]:='Egy-kettő';
ketto[1]:='Kettő-egy';
ketto[2]:='Kettő-kettő';
WriteLn(StringsReplace('Egy-egy',egy,ketto,[rfReplaceAll]));
end.
azonban oktatási céllal kéne... szóval, azon felül, hogy mit rontok el most, érdekelne az eredeti kérdésre is a válasz..
- A hozzászóláshoz be kell jelentkezni
Bár én nem használok FreePascal-t, de Delphi 2010-et igen, nem tudom van-e WideString típus ott, arra átkonvertálva (ami automatikus D2010 alatt) már működni kéne a pozícionálásnak, mivel abban a típusban fix hosszúságúak a karakterek. Vagy egy PWideChar tömbbe a következő függvénnyel: StringToWideChar().
Nem próbáltam ki, de erre tapogatóznék:
http://www.freepascal.org/docs-html/rtl/system/stringtowidechar.html
Üdv.
Attila, Perger
-----------------------------------------------------
"Az a szoftver, amelyiket nem fejlesztik, az halott!"
- A hozzászóláshoz be kell jelentkezni
"már működni kéne a pozícionálásnak, mivel abban a típusban fix hosszúságúak a karakterek"
Nem megy sajnos, és asszem értem is, hogy miért: külön hasonlítja össze az első és a második bájtot.
még egy példa:
-------------------
var a: widestring;
begin
a:='Áá';
writeln('a hossza: ',length(a));
writeln('1:',a[1]);
writeln('2:',a[1],a[2]);
end.
-------------------
$./widestring
a hossza: 4
1:
2:Á
Hogy magyarázzam meg a pascalnak, hogy ha widestring, akkor két bájt egy betű, és innentől a stringkezelő függvényei dolgozzanak eszerint?:-)
- A hozzászóláshoz be kell jelentkezni
Például a tömbödben ne byte-onként lépkedj, hanem kétbyte-onként. A widestring programod mutatja, hogy hiába widestring a string, akkor is byte-onként lépked benne a ciklusban.
- A hozzászóláshoz be kell jelentkezni
"hiába widestring a string, akkor is byte-onként lépked benne a ciklusban"
'szen látom én, csak 'sszameg... :)
kidobhatom a for ciklust, meg egyebek - egy csomó nehezedés van, amit persze leprogramoz az ember, csak szegény diák fog miatta utálni.
- A hozzászóláshoz be kell jelentkezni
Nem kell kidobni, mert az összehasonlítás szerintem jó lesz a típus miatt, csak a for ciklusban nem egyesével kell növelni a ciklusváltozót, hanem kettesével, azaz rendre: 1,3,5,....stb.
Így pl.: (nem értek a pascalhoz, tehát lehet, hogy másképpen is rá lehet venni a fort a kettesével való számolásra)
function ekezettelen(szoveg:string):string;
var magyar,angol: string;
f,m: Byte;
begin
m:=0;
magyar:='áéíóöőúüűÁÉÍÓÖŐÚÜŰ';
angol:= 'aeiooouuuAEIOOOUUU';
for f:=1 to length(szoveg) do begin
Write(szoveg[f]);
m:=pos(szoveg[f],magyar);
WriteLn(m,' ',szoveg[f],' ');
if (m<>0) then szoveg[f]:=angol[m];
m:=0;
f:=f+1;
end;
ekezettelen:=szoveg;
end;
begin
write(ekezettelen('Árvíztűrő tükörfúrógép'));
end.
Kérdés, hogy miért pascal és nem más nyelv ?
- A hozzászóláshoz be kell jelentkezni
ilyen a pascalban nincs:)
var f: byte;
begin
for f:=1 to 10 do f:=f+1;
end.
egy.pas(3,26) Error: Illegal assignment to for-loop variable "f"
egy.pas(5) Fatal: There were 1 errors compiling module, stopping
és igen, a kérdés az kérdés:)
- A hozzászóláshoz be kell jelentkezni
kapcsold be a delphi módot, vagy vlamelyiket, valamelyikben van.
Amúgy meg akkor oldd meg while ciklussal, az úgyis szebb ilyen esetben, ha több, mint egyel kéne növelni a ciklusváltozót.
Nehogy már ezen elakadj...
- A hozzászóláshoz be kell jelentkezni
nem elakadok, mondom - ha kell, megírom a pos, és a többi függvény megfelelő változatát. azonban oktatni kéne, és didaktikai elveimet sérti, ha nem téglánként építkezem.
- A hozzászóláshoz be kell jelentkezni
Megírhatod, de egyszerűbb lenne a ciklusváltozóddal kezdeni valamit, hogy kettesével lépkedjen...ha nincs pascalban aaz, amit írtam, akkor marad psc megoldása, while. Csak egyszerűbb a ciklust átírni pár perc alatt, mint újraírni a függvénykönyvtárat.
Persze te tudod...sajnos pascalt sosem használtam hála az istennek, ezért konkrét kódot nem tudok adni. :)
- A hozzászóláshoz be kell jelentkezni
Föltelepítettem egy free pascalt és az alábbi kóddal jutottam eredményre:
function ekezettelen(szoveg: widestring): widestring;
var magyar: widestring;
angol: string;
f, m: byte;
begin
m := 0;
magyar := utf8decode('áéíóöőúüűÁÉÍÓÖŐÚÜŰ');
angol := 'aeiooouuuAEIOOOUUU';
for f := 1 to length(szoveg) do begin
Write(szoveg[f]);
m := pos(szoveg[f], magyar);
WriteLn(' <', m, '> ', szoveg[f], ' ');
if (m <> 0) then szoveg[f] := angol[m];
m := 0;
end;
ekezettelen := szoveg;
end;
begin
write(ekezettelen(utf8decode('Árvíztűrő tükörfúrógép')));
end.
- A hozzászóláshoz be kell jelentkezni
Nem állíthatom hogy a téma indítóját érdekli a megoldás felé tett lépésem. Legalább jelezné hogy rossz vagy nem tetszik neki. :-( Legközelebb nem igyekszem segíteni. (Csak emiatt tettem föl a free pascalt és frissítettem 2.4.0-ra.)
- A hozzászóláshoz be kell jelentkezni