У меня возникла проблема с вызовом этой функции. Предполагается переформатировать имя из «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
Как же тогда скомпилировать свой файл реализации? Когда я удаляю пустую главную, я получаю эту ошибку: {/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 статус выхода } –
Правильная подпись для main is int main (int argc, char ** argv) Вы можете игнорировать параметры, если вам не нужны аргументы командной строки. Тем не менее, они должны будут связываться. –
Я новичок в этом программировании объектов, так голый со мной здесь: В моем основном программном файле моя главная функция должна выглядеть примерно так: int main (int argc, char ** argv)? Кроме того, если это так, я не понимаю, какие мои аргументы должны быть ... –