2017-02-07 3 views
0

Mein Programm nimmt Name und Alter des Studenten und diese Funktion sollte den Namen des jüngsten, ältesten Studenten und des Durchschnittsalters drucken. Jedoch druckt es Name des jüngsten Kursteilnehmers kann niemand mir sagen, warum?Warum druckt mein Programm keine Zeichenfolge?

void check(string *nameStudent, int *ageStudent, int num) { 
    int i, young = 0, old = 0, sum = 0, mov = 0; 
    string a, b; 
    double average; 
    for (i = 0; i < num; i++){ 
     if (*(ageStudent + mov) < young) { 
      young = *(ageStudent + mov); 
      a = *(nameStudent + mov); 
     } 
     if (*(ageStudent + mov) > old) { 
      old = *(ageStudent + mov); 
      b = *(nameStudent + mov); 
     } 
     sum += *(ageStudent + mov); 
     mov++; 
    } 
    average = (double) sum/num; 
    cout << a << " Is youngest student and " << b << " Is oldest student " << endl << average << " is average age of students"; 
} 
+12

Weil alle Schüler älter sind als '0'. – alcedine

+0

Können Sie bitte versuchen, ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) zu erstellen und uns zu zeigen? Einschließlich * wie * Sie diese Funktion aufrufen und mit welchen Argumenten. –

+2

FYI, '* (ageStudent + mov)' kann klarer geschrieben werden als 'ageStudent [mov]' – Barmar

Antwort

2

Sie initialisieren young-0. Es wird nur young und a ändern, wenn es einen Studenten gibt, dessen Alter weniger als 0 ist.

Anstatt die Anfangswerte all dieser Variablen fest zu codieren, holen Sie sie aus den ersten Elementen der Arrays.

if (num > 0) { 
    young = old = sum = *ageStudent; 
    a = b = *nameStudent; 
} 

Dann können Sie Ihre Schleife ändern von 1 statt 0, zu starten, da Sie bereits das erste Element des Arrays verarbeitet haben.

BTW, es gibt keine Notwendigkeit für die mov Variable, da es immer das gleiche wie i enthält. Verwenden Sie stattdessen *(ageStudent + i).

void check(string *nameStudent, int *ageStudent, int num) { 
    int i, young = 0, old = 0, sum = 0; 
    string a, b; 
    double average; 
    if (num > 0) { 
     young = old = sum = *ageStudent; 
     a = b = *nameStudent; 
    } 
    for (i = 1; i < num; i++){ 
     if (*(ageStudent + i) < young) { 
      young = *(ageStudent + i); 
      a = *(nameStudent + i); 
     } 
     if (*(ageStudent + i) > old) { 
      old = *(ageStudent + i); 
      b = *(nameStudent + i); 
     } 
     sum += *(ageStudent + i); 
     mov++; 
    } 
    average = num ? (double) sum/num : 0; // prevent division by 0 
    cout << a << " Is youngest student and " << b << " Is oldest student " << endl << average << " is average age of students"; 
} 
+0

Persönlich würde ich die Funktion mit 'if (num <= 0) {cout <<" Keine Schüler \ n "; } und dann aufhören, sich Sorgen um eine nicht Null Anzahl von Schülern zu machen. Man könnte nützlich sein, den 'Durchschnitt' zu deklarieren, bis er benötigt wird, und es sollte const sein. nameStudent, ageStudent sollte Const Zeiger auf Const sein. Schließlich würde ich das "ist" in den Literalen nicht groß schreiben (es ist nicht das erste Wort des Satzes). –

+0

Ich habe darüber nachgedacht, wollte aber meine Änderungen auf ein Minimum beschränken. Plus, ich habe gezeigt, wie man gegen Teilung durch 0 schützen kann. – Barmar

+0

Danke, das war wirklich hilfreich, aber was ist Funktion von _italic_ ** fett ** 'Durchschnitt = num? (double) sum/num: 0' was ist _italic_ ** fett ** '?' und _italic_ ** fett ** ': 0' tut? auch, was sind die Namen dieser Betreiber übrigens ja ich hätte _italic_ ** fett ** '* (ageStudent + i)' aber das war nicht erlaubt –

0

Anfangs jung auf die maximale Menge ganzer Zahlen den Vergleich zu erzwingen, die eine setzt.

Streng genommen die anfänglichen alt negatives Maximum sein sollte (sig) integer alle formal mögliche Fälle zu handhaben und auch der num = 0 Fall angesprochen werden soll.

1

Sie behalten das Alter des jüngsten Studenten in young, aber initialisieren es auf 0, so wird natürlich keiner der Schüler in der Liste erfüllen ageStudent[i] < young. Initialisiere es stattdessen auf einen großen Wert. Im Allgemeinen wird der größte Wert, den der fragliche Typ (int) annehmen kann, bevorzugt. Wenn Ihnen das kompliziert erscheint, können Sie in diesem Fall so etwas wie 1000 verwenden, solange keiner Ihrer Schüler über tausend Jahre alt ist.

0

Ihr Problem ist die Variable young. Sie initialisieren es hier 0:

int i, young = 0, old = 0, sum = 0, mov = 0; 

Dann überprüfen Sie es hier:

if (*(ageStudent + mov) < young) { 

Aber die ageStudent Variable wird immer größer als 0, solange niemand Ihrer Schüler unter 0 Jahre alt, also wird die Bedingung immer auf false ausgewertet.

Sie können das Problem lösen, indem Sie zu Beginn Ihrer Funktion young auf eine hohe Zahl setzen.

Verwandte Themen