Contare il numero di lettere minuscole di una stringa

di Anonimizzato21278 il
15 risposte
Ciao, ho scritto un programma in cui devo contare le lettere minuscole di una stringa, solo che alla fine non riesco a visualizzare il numero di lettere minuscole. Non capisco in cosa sbaglio in questo programma. Qualcuno riesce a capire in quale errore banale mi sto perdendo in questo momento?

#include<stdio.h>

int main(){

	char a[255] = "CIAO Mamma";
	int risultato;
	char *b;
	b = &a[0];


	__asm{

		mov ebx, b
		mov esi, 0

		
	ciclo:
			mov al, byte ptr[ebx + esi]
			cmp al, 0			
			je fine

			
			cmp al, 97				
			jl salto				
			cmp al, 122
			jg salto

			
			

		salto:
			inc esi
			jmp ciclo
		fine:
			mov risultato, esi
	}

	printf("Il numero di caratteri e' : %d", risultato);

}







15 Risposte

  • Manca un registro che conti solo le minuscole

    Il registro esi serve a contare e accedere a tutte le lettere
  • Ah, ora ho capito..
    
    
    cmp al, 97				
    jl salto				
    cmp al, 122				
    jg salto
    inc edi		
    
    
    
    
    
    
    dovevo incrementare un altro registro subito successivamente, cosi oltre a contare il numero di caratteri della mia stringa, riesco a contare contemporaneamente il numero di lettere minuscole
  • In realtà ti rammento che puoi controllare direttamente il sesto bit, invece di fare un doppio controllo "maggiore" e "minore".
  • +m2+ ha scritto:


    In realtà ti rammento che puoi controllare direttamente il sesto bit, invece di fare un doppio controllo "maggiore" e "minore".
    Sei sicuro...?
    include \masm32\include\masm32rt.inc
    .data?
    risultato   dd ?
    
    .code
    start:
      mov ebx, chr$("CIAO Mammina, è già pronta la pasta?")		; 29-6=23
      xor esi, esi
      molto_sbagliato=0
      un_po_sbagliato=0
      ciclo:
      mov al, byte ptr[ebx + esi]
      test al, al
      je fine
      if molto_sbagliato	; risultato 31, sbagliato
    	test al, 32
    	je salto
      else
    	cmp al, "a"  	 ; 97
    	jb salto
    	if un_po_sbagliato	; risultato 21, mancano è + à
    		cmp al, "z"   	; 122
    		ja salto
    	else		; risultato 23, corretto
    		shr al, 6
    		jnc salto
    	endif
      endif
      inc risultato
      salto:
      inc esi
      jmp ciclo
    
    fine:
      print str$(risultato), " caratteri minuscoli fra un totale di "
      inkey str$(esi), " caratteri"
      exit
    end start
    Output:
    23 caratteri minuscoli fra un totale di 36 caratteri
    @Matte: Studia bene perché ho cambiato il jl salto a jb salto.
  • jj2007 ha scritto:


    +m2+ ha scritto:


    In realtà ti rammento che puoi controllare direttamente il sesto bit, invece di fare un doppio controllo "maggiore" e "minore".
    Sei sicuro...?
    Abbastanza. Tu no?
  • +m2+ ha scritto:


    jj2007 ha scritto:


    +m2+ ha scritto:


    In realtà ti rammento che puoi controllare direttamente il sesto bit, invece di fare un doppio controllo "maggiore" e "minore".
    Sei sicuro...?
    Abbastanza. Tu no?
    Non per qualsiasi carattere possa esserci nella stringa ... (a meno che non limiti quelle che possono essere presenti, ma non mi sembra ci fossero queste premesse ...)

    Prendi lo SPAZIO, ad esempio ...
  • Matte ha scritto:


    Ah, ora ho capito..
    
    
    cmp al, 97				
    jl salto				
    cmp al, 122				
    jg salto
    inc edi		
    
    
    
    
    
    
    dovevo incrementare un altro registro subito successivamente, cosi oltre a contare il numero di caratteri della mia stringa, riesco a contare contemporaneamente il numero di lettere minuscole
    Naturalmente devi azzerare edi all'inizio ...
  • oregon ha scritto:


    Matte ha scritto:


    Ah, ora ho capito..
    
    
    cmp al, 97				
    jl salto				
    cmp al, 122				
    jg salto
    inc edi		
    
    
    
    
    
    
    dovevo incrementare un altro registro subito successivamente, cosi oltre a contare il numero di caratteri della mia stringa, riesco a contare contemporaneamente il numero di lettere minuscole
    Naturalmente devi azzerare edi all'inizio ...
    sisi certamente, grazie mille!
  • Matte ha scritto:


    jl salto
    jl non funziona, vedi la mia risposta delle 17:55. Per gli inglesi sì, per italiani no.
  • jj2007 ha scritto:


    Matte ha scritto:


    jl salto
    jl non funziona, vedi la mia risposta delle 17:55. Per gli inglesi sì, per italiani no.
    Direi che deve usare

    jb e ja

    dato che opera su unsigned

    (ma quella degli inglesi/italiani non l'ho capita) ...
  • oregon ha scritto:


    jl salto
    Direi che deve usare

    jb e ja

    dato che opera su unsigned

    (ma quella degli inglesi/italiani non l'ho capita) ...
    Se hai una stringa "italiana" tipo "CIAO Mammina, è già pronta la pasta?", ci trovi dei caratteri >127, come è e à. Quindi il jl salto fallisce. L'alfabeto inglese non ha questo problemino.
  • Ah ... ok ... non pensavo alla lingua della frase ...

    Comunque, oltre alla jb, per lo stesso motivo, è necessaria la ja
  • oregon ha scritto:


    Ah ... ok ... non pensavo alla lingua della frase ...

    Comunque, oltre alla jb, per lo stesso motivo, è necessaria la ja
    Sarebbe necessaria, se ci fosse un limite alto tipo "z" - ma la soluzione migliore e corretta è questa (vedi sopra):
          shr al, 6
          jnc salto
    Così funzionano anche à è ì ò ù ecc
  • jj2007 ha scritto:


    ma la soluzione migliore e corretta è questa ..
    Non per frasi del tipo

    "{par 1} L'acqua per la pasta bolle a 100 °C"

    Insomma ... sul codice "migliore e corretto" ci sarebbe tanto da dire ... l'OP si può accontentare del suo, considerando che è un esercizio ...
Devi accedere o registrarti per scrivere nel forum
15 risposte