Вывод, который я получаю, неверен, и я получаю бесконечный цикл.
Для удобства использования это назначение описано ниже с помощью числовых индексов от 1 до 14.
Это стандартное задание программирования на C++ с использованием компилятора командной строки g++ или встроенного в zyBooks. Никаких графических форм и никакой Visual Studio. Никакие внешние файлы и базы данных не используются.
Существует только одна объектно-ориентированная программа для выполнения в этом задании. Весь код должен быть сохранен в файле с именем ExamScoresUpdate.cpp, который является единственным файлом, отправленным на оценку. Файлы .h не используются.
Файл .cpp содержит main() и два класса, ExamScores и DataCollector. Между этими двумя классами нет никаких отношений, включая наследование. Их определение и использование описаны ниже, начиная с пункта 10.
Если вы отправите файл .cpp, который не может быть скомпилирован с помощью g++ из-за синтаксических ошибок, вы получите не более 20% или 10 баллов за это задание.
Эта программа, то есть main (), сначала позволяет пользователю ввести два набора баллов, set1 и set2, по одному набору за раз и по одному баллу на строку, пока не будет введено -999. Баллы-это целые числа, положительные или отрицательные, и могут быть равны нулю. Каждый набор может не содержать ни одного балла или любого количества баллов, и они могут содержать одинаковое или разное количество баллов.
Без учета обработки исключений, которая будет обсуждаться в главе 9, эта программа предполагает, что пользователь вводит только целочисленные оценки или 0 или -999. Поэтому проверка входных данных не требуется.
После ввода первых двух наборов баллов программа обновляет каждый балл set1, добавляя соответствующий балл set2, и отображает результат. Например, если set1 и set2 содержат по три оценки, скажем, { 70, 90, 50 } и { 2, -1, 100} соответственно, обновление (т. е. set1 + set2) изменяет set1 на { 72, 89, 150 }. Смотрите верхнюю половину рисунка слева ниже.
Затем он позволяет пользователю ввести 3-й набор баллов, set3, и использует его для повторного обновления баллов set1 и отображения результата. Например, если set3 равен { 1, 0, 33 }, обновление (т. е. set1 + set3) изменяет вышеуказанный set1 на { 73, 89, 183 }. См. нижнюю половину рисунка слева ниже.
Важным правилом для каждого обновления является то, что оба набора должны содержать равное количество баллов. Если нет, то отображается сообщение об ошибке "<error> Не удается обновить-наборы баллов имеют неравные размеры!" Смотрите верхнюю половину правого рисунка ниже, где возникает ошибка, потому что set2 имеет только один балл, а set1-три.
Поскольку мы хотим, чтобы это была объектно-ориентированная программа с классами и main (), и мы не ожидаем, что в нее будут включены какие-либо автономные функции. Поэтому, чтобы поддерживать процесс из функции main(), два занятия являются обязательными, которые ExamScores и DataCollector.
Класс ExamScores определяет только один частный элемент данных, который является вектором целых чисел. Когда вводятся баллы set1 и set3, они должны храниться в этом элементе данных двух объектов ExamScores отдельно. Однако баллы set2 хранятся непосредственно в векторе целых чисел в main().
Класс ExamScores определяет не конструкторы, а пять открытых функций-членов:
GetScores: он возвращает частный элемент данных ExamScores, который представляет собой вектор целых чисел.
EnterScore: он принимает входной параметр integer и добавляет его к частному члену данных ExamScores без возвращаемого значения.
Обновление: он принимает входной параметр вектора целых чисел и, если вектор целых чисел частного элемента данных ExamScores и входной вектор имеют одинаковый размер, он добавляет каждое целое число входного вектора к целому числу в той же позиции частного элемента данных ExamScores. Если оба вектора имеют неравные размеры, он отображает "ошибка не может обновить-наборы баллов имеют неравные размеры!" (см. рисунок справа ниже). Он не имеет возвращаемого значения.
Обновление: функция перегрузки вышеупомянутого обновления. Он использует входной параметр объекта ExamScores для выполнения того же самого, что и приведенное выше обновление.
Дисплей: он отображает вектор целых чисел частного элемента данных экзаменационных баллов, по одному числу в строке. Дисплей начинается и заканчивается линией тире, как '---------' и простой заголовок " Scores:" печатается перед первым счетом.
Для целей классификации никакие другие функции-члены не должны включаться.
The DataCollector class is defined to facilitate user interaction for data input and store them in an ExamScores object or a vector. It has no data members at all but two public overloading member functions called AskUser(), one returns an ExamScores object and the other returns a vector of integers. Because different return types cannot make overloading functions, these two AskUser() must use either different types or different numbers of input parameters. This is a part intended for your own design. Whichever way you choose to make them overloaded, the input parameter(s) is supposed to be used to display the header line like "Exam scores of set 1" or "Exam scores of set 2". After this line, AskUser() starts a loop to prompt user "Enter an integer score or '-99' to end:" to collect score input and store them in an ExamScores object or a vector of integers. The loop ends when user enters -999 and AskUser() returns its ExamScores object or vector of integers.
В рамках требований main(), вход set1 и set3 должен использовать AskUser (), который возвращает объект ExamScores, а вход set2 должен использовать другой AskUser() для возврата вектора.
Чтобы помочь вам разработать и протестировать эту программу, ниже прилагается exe-файл для Windows с двумя образцами скриншотов. Вы можете скачать файл .exe на свой компьютер Windows и дважды щелкнуть по нему, чтобы протестировать запуск программы.
Что я уже пробовал:
/* Brandon Jones ExamScoresUpdate program */ #include <iostream> #include <vector> using namespace std; // ExamScores class ExamScores { private: // the private data member as a vector integer // Set1 and set 3 are stored in this member vector<int> Exm_scores; public: // return the private data member of ExamScores vector<int> GetScores() { return Exm_scores; } // Takes input parameter of integers and adds it to private data member void EnterScore(int Exm_score) { // push back is used here to add new element at the end of the vector Exm_scores.push_back(Exm_score); // should 999....?????? } // used to test and compare the size of the input parameter vectors and the input vectors void Update(vector<int> set) { // testing and comparing size of both if(set.size() == Exm_scores.size()) { // if the size are identical the program starts to add integers of the input vector // to integers of same position in the ExamScores. for(unsigned int i=0;i<Exm_scores.size();i++) Exm_scores.at(i) += set[i]; } // the else here is used if both are not identical else { // if they are not identical a error message is printed to the user!!! cout<<"<error> Cannot update--score sets have unequal sizes!"<<endl; } } // this uses the same function above for the upate but it is testing for overloading within the ExamScore void Update(ExamScores set) { if(Exm_scores.size() == set.Exm_scores.size()) { for(unsigned int i=0;i<Exm_scores.size();i++) Exm_scores.at(i) += set.Exm_scores.at(i); } else { cout<<"<error> Cannot update--score sets have unequal sizes!"<<endl; } } // displaying the Exm_scores results void Display() { cout<<"\n--------------\n Scores:"; for(unsigned int i=0;i<Exm_scores.size();i++) cout<<Exm_scores.at(i)<<"\n"<<endl; } }; // DataCollector class DataCollector { public: // function returning ExamScores ExamScores AskUser(string header,bool YesorNoExam) { ExamScores set; int Dat_score; cout<<header<<endl; do{ // asking user to integer integer cout<<" Enter an integer score or '-999' to end:\n "; cin>>Dat_score; // if statement used to test integer range if(Dat_score == -999) break; set.EnterScore(Dat_score); } while(Dat_score != -999); return set; } //function return vector of integers vector<int> AskUser(string header) { vector<int> set; int Dat_score; cout<<header<<endl; do{ cout<<" Enter an integer score or '-999' to end: "; cin>>Dat_score; if(Dat_score == -999) break; set.push_back(Dat_score); } while(Dat_score != -999); return set; } }; int main() { DataCollector DataCol; ExamScores first_set,third_set; // the vector in main that is used to hold members of set 2 vector<int> second_set; first_set = DataCol.AskUser("Exam scores of set 1",true); third_set = DataCol.AskUser("Exam Scores of set 3",true); second_set = DataCol.AskUser("Exam Scores of set 2"); cout<<"Set 1 :"; first_set.Display(); first_set.Update(second_set); cout<<"Set 1 + Set 2: "; first_set.Display(); //updated version cout<<"Set 3: "; third_set.Display(); cout<<"Set 1 + Set 3: "; first_set.Update(third_set); first_set.Display(); return 0; } // end of program
Patrice T
Почему вы думаете, что это бесконечный цикл ?
Где в коде ?
KarstenK
У вас есть инструмент отладчика?