2009-03-30 5 views
0

Le programme est censé calculer le nombre d'arguments, parcourir la liste des arguments, convertir chaque argument en entier et le copier dans un tableau, parcourir les éléments du tableau, ajouter la valeur de chacun à une variable (cela calcule la somme des éléments) et imprime la somme. Il n'y aura pas plus de 15 arguments. Jusqu'à présent, j'ai:Pourrais-je avoir un indice sur l'orientation du formatage?

int sumofA (int sizeofA, int x, int y){ 
    int i = sizeofA; 
    if (i <= 15){ 
     int z = x + y; 
     return z; 
    } 
} 

int main (int argc, char*argv[]){  
    int sizeofA = argc - 1; 
    int i = 1; 
    while (i <= sizeofA){ 
     int x = GetInt (argc, argv, i); 
     i = i + 1; 
     int y = GetInt (argc, argv, i);  
     printf ("%d\n", sumofA (sizeofA, x, y)); 
    } 
    return 0; 
} 

Ok, maintenant (quand donné trois arguments autres que ./a) elle imprime la somme du premier argument et le second argument ... puis la deuxième et la troisième ... et ensuite la valeur du troisième argument. Pourquoi?

Voici le code pour getint (je dois l'utiliser):

int GetInt (int argc, char * argv[], int i) { 
    if (i < 0 || i >= argc) return 0; 
    return atoi(argv[i]); 
} 

Ai-je besoin de passer par et attribuer à chaque argument un entier (ex int z = GetInt (argc, argv, i + 2).)?

+0

Il y a tellement de choses qui ne vont pas avec ce code que je ne sais pas par où commencer. Il semble que vous ayez mal compris la signification de certaines parties clés du langage, telles que la portée et le retour. – SpoonMeiser

Répondre

5

Il y a deux ou trois de ce qui ne va pas ici:

  • i ne définit pas sumofA, si l'on compare avec elle un comportement non défini donné.
  • Si i> = 15, alors on ne sait pas ce que retournera sumofA.
  • Vous revenez dans la boucle; ce n'est sûrement pas ce que tu veux.
  • Votre code ne stocke pas quoi que ce soit dans le tableau A.

S'il vous plaît compiler votre code avec tous les avertissements-drapeaux sur (gcc: -Wall -Werror -pedantic), et assurez-vous qu'il ya no avertissements lorsque votre code est compilé.

Notez que la variable taille est inutile: utiliser while (i < argc).

Edit: Maintenant que vous avez ajouté le code de getint, remplacer

GetInt (argc, argv, i); 

avec

atoi(argv[i]); 

Il n'y a pas d'utilisation pour getint, vous pouvez le supprimer complètement .

Enfin, dans votre question, vous mentionnez de stocker les nombres dans un tableau, puis de les additionner.Avez-vous voulez pour faire cela, ou besoin de pour ce faire (en raison d'une mission?) Parce que ce n'est pas nécessaire: il suffit d'ajouter le résultat de tous les appels à atoi. Le tableau A est alors superflu.

Édition 2: Je vois que vous avez corrigé le code à certains endroits. Votre code actuellement (23:31 CEST) ajoute le premier argument à chacun des arguments séparément et les imprime. Vous n'êtes pas encore là. Bonne chance!

+0

+1 pour avoir pris le temps d'énumérer tous ces problèmes. Je ne savais vraiment pas par où commencer :) – SpoonMeiser

+0

Et la liste était/n'est même pas complète ... * soupir * :) – Stephan202

+0

Je dois utiliser GetInt, avec des numéros de stockage dans un tableau et de les convoquer pour l'attribution . – Kaity

2

Votre problème est ici:

int x = GetInt (argc, argv, 1); 
int y = GetInt (argc, argv, i); 

Comme vous passez par la boucle la première fois, ce qui est moi, et qu'est-ce qu'il imprime? Qu'en est-il de la deuxième fois que vous passez par la boucle?

2

Pour commencer, vous renvoyez 0 après la première itération de votre boucle.

0

Lors de la première exécution de votre boucle x et y sont affectés la même valeur (puisque i = 1), leur somme est imprimée, puis la fonction retourne qui termine votre programme. Donc, vous obtiendrez juste la première valeur ajoutée à elle-même.

1

Puisque vous voulez aider la mise en forme ...

Tout d'abord, C a plus que les opérateurs d'affectation seulement =, et ce sont des choses comme grand pour x = x + 1. La plupart des langues, C inclus, fournissent un opérateur +=, qui ressemble à ceci: x += 1. Cela fait la même chose que x = x + 1, et c'est plus agréable. Sucre syntaxique, mais le sucre est savoureux.

Alors que nous y sommes, C et de nombreuses autres langues fournissent un cas particulier pour += 1 - l'opérateur ++ à partir duquel C++ obtient son nom. Donc vraiment, x = x + 1 peut être réécrit comme x++ avec le exactement le même effet. Notez, cependant, qu'il existe une différence majeure entre x++ et ++x, mais cela n'a pas d'importance actuellement. Pour l'instant, utilisez celui que vous voulez, et assurez-vous de le mettre sur sa propre ligne tout seul jusqu'à ce que vous apprenez la différence entre x++ et ++x.

Si vous trouvez que vous avez une variable que vous utilisez une fois, ne l'utilisez pas. Au lieu de cela:

int sizeofA = argc - 1; 
... 
while (i <= sizeofA){ 
    ... 
    printf ("%d\n", sumofA (sizeofA, x, y)); 
} 

Essayez ceci:

... 
while (i <= argc - 1){ 
    ... 
    printf ("%d\n", sumofA (argc - 1, x, y)); 
} 

Ou (probablement mieux):

... 
while (i < argc){ 
    ... 
    printf ("%d\n", sumofA (argc - 1, x, y)); 
} 

Troisième arrêt, vous ne devriez pas de passage aveuglément votre liste d'arguments entiers, seulement l'argument que vous voulez convertir en ce moment, mais c'est un autre problème, et je suppose que vous ne pouvez pas changer GetInt(). Cela semble être une bataille pour un autre jour.

(quatrième arrêt, pourquoi est-ce une question Wiki communautaire?)

cinquièmement, je pense que votre logique est hors - si vous commencez à 1, je ne pense pas que vous voulez arrêter 1 avant la fin de la liste. Mais il s'agit d'une simple erreur par défaut et vous pouvez corriger cela plus tard lorsque vous savez avec certitude que c'est en fait l'erreur.

Enfin, je vous suggère de définir une variable, int answer et, au lieu de printf() ing tous les éléments de la liste, il suffit d'aller dans la liste, ajoutez la valeur numérique de chacun à answer, un puis, à la fin, imprimez answer. Mais peut-être que je manque le point de la mission.Alternativement, chaque fois que vous parcourez la boucle, imprimez answer, de sorte que vous pouvez voir la valeur se développer correctement à chaque fois. Je pense que cela est plus proche de ce que vous voulez réellement faire dans la tâche, mais je ne peux pas prendre le temps de vérifier parce que j'ai un cours à suivre.

Questions connexes