Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    23

    [ASSEMBLER] - conteggio numeri

    devo fare un programma che mi chieda in input due numeri ( con al massimo 5 cifre ), che mi faccia il conteggio delle volte che il numero '1' è stato ripetuto dai numeri tra a e b ( compresi ), e mi faccia la somma di questi ultimi.

    per esempio , scegliendo i numeri a=122 e b=125, allora la sequenza ( di cui non è richiesta la stampa ) da prendere in considerazione è : 122, 123 , 124 , 125. in questa sequenza il numero 1 è stato ripetuto in totale 4 volte. quindi la somma di tutti gli "1" presenti nella sequenza è proprio 4.

    un esercizio praticamente identico è già stato affrontato in precedenza, ma l'utente in questione aveva , se posso permettermi , molta più voglia di farsi fare un esame che di imparare.. io ho svolto la parte relativa alla introduzione dei numeri da tastiera, e so come risolvere il terzo punto relativo alla somma totale dei numeri 1. avrei però bisogno di una mano per risolvere il punto intermedio del mio esercizio, quello relativo al conteggio della frequenza del numero 1 nella sequenza di numeri. potreste darmi una mano ?

    ovviamente sono pronto a fornire , se richiesto, il codice da me scritto per l'introduzione dei numeri da tastiera, e ad esporvi le mie idee per la realizzazione del punto intermedio che non riesco a risolvere.

    grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Comincia con l'indicare di quale assembler parli e poi mostra codice e idea ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    23
    utilizziamo assembler x86, compilatore dosbox.

    ho avuto un milione di idee, mi perdonerai se alcune sono stupide ma sono solo all'inizio. di getto , guardando il programma, ho pensato che potevo Trasformare in numeri le cifre scritte in input (utilizzando però 16 bit). in questo modo avrei dunque trasformato una sequenza con blocchi di massimo 5 cifre, in una sequenza con un blocco per volta. quindi sarei potuto partire da A , fino ad arrivare a B, e avrei così potuto scorrere UNA CIFRA PER VOLTA. se il blocco ( cifra ) è uguale a 1, allora incremento il contatore, altrimenti passo al blocco successivo. Appena arrivo a B (ultimo blocco) e l'ho controllato moltiplico 2 * variabile e scrivo il risultato...

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Cosa usi per l'input dei dati da tastiera? Mostra solo questa parte di codice ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    23
    questo è il codice che ho scritto per l'introduzione dei numeri da tastiera. dovevano essere compresi da 0 a 64000. il tipo di "struttura" che ho utilizzato è quella tipica voluta dal nostro professore.

    purtroppo ho dovuto caricarla su mediafire, mi dispiace ma era troppo lunga e non mi era possibile postarla. http://www.mediafire.com/?6vtjfr91p9zqg3d

    so che in molti forum è vietato postare link di mediafire, e devo ammettere che non ho letto abbastanza bene le condizioni al momento dell'iscrizione. se mi dite come posso ovviare al problema, modifico il post subito.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    dosbox è un emulatore ... ma per assemblare cosa usate? MASM ? O altro ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    23
    ‐ Un editor di testo: notepad, pspad, gedit, textedit, ...
    -_‐ Un ambiente x86: DOSBOX
    -_‐ Un compilatore assembler: Turbo Assembler
    -_‐ Un linker assembler: Turbo Linker
    -_‐ Un debugger: Turbo Debugger

    come assemblatore usiamo tasm

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ah ... ecco ... io ho installato MASM ma è lo stesso.

    Ho visto il codice e ho visto che esegui l'input ASCII in un buffer del primo numero, lo converti in binario e poi ripeti le due operazioni per il secondo numero.

    A parte che ti conviene impostare una routine per la conversione da ASCII a binario e chiamarla due volte durante l'input invece di scrivere due volte lo stesso codice, a questo punto hai due strade da poter seguire.

    La prima :

    1) Azzeri un contatore di '1' (magari in un registro a 8 bit)

    2) imposti un ciclo con un contatore che parta dal primo valore binario e termini al secondo (utilizzi un registro a 16 bit come SI per contare)

    3) scrivi una funzione che trasformi il valore di SI in ASCII e, mentre converti, controlli che il carattere convertito sia un '1' ... in questo caso aumenti il contatore

    La seconda :

    1) Azzeri un contatore di '1' (magari in un registro a 8 bit)

    2) Effettui soltanto l'input dei valori in ASCII in due buffer diversi (buffer1 e buffer2) e non trasformi in binario i valori (non usi NUM1 nè NUM2)

    3) Conti le cifre '1' nel buffer1 aggiornando il contatore

    4) Aumenti il valore di buffer1 di 1 seguendo le regole della numerazione decimale tenendo conto che utilizzi valori ASCII e ripeti il punto 3) finché i due buffer non si equivalgono
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    23
    ti allego , scusa per la scrittura a zampe di gallina, uno "schema" di come risolverei l'esercizio, per quello che secondo me potrebbe essere il modo più semplice (http://www.mediafire.com/?ob65kdzom6ag57z ). il professore mi aveva consigliato di scrivere prima il codice in c, cosa che ho fatto qui :

    codice:
    #include <stdio.h>
    #define LIM_INF 0
    #define LIM_SUP 64000
    #define TARGET_DIGIT 2
    
    int main(void) {
    int A, B; 
    int contatore, curr; 
    
    //controllo dell'input
    do { //ciclo che controlla se A < B
    do { //ciclo che controlla se LIM_INF <= A <= LIM_SUP
    printf("Inserisci estremo inferiore: "); 
    scanf("%d", &A); 
    } while (A < LIM_INF | A > LIM_SUP); 
    
    do { //ciclo che controlla se LIM_INF <= B <= LIM_SUP
    printf("Inserisci estremo superiore: "); 
    scanf("%d", &B); 
    } while (B < LIM_INF || B > LIM_SUP); 
    } while (A > B); 
    
    for (contatore = 0; A <= B; A++) 
    //scompone il numero in cifre e cerca la cifra bersaglio (2 in questo caso)
    for (curr = A; curr > 0; curr /= 10)
    //ottengo cifra meno significativa e faccio quel che devo fare
    if (curr % 10 == TARGET_DIGIT) 
    contatore++;
    
    printf("Sono stati trovati %d cifre uguali a %d\n", contatore, TARGET_DIGIT); 
    printf("La somma delle %d occorrenze di %d e' %d\n", contatore, TARGET_DIGIT, TARGET_DIGIT * contatore); 
    return 0; 
    }

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 © 2025 vBulletin Solutions, Inc. All rights reserved.