1
votes

Puis-je mettre une boucle pour vérifier la position de la lettre dans l'alphabet anglais au lieu d'utiliser l'instruction if pour chaque lettre? (C)

#include <stdio.h>

int main(void)
{
char a;
do{
    printf("Enter an uppercase alphabet: ");
    scanf(" %c", &a);

} while(a < 'A' || a > 'Z');

for(int i=1;i<=1;i++)
{
  if(a=='A')
    printf("Alphabet number is 1");
  else if(a=='B')
    printf("Alphabet number is 2"); //and so on

}
}Is there any way to loop it to print the letter number in English alphabet instead of using if statement for every letter?

2 commentaires

Ne faites pas de boucle; utilisez les mathématiques. Astuce: Comment fonctionne a <'A' ? Que se passe-t-il si vous attribuez un a à un int ?


Vérifiez la position de A dans une table ASCII et faites le calcul.


3 Réponses :


1
votes

Attribuez simplement à int:

int letter = a - 'A' + 1


0 commentaires

3
votes

Vous pouvez utiliser la fonction C standard strchr . Par exemple

#include <stdio.h>
#include <string.h>

int main(void) 
{
    const char *alphabet =
    {
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    };

    char c;
    const char *p;

    do
    {
        printf( "Enter an uppercase alphabet: " );
        scanf( " %c", &c );
    } while ( ( p = strchr( alphabet, c ) ) == NULL );

    printf( "The alphabet number of the character %c is %d\n",
            c, ( int )( p - alphabet ) + 1 );

    return 0;
}

La sortie du programme pourrait ressembler à

Enter an uppercase alphabet: Z
The alphabet number of the character Z is 26

Pour réduire le nombre d'appels de la fonction strchr code > vous pouvez introduire une autre variable du type const char * . Par exemple

#include <stdio.h>
#include <string.h>

int main(void) 
{
    const char *alphabet =
    {
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    };

    char c;

    do
    {
        printf( "Enter an uppercase alphabet: " );
        scanf( " %c", &c );
    } while ( strchr( alphabet, c ) == NULL );

    printf( "The alphabet number of the character %c is %d\n",
            c, ( int )( strchr( alphabet, c ) - alphabet ) + 1 );

    return 0;
}


0 commentaires

1
votes

Je vais développer un peu la réponse de @ Tarik.

Le Code standard américain pour l'échange d'informations , appelé ASCII, est la norme à partir de laquelle les encodages de caractères modernes sont dérivés.

Ce codage, contrairement à certains autres avant lui, place les 26 caractères de l'alphabet latin de chaque cas ensemble dans une plage séquentielle de nombres. Ainsi, «A» a une valeur numérique, «B» a une valeur supérieure à «A», «C» a une valeur supérieure à «B», etc. Il en va de même pour «a» .. «z», bien que leurs valeurs numériques soient différentes.

Pour cette raison, vous pouvez effectuer un traitement très rapide des caractères latins de base en utilisant des expressions mathématiques simples. Par exemple, les lettres majuscules et minuscules diffèrent d'un bit, vous pouvez donc basculer entre elles en basculant ce bit.

Et, bien sûr, vous pouvez profiter de la propriété de plage numérique séquentielle pour calculer une expression qui donne le nombre souhaité.

Plus précisément, si vous traitez les caractères comme des types entiers (ce qu'ils sont, mais vous devez ajouter une distribution pour indiquer clairement au lecteur ce que vous faites), vous constaterez que:

char ch = 'Q'; // or any letter, really
int ordinal_number = (int)ch - 'A' + 1;
printf("Alphabet number is %d\n", ordinal_number);

Cela signifie que vous pouvez obtenir un " ordinal "numéro des lettres alphabétiques en ajoutant un à l'expression:

'0' - '0' == 0
'9' - '0' == 9

'A' - 'A' == 0
'Z' - 'A' == 25

'a' - 'a' == 0
'z' - 'a' == 25

'a' > 'A' (counterintuitive!)
'A' > '0'


3 commentaires

@aghast C'est une mauvaise approche car dans le codage EBCDIC, il n'est pas nécessaire que les caractères se suivent sans lacunes.


@ DavidC.Rankin corrigé! Merci!


Tant qu'il est limité à ASCII, cela fonctionne très bien. Mais cela doit être noté. EBCDIC jette la ponctuation au milieu des caractères.