Caratteri diversi dall'alfabeto

di il
10 risposte

Caratteri diversi dall'alfabeto

Ciao,

come faccio a indicare al programma di segnalare un messaggio di errore se l'utente fornisce un carattere diverso dall'alfabeto (accettando solo le lettere maiuscole e minuscole).

Non posso usare vettori, array, … ma solo if-else e i cicli.

10 Risposte

  • Re: Caratteri diversi dall'alfabeto

    Passi per un test numerico sul codice ASCII

    Ricordando che le minuscole sono contigue

    Le maiuscole pure

    Le cifre anche

    E la punteggiatura dai uno sguardo alla tabella ASCII

  • Re: Caratteri diversi dall'alfabeto

    Quando hai inserito una stringa, con un ciclo esamini carattere per carattere e con una if ti assicuri che siano 

    (>=‘A’  e  <='Z') o (>=‘a’  e  <='z')

    Ovviamente usa la sintassi del linguaggio

  • Re: Caratteri diversi dall'alfabeto

    In pratica devo scrivere un programma che elabori lettere maiuscole e minuscole visualizzando la cifra corrispondente sulla tastiera telefonica. Se il carattere fornito in ingresso è diverso da una lettera minuscola o maiuscola, il programma deve visualizzare un appropriato messaggio d'errore.

    Ho pensato di mettere un altro ciclo while all'interno ma non stampa niente while ((C < ‘A’ && C > ‘Z’) || (C < ‘a’ && C > ‘z’))

    // enunciati di inclusione
    #include<iostream>
    #include<iomanip>
    #include<string>
    
    // enunciato using namespace
    using namespace std;
    
    int main()
    {
    	// dichiarazioni di variabili
    	char C;
    	
    	// enunciati eseguibili
    	cout << "Inserisci una lettera maiuscola o minuscola: ";
    	cin >> C;
    	
    	while ((C >= 'A' && C <= 'Z') || (C >= 'a' && C <= 'z'))
    	{
    		if ((C >= 'A' && C <= 'C') || (C >= 'a' && C <= 'c'))
    			cout << "Il numero che corrisponde alla lettera inserita vale: " << 2 << endl;
    		else if ((C >= 'D' && C <= 'F') || (C >= 'd' && C <= 'f'))
    			cout << "Il numero che corrisponde alla lettera inserita vale: " << 3 << endl;
    		else if ((C >= 'G' && C <= 'I') || (C >= 'g' && C <= 'i'))
    			cout << "Il numero che corrisponde alla lettera inserita vale: " << 4 << endl;
    		else if ((C >= 'J' && C <= 'L') || (C >= 'j' && C <= 'l'))
    			cout << "Il numero che corrisponde alla lettera inserita vale: " << 5 << endl;
    		else if ((C >= 'M' && C <= 'O') || (C >= 'm' && C <= 'o'))
    			cout << "Il numero che corrisponde alla lettera inserita vale: " << 6 << endl;
    		else if ((C >= 'P' && C <= 'S') || (C >= 'p' && C <= 's'))
    			cout << "Il numero che corrisponde alla lettera inserita vale: " << 7 << endl;
    		else if ((C >= 'T' && C <= 'V') || (C >= 't' && C <= 'v'))
    			cout << "Il numero che corrisponde alla lettera inserita vale: " << 8 << endl;
    		else if ((C >= 'W' && C <= 'Z') || (C >= 'w' && C <= 'z'))
    			cout << "Il numero che corrisponde alla lettera inserita vale: " << 9 << endl;
    		
    		cout << "Inserisci un'altra lettera per ripetere: ";
    		cin >> C;
    	}
    	
    	// enunciato return
    	return 0;
    }
  • Re: Caratteri diversi dall'alfabeto

    Ti conviene trasformare in maiuscolo il carattere inserito e fare dei controlli più semplici.

    Per farlo puoi usare la funzione toupper()

    C = toupper(C);

    e poi fare i controlli solo con le maiuscole.

  • Re: Caratteri diversi dall'alfabeto

    Tutti quegli if devono stare a valle del while, occhio anche alla condizione del while che deve essere false per uscire

    Chiamare quella variabile char C in un codice del genere, vuol dire andare a cercarsi dei guai…

  • Re: Caratteri diversi dall'alfabeto

    Okk provo

  • Re: Caratteri diversi dall'alfabeto

    Se è solo quello diventa facile

    Normalizzi a maiuscolo con una toupper()

    Togli ‘A’

    Dividi per tre

    Fatto

    Se supera ‘Q’ correggi di uno

  • Re: Caratteri diversi dall'alfabeto

    Io userei la funzione di libreria isprint(int ch); che mangia un carattere e restituisce se è stampabile (quindi accetta anche punteggiatura e caatteri unicode). 

    Nella libreria hai anche isalpha()nt ch) che torna true se è alfabetico
    isalnum(int ch) che torna true se è alfabetico o una cifra
    ispunct(int ch) che torna true se è punteggiatura.

    Non reinventare la ruota, se la libreria standard già fa quello che vuoi, usa la libreria.

    [url=https://cplusplus.com/reference/cctype/]qui[/url] un riferimento alla ctype.h

    #include <stdio.h>
    #include <ctype.h>
    
    
    
    	int main(int arcg, char** argv) {
    
    
    		char s[20];
    		s[0] = 'c';
    		s[1] = 'i';
    		s[2] = 'a';
    		s[3] = '0';
    		s[4] = 0x10; //data-link-escape, non stampabile
    		s[5] = 0x20; //spazio
    		s[6] = 112;
    		s[7] = 'o';
    		s[8] = 'l';
    		s[9] = 0x6c;
    		s[10] = 'o';
    		s[11] = 0x1b; //ESC
    		s[12] = '\0'; //terminatore
    
    		for (int i = 0; '\0' != s[i]; i++) {
    
    			if(isprint(s[i]))
    				printf("'%c'\tsi stampa\n", s[i]);
    			else
    				printf("%d\tnon si stampa\n", s[i]);
    		}
    		return 0;
    	}
    
    
  • Re: Caratteri diversi dall'alfabeto

    Non è questione di reinventare la ruota

    È che lui deve convertire le lettere nei numeri corrispondenti nella tastiera del telefono

    Inoltre se lo dovesse fare come esercizio usare librerie sarebbe forse un po' truccare

  • Re: Caratteri diversi dall'alfabeto

    Ci sarebbe una maniera alternativa

    si parte da una forma normalizzata

    ovvero la conversione in maiuscole e l'esclusione dei caratteri “erronei” è già stata fatta

    una funzione che riceve in ingresso il singolo carattere lettera maiuscola da convertire

    e che restituisce un intero (anche a 8 bit) che rappresenta il numero della tastiera del telefono che corrisponde alla lettera

    int converti (char lettera)
       {
       static int sequenza[]={3,3,3,3,3,4,3}; // la “capacità” di ogni singolo tasto
       for (int c=0,int i=0; i< sizeof sequenza/sizeof sequenza[0]; i++)
          {
          c=c+sequenza[i];
          // volendo invece di fare il conto volta per volta si potrebbe mettere nell'array direttamente il risultato
          if ((lettera - A) <= c)
             {
             return 2+i;
             }
          }
       return 9;
       }
    

    fondamentalmente “conta sulle dita” il carattere fino ad arrivare al tasto ‘9’

    i tasti 2 3 4 5 6 contengono 3 lettere

    il tasto 7 ne contiene 4

    il tasto 8 ne contiene tre

    e le restanti sono nel nove

    algoritmo un po' banale, ma dovrebbe andare

    a propsito, non provato e non collaudato, scritto al volo qui

Devi accedere o registrarti per scrivere nel forum
10 risposte