Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di gokan
    Registrato dal
    Feb 2003
    Messaggi
    262

    [Delphi e non solo]Funzione di conversione

    Sono alle prese con una funzione di conversione da intero ad "egiziano".

    "|" =1;
    "n"=10;
    "9"=100
    "8"=1000
    "r"=10000

    Ad esempio il numero intero 4023=|||nn8888 oppure 24230=nnn998888rr

    Devo costruire una funzione che prenda in ingresso una stringa (diciamo edit1.Text, che contiene il numero intero) e restitusca un'altra stringa (quella converitita in egiziano)
    Ho abbozzato una cosa simile:
    codice:
    function TfmSecond.DecToEg(s:string): string;
    var
      unita,decine,centinaia,migliaia,decimigliaia:0..9;
    begin
    unita:=0;
    decine:=0;
    centinaia:=0;
    migliaia:=0;
    decimigliaia:=0;
    
    
    unita:=StrToInt(Copy(s,Length(s),1));
    decine:=StrToInt(Copy(s,Length(s)-1,1));
    centinaia:=StrToInt(Copy(s,Length(s)-2,1));
    migliaia:=StrToInt(Copy(s,Length(s)-3,1));
    decimigliaia:=StrToInt(Copy(s,Length(s)-4,1));
    
     while unita<>0 do
       begin
       Result:=Result+'|'; //Result è il valore di ritorno della funzione
       Dec(unita);
       end;
    
     while decine<>0 do
       begin
       Result:=Result+'n'; //E' uguale a DecToEg:=DecToEg(s)+'n';
       Dec(centinaia);
       end;
    
     while centinaia<>0 do
       begin
       Result:=Result+'9'; //Result è il valore di ritorno della funzione
       Dec(centinaia);
       end;
    
     while migliaia<>0 do
       begin
       Result:=Result+'8'; //Result è il valore di ritorno della funzione
       Dec(migliaia);
       end;
    
     while decimigliaia<>0 do
       begin
       Result:=Result+'r'; //Result è il valore di ritorno della funzione
       Dec(decimigliaia);
       end;
    end;
    L'attuale funzione non è adoperabile con molti parametri in ingresso, ma in sostanza dovrebbe andare. La mia idea è prendere dalla stringa ogni singolo numero e fare una sorta di abaco. Ad esempio se il mio numero intero è 345 pensavo di prendere a ritroso le:
    unita=5
    decine=4
    centinaia=3

    I cicli while non dovrebbero fare altro che stampare il simbolo corrispondente in "egiziano". Dovrei richiamare questa funzione con un pulsante e passare il tutto ad una label:
    codice:
    procedure TfmSecond.bbOKClick(Sender: TObject);
    begin
    fmMain.lbNumero1.Caption:=DecToEg(edNumero1.Text);
    fmMain.lbNumero2.Caption:=DecToEg(edNumero2.Text);
    end;
    Ogni volta che eseguo il programma mi va in loop, quasi il blocca il pc. Il problema dovrebbe quindi essere nella sfilza di cicli while che uso, cosa sbaglio?
    Vorrei trovare un algoritmo di sviluppo migliore.Spero di essermi spiegato.ciao

  2. #2
    Utente di HTML.it L'avatar di gokan
    Registrato dal
    Feb 2003
    Messaggi
    262
    Ho risolto qualcosa usando una variabile di appoggio:
    codice:
    while unita<>0 do
       begin
       s1:=s1+'|';
       Dec(unita);
       end;
    Forse avevo esagerato con i Result, meno male che mi ero ricordato che Result non è altro che il valore di ritorno della funzione...troppo pascal negli ultimi tempi..
    Se vi viene in testa un algritmo migliore consigliatelo, nel frattempo sistemo la mia funzione!!
    Bye

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,325
    Sinceramente, non ci ho capito nulla di come si convertono i numeri in "egiziano".

    Solo un consiglio posso darti: il commento su Result basterebbe scriverlo una volta sola.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  4. #4
    Utente di HTML.it L'avatar di gokan
    Registrato dal
    Feb 2003
    Messaggi
    262
    Originariamente inviato da alka
    Sinceramente, non ci ho capito nulla di come si convertono i numeri in "egiziano".

    Solo un consiglio posso darti: il commento su Result basterebbe scriverlo una volta sola.
    Solo per semplice curiosità, prova a leggerti il testo dell'esame di luglio (che non ho sostenuto) della materia che studio adesso. Prima di capire il testo ho dovuto fare parafrasi e analisi logica
    Non ti preoccupare se non hai capito l'egiziano...può capitare...:bubu:
    A parte lo scherzo ho risolto il problemino...



    Prova pratica dell’esame di
    Programmazione e Laboratorio
    14 Luglio 2003

    Sulla base degli argomenti trattati durante il corso e delle classi messe a disposizione da Delphi 5, si realizzi un’applicazione che implementi la moltiplicazione egiziana. Il progetto deve essere sviluppato nei seguenti punti:
    Una form principale deve contenere due componenti TRichEdit, rispettivamente di nome colonna1 e colonna2. Deve contenere inoltre due componenti TLabel , di nome numero1 e numero2, in cui vengono visualizzati i due numeri da moltiplicare, scritti nella notazione specificata nel punto 2.
    Una form modale generata run-time deve contenere due componenti TEdit in cui inserire i due interi maggiori di zero e minori di 100000; alla chiusura di tale form (al click di un bottone OK) tali valori devono comparire nelle due label della form principale (numero1 e numero2). Tali numeri interi inoltre devono essere visualizzati nelle label secondo il sistema numerico egiziano. Tale sistema non è posizionale come il nostro, ma usa caratteri separati per denotare 1, 10, 100, 1000, 10000. In particolare noi useremo i seguenti simboli:
    ‘|’ per 1; ‘n’ per 10; ‘9’ per 100; ‘8’ per 1000; ‘r’ per 10000;
    per esempio, il numero 4023 è rappresentato mediante la stringa |||nn8888,
    il numero 24230 è rappresentato mediante la stringa nnn998888rr.
    (Suggerimento: potete creare due funzioni, la prima che converta un numero intero nella corrispondente stringa in notazione egiziana, la seconda che converta una stringa in notazione egiziana nel corrispondente numero intero).
    Deve essere possibile caricare sulle label i numeri scritti in notazione egiziana da file di testo esterni e anche salvare tali numeri su file di testo.
    Al click di un bottone START, viene copiato su colonna1 il simbolo ‘|’ e su colonna2 il numero1. Viene abilitato inoltre un timer che scandisce il tempo in intervalli della durata di due secondi. Ad ogni scansione del tempo, in ogni colonna viene aggiunta una nuova riga ottenuta raddoppiando il numero della riga precedente.
    (Nota che il raddoppiamento può essere ottenuto o raddoppiando ciascun simbolo del numero in notazione egiziana, tenendo conto delle eventuali operazioni di riporto nel caso in cui ci siano più di nove simboli consecutivi uguali, oppure lavorando con i valori interi corrispondenti ai numeri in notazione egiziana).
    Il timer si ferma se il numero ottenuto nella prima colonna è maggiore del valore di numero2.
    I numeri nella colonna1, la cui somma è il valore di numero2, vengono marcati con un asterisco. I numeri nella colonna2, corrispondenti a tali asterischi, vengono sommati producendo così il risultato (VEDI ESEMPIO SUL RETRO). Tale risultato deve essere visualizzato in un componente a vostra scelta. Valori non codificabili in notazione egiziana sono da considerarsi OUT OF RANGE e implicano un risultato OUT OF RANGE.
    Deve essere possibile aggiungere il risultato nel file di testo, se esiste, che contiene i due numeri in notazione egiziana da moltiplicare.

    ESEMPIO: moltiplicare 384 per 19;

    numero1 : ||||nnnnnnnn999
    numero2: |||||||||n

    Colonna1 Colonna2
    |* ||||nnnnnnnn999
    ||* ||||||||nnnnnn9999999
    |||| ||||||nnn999998
    |||||||| ||nnnnnnn888
    ||||||n* ||||nnnn9888888

    Il numero 19 si scrive come 16+2+1 in quanto in notazione binaria si rappresenta come: 10011.
    Nota che gli asterischi sono in corrispondenza degli ‘1’ nella notazione binaria di numero2.

    Il risultato si ottiene sommando le righe della colonna2 che corrispondono agli asterischi, ovvero:

    ||||nnnnnnnn999 +
    ||||||||nnnnnn9999999 +
    ||||nnnn9888888

    Il risultato è: ||||||nnnnnnnnn998888888
    che corrisponde al numero intero 7296.

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,325
    Ci siamo passati tutti...nemmeno il mio Esame di Maturità lasciava a desiderare in quanto a fantasia del Ministero dell'Istruzione.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.