Форум программистов, компьютерный форум CyberForum.ru

Пропускает операторы считывания информации после первой итерации - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Как использовать переменную типа string в заголовочном файле? http://www.cyberforum.ru/cpp-beginners/thread942004.html
Есть файл cpp в котором объявлена переменная string head; Как мне использовать эту переменную в заголовочном файле?
C++ Не собирается проект bool CreateDisk(char *cmd) { char *dsk_name=GetParameter(cmd, "name="); int fd; //|предупреждение: variable «fd» set but not used | if (dsk_name == NULL) { cout<<"Disk name parameter not found. Default name.\n"; fd=open("disket.img", O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IROTH | S_IWOTH); } http://www.cyberforum.ru/cpp-beginners/thread941998.html
Полиморфизм C++
Всем доброго времени суток.Сразу к делу. Если описывать с помощью полиморфизма подклассы и потом динамично их создавать ,то можно вызывать замещенные(перегруженные) виртуальные функции описанные в базовом классе. А если мне нужно вызвать функцию которая описана только в подклассе? Если написал бред,- пожалуйста гляньте код. Обратите внимание на 63 строчку. Именно в ней загвоздка #include...
Ошибка при вызове команды open C++
Установил на семерку Visual C++ 6.0 Standard Edition. При открытии файлов появляется вот такая вот ошибка. С вылетает. ------------------------------------------------ Имя события проблемы: APPCRASH Имя приложения: MSDEV.EXE Версия приложения: 6.0.8168.0 Отметка времени приложения: 35889584 Имя модуля с ошибкой: devshl.dll Версия модуля с ошибкой: 6.0.8168.0 Отметка времени...
C++ спецификаторы %e и %l http://www.cyberforum.ru/cpp-beginners/thread941951.html
Доброго времени суток! Столкнулся с кодом, который читает из строки s числа формата x.xxxxe+xx, то есть в качестве примера s=0.23002032e+02. Чтение идет в массив buf. Творю все это с помощью команды sscanf, пример: char* buf=new char ; sscanf(s,"%le" ,buf); Отладчиком до этой функции по коду проекта добраться не выходит, поэтому для просмотра значения переменной юзаю printf: printf("Значение...
C++ Заполнение динамического масива Как заполнить динамический масив определенным числом без использования цыклов, жалательно при определении. Похоже на //int a = {0}; Масив не определенного размера scanf ("%d", &n); int *arry = new int ; подробнее

Показать сообщение отдельно
TrickSonix
1 / 1 / 0
Регистрация: 04.07.2013
Сообщений: 12
22.08.2013, 21:31     Пропускает операторы считывания информации после первой итерации
Доброго времени суток всем. Все кому лень читать предистории можете смело пропускать следующие строки, смотреть на код, и возникшую проблему которую я опишу под ним.
Я лишь недавно занялся изучением С++ по книге Дейтелов. На протяжении первых 5-6 глав там мусолят класс под названием GradeBook. Ну и я следуя инструкциям, и некоторым своим соображениям мусолил этот же класс вместе с книгой. В 5-ой главе, когда демонстрируют оператор выбора switch представляют текст программы на С++ этого класса вместе с добавлением сего оператора. Суть - считывание буквенных оценок, и, по окончанию ввода, вывод количества различных буквенных оценок. Кому интересно, в книге это страница 282(издание 2008 года). Мой же собственный код отличается от этого тем, что я попытался сделать так чтобы эта программа работала столько раз, сколько я захочу (цикл while с меткой). Вот как это получилось в итоге:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <cstdlib>
#include <iostream>
#include <string>
#include "GradeBook.h"
 
using namespace std;
 
int main()
{
    string nameOfCourse;
    string name;
    int choise = 0;
    char k = 'n';
    cout << "Enter name: " << endl;
    getline(cin, name);
    GradeBook gradeBook1(name); //создание класса с именем gradeBook1
 
    cout << "gradeBook1 created for: " << gradeBook1.getCourseName() << endl;
    do
    {
        cout << "\nPlease enter the course name for gradeBook:" << endl;
        getline( cin, nameOfCourse );
        gradeBook1.setCourseName(nameOfCourse); //эта функция изменяет первоначальное имя курса
        cout << endl;
    
        gradeBook1.displayMessage();
        cout << "\nWhat kind of operation would have you do?" << "\n1)Determine Class Average\n2)Input letter grades" << endl;
        cin >> choise;
        if (choise == 1)
        {
            gradeBook1.determineClassAverage();
        }
        else
        {
            if (choise == 2)
            {
                gradeBook1.inputGrades(); // а вот и функция которая считывает буквенные оценки и записывает их количесвто в свои внутренние переменные
                gradeBook1.displayGradeReport(); // Это функция отображения полученного результата после окончания ввода
            }
            else
                cout << "Incorrect number of operation." << endl;
        }
        cout << "Continue? (y/n)" << endl;
        cin >> k;
    }
    while (k != 'n'); //по умолчанию пользователь не хочет продолжать работать с программой и нужно ввести y чтобы продолжить
    system("PAUSE");
   return 0;
}
А вот собственно и проблема - после того как цикл срабатывает первый раз перестают работать некоторые операторы ввода информации. Если, например, ввести неправильно номер операции то он просто выдает текст который выводят все функции cout до момента когда нужно выбрать операцию. А если же выбрать операцию 2 то после того как заканчиваешь вводить оценки(признаком конца ввода является символ EOF) цикл начинает повторяться до бесконечности.
Ниже написаны функции класса, на всякий случай.
Для создания программ пользуюсь Dev-cpp 4.9.9.2
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <cstdlib>
#include <iostream>
#include <iomanip>
#include "GradeBook.h"
 
using namespace std;
 
GradeBook::GradeBook(string name)
{
    setCourseName(name);
    aCounter = 0;
    bCounter = 0;
    cCounter = 0;
    dCounter = 0;
    fCounter = 0;
}
 
void GradeBook::setCourseName(string name)
{
    if (name.length() <= 25)
        courseName = name;
    else
    {
        courseName = name.substr(0,25);
        cout << "Name \"" << name <<"\" exceed maximum length.\nLimiting courseName to first 25 characters.\n" << endl;
    }
}
 
string GradeBook::getCourseName()
{
    return courseName;
}
 
void GradeBook::displayMessage()
{
    cout << "Welcome to Grade Book for\n" << getCourseName() << "!" << endl;
}
 
void GradeBook::determineClassAverage()
{
    int gradeCounter = 0;
    int grade = 0;
    double average = 0;
    int total = 0;
    cout << "Enter grade or -1 to end: " << endl;
    cin >> grade;
    while (grade != -1)
    {
        gradeCounter += 1;
        total = total + grade;
        cout << "Enter grade or -1 to end: " << endl;
        cin >> grade;       
    }
    if (gradeCounter != 0)
    {
        average = static_cast<double>(total)/gradeCounter;
        cout << "\nTotal of all " << gradeCounter << " grades entered is " << total << endl;
        cout << "Class average is " << setprecision(2) << fixed << average << endl;
    }
    else
        cout << "No grades were entered." << endl;
}
 
void GradeBook::inputGrades()
{
    int grade = 0;
    cout << "Enter the letter grades." << endl << "Enter the EOF character to end input." << endl;
 
    while ((grade = cin.get()) != EOF)
    {
        switch (grade)
        {
            case 'A':
            case 'a':
                aCounter++;
                break;
            case 'B':
            case 'b':
                bCounter++;
                break;
            case 'C':
            case 'c':
                cCounter++;
                break;
            case 'D':
            case 'd':
                dCounter++;
                break;
            case 'F':
            case 'f':
                fCounter++;
                break;
            case '\n':
            case '\t':
            case ' ':
                break;
            default:
                cout << "Incorrect letter grade entered. Enter another." << endl;
                break;
        }
    }
}
 
void GradeBook::displayGradeReport()
{
    cout << "\nNumber of students who received each letter grade:"
        << "\nA: " << aCounter
        << "\nB: " << bCounter
        << "\nC: " << cCounter
        << "\nD: " << dCounter
        << "\nF: " << fCounter
        << endl;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 15:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru