2010-03-08 7 views
1

J'ai des problèmes avec une question sur les devoirs auxquels je travaille depuis un certain temps. Je ne sais pas exactement pourquoi la question est posée et j'ai besoin d'éclaircissements là-dessus et aussi d'une poussée dans la bonne direction.Comptage des caractères alphabétiques contenus dans un tableau avec C

Voici la question:

(2) Résoudre ce problème en utilisant un seul tableau indicés des compteurs. Le programme utilise un tableau de caractères défini à l'aide de la fonction d'initialisation C. Le programme compte le nombre de chacun des caractères alphabétiques a à z (seuls les caractères minuscules sont comptés) et imprime un rapport (dans une table nette) du nombre d'occurrences de chaque caractère minuscule trouvé. N'imprimez les nombres que pour les lettres qui apparaissent au moins une fois. Cela n'imprime pas un compte s'il est nul. N'utilisez PAS une instruction switch dans votre solution. NOTE: si x est de type char, x-à 'est la différence entre les codes ASCII pour le caractère dans x et le caractère' a '. Par exemple, si x contient le caractère 'c' alors x-'' a la valeur 2, tandis que si x contient le caractère 'd', alors x-'' a la valeur 3. Fournissez les résultats du test en utilisant la chaîne suivante:

« Ceci est un exemple de texte pour l'exercice (2). »

Et voici mon code source jusqu'à présent:

#include<stdio.h> 

int main() { 

    char c[] = "This is an example of text for exercise (2)."; 
    char d[26]; 

    int i; 
    int j = 0; 
    int k; 

    j = 0; 

    //char s = 97; 

    for(i = 0; i < sizeof(c); i++) { 
     for(s = 'a'; s < 'z'; s++){ 
      if(c[i] == s){ 

       k++; 
       printf("%c,%d\n", s, k); 
       k = 0; 

      } 
     } 
    } 
    return 0; 

} 

Comme vous pouvez le voir, ma solution actuelle est un peu anémique. Merci pour l'aide, et je sais que tout le monde sur le net n'aime pas nécessairement aider avec les devoirs des autres. ; P

Répondre

2
char c[] = "This is an example of text for exercise (2)."; 
int d[26] = {0}, i, value; 

for(i=0; i < sizeof(c) - 1; i++){ //-1 to exclude terminating NULL 
    value = c[i]-'a'; 
    if(value < 26 && value >= 0) d[value]++; 
} 

for(i=0; i < 26; i++){ 
    if(d[i]) printf("Alphabet-%c Count-%d\n", 'a'+i, d[i]); 
} 

corrigée. Merci caf et Leffler.

+0

Merci, je vois comment je tentais de trop compliquer la réponse. – Craig

+1

Cette solution écrit en dehors des limites définies du tableau 'd'. – caf

+1

Cela a des problèmes - qu'en est-il des espaces, des parenthèses, des chiffres, des points (et terminal NUL)? –

2

L'objectif de la question est de savoir comment convertir efficacement un caractère entre 'a' et 'z' en un index entre 0 et 25. Vous êtes apparemment autorisé à assumer ASCII pour cela (bien que la norme C ne garantit pas un jeu de caractères particulier), qui a la propriété utile que les valeurs des caractères 'a' à 'z' sont séquentielles.

Une fois que vous avez fait cela, vous pouvez augmenter la fente correspondante dans votre tableau d (notez que vous devrez initialiser ce tableau à tous-zéros pour commencer, ce qui peut être fait simplement avec char d[26] = { 0 };. A la fin , vous parcourez le tableau d et imprimez les comptes qui sont supérieurs à zéro, ainsi que le caractère correspondant (qui impliquera la transformation inverse - d'un index 0 à 25 dans un caractère 'a' à 'z')

2

Heureusement pour vous, vous ne semblez pas obligé de produire une solution qui fonctionnerait sur une machine EBCDIC (mainframe)

Votre boucle interne doit être remplacée par une condition:

if (c[i] is lower-case alphabetic) 
    increment the appropriate count in the d-array 

Après avoir terminé la chaîne, il faut alors une boucle pour parcourir le d-tableau, l'impression de la lettre correspondant à l'entrée et le nombre associé avec.

Votre d-array utilise 'char' pour les comptages; C'est OK pour l'exercice mais vous devrez probablement utiliser un type entier plus grand pour une solution générale. Vous devez également vous assurer qu'il est initialisé à tous les zéros; il est difficile d'obtenir des informations significatives à partir d'ordures aléatoires (et la langue ne garantit pas que rien d'autre que des ordures sera sur la pile où le tableau est stocké).

0

.

for(s = 'a'; s < 'z'; s++){ 
    j=0; 
    for(i = 0; i < sizeof(c); i++) { 
     if(c[i] == s) 
      j++; 
    } 
    if (j > 0) 
     printf("%c,%d\n", s, j); 
} 
+0

Etes-vous sûr de tout cela? Avez-vous essayé de l'exécuter? –

+0

Je l'ai couru et il y a quelques parenthèses manquantes sur l'instruction if mais en plus de quelques petites erreurs de syntaxe c'est bien. – Craig

+0

OK - Je me suis confus en traitant l'indentation comme exacte. Une raison de plus de ne pas aimer K & R placement des accolades. –

0
char c[] = "This is an example of text for exercise (2)."; 
char d[26]; 
int i; 
int j; 

for(i = 0; i < 26; i++) 
{ 
    d[i] = 0; // Set the frequency of the letter to zero before we start counting. 
    for(j = 0; j < strlen(c); j++) 
    { 
     if(c[j] == i + 'a') 
      d[i]++; 
    } 
    if(d[i] > 0) // If the frequency of the letter is greater than 0, show it. 
     printf("%c - %d\n", (i + 'a'), d[i]); 
} 
Questions connexes