Ripetizioni di lettere in una parola

di il
2 risposte

Ripetizioni di lettere in una parola

Ciao a tutti!
In questo mio programma (se così si può per ora definire) vorrei prima digitare una parola e inseguito stabilire se ci sono delle ripetizioni di lettere in essa.
Il problema che dopo ripetute correzioni di errori segnalate dal compilatore, il programma si avvia ma non esegue nulla...

Ecco qui il mio codice:

p.s. Assembly 8086

DATA SEGMENT PUBLIC

	FRASE DB 9 DUP(?) ;array di 20 caselle di tipo byte
	CHAR DB 9 DUP(?) ;array che mi servirà per memorizzare le lettere già presenti nella conta 
	CONTA DB 0 ;variabile contatore
	DOM1   DB "Lunghezza di una parola: ",'$'
	DOM2   DB "Digita parola: ",'$'
	ACAPO DB "",10,13,'$'
	RIS DB "Le ripetizioni presenti nella parola sono: ",'$'
	FINEFRASE DB "Fine input della parola!",10,13,'$'
	LUNGHEZ DW ? ;lunghezza massima della parola
	INDICE1 DW ? ;variabile che contiene l'indice 
	INDICE2 DW ? ;variabile che contine l'indice
	INDICE3 DW ? ;variabile per salvare nell'array la lettera
	FLAG DB 0    ;variabile flag che mi serve per tener sottocontrollo alcune situazioni

DATA ENDS ;fine del segmento dei dati

CODE SEGMENT

	ASSUME CS:CODE,DS:DATA

INIZIO: ;inizio del programma

	STAMPA MACRO stringa
		MOV AH,09H
		LEA DX,stringa
		INT 21H
	ENDM ;fine delle procedure
		
	;Caricamento dei dati
	MOV AX,DATA
	MOV DS,AX
	
	STAMPA DOM1
	MOV AH,01H
	INT 21H
	SUB AL,30H ;conversione del carattere
	MOV AH,00H
	MOV LUNGHEZ,AX
	
	XOR SI,SI ;azzero il registro SI 
	
	STAMPA DOM2 ;richiamo la macro per la stampa della domanda
	
	INPUT: ;inizio del ciclo per l'input di una parola
		
		MOV AH,01H ;richiamo la funzione di input
		INT 21H	   ;interrupt che permette l'input del carattere
		SUB AL,30H ;conversione del carattere di input
		MOV FRASE[SI],AL ;salvo il carattere nella cella dell'array indicato da SI
		
		INC SI ;incremento l'indice
		
		;stabilisco se continuare il LOOP oppure no
		CMP SI,LUNGHEZ
		JL INPUT ;fine del ciclo 
	
	;Preparo il ciclo per stabilire le lettere che si ripetono	
	MOV SI,0 ;metto in SI zero per iniziare un nuovo ciclo	
	MOV INDICE1,0 ;l'indice1 si occupa di puntare alla lettera che viene confrontata
	MOV INDICE2,0 ;l'indice2 si occupa di puntare a tutte le altre lettere dell'array
	MOV INDICE3,0 
	
	CICLO:
		
		MOV SI,INDICE1 ;metto nel registro indice il contenuto di indice1
		MOV BL,FRASE[SI] ;metto la lettera contenuta nella cella scelta da SI in BH
		MOV INDICE1,SI ;salvo l'indice1
		
		MOV INDICE2,0 ;azzero sempre l'indice2 così da preparare una scansione lineare
		MOV SI,0 ;azzero l'indice per sicurezza 
		XOR AX,AX
		MOV AX,INDICE2
		MOV SI,AX ;metto l'indice2 in SI
		MOV CX,LUNGHEZ ;metto in CX il numero di caratteri della parola
		
		CICLO2:
			
			 MOV BH,FRASE[SI] ;salvo in BH il valore da confrontare con la lettera scelta precedentemente
			 MOV INDICE2,SI
			 
			 CMP BH,BL ;confronto la lettera scelta ora con quella scelta prima
			 JE UGUALI ;se le due lettere sono uguali vado a verificare 
			 
			 INC SI ;altrimenti se non sono uguali continuo la scansione incrementando l'indice
			 JMP CICLO2 ;dopo aver incrementato l'indice riprendo il ciclo2
			 
			 MOV CX,LUNGHEZ ;metto in CX il numero di caratteri della parola
			 UGUALI:
				MOV AX,INDICE1 ;sposto in AL l'indice1 
				CMP AX,INDICE2 ;confronto i due indici poichè devono essere diversi
				JE CICLO2 ;se i due indici sono uguali non va bene e continuo la scansione lineare
				
				;altrimenti se gli indici sono diversi
				MOV SI,0 ;azzero il registro SI in preparazione al ciclo che determina se la lettera è già presente
				MOV FLAG,0 ;metto in flag il valore 0 se esso rimane invariato signfica che la lettera che si ripete non è gia stata contata
				MOV CX,LUNGHEZ ;metto in CX il numero di giri da fare
				LOOPCONF:
					MOV AL,CHAR[SI]
					CMP BL,AL ;BL è sempre il valore che deve essere confrontato
					JE UGUALICONF ;se i due valori sono uguali salto a UGUALICONF					
					UGUALICONF: 
						ADD FLAG,1 ;sommo alla variabile FLAG il valore 1
					INC SI ;incremento il registro puntatore
				LOOP LOOPCONF ;fine del ciclo che serve per confermare la lettera
				
				CMP FLAG,0 ;confronto il contenuto di FLAG con zero 
				JNZ CONTINUA ;se non sono uguali salto a CONTINUA 
					
				;se invece il contenuto di FLAG è zero allora significa che la lettera ancora non è stata salvata
				MOV SI,INDICE3 ;metto nel registro puntatore 
				MOV CHAR[SI],BL ;salvo il contenuto di BL nel registro che conserva gli elementi 
				ADD INDICE3,1 ;sommo +1 alla variabile indice per una possibile prossima lettera
				ADD CONTA,1 ;sommo +1 anche alla variabile conta in quanto conta appunto quante lettere si ripetono nella parola
				
				CONTINUA:
				
			LOOP UGUALI ;fine del "UGUALI"	
		
		;CONTROLLO FINALE "CICLO" 		
		MOV SI,INDICE1 ;ripendo l'indice del primo ciclo
		INC SI ;incremento l'indice del primo ciclo
		CMP SI,LUNGHEZ ;confronto l'indice con la lunghezza della parola 
		JLE CICLO ;se l'indice è minore o uguale allora ritorna su per un prossimo ciclo
	
	
		STAMPA RIS ;richiamo la macro per eseguire la stampa
		MOV AH,02H
		MOV DL,CONTA
		ADD CONTA,30H
		INT 21H
		
	
	;Restituisco il controllo al DOS
	MOV AH,4CH
	INT 21H

CODE ENDS ;fine del segmento del codice
END INIZIO ;fine etichetta che inica l'inizio del programma
Spero che qualcuno mi possa aiutare, grazie!

2 Risposte

  • Re: Ripetizioni di lettere in una parola

    Intanto questa riga

    ACAPO DB "",10,13,'$'

    la devo scrivere così

    ACAPO DB 10,13,'$'

    perché la stringa vuota causa un errore di compilazione.

    Per il resto, non è chiaro cosa dovrebbe fare il programma ...
  • Re: Ripetizioni di lettere in una parola

    Innanzitutto grazie per il consiglio!

    Il programma dovrebbe fare questo:
    1)chiedere la lunghezza massima della parola
    2)digitare in input una parola
    3)a questo punto il programma stabilisce se ci sono delle lettere che si ripetono all'interno della parola stessa
    4)ci comunica il numero di ripetizioni delle lettere

    Spero di essere stato chiaro... Grazie
Devi accedere o registrarti per scrivere nel forum
2 risposte