我有這個剛剛開始的程式:
#include <iostream>
#include <iomanip>
#include <ctime>
#include <string>
using namespace std;
class Grade
{
public:
string studentID;
int userChoice = 0;
int size = 0;
double* grades = new double[size]{0};
};
void ProgramGreeting(Grade &student);
void ProgramMenu(Grade& student);
string GetID(Grade& student);
int GetChoice(Grade& student);
void GetScores(Grade& student);
int main()
{
Grade student;
ProgramGreeting(student);
ProgramMenu(student);
}
// Specification C1 - Program Greeting function
void ProgramGreeting(Grade &student)
{
cout << "--------------------------------------------" << endl;
cout << "Welcome to the GPA Analyzer! " << endl;
cout << "By: Kate Rainey " << endl;
cout << "Assignment Due Date: September 25th, 2022 " << endl;
cout << "--------------------------------------------" << endl;
GetID(student);
cout << "For Student ID # " << student.studentID << endl;
}
void ProgramMenu(Grade &student)
{
cout << "--------------------------------------------" << endl;
cout << setw(25) << "Main Menu" << endl;
cout << "1. Add Grade " << endl;
cout << "2. Display All Grades " << endl;
cout << "3. Process All Grades " << endl;
cout << "4. Quit Program." << endl;
cout << "--------------------------------------------" << endl;
GetChoice(student);
}
string GetID(Grade &student)
{
cout << "Enter the student's ID: ";
cin >> student.studentID;
if (student.studentID.length() != 8) {
cout << "Student ID's contain 8 characters ";
GetID(student);
}
return student.studentID;
}
int GetChoice(Grade &student)
{
cout << "Enter your selection: ";
cin >> student.userChoice;
if (student.userChoice == 1) {
GetScores(student);
}
else if (student.userChoice == 2)
{
}
else if (student.userChoice == 2)
{
}
else if (student.userChoice == 4)
{
exit(0);
}
else
{
cout << "Please enter 1, 2, 3 or 4" << endl;
GetChoice(student);
}
}
void GetScores(Grade &student)
{
int count = 0;
double score = 0;
cout << "How many test scores would you like to enter for ID# "
<< student.studentID << "? ";
cin >> student.size;
while (count != student.size) {
cout << "Enter a grade: ";
cin >> score;
for (int i = 0; i < student.size; i ) {
student.grades[i] = score;
}
count ;
}
for (int i = 0; i < student.size; i ) {
cout << student.grades[i] << " ";
}
}
我試圖確保我的陣列記錄了所有測驗分數,但是當我在GetScore函式中輸出陣列時,陣列中的每個元素都與我輸入的最后一個分數相同或相等。例如,如果我選擇3size 然后輸入 的三個值99.2 86.4 90.1,則所有三個元素都將顯示為90.1。
為什么會這樣?

uj5u.com熱心網友回復:
您的類正在分配一個包含 0 個元素Grade的陣列(這是未定義的行為),然后您的函式在詢問用戶他們將輸入多少分數后不會重新分配該陣列,因此您將輸入值寫入無效記憶體(這也是未定義的行為)。doubleGetScores()
即使您正確地管理了陣列的記憶體(即,通過使用std::vector而不是new[]),GetScores()也會運行一個for回圈,將用戶的最新輸入值寫入陣列的每個元素,而不是僅僅將其寫入下一個可用元素。這就是為什么您的最終輸出僅顯示每個元素中輸入的最后一個值的原因。你需要完全擺脫那個for回圈。
改用類似的方法(您的代碼還有其他幾個問題,但我會將這些問題作為單獨的練習留給您解決):
class Grade
{
public:
...
int size = 0;
double* grades = nullptr;
};
...
void GetScores(Grade &student)
{
int size = 0;
double score = 0;
cout << "How many test scores would you like to enter for ID# " << student.studentID << "? ";
cin >> size;
if (student.size != size) {
delete[] student.grades;
student.grades = new double[size]{0};
student.size = size;
}
for(int i = 0; i < size; i) {
cout << "Enter a grade: ";
cin >> score;
student.grades[i] = score;
}
for (int i = 0; i < size; i) {
cout << student.grades[i] << " ";
}
}
或者:
#include <vector>
...
class Grade
{
public:
...
vector<double> grades;
};
...
void GetScores(Grade &student)
{
size_t size = 0;
double score = 0;
cout << "How many test scores would you like to enter for ID# " << student.studentID << "? ";
cin >> size;
student.grades.resize(size);
for (size_t i = 0; i < size; i) {
cout << "Enter a grade: ";
cin >> score;
student.grades[i] = score;
}
/* alternatively:
student.grades.clear();
for (size_t i = 0; i < size; i) {
cout << "Enter a grade: ";
cin >> score;
student.grades.push_back(score);
}
*/
for (size_t i = 0; i < size; i) {
cout << student.grades[i] << " ";
}
}
uj5u.com熱心網友回復:
我for從我的回圈中洗掉了我的while回圈。
void GetScores(Grade &student)
{
int count = 0;
double score = 0;
cout << "How many test scores would you like to enter for ID# "
<< student.studentID << "? ";
cin >> student.size;
while (count != student.size) {
cout << "Enter a grade: ";
cin >> score;
student.grades[count] = score;
count ;
}
for (int j = 0; j < student.size; j ) {
cout << student.grades[j] << " ";
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506484.html
上一篇:學習ASP.NET Core Blazor編程系列二——第一個Blazor應用程式(完)
下一篇:按值或按參考回傳類
