Esercizio tabella ascii

franbisc
Mi spiegate cosa vuole questo esercizio,non ci ho capito niente
"Leggere un carattere e determinare se è una cifra,una lettera minuscola,oppure una lettera maiuscola.Nei confronti non usare esplicitamente i codici ASCII,ma simboli tra apici singoli ('a', 'z' ecc.)".

Non sarei proprio da dove iniziare

Risposte
Summerwind78
Ciao
per prima cosa dovresti indicare con quale linguaggio devi scrivere il programma

Raptorista1
Ciao, come da regolamento, dovresti modificare il titolo per indicare l'argomento del topic, e, soprattutto, proporre un tuo tentativo di soluzione!

franbisc
"Summerwind78":
Ciao
per prima cosa dovresti indicare con quale linguaggio devi scrivere il programma

In c++
"Raptorista":
Ciao, come da regolamento, dovresti modificare il titolo per indicare l'argomento del topic, e, soprattutto, proporre un tuo tentativo di soluzione!

Mah,io avrei pensato di riconoscere se è un carattere,una maiuscola o una minuscola in base alla colonna decimale della tabella ascii.Cioè io immetto ad esempio 'a' , se questo è compreso tra 97 e 122 allora scrivo "è una minuscola".

Però di fondo c'è una cosa che non mi è chiara:sulla tabella sono riportati i simboli/lettere/caratteri speciali con il rispettivo codice,e inoltre il corrispondente numero ottale,esadecimale,binario e alfanumerico:questi ultimi a cosa servono?Cioè l'utente potrà immettere solo simboli/lettere/caratteri speciali con il comando (alt+codice decimale) o dovrà/potrà scriverne il codice anche in un'altra base?
Invece il programmatore quale di queste colonne dovrà tenere in considerazione?

Raptorista1
Nessuna! Leggi il suggerimento nella traccia dell'esecizio: non usare direttamente i codici, ma le singole lettere.

franbisc
Quindi se l'utente immette x, se x=a,o x=b,o x=c (insomma faccio un blocco switch) scrivo che è una minuscola?

Raptorista1
Sì, ma non ti conviene assolutamente mettere tutti quegli switch..
C'è un modo più semplice, sfruttando l'ordinamento dei caratteri ASCII nella tabella!

franbisc
"Raptorista":
Sì, ma non ti conviene assolutamente mettere tutti quegli switch..
C'è un modo più semplice, sfruttando l'ordinamento dei caratteri ASCII nella tabella!

Si può impostare allora: se (x>a) e (x

Raptorista1
Ora sei sulla buona strada, ti manda di includere gli estremi :)

franbisc
"Raptorista":
Ora sei sulla buona strada, ti manda di includere gli estremi :)

Uhm,ok,ci proverò.Quello che mi chiedo è come fa un calcolatore a sapere quali caratteri sono compresi tra a e z?

Raptorista1
Dalla tabella! Ad ogni carattere è associato un numero, e con quelli si possono fare confronti in maniera usuale.

franbisc
Allora,ho provato due modi(inutile dire che neanche uno è eseguibile :lol: ).
Dunque,il primo è
#include <iostream>

int main()   {
char x;

    std::cout<< " Inserisci un carattere/cifra: \n";
    std::cout<< "=> ";
    std::cin>> x;

    switch (x)
    {
    case(x<='1';x>='9') : std::cout<<"è una cifra\n";breack;

    case(x>='A';x<='Z') : std::cout<< "è una maiuscola\n";breack;

    case(x>='a';x<='z') : std::cout<< "è una minuscola\n";breack;

    };

    return 0;

}

L'altro è:
 #include <iostream>

int main()   {
char x;

    std::cout<< " Inserisci un carattere/cifra: \n";
    std::cout<< "=> ";
    std::cin>> x;
    if (x>='0',x<= '9')  {
        std::cout<<"è una cifra\n";
    }
    else if (x>='A';x<='Z')  {
        std::cout<< "è una maiuscola\n";
    }
    if (x>='a';x<='z')  {
        std::cout<< "è una minuscola\n";
    };

    return 0;

}

Ci ho provato :oops:

vict85
"Mifert4":
Allora,ho provato due modi(inutile dire che neanche uno è eseguibile :lol: ).
Dunque,il primo è
#include <iostream>

int main()   {
char x;

    std::cout<< " Inserisci un carattere/cifra: \n";
    std::cout<< "=> ";
    std::cin>> x;

    switch (x)
    {
    case(x<='1';x>='9') : std::cout<<"è una cifra\n";breack;

    case(x>='A';x<='Z') : std::cout<< "è una maiuscola\n";breack;

    case(x>='a';x<='z') : std::cout<< "è una minuscola\n";breack;

    };

    return 0;

}


:shock: ma chi ti ha insegnato la sintassi? È break e non breack...

Il case inoltre in questo modo non l'ho mai visto usare, come se stessi impostando degli intervalli. In genere lo switch è segnato per evitare una lista di else if in cui poni il test "x = a" per diversi "a". Inoltre il mancato uso del break può anche servire per varie ragioni. Questo non è il caso in cui switch va usato.

"Mifert4":
L'altro è:
 #include <iostream>

int main()   {
char x;

    std::cout<< " Inserisci un carattere/cifra: \n";
    std::cout<< "=> ";
    std::cin>> x;
    if (x>='0',x<= '9')  {
        std::cout<<"è una cifra\n";
    }
    else if (x>='A';x<='Z')  {
        std::cout<< "è una maiuscola\n";
    }
    if (x>='a';x<='z')  {
        std::cout<< "è una minuscola\n";
    };

    return 0;

}

Ci ho provato :oops:


Cosa ti fa pensare che (x>='a';x<='z') sia il giusto modo per segnare la congiunzione di due test?

Quello corretto è
(x>='a')&&(x<='z')

franbisc
A me funziona solo scrivendo
('0'<= x and x<= '9')
come mai?

Summerwind78
non credo, penso che funzioni solo come vict85.

Forse potrebbe anche funzionare come dici tu, ma la sintassi indicata da vict85 è la corretta sintassi C ANSI che quindi ogni compilatore C e C++ deve interpretare correttamente

franbisc
"Summerwind78":
non credo, penso che funzioni solo come vict85.

Forse potrebbe anche funzionare come dici tu, ma la sintassi indicata da vict85 è la corretta sintassi C ANSI che quindi ogni compilatore C e C++ deve interpretare correttamente

Guarda,se è per questo il mio compilatore non mi accetta neanche
<<endl
in nessuna occasione, o
using namespace std

apatriarca
Se non accetta nessuna delle istruzioni corrette del C++ sopra elencate ti consiglio di cambiare il tuo compilatore. Ma mi pare avessi detto di usare g++ sotto Ubuntu, che è un compilatore più che valido e che accetta sicuramente tutte quelle espressioni. L'errore è quindi in qualche modo probabilmente tuo. Come compili il codice?

Esiste comunque un solo modo realmente portabile di risolvere questo problema ed è il seguente:
#include <cctype>
#include <iostream>

int main(void)
{
    std::cout << "Inserisci un carattere/cifra e premi invio: ";

    char c = 0;
    std::cin >> c;

    if (std::isdigit(c))  {
        std::cout << c << " e' una cifra.\n";
    } else if (std::isupper(c))  {
        std::cout << c << " e' una maiuscola.\n";
    } else if (std::islower(c))  {
        std::cout << c << " e' una minuscola.\n";
    }
}

Non è infatti assolutamente garantito che la codifica usata dal C sia ASCII e le lettere minuscole e maiuscole di un linguaggio sono diverse da quelle di un altro (considera le lettere accentate o la œ francese o la ä tedesca).

Summerwind78
@apatriarca: Per la precisione in tedesco si definiscono lettere con "Umlaut" o "dieresi" :D
Su questo gioco in casa vista la mia residenza :P

franbisc
"apatriarca":
Se non accetta nessuna delle istruzioni corrette del C++ sopra elencate ti consiglio di cambiare il tuo compilatore. Ma mi pare avessi detto di usare g++ sotto Ubuntu, che è un compilatore più che valido e che accetta sicuramente tutte quelle espressioni. L'errore è quindi in qualche modo probabilmente tuo. Come compili il codice?

Esiste comunque un solo modo realmente portabile di risolvere questo problema ed è il seguente:
#include <cctype>
#include <iostream>

int main(void)
{
    std::cout << "Inserisci un carattere/cifra e premi invio: ";

    char c = 0;
    std::cin >> c;

    if (std::isdigit(c))  {
        std::cout << c << " e' una cifra.\n";
    } else if (std::isupper(c))  {
        std::cout << c << " e' una maiuscola.\n";
    } else if (std::islower(c))  {
        std::cout << c << " e' una minuscola.\n";
    }
}


Ho scaricato molti esercizi del mio professore,che venivano correttamente eseguiti solo dopo aver sostituito a endl "\n" e ogni volta a "using namespace std" std::,altrimenti mi diceva qualcosa del tipo"endl is not declared for this scope".Credo di potermi fidare degli esercizi di un professore laureato in ingegneria informatica...spero :shock:

Per quanto riguarda il tuo codice mi spiegheresti queste righe:
 #include <cctype>

 int main(void)

(std::islower(c))

(std::isupper(c)) 

 std::isdigit(c)

non li ho mai visti

Summerwind78
#include : sai cosa è un #include?

int main(void): non lo hai mai visto??? come lo scrivi tu il corpo principale di un programma in c?


le altre tre funzioni sono funzioni che ti ritornano true o false a seconda che il parametro che fornisci sia
una lettera minuscola -> (std::islower(c))
una lettera maiuscola -> (std::isupper(c))
una cifra -> (std::isdigit(c))

franbisc
"Summerwind78":
#include : sai cosa è un #include?

Si,certo,ma cosa contiene la libreria cctype?

"Summerwind78":
int main(void): non lo hai mai visto??? come lo scrivi tu il corpo principale di un programma in c?

Così: int main()

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.