Programming Basics with Python - февруари 2020
Loading...
+ Нов въпрос
Vbrasnarova avatar Vbrasnarova 0 Точки

Nested Loops - 04. Train The Trainers

Добър вечер , имам нужда от малко помощ , да намеря грешката си . 

Условието на задачата е :

Курсът "Train the trainers" е към края си и финалното оценяване наближава. Вашата задача е да помогнете на журито което ще оценява презентациите, като напишете програма в която да изчислява средната оценка от представянето на всяка една презентация от даден студент, а накрая средният успех от всички тях.
От конзолата на първият ред се прочита броят на хората в журито n - цяло число в интервала [1…20]    
След това на отделен ред се прочита името на презентацията - текст
За всяка една презентация на нов ред се четат n - на брой оценки - реално число в интервала [2.00…6.00]
След изчисляване на средната оценка за конкретна презентация, на конзолата се печата
 "{името на презентацията} - {средна оценка}."
След получаване на команда "Finish" на конзолата се печата "Student's final assessment is {среден успех от всички презентации}." и пограмата приключва.
Всички оценки трябва да бъдат форматирани до втория знак след десетичната запетая.

Примерен вход и изход
Вход    Изход    Обяснения
2
While-Loop
6.00
5.50
For-Loop
5.84
5.66
Finish    

    2 – броят на хората в журито следователно ще получаваме по 2 оценки на презентация.
(6.00 + 5.50) / 2 = 5.75
(5.84 + 5.66) / 2 = 5.75
(6.00 + 5.50 + 5.84 + 5.66) / 4 = 5.75 
Вход    Изход    Вход    Изход
3
Arrays
4.53
5.23
5.00
Lists
5.83
6.00
5.42
Finish 

   Arrays - 4.92.
Lists - 5.75.
Student's final assessment is 5.34.

    2
Objects and Classes
5.77
4.23
Dictionaries
4.62
5.02
RegEx
2.88
3.42
Finish  

 Objects and Classes - 5.00.
Dictionaries" - 4.82.
RegEx - 3.15.
Student's final assessment is 4.32.
 

Решението ми :

#include <iostream>
#include <string>
#include <math.h>
using namespace std;

int main()
{
    int people;
    cin >> people;
    string namePresent;
    cin >> namePresent;

    double averageGrade = 0;
    double gradeCounter = 0;
    double counter = 0;
    double sumGrade = 0;
    double allGrade = 0;

    cout.setf(ios::fixed);
    cout.precision(2);
    while (namePresent != "Finish") {
        sumGrade = 0;
        for (gradeCounter = 1.00; gradeCounter <= people; gradeCounter++) {
            double grade;
            cin >> grade;
            cin.ignore();
            allGrade += grade;
            sumGrade += grade;
            counter++;
            if (gradeCounter == people) {
                averageGrade = sumGrade / people;

                break;
            }
        }
        if (namePresent != "Finish") {
            cout << namePresent << " - " << averageGrade << "." << endl;;
        }
        getline(cin, namePresent);
    }
    if (namePresent == "Finish") {

        double totalGrade = allGrade / counter;
        cout << "Student's final assessment is " << totalGrade << ".";
    }

}

- става безкраен цикъл и не спира , а по другия начин , по който опитах ми изяжда първата дума , от името на презентацията .

ако някой ми го обясни , ще съм много благодарна :))).

Тагове:
0
Programming Basics with C++
MartinBG avatar MartinBG 2079 Точки

cin>>... прочита следващия елемент, но не премахва символа за нов ред, който е след него, докато getline чете до срещането на този символ (т.е. може да върне празен string). За справяне с проблема използваме std::ws, който премахва празните символи от началото на стрийма:

    std::string line;
    std::getline(std::cin >> std::ws, line);

Конкретно по твоето решение:

- имената на презентациите може да са съставени от няколко думи, следователно трябва да ги четем винаги с getline - при теб първата презентация се чете извън цикъла директно с cin>>namePresent

- cin трябва да се изчиства от празните символи, преди да бъде използван от getlinegetline(cin >> ws, namePresent)

 

0
23/02/2020 02:02:17