0
votes

Comment simplifier une grande déclaration conditionnelle

Cette instruction conditionnelle compare les lettres avec des chiffres en fonction du clavier d'anciens téléphones à boutons.

Dans cette déclaration, chaque condition If-ele est la même. Comment puis-je raccourcir ce morceau de code? P>

//compares every name and pattern character
//every number represents some letters from latin alphabet
    if(lowch >= 97 && lowch <= 99 && pattern[ptrch] == '2'){
        ptrch++;
        mir++;
    }
    else if(lowch >= 100 && lowch <= 102 && pattern[ptrch] == '3'){
        ptrch++;
        mir++;
    }
    else if(lowch >= 103 && lowch <= 105 && pattern[ptrch] == '4'){
        ptrch++;
        mir++;
    }
    else if(lowch >= 106 && lowch <= 108 && pattern[ptrch] == '5'){
        ptrch++;
        mir++;
    }
    else if(lowch >= 109 && lowch <= 111 && pattern[ptrch] == '6'){
        ptrch++;
        mir++;
    }
    else if(lowch >= 112 && lowch <= 115 && pattern[ptrch] == '7'){
        ptrch++;
        mir++;
    }
    else if(lowch >= 116 && lowch <= 118 && pattern[ptrch] == '8'){
        ptrch++;
        mir++;
    }
    else if(lowch >= 119 && lowch <= 122 && pattern[ptrch] == '9'){
        ptrch++;
        mir++;
    }
    else if(lowch == '+' && pattern[ptrch] == '0'){
        ptrch++;
        mir++;
    }
    else{
        ptrch = 0;
        mir = 0;
    }
}


3 commentaires

Il semble que lowch est en fait un code de caractères ASCII: Si tel est le cas, je vous recommande vraiment d'utiliser la lettre réelle - telle que A plutôt que la valeur décimale. Cela faciliterait la lecture plus facile.


Oh, ok merci. Et qu'en est-il de toute cette structure if-Structure? Y a-t-il un moyen de rendre plus compact et plus intelligent?


Je crois que la réponse ci-dessous - avec la macro - sera votre meilleur pari (mais incluez les caractères plutôt que le nombre)


3 Réponses :


2
votes

Définissez une macro qui encapsule les comparaisons, puis utilisez une seule condition avec || . xxx

une autre option serait d'utiliser une gamme de structures. xxx


0 commentaires

1
votes

Une solution que vous pourriez envisager est de cartographier les lettres dans un tableau.

// Build the table once
char dialpad[1 << CHAR_BIT] = { 0 };
const unsigned char *map_from = "abcdefghijklmnopqrstuvwxyz+";
const char          *map_to   = "222333444555666777788899990";

for (int i = 0; map_from[i]; i++) dialpad[map_from[i]] = map_to[i];

// Later on...
if (dialpad[(unsigned char)lowch] == pattern[ptrch]) {
    ptrch++;
    mir++;
}
else {
    ptrch = mir = 0;
}


1 commentaires

Créer une table avec 256 entrées est à peine surkill. Au contraire, sans toute la gamme emballer, le code est beaucoup plus simple.



0
votes

Tous vos personnages (sauf le signe plus) sont des lettres minuscules. En ASCII, ces lettres sont dans une plage contiguë. Vous pouvez donc utiliser un tableau pour mapper des lettres minuscules vers un code de numéros: xxx

Avant d'accéder à la matrice, vous devez vérifier si lowch est une valeur inférieure valide. lettre de cas. Le signe plus doit être traité comme cas particulier ici. (Mais vous pouvez rendre le tableau couvre la gamme d'ASCII entière 7 bits, où les caractères qui ne disposent pas d'un code UMBER ont une valeur spéciale, peut-être '\ 0' .) .


0 commentaires