Ahojky.Mám úkol udělat program, který převede celočíselnou hodnotu (do jednotek milionů) na slovní vyjádření podobně jako na složence např. 1245 - jedentisícdvěstěčtyřicetpět.
VSTUP: celé číslo
VÝSTUP: text – slovní vyjádření čísla
Prosím pomocte ,mi někdo..
Fórum › Pascal
Úkol
Je to v cecku, nemam u sebe nic na pascal ani delphi, ale snad pro inspiraci... Vim ze to neni uplne optimalni, je to sity horkou jehlou, tak budte shovivavy... :smile16: je tam chyba u cislovani po desitce -> jedenact.... dvanact...., nemam cas to osetrovat, ale kdybych to mel udelat, tak bych si vzdycky do dalsiho radu nesl informaci zda predchozi cislo byla 1, a pokud ano, tak bych tam bral jiny switch se spravnym cislovanim....
void cisla(int c)
{
//zadani cisla
int cislo = c;
int ref = 1000000; // do jednotek milionu...
int vysledek;
AnsiString ret,pom;
//-------------------------------- miliony
vysledek = cislo / ref; //celociselne deleni...
if(vysledek == 0) //nic
{
}
else
{
switch (vysledek)
{
case 1: pom = "milion";break;
case 2: pom = "dvamiliony";break;
case 3: pom = "trimiliony";break;
case 4: pom = "ctyrmiliony";break;
case 5: pom = "petmilionu";break;
case 6: pom = "sestmilionu";break;
case 7: pom = "sedmmilionu";break;
case 8: pom = "osmmilionu";break;
case 9: pom = "devetmilionu";break;
default:
case 0:;break;
}
ret = ret + pom;
cislo = cislo - (vysledek * ref);
}
//------------------------------- statisice
ref = ref / 10;
vysledek = cislo / ref; //celociselne deleni...
if(vysledek == 0) //nic
{
}
else
{
switch (vysledek)
{
case 1: pom = "sto";break;
case 2: pom = "dveste";break;
case 3: pom = "trista";break;
case 4: pom = "ctyrista";break;
case 5: pom = "petset";break;
case 6: pom = "sestset";break;
case 7: pom = "sedmset";break;
case 8: pom = "osmset";break;
case 9: pom = "devatset";break;
default:
case 0:;break;
}
ret = ret + pom;
cislo = cislo - (vysledek * ref);
}
//-------------------------------------- desetitisice
ref = ref / 10;
vysledek = cislo / ref; //celociselne deleni...
if(vysledek == 0) //nic
{
}
else
{
switch (vysledek)
{
case 1: pom = "deset";break;
case 2: pom = "dvacet";break;
case 3: pom = "tricet";break;
case 4: pom = "ctyricet";break;
case 5: pom = "padesat";break;
case 6: pom = "sedesat";break;
case 7: pom = "sedmdesat";break;
case 8: pom = "osmdesat";break;
case 9: pom = "devadesat";break;
default:
case 0:;break;
}
ret = ret + pom;
cislo = cislo - (vysledek * ref);
}
//-------------------------------------------tisice
ref = ref / 10;
vysledek = cislo / ref; //celociselne deleni...
if(vysledek == 0) //nic
{
}
else
{
switch (vysledek)
{
case 1: pom = "jedentisic";break;
case 2: pom = "dvatisice";break;
case 3: pom = "tritisice";break;
case 4: pom = "ctyritisice";break;
case 5: pom = "pettisic";break;
case 6: pom = "sesttisic";break;
case 7: pom = "sedmtisic";break;
case 8: pom = "osmtisic";break;
case 9: pom = "devattisic";break;
default:
case 0:;break;
}
ret = ret + pom;
cislo = cislo - (vysledek * ref);
}
//--------------------------------------------- setiny
ref = ref / 10;
vysledek = cislo / ref; //celociselne deleni...
if(vysledek == 0) //nic
{
}
else
{
switch (vysledek)
{
case 1: pom = "jednosto";break;
case 2: pom = "dveste";break;
case 3: pom = "trista";break;
case 4: pom = "ctyrista";break;
case 5: pom = "petset";break;
case 6: pom = "sestset";break;
case 7: pom = "sedmset";break;
case 8: pom = "osmset";break;
case 9: pom = "devatset";break;
default:
case 0:;break;
}
ret = ret + pom;
cislo = cislo - (vysledek * ref);
}
//--------------------------------------------------- desitky
ref = ref / 10;
vysledek = cislo / ref; //celociselne deleni...
if(vysledek == 0) //nic
{
}
else
{
switch (vysledek)
{
case 1: pom = "deset";break;
case 2: pom = "dvacet";break;
case 3: pom = "tricet";break;
case 4: pom = "ctyricet";break;
case 5: pom = "padesat";break;
case 6: pom = "sedesat";break;
case 7: pom = "sedmdesat";break;
case 8: pom = "osmdesat";break;
case 9: pom = "devadesat";break;
default:
case 0:;break;
}
ret = ret + pom;
cislo = cislo - (vysledek * ref);
}
//---------------------------------------------------- jednotky
ref = ref / 10;
vysledek = cislo / ref; //celociselne deleni...
if(vysledek == 0) //nic
{
}
else
{
switch (vysledek)
{
case 1: pom = "jedna";break;
case 2: pom = "dva";break;
case 3: pom = "tri";break;
case 4: pom = "ctyri";break;
case 5: pom = "pet";break;
case 6: pom = "sest";break;
case 7: pom = "sedm";break;
case 8: pom = "osm";break;
case 9: pom = "devet";break;
default:
case 0:;break;
}
ret = ret + pom;
}
//vypsat vysledek
}
To joudicek : Mám to mít do konce května.Díky
Moje riešenie :smile18: tvári sa to funkčne. Ak nájdete chybu tak dajte vediet :smile1:
program number_to_text;
uses crt;
var cislo:longint;
problem_s_desiatkami:boolean;
problem_s_milionmi:boolean;
procedure nacitaj;
begin
writeln('Prevod cisla na text');
writeln('-*! Radoslav R bara !*-');
write('Zadaj cislo: ');
readln(cislo);
problem_s_desiatkami:=false;
problem_s_milionmi:=false;
end;
function cislo_na_text(cifra,por_cifry:integer):string;
var x:string;
false_problem_s_desiatkami:boolean;
begin
x:='';
false_problem_s_desiatkami:=false;
if (por_cifry<=9) and (por_cifry>0) then begin
if cifra=1 then
x:='jeden'
else if cifra=2 then
x:='dva'
else if cifra=3 then
x:='tri'
else if cifra=4 then
x:='styri'
else if cifra=5 then
x:='pet'
else if cifra=6 then
x:='sest'
else if cifra=7 then
x:='sedem'
else if cifra =8 then
x:='osem'
else if cifra=9 then
x:='devet';
if problem_s_desiatkami=true then begin
x:=x+'nast';
if cifra=0 then
x:='desat'
else if cifra=4 then
x:='strnast';
false_problem_s_desiatkami:=true;
end;
if (por_cifry=2) or (por_cifry=5) or (por_cifry=8) then begin
x:=x+'desiat';
if (cifra=1) or (cifra=0) then begin
x:='';
if cifra=1 then
problem_s_desiatkami:=true;
end
else if cifra=2 then
x:='dvadsat'
else if cifra=3 then
x:='tridsat'
else if cifra=4 then
x:='styridsat';
end
else if (por_cifry=3) or (por_cifry=6) or(por_cifry=9) then begin
if cifra=2 then
x:='dve'
else if cifra=1 then
x:='';
if cifra<>0 then
x:=x+'sto ';
end
else if por_cifry=4 then begin
if problem_s_desiatkami = false then begin
if cifra=1 then
x:=''
else if cifra=2 then
x:='dve';
end;
x:=x+'tisic ';
end
else if por_cifry=7 then begin
if (cifra>=5) or (problem_s_milionmi=true) then
x:=x+'milionov'
else if cifra=1 then
x:=x+'milion'
else if (cifra>=2) and (cifra<5) then
x:=x+'miliony';
x:=x+' ';
problem_s_milionmi:=false;
end;
if false_problem_s_desiatkami=true then
problem_s_desiatkami:=false;
end;
cislo_na_text:=x;
end;
procedure preved_cislo;
var retazec,vysledne_cislo:string;
i,cifra,por_cifry,pom:integer;
begin
str(cislo,retazec);
por_cifry:=length(retazec);
vysledne_cislo:='';
if por_cifry>9 then
writeln('Cislo nesmie byt vecsie ako 999 999 999!')
else begin
for i:=1 to length(retazec) do begin
val(retazec[i],cifra,pom);
vysledne_cislo:=vysledne_cislo+cislo_na_text(cifra,por_cifry);
dec(por_cifry);
end;
if cislo = 0 then vysledne_cislo:='nula';
writeln(vysledne_cislo);
end;
end;
begin
clrscr;
nacitaj;
preved_cislo;
readln;
end.
To R R : Díky moc
R R podmineny prikaz case ti asi nic nerika vid? tohle je hrozne prasacky reseni a myslis ze ve skoly by se nelibilo.
Malirka: nastuduj si podmineny prikaz CASE, potom datovy typ STRING, jak nacist promennou snad zvladnes a pak to napises behem par minut.
kdyztak zkus napsat par radek kodu, hod to sem a my ti poradime... ale zkus se nad tim nejdriv zamyslet, je to jednoducha uloha.
To raddino : Aahojky.Já jsem to udělala trochu jinak.Mrkni na to jestli to takhle může být:
Uses crt;
function miliony(pocet: Longint): String;
var retezec: String;
begin
retezec:= '';
case pocet of
1:begin
retezec:= retezec + 'milion';
end;
2:begin
retezec:= retezec + 'dvamiliony';
end;
3:begin
retezec:= retezec + 'trimiliony';
end;
4:begin
retezec:= retezec + 'ctyrimiliony';
end;
5:begin
retezec:= retezec + 'petmilionu';
end;
6:begin
retezec:= retezec + 'sestmilionu';
end;
7:begin
retezec:= retezec + 'sedmmilionu';
end;
8:begin
retezec:= retezec + 'osmmilionu';
end;
9:begin
retezec:= retezec + 'devetmilionu';
end;
end;
miliony:= retezec;
end;
function stovky(pocet: Longint): String;
var retezec: String;
begin
retezec:= '';
case pocet of
1:begin
retezec:= 'sto';
end;
2:begin
retezec:= 'dveste';
end;
3:begin
retezec:= 'trista';
end;
4:begin
retezec:= 'ctyrista';
end;
5:begin
retezec:= 'petset';
end;
6:begin
retezec:= 'sestset';
end;
7:begin
retezec:= 'sedmset';
end;
8:begin
retezec:= 'osmset';
end;
9:begin
retezec:= 'devetset';
end;
end;
stovky:= retezec
end;
function desitky(pocet: Longint): String;
var retezec: String;
begin
retezec:= '';
case pocet of
2:begin
retezec:= 'dvacet';
end;
3:begin
retezec:= 'tricet';
end;
4:begin
retezec:= 'ctyrcet';
end;
5:begin
retezec:= 'padesat';
end;
6:begin
retezec:= 'sedesat';
end;
7:begin
retezec:= 'sedmdesat';
end;
8:begin
retezec:= 'osmdesat';
end;
9:begin
retezec:= 'devadesat';
end;
end;
desitky:= retezec;
end;
function des_problem(pocet: Longint): String;
var retezec: String;
begin
retezec:= '';
case pocet of
1:begin
retezec:= 'jedenact';
end;
2:begin
retezec:= 'dvanact';
end;
3:begin
retezec:= 'trinact';
end;
4:begin
retezec:= 'ctrnact';
end;
5:begin
retezec:= 'patnact';
end;
6:begin
retezec:= 'sestnact';
end;
7:begin
retezec:= 'sedmnact';
end;
8:begin
retezec:= 'osmnact';
end;
9:begin
retezec:= 'devatenact';
end;
end;
des_problem:= retezec;
end;
function tisice(pocet: Longint): String;
var retezec: String;
begin
retezec:= '';
case pocet of
1:begin
retezec:= 'jedentisic';
end;
2:begin
retezec:= 'dvatisice';
end;
3:begin
retezec:= 'tritisice';
end;
4:begin
retezec:= 'ctyritisice';
end;
5:begin
retezec:= 'pettisic';
end;
6:begin
retezec:= 'sesttisic';
end;
7:begin
retezec:= 'sedmtisic';
end;
8:begin
retezec:= 'osmtisic';
end;
9:begin
retezec:= 'devettisic';
end;
end;
tisice:= retezec;
end;
function jednotky(pocet: Longint): String;
var retezec: String;
begin
retezec:= '';
case pocet of
1:begin
retezec:= 'jedna';
end;
2:begin
retezec:= 'dva';
end;
3:begin
retezec:= 'tri';
end;
4:begin
retezec:= 'ctyri';
end;
5:begin
retezec:= 'pet';
end;
6:begin
retezec:= 'sest';
end;
7:begin
retezec:= 'sedm';
end;
8:begin
retezec:= 'osm';
end;
9:begin
retezec:= 'devet';
end;
end;
jednotky:= retezec;
end;
var cislo, delitel: Longint;
retezec: String;
desitky_prob: Boolean;
pocet: Longint;
begin
cislo:= 1;
while (cislo <> 0) do
begin
TextColor(Yellow);
Writeln('---- Program,ktery prevede celociselnou hodnotu na slovni vyjadreni----');
TextColor(White);
Writeln;
Writeln('Zadejte cislo (max. 9 999 999) 0 = konec: ');
readln(cislo);
Writeln;
retezec:= '';
if (cislo <> 0) then
begin
delitel:= 1000000;
pocet:= cislo div delitel;
retezec:= miliony(pocet);
cislo:= cislo - (delitel * pocet);
delitel:= delitel div 10;
pocet:= cislo div delitel;
retezec:= retezec + stovky(pocet);
cislo:= cislo - (delitel * pocet);
delitel:= delitel div 10;
pocet:= cislo div delitel;
retezec:= retezec + desitky(pocet);
if (pocet = 1) then
desitky_prob:= true
else
desitky_prob:= false;
cislo:= cislo - (delitel * pocet);
delitel:= delitel div 10;
pocet:= cislo div delitel;
if(desitky_prob = true) then begin
retezec:= retezec + des_problem(pocet) + 'tisic';
end
else
begin
retezec := retezec + tisice(pocet);
end;
cislo:= cislo - (delitel * pocet);
delitel:= delitel div 10;
pocet:= cislo div delitel;
retezec:= retezec + stovky(pocet);
cislo:= cislo - (delitel * pocet);
delitel:= delitel div 10;
pocet:= cislo div delitel;
retezec:= retezec + desitky(pocet);
if (pocet = 1) then
desitky_prob:= true
else
desitky_prob:= false;
cislo:= cislo - (delitel * pocet);
delitel:= delitel div 10;
pocet:= cislo div delitel;
if(desitky_prob = true) then begin
retezec:= retezec + des_problem(pocet);
end
else
begin
retezec:= retezec + jednotky(pocet);
end;
Writeln(retezec);
end;
end;
Writeln('-----------------------------------------------------------------');
Writeln(' Program ukoncite stiskem libovolne klavesy');
Writeln('-----------------------------------------------------------------');
Readln;
end.
netestoval sem to ale zda se to v poradku. a jenom takovej kosmetickej doplnek. myslim ze by to melo byt v takovehle posloupnosti:
program prevod;
uses crt;
var ....;
function ...;
begin
end.
pod to do pascalu a kdyby to hlasilo chybu tak napis..
Já bych jen doplnil jednu radu nutnou k dosažení dalšího programátorského levelu: dole v hlavním těle programu se dost opakuje
cislo:= cislo - (delitel * pocet);
delitel:= delitel div 10;
pocet:= cislo div delitel;
retezec:= retezec + stovky(pocet);
to by bylo vhodné dát do vlastní funkce.
To raddino : Ja myslim ze posloupnost function-var vubec nicemu nevadi, naopak si myslim ze pokud pouziju posloupnost var-function, tak promenne za var budou definovany jako globalni coz se mi programatorsky nelibi (ale nejsem si jistej, jsem ceckar....)
To Quiark : Jo tohle jsem prehlidnul kdyz jsem ten program delal :smile1:
raddino napsal:
R R podmineny prikaz case ti asi nic nerika vid? tohle je hrozne prasacky reseni a myslis ze ve skoly by se nelibilo.
U nás v škole sa profesorke nepáči používanie case. :smile17: A snáď vie prečo. :smile4:
Myslíš že je lepšie urobiť podmienky pre všekty možnosti?? Neni to tak trochu neefektívne??
To malirka
Ja jsem na rozdíl od těch co jenom kecají ten tvůj program otestoval a pro některé případy nefunguje:
např.
1.špatně vypíše všechna čísla, která končí 10 (jak v řádu desítek tisíc, tak v řádu desítek)
2.špatně vypíše všechna čísla od 100000 do 100999 a od 110000 do 110999. (samozřejmě i když jsou tam miliony)
3.jakmile je na konci čísla 0 tak program skončí (způsobeno while(cislo)<>0 do)
No nicméně náprava je celkem jednoduchá:
1. do function des_problem(pocet: Longint): String;
var retezec: String;
begin
retezec:= '';
case pocet of
1:begin
retezec:= 'jedenact';
end;
atd.
dopsat
function des_problem(pocet: Longint): String;
var retezec: String;
begin
retezec:= '';
case pocet of
0: retezec:= 'deset'; //dopsat tento jeden řádek, pozn. ty begin a end můžeš všude vymazat-ve všech funkcích.
1:begin
retezec:= 'jedenact';
end;
atd.
2. do hlavního těla programu:
místo while (cislo <> 0) do
dát while (cislo <> -1) do (program pak budeme ukončovat číslem -1)
místo Writeln('Zadejte cislo (max. 9 999 999) 0 = konec: ');
dát Writeln('Zadejte cislo 1...9999999, -1 = konec: ');
nebo Write('Zadejte cislo 1...9999999, -1 = konec: ');
a za první výskyt retezec:= retezec + stovky(pocet);
tedy k tomuto
if (cislo <> 0) then
begin
delitel:= 1000000;
pocet:= cislo div delitel;
retezec:= miliony(pocet);
cislo:= cislo - (delitel * pocet);
delitel:= delitel div 10;
pocet:= cislo div delitel;
retezec:= retezec + stovky(pocet);
atd.
připsat toto
if (cislo <> 0) then
begin
delitel:= 1000000;
pocet:= cislo div delitel;
retezec:= miliony(pocet);
cislo:= cislo - (delitel * pocet);
delitel:= delitel div 10;
pocet:= cislo div delitel;
retezec:= retezec + stovky(pocet);
if cislo div 1000 = 100 then //připsat tyto dva řádky
retezec:= retezec + 'tisic';
atd.
Takto upravené by to už mělo pracovat dobře.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Moderátoři diskuze