我正在工作,它是输入一些分数并打印出分数,排名和通过/失败。我正在使用C ++ 17,但在编辑我的等级时出错。
我试图将向量放在头文件的'setRankPass'函数中,但它根本不起作用。
头文件
#pragma once
#include <vector>
class Score {
public:
Score(int score)
: _score{ score } {
}
int getScore() {
return _score;
}
int getRank() {
return _rank;
}
bool getPass() {
return _pass;
}
void setRankPass(const std::vector<int>* scores, int size) {
for (int i{ 0 }; i < size; i++) {
_rank = rank[i];
}
double average = static_cast<double>(_rank) / size * 100;
if (average <= 10) {
_pass = true;
}
else {
_pass = false;
}
}
private:
int _score{ 0 };
int _rank{ 0 };
bool _pass{ false };
};
cpp文件
#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include "Score.h"
using namespace std;
int main() {
int enter{ 0 };
int counter{ 0 };
vector<Score> v;
vector<int> s;
while (enter != -1) {
cout << "Enter score(-1 to quit): ";
cin >> enter;
if (enter == -1)
break;
v.push_back(Score(enter));
counter++;
}
int cnt;
vector<int>rank;
for (int i = 0; i < v.size(); i++) {
cnt = 0;
for (int j = 0; j < v.size(); j++) {
if (v[i].getScore() < v[j].getScore()) {
cnt++;
}
}
rank.push_back(cnt + 1);
}
cout << endl;
for (int a{ 0 }; a < v.size(); a++) {
v[a].setRankPass(&rank, counter);
}
for (int k{ 0 }; k < v.size(); k++) {
cout << setw(5) << v[k].getScore() << setw(5) << v[k].getRank() << setw(5) << v[k].getPass() << endl;
}
return 0;
}
我在_rank = rank [i]上有一些错误。是error E0441 There is no argument list for class template "std::rank"
和Error C2065 'rank': Undeclared identifier
。我期望矢量等级的实例将分配给每个_rank。我该如何解决这个问题?
答案 0 :(得分:5)
在此范围内,您没有rank
矢量变量:
void setRankPass(const std::vector<int>* scores, int size) {
for (int i{ 0 }; i < size; i++) {
_rank = rank[i];
}
double average = static_cast<double>(_rank) / size * 100;
if (average <= 10) {
_pass = true;
}
else {
_pass = false;
}
}
您可以这样调用函数:
for (int a{ 0 }; a < v.size(); a++) {
v[a].setRankPass(&rank, counter);
}
但是您在serRankPass
范围内拥有的变量是分数。我想你打算做这样的事情:
void setRankPass(const std::vector<int> &rank, int size) { // Pay attention to & and not * (reference instead of pointer)
_rank = 0; // initialize to 0 and not junk value
for (int i{ 0 }; i < size; i++) {
_rank += rank[i]; // += instead of = (add and not overwrite)
}
double average = static_cast<double>(_rank) / size * 100;
if (average <= 10) {
_pass = true;
}
else {
_pass = false;
}
}
请注意,在此修复程序之后,您必须在主程序中更改以下行:
v[a].setRankPass(&rank, counter);
此行:
v[a].setRankPass(rank, counter);