Bitte kann ich einen Hinweis auf, wo auf der Formatierung konzentrieren? [geschlossen]

StackOverflow https://stackoverflow.com/questions/698973

  •  22-08-2019
  •  | 
  •  

Frage

Das Programm soll die Anzahl der Argumente berechnen, über die Liste von Argumenten iterieren, für jedes Argument konvertieren, das Argument zu einer ganzen Zahl und kopieren sie in einem Array, iteriert über die Elemente des Arrays, den Wert jeder Zugabe ein auf eine Variable (das die Summe der Elemente berechnet), und die Summe drucken. Es werden nicht mehr als 15 Argumente sein. Bisher habe ich:

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, jetzt (wenn drei Argumente außer ./a gegeben) druckt er die Summe des ersten Arguments und das zweite Argument ... dann die zweite und die dritte ... und dann wird der Wert des dritten Arguments. Warum?

Hier ist der Code für getint (Ich habe diese verwenden):

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

Muss ich durch gehen und jedes Argument auf eine ganze Zahl zuweisen (ex. int z = GetInt (argc, argv, i + 2))?

War es hilfreich?

Lösung

Es gibt ein paar dies falsch geht hier vor:

  • i ist nicht in sumofA definiert, so dass der Vergleich mit ihm nicht definiertes Verhalten ergeben.
  • Wenn i> = 15, dann ist es unklar, was sumofA zurückkehren wird.
  • Sie kehren in der Schleife; sicher, das ist nicht das, was Sie wollen.
  • Ihr Code speichert nicht wirklich etwas im Array A.

Bitte kompilieren Sie Ihren Code mit allen Warnflaggen auf (gcc: -Wall Werror -pedantic)., Und stellen Sie sicher, dass es nicht Warnungen, wenn Ihr Code kompiliert

Hinweis

, dass die Variable Größe ist nicht mehr benötigt. Verwenden while (i

Edit: Jetzt, wo Sie den Code von getint hinzugefügt, ersetzen

GetInt (argc, argv, i);

mit

atoi(argv[i]);

Es gibt keine Verwendung für getint , so können Sie es komplett entfernen können.

Schließlich: in Ihrer Frage, die Sie die Zahlen in einem Array erwähnen Speicher und Summieren sie dann. Haben Sie wollen , das zu tun, oder Notwendigkeit , das zu tun (aufgrund einiger Aufgabe?) Weil es nicht notwendig ist: einfach das Ergebnis aller Anrufe auf atoi hinzufügen . Das Array A ist dann überflüssig.

Edit 2: Ich sehe Sie den Code an einigen Stellen fixiert. Ihr Code zur Zeit (23.31 Uhr MESZ) fügt das erste Argument für jedes der Argumente separat und druckt sie. Sie sind noch nicht so weit. Viel Glück!

Andere Tipps

Ihr Problem ist hier:

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

Wie Sie die Schleife durchlaufen das erste Mal, was i ist, und was es nicht ausdrucken? Was ist mit dem zweiten Mal, wenn Sie die Schleife durchlaufen?

Für den Anfang Sie 0 nach der ersten Iteration der Schleife zurück.

Da Sie Hilfe wollen die Formatierung ...

Zunächst einmal hat C mehr Zuweisungsoperator als nur =, und diese sind für Dinge wie x = x + 1. Die meisten Sprachen, inklusive C, bieten einen += Operator, der wie folgt aussieht: x += 1. Das macht das Gleiche wie x = x + 1 und ist schöner. Syntaxtic Zucker, aber Zucker ist lecker.

Während wir gerade dabei sind, C und viele andere Sprachen bieten einen Sonderfall für += 1 - den ++ Operator aus der C ++ seinen Namen. So wirklich kann x = x + 1 als x++ neu geschrieben wird mit der genau dem gleichen Wirkung . Beachten Sie jedoch, dass es einen großen Unterschied zwischen x++ und ++x, aber das zur Zeit spielt keine Rolle. Vorerst verwenden je nachdem, welche Sie wollen, und stellen Sie sicher, dass es auf seine eigene Linie von selbst alles setzen, bis Sie den Unterschied zwischen x++ und ++x lernen.

Wenn Sie feststellen, Sie haben eine Variable, die Sie einmal mit sind, verwenden Sie es nicht. Statt dessen:

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

Versuchen Sie folgendes:

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

oder (wahrscheinlich besser):

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

Dritter ab, sollten Sie nicht blind es Ihre gesamten Argumente Liste werden vorbei, nur das Argument Sie in dieser aktuellen Zeit konvertieren wollen, aber das ist ein anderes Thema, und ich nehme an, Sie nicht GetInt() ändern können. Dies scheint ein Kampf für einen anderen Tag.

(Vierte ab, warum ist dies ein Community Wiki Frage?)

Fünftens, ich glaube, Ihre Logik ausgeschaltet ist - wenn man bei 1 beginnen, ich glaube nicht, dass du 1 vor dem Ende der Liste beenden möchten. Aber das ist eine einfache off-by-one Fehler und Sie können beheben, dass später, wenn Sie sicher sind, dass das heißt, in der Tat, der Fehler.

Schließlich schlage ich vor, Sie definieren eine Variable, int answer, und statt printf()ing alle die Elemente der Liste, einfach durch die Liste gehen, fügen Sie den numerischen Wert eines jeden, eine answer dann, am Ende, ausdrucken answer. Aber vielleicht bin ich dabei den Punkt der Zuordnung. Alternativ kann jedes Mal, wenn Sie durch die Schleife durchlaufen, ausdrucken answer, so können Sie den Wert richtig jedes Mal wachsen sehen. Ich denke, das ist näher an, was Sie wirklich wollen, in der Zuordnung zu tun, aber ich kann nicht Zeit nehmen, um zu überprüfen, weil ich eine Klasse zu gehen.

Beim ersten Durchlauf der Schleife x und y beide den gleichen Wert zugeordnet (da i = 1), deren Summe aus gedruckt wird, und dann die Funktion zurück, die das Programm endet. So werden Sie nur der erste Wert selbst werden immer hinzugefügt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top