2013-04-02 5 views
0

У меня возникла проблема с вызовом этой функции. Предполагается переформатировать имя из «First Mid Last» в «Last, First MidInitial» (если имеется среднее имя, иначе просто «Last, First»). Хотя если я изменил тип функции на строку, это даст другое список ошибок:Как я могу правильно назвать эту функцию?

In function âvoid getData(StudentType*, int)â: 
71:43: error: invalid use of void expression 

Кто-нибудь есть какие-либо предложения


ПРОГРАММА FILE


using namespace std; 
#include "StudentType.h" 
#include <iostream> 
#include <iomanip> 
#include <fstream> 
#include <climits> 
#include <string> 

const int MAX_STDS = 20; 

void getData(StudentType[], int&); 

void sortData(StudentType[], int&); 

void getFormat(string& name); 

void computeAverages(StudentType[], int&); 

void printData(StudentType[], int&); 


int main() { 

StudentType students[MAX_STDS]; 
StudentType(); 
int n; 

getData(students, n); 
sortData(students, n); 
computeAverages(students, n); 
printData(students, n); 

return 0; 
} 

void getData(StudentType students[], int n){ 
    ifstream fin; 
    int grade; 
    string filename, name; 
    bool done = false; 

    cout << "Enter filename: "; 
    cin >> filename; 
    fin.open(filename.c_str()); 
    while(true) { 
     try { 
     fin.open(filename.c_str()); 
     if(!fin) { 
      throw(string("Could not open " + filename + ".")); 
     } 
     break; 
     } 
     catch (string s) { 
      cout << s << endl; 
      cout << "Enter a different file name: "; 
      cin >> filename; 
     } 
    } 
    n=0; 
    while(n<MAX_STDS && getline(fin, name)) { 
     students[n].setName(getFormat(name)); 
     for(int i = 0; i < NUM_GRDS; ++i) { 
      fin >> grade; 
      students[n].setGrade(grade, i); 
     } 
     getline(fin, name); 
     ++n; 
    } 
} 

void printData(StudentType students[], int n) { 
    for(int i = 0; i < n; ++i) { 
     students[i].printLine(); 
    } 
} 

void computeAverages(StudentType students[], int n) { 
    for(int i = 0; i < n; ++i) { 
     students[i].computeAverage(); 
    } 
} 

void sortData(StudentType students[], int n) { 
    for(int i=0; i<n-1; i++) { 
     for(int j=0; j < n-1-i; ++j) { 
      if(students[j].getName() > students[j+1].getName()) { 
      swap(students[j], students[j+1]); 
      } 
     } 
    } 
} 

void getFormat(string name) { 
    string first; 
    string middle; 
    string last; 
    char n, m; 
    int size = 0; 
    n = name.find(' '); 
    first = name.substr(0, n); 
    m = name.find(' ', n + 1); 
    size = name.size(); 
    if (m != string::npos) { 
     middle = name.substr(n+1, m-(n+1)); 
     last = name.substr(m+1, size - (m+1)); 
    } 
    else { 
     middle = ""; 
     last = name.substr(n + 1, size - (n + 1)); 
    } 
    name = last + ", " + first; 
    if (middle != "") { 
     name = (name + ' ') + middle[0]; 
    } 
} 

Заголовочный файл


#ifndef STUDENTTYPE__H 
#define STUDENTTYPE__H 

#include <string> 
#include<iostream> 

const int NUM_GRDS = 10; 

class StudentType { 
    public: 
     StudentType(); 
     void setName(std::string); 
     void setGrade(int, int); 
     void computeAverage(); 
     std::string getName() const; 
     void printLine(std::ostream& = std::cout) const; 
    private: 
     std::string name; 
     int grades[NUM_GRDS]; 
     float avg; 
}; 

#endif 

РЕАЛИЗАЦИЯ FILE


#include "StudentType.h" 
#include <iomanip> 

StudentType::StudentType(){ 
    name = ""; 
    for(int i =0; i <NUM_GRDS; ++i){ 
     grades[i] = 0; 
    } 
    avg = 0.0; 
} 

void StudentType::setName(std::string newName){ 
    name = newName; 
} 

void StudentType::setGrade(int grade, int num){ 
    grades[num] = grade; 
} 

void StudentType::computeAverage(){ 
    float total = 0; 
    for(int i = 0; i<NUM_GRDS; ++i){ 
     total += grades[i]; 
    } 
    avg = total/NUM_GRDS; 
} 

std::string StudentType::getName() const{ 
    return name; 
} 

void StudentType::printLine(std::ostream& out) const { 
// out.setf(ios::left); 
// out.setf(ios::fixed); 
// out.setf(ios::showpoint); 
    out << "\n" << std::setw(25) << "Student" << std::setw(50) 
     << "Grades" << std::setw(10) << "Average" << std::endl; 
    out << "_____________________________________________________________________________________" << std::endl; 
    out << std::left << std::setw(25) << name << std::right << ' '; 
    for(int i = 0; i < NUM_GRDS; ++i){ 
    out << std::setw(5) << grades[i] << ' '; 
    } 
    out << std::setprecision(2) << std::setw(6) << avg << std::endl; 
} 

int main(){ 

return 0; 
} 

Мой вывод должен выглядеть следующим образом после того, как программа компилируется ...


Enter file name: grades.dat 

Student     Grades           Average 
________________________________________________________________________________________ 
Last, First    90 80 70 60 50 40 30 20 10 0 45.00 
Last, First    40 40 40 40 40 40 40 40 40 40 40.00 
Last, First    54 98 65 32 21 87 54 65 98 32 60.60 
Flames, Blood A   9 8 7 6 5 4 3 2 1 0 4.50 
Bottoms, Car    32 65 98 87 54 24 56 89 78 68 65.10 
Guitars, Dean   10 10 10 10 10 10 10 10 10 10 10.00 
Honer, Ruth T   78 56 12 23 45 89 31 64 97 79 57.40 
Hot, Zepher R   12 54 87 89 56 32 51 46 97 31 55.50 
. 
. 
. 

Входной файл должен иметь следующий формат и включать в себя более 20 студентов для целей тестирования: g0, g1, ... G9 должно быть 10 классов в диапазоне от 0 до 100

First Middle Last 
g0 g1 g2 g3 g4 g5 g6 g7 g8 g9 
First Last 
g0 g1 g2 g3 g4 g5 g6 g7 g8 g9 

ответ

2

Ошибка указывает, что вы неправильно используете функцию с типом возвращаемого значения void.

В вашем примере, вы можете увидеть эту строку:

students[n].setName(getFormat(name)); 

Согласно определению, функция GetFormat() возвращается недействительной и метод SetName ожидает зОго :: строки.

Кроме того, я обнаружил множественное определение для main(), которое не будет связываться. Посмотрите на конец файла реализации типа вашего ученика.

+0

Как же тогда скомпилировать свой файл реализации? Когда я удаляю пустую главную, я получаю эту ошибку: {/usr/lib/gcc/i586-suse-linux/4.6/../../../crt1.o: В функции '_start ': /home/abuild/rpmbuild/BUILD/glibc-2.14.1/csu /../ sysdeps/i386/elf/start.S: 115: неопределенная ссылка на 'main ' collect2: ld возвращен 1 статус выхода } –

+0

Правильная подпись для main is int main (int argc, char ** argv) Вы можете игнорировать параметры, если вам не нужны аргументы командной строки. Тем не менее, они должны будут связываться. –

+0

Я новичок в этом программировании объектов, так голый со мной здесь: В моем основном программном файле моя главная функция должна выглядеть примерно так: int main (int argc, char ** argv)? Кроме того, если это так, я не понимаю, какие мои аргументы должны быть ... –

Смежные вопросы