2017-03-22 17 views
0

Ich habe erst im Januar angefangen zu programmieren und noch sehr, sehr neu! Mein Code sieht wahrscheinlich wie Müll aus und es gibt definitiv einen Weg, ihn effizienter zu machen, aber ich habe es noch nicht gelernt!C++: Extra neue Zeile nach Eingabe einer Schleife?

Ich kann nicht herausfinden, warum es eine neue Zeile in meinem Display gibt!

Die Ausgabe sieht wie folgt aus etwas:

Student name Test1 Test2 Test3 Test4 Average Grade 
Ben Smith 
90    88  77  55  76.55 A 

Hier ist die Bildung der Textdatei Inhalt, wenn Sie versuchen möchten.

90 88 77 55 Ben Smith 
66 77 66 55 Stuart Bit 

Hier ist mein vollständiger Code (die Ausgabeanweisungen zum Ende sind):

#include<iostream> 
#include<iomanip> 
#include<fstream> 
#include<string> 
using namespace std; 

int main() 
{ 
    string name[25], grade[25]; 
    string dummy; 
    int lineNum=0; 
    int x,y; 

    int table[25][4]{}; 
    double average[25]{},classAvg[4]{}; 

    ifstream in; 
    in.open("classData.txt"); 

    while(getline(in, dummy)) 
    { 
     lineNum++; 
    } 

    in.close(); 
    in.open("classData.txt"); 

    while(!in.eof()) 
    { 
     for(x=0; x<lineNum;x++) 
     { 
      for(y=0;y<4;y++) 
      { 
      in>> table[x][y]; 
      } 
      in.ignore(1, '\n'); 
      getline(in, name[x]); 
     } 
    } 

    in.close(); 

    for(x=0; x<lineNum;x++) 
    { 
     for(y=0;y<4;y++) 
     { 
      average[x] += table[x][y]; 
     } 
     average[x]= average[x]/4; 
    } 

    for(int x=0;x<4;x++) 
    { 
     for(int y=0;y<lineNum;y++) 
     { 
     classAvg[x]+=table[y][x]; 
     } 
     classAvg[x]=classAvg[x]/lineNum; 
    } 

    for(int x=0;x<lineNum;x++) 
    { 
     if(average[x]>= 90) 
     grade[x]="A"; 
     else if(average[x]>= 80) 
     grade[x]="B"; 
     else if(average[x]>= 70) 
     grade[x]="C"; 
     else if(average[x]>= 60) 
     grade[x]="D"; 
     else 
     grade[x]="F"; 
    } 

    cout<<setw(20)<<"Student Name" 
    <<setw(20)<<"Test 01"<<setw(20)<<"Test 02" 
    <<setw(20)<<"Test 03"<<setw(20)<<"Test 04" 
    <<setw(20)<<"Average" 
    <<setw(20)<<"Grade"<<endl; //Print headers. 

    for(int x=0;x<lineNum;x++) 
    { 
     cout<<setw(20)<<name[x]; //Print all students' names. 
     for(int y=0;y<4;y++) 
     { 
     cout<<setw(20)<<table[x][y]; //Print 4 tests per student. 
     } 
     cout<<setw(20)<<setprecision(2)<<fixed<<average[x]; //Print average of 4 tests. 
     cout<<setw(20)<<grade[x]<<endl; //Print the grade of the student. 
    } 
} 
+2

Versuchen Sie einen Debugger zu verwenden – Danh

+0

Der Code 'Test 01' erzeugt nicht den Ausgang' Test1'. Niemand möchte versuchen zu entziffern, was Sie nicht richtig kopieren/einfügen konnten. –

+0

Um Danhs Vorschlag zu folgen, [dieser Artikel ist ein guter] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). – BoBTFish

Antwort

0

Ich glaube, Sie zum ersten Mal Programmierern einen guten Job machen! Die neue Zeile in Ihrer Ausgabe stammt aus Ihrer Eingabedatei.

mit:

getline(in, name[x]); 

lesen Sie alle Zeichen am Ende der Newline inklusive.

Sie könnten versuchen, Name [x] danach zu trimmen.

+0

Ja! Das war genau das Problem! Ich hatte gedacht, getline() würde das Newline-Zeichen verwerfen, da es von Benutzereingaben stammt. Anscheinend nicht beim Lesen einer Textdatei! Danke für das Aufzeigen! –

Verwandte Themen