Newsgroup: it.comp.lang.pascal
Titolo: Problema con i compiti!8)

Salve,avrei un problema con un esercizio:"Dato un numero minore di 100 da
tastiera(es. 10),creare un programma che restituisca la stringa di caratteri
rappresentanti il numero(es. dieci)." Il capitolo a cui siamo arrivati
riguarda i vettori.Ora,non pretendo mica l'esercizio bello e fatto(magari!)
ma un'aiuto sul metodo di risoluzione.Avrei pensato ad una serie di Case of
per ogni num fino ad arrivare a 100 ma non penso sia questa la strada
giusto(č lunghissima!!!!).Potete aiutarmi?
Luca Mago
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (
http://www.grisoft.com
).
Version: 6.0.311 / Virus Database: 172 - Release Date: 27/12/01

 rappresentanti il numero(es. dieci)." Il capitolo a cui siamo arrivati
E' una versione semplicata di: "dato un numero N restituire la relativa
rappresentazione letterale"
Esempio: 1998 = MILLENOVECENTONOVANTOTTO.
Forza e coraggio, per i numeri da 1 a 100 è ancora più facile ^_* Rifletti
più che altro sulla grammatica italiana per la formazione del numero in
lettere e desumi le varie regole....
Cooper.


Io l'avevo e l'ho perso... dio cane... arrivava fino a numeri di 64 bit...
Cmq ha ragione cooper... fino a 100 è facilissimo quando superi 1000 diventa
un pò + complicato
es 2000=due+mila
mentre
es 1000=mille e non uno+mila... eheh
fino a 100 apparte qualche eccezione non è difficile...
Ciaoooo
--
--------------------------------------------------
Carlo Camarda
chiamac...@tiscalinet.it
]@#[ Anna I Love You ]#@[

 giusto(è lunghissima!!!!).Potete aiutarmi?



Non so come hai fatto a scrivere 200 righe di codice per un programma che al
max ha 100 case...
E inoltre nemmeno funziona... vedi qua...
Inserisci il numero: 78
settantaotto
settantaotto non č corretto settantotto si...
anche "otto" inizia per vocale come "uno"...
Il programma va fatto in molte meno righe...
appena posso lo posto qua...
P.S. non voglio criticare nessuno ma non mi sembra (errori ortografici a
parte...) che sia molto corretto algoritmicamente parlando...
Ciao


Ecco la procedura corretta...
Program Num2Let;
Uses Crt,Dos;
Var
  S,L:String;
  N:Byte;
Begin
  {
   E discrezione del programmatore fare un eventuale controllo che il numero
   sia minore di 100
  }
  Clrscr;
  Write('Inserisci il numero: ');
  Readln(N);
  Str(N,L);
  S:='';
  If Length(L)=2 Then
  Begin
   Case L[1] Of
    '2': S:=S+'vent';
    '3': S:=S+'trent';
    '4': S:=S+'quarant';
    '5': S:=S+'cinquant';
    '6': S:=S+'sessant';
    '7': S:=S+'settant';
    '8': S:=S+'ottant';
    '9': S:=S+'novant';
   End;
   If ((L[2]<>'1') And (L[2]<>'8')) Then
    Begin
     If L[1]='2' Then
      S:=S+'i';
     If L[1]<>'2' Then
      S:=S+'a';
    End;
  End;
  Case N Of
    0: S:='zero';
    1: S:='uno';
    2: S:='due';
    3: S:='tre';
    4: S:='quattro';
    5: S:='cinque';
    6: S:='sei';
    7: S:='sette';
    8: S:='otto';
    9: S:='nove';
   10: S:='dieci';
   11: S:='undici';
   12: S:='dodici';
   13: S:='tredici';
   14: S:='quattordici';
   15: S:='quindici';
   16: S:='sedici';
   17: S:='diciassette';
   18: S:='diciotto';
   19: S:='diciannove';
  100: S:='cento';
  End;
  If L[1]<>'1' Then
  Case L[2] Of
    '1': S:=S+'uno';
    '2': S:=S+'due';
    '3': S:=S+'tre';
    '4': S:=S+'quattro';
    '5': S:=S+'cinque';
    '6': S:=S+'sei';
    '7': S:=S+'sette';
    '8': S:=S+'otto';
    '9': S:=S+'nove';
  End;
  Write(N,' = ',S);
  Readln;
End.

 Luca Mago
Come approfondimento, ti posto la mia soluzione al tuo problema... chiedi al
prof cosa ne pensa :P
(* ------------------------------------------------------------ *)
Function NumToStr (Numero: Longint): String;
 Type    S = Array [0..19] Of String [15];
 Const   PUnita:  S =
('zero','uno','due','tre','quattro','cinque','sei','sette','otto','nove','di
eci',
'undici','dodici','tredici','quattordici','quindici','sedici','diciassette',
'diciotto','diciannove');
         PDecine: S = ('',
'','vent','trent','quarant','cinquant','sessant','settant','ottant','novant'
,'','','','','','','','','','');
 Var Unita, Decine: Longint;   StrNum, State: String;
 Begin
  If Not (Numero < 100) Then StrNum := 'Error, Out Of Range' Else
    Begin
     Unita  := Numero Mod 10;
     Decine := Numero Div 10;
     Case Decine Of
      0..1:  If Decine = 0 Then StrNum := PUnita [Unita] Else StrNum :=
PUnita [10+Unita];
      2..9:  Begin
              If Decine = 2 Then State := 'i' Else State := 'a';
                Case Unita Of
                 0:       StrNum := PDecine [Decine] + State;
                 1, 8:    StrNum := PDecine [Decine] + PUnita [Unita];
                 2..7,9:  StrNum := PDecine [Decine] + State + PUnita
[Unita];
                End;
             End;
     End;
    End;
  NumToStr := StrNum;
 End;
(* ------------------------------------------------------------ *)
Osserva l'applicazione delle regole grammaticali dentro il costrutto CASE ..
OF.
Cordialmente, Cooper.

A questo punto, per non essere da meno, posto anke io la mia soluzione...
fammi sapere se può andare
(********************************************)
program scrivi_numero;
const unita:array[1..9] of
string=('uno','due','tre','quattro','cinque','sei','sette','otto','nove');
      decine:array[1..9] of
string=('dieci','venti','trenta','quaranta','cinquanta','sessanta','settanta
','ottanta','novanta');
      vocali=['a','e','i','o','u'];
      numeri=['0'..'9'];
var numero:string;
    ciclo:char;
function controllo(str:string):boolean;
var x,k,p:integer;
begin
k:=0;p:=0;
for x:=1 to length(str) do begin
if str[x] in numeri then inc(p) else inc(k);
end;
if k=0 then controllo:=true else controllo:=false;
end;
function scrivi(num:string):string;
var j,dec,uni:integer;
    un,deci,ris:string;
begin
if controllo(num) then begin
if (length(num)=2) and (num[2]<>'0') and (num[1]<>'1') then begin
   val(num[1],dec,j);val(num[2],uni,j);
   un:=unita[uni];deci:=decine[dec];
        if un[1] in vocali then delete(deci,length(deci),1);
        ris:=deci+un;
end;
if (length(num)=1) and (num<>'0') then begin
   val(num[1],uni,j);
   ris:=unita[uni];
end;
if (num[2]='0') and (length(num)=2) then begin
   val(num[1],dec,j);
   ris:=decine[dec];
end;
if (length(num)=2) and(num[1]='1') then begin
case num[2] of
'0':ris:='dieci';
'1':ris:='undici';
'2':ris:='dodici';
'3':ris:='tredici';
'4':ris:='quattordici';
'5':ris:='quindici';
'6':ris:='sedici';
'7':ris:='diciassette';
'8':ris:='diciotto';
'9':ris:='diciannove';
end;
end;
if (num='0') then ris:='zero';
if(length(num)>2) then ris:='Numero non valido';
end else ris:='Numero non valido';
scrivi:=ris;
end;
begin
repeat
writeln;
write('NUM>');
readln(numero);
writeln(numero,' = ',scrivi(numero));
writeln;
write('Vuoi continuare? ');
readln(ciclo);
until ciclo='n';
end.
(***********************************************)

Comunque se ti interessa, ho una function che scrive a video tanti
asterischi quante sono le volte che viene eseguita Cioč questo:
*
**
***
****
*****
Bčh sono un pň stanco e non mi sono spiegato un gran che bene, ma se vuoi te
la posso inviare cosě te la studi un pň e vedi se ti risulta piů facile
risolvere il tuo problema.
Ciao

 ha scritto nel messaggio
news:3ca8a...@news.dada.it...

Scusa l'ignoranza ma cosa c'entra questo?


 wrote in message
chkq8.43647$pT1.1...@news1.tin.it...


 ---
Grazie a tutti ragazzi,ho risolto il problema!!!Grazie 1000 a tutti!!!!!


 ha scritto nel messaggio
news:3ca8a...@news.dada.it...

parli con me? se si scusa, ma non capisco cosa vuoi dire...


Anche se sei partito e torni fra 5 giorni ti rispondo lo stesso... ;-)
Comunque parlavo con mago, cioč colui che ha inviato il post e che aveva
problemi con l'esercizio ;-)
Ciaoz!
Marchese Gianfranco <d.g.r.u.m.a.@VediInFirma.it> wrote in message
oqVq8.48583$pT1.1...@news1.tin.it...
