Как использовать реальные строковые типы для представления строк в функции структуры класса? - PullRequest
0 голосов
/ 31 октября 2011

Мне дали задание ввести некоторые данные ученика, например

  • вариант 1: введите имя и идентификатор учащегося.
  • вариант 2: введите i.d (проверка по идентификатору студента - введите 1), введите до 10 оценок для студента, а затем вычислите среднюю и буквенную оценку для студента
  • вариант 3: вывести имя студента, его идентификатор и оценку по буквам.

Программа должна быть написана в классоподобной структуре - с объявленными переменными и функциями в структуре.

Мне также дали задание ввести данные 3 учеников, используя структуру класса. Для простоты сейчас я пишу программу для одного студента.

Программа компилирует O.K

Первая конкретная возникшая проблема: когда я выбираю опцию «I», программа позволяет мне ввести имя студента и все! - по какой-то причине пропускает ввод идентификатора и продолжает работу.

Проблема в том, что я использовал cin>>, а также scanf() в качестве основных методов ввода - но они и system("Pause") не очень хорошо мне помогают - я понимаю, system("pause") не очень эффективен. В прошлом мне советовали использовать тип реальной строки для представления строк, таких как std::string класс из библиотеки <string>.

Поэтому я был бы признателен за любую помощь со строковыми классами, чтобы я мог узнать о них.

Я полагаю, что могут быть некоторые другие проблемы с моей программой, но любой совет по поводу строковых классов и моей «первой конкретной обнаруженной проблемы» был бы полезен для начала.

Итак, я написал следующую программу для представления моего ответа.

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


  struct classroom{

     char name;
     int student_id;
     float grades[10];
     int num_tests;
     float average;

     float letter_grade;
     void enter_name_id(void);
     void enter_grade(int);
     void average_grades(int);
     void letter_grades(void);
     void output_name_id_grade(void);

  };


     void classroom::enter_name_id(){

          cout<<"\n Please enter name of student: \n"<<"\n";

          cin>>name;
          cout<<"\n Please enter student i.d number: \n"<<"\n";
          scanf("%d",student_id);

          cout<<"\n"<<student_id;

        system("PAUSE");

     }

     void classroom::enter_grade(int n_tests){

          if(n_tests<=10){

             cout<<"\n Please enter student test grade: \n"<<"\n";
             cin>>grades[n_tests];

          }
          else{

             cout<<"\n You have reached your max number of grades entered!!"<<"\n";     

          }

         system ("PAUSE");
     }


     void classroom::average_grades(int n_tests){


          float sum=0;
          int i;

          for(i=0;i<n_tests;i++){

                    sum =sum+grades[i];             

          }
          average=sum/(float)n_tests;
          system ("PAUSE");
     }




     void classroom::letter_grades(void){

                if(average>=90){

                    letter_grade=65;   
                }
                if(average>=80&&average<90){

                    letter_grade=66; 
                }
                 if(average>=70&&average<80){

                    letter_grade=67; 
                }
                 if(average>=60&&average<70){

                    letter_grade=68; 
                }
                 if(average<60){

                    letter_grade=70; 
                }
                system ("PAUSE");
     }

     void classroom::output_name_id_grade(void){

           cout<<"\    Name     I.D   Grade "<<"\n";  

           cout<<name <<"      ";
           cout<<student_id<<"      ";
           cout<<(char)letter_grade<<"\n";  
           system ("PAUSE");
     }


int main()
{       
    classroom a;
    char  option,answer,ans;
    int a_num_tests, id;
    a_num_tests=0;


 for( ; ;){

 cout<<"\nEnter 'I' for Name and I.d, 'G' for grades or 'O' for Data output "<<"\n";

              cin>>answer;
              switch(answer){

                           case'I':

                                    a.enter_name_id();
                                    break;
                           case'G':
                                cout<<"\n Please enter student i.d number: "<<"\n";
                                scanf("%d",id);
                                cout<<"\n"<<id;
                                if(id==a.student_id){

                                    a_num_tests++;
                                    a.enter_grade(a_num_tests);
               cout<<"\n Would you like to enter another grade?   'Y' or 'N': "<<"\n";
                                    cin>>ans;

                                    while(ans=='y'||'Y'){
                                       a_num_tests++;

                                       a.enter_grade(a_num_tests);
               cout<<"\n Would you like to enter another grade? 'Y' or 'N': "<<"\n";
                                       cin>>ans;
                                    }

                                    a.average_grades(a_num_tests);
                                    a.letter_grades();

                                }
                                else{

                  cout<<"\n You have entered the wong i.d number!!! \n"<<"\n";

                                break;
                           }


                           case 'O':

                                a.output_name_id_grade();
                                break;
                           default:
                                cout<<"\n Wong Entry "<<"\n";
                                break;
                }
 }
 system ("PAUSE");
 return 0;

}

Ответы [ 3 ]

2 голосов
/ 06 ноября 2011

Привет еще раз всем тем, кто хочет знать, этот код работал для меня:

     void classroom::enter_name_id(void){

           cout << " Please enter your name\n>";
           std::cin.ignore( 25, '\n' );
           cin.getline( name,25);

           cout << " Type id\n>";
           cin>>student_id;
     return;
     }

Не уверен, как работает эта строка: 'std :: cin.ignore (25,' \ n '); '!!!Но тем не менее это было необходимо для того, чтобы компилятор не пропустил следующую строку: 'cin.getline (name, 25);'

Изначально у меня были проблемы с использованием только 'cin >> name' вФункция класса, и именно поэтому я задал вопросы для альтернативных типов реальных строк.

Если у кого-то есть что-то еще, чтобы добавить к этому вопросу, пожалуйста, сделайте это.

Я хотел бы сказать спасибоснова всем моим фанатам, которые внесли свой вклад в этот прогресс, которого мы достигли вместе.

Парус на ...

0 голосов
/ 31 октября 2011

Так много вещей, чтобы сказать ... почему вы пишете << "\n" << "\n" ?? Вы можете просто поместить всю строку в один кусок, << "\n\n" ... в любом случае.

Для ввода / вывода, просто придерживайтесь iostreams, и не смешивайте и не сочетайте функции библиотеки C без уважительной причины. Возможно, так:

std::string name;
int         id;

std::cout << "Please enter your name: ";
std::getline(std::cin, name);

std::cout << "Please enter the ID: ";
std::cin >> id; // see below

Может быть этот ответ вам пригодится. Операции ввода должны быть проверены на наличие ошибок, если вы хотите написать серьезный код.

Обратите внимание, что извлечение токена (>>) читает слово за словом, поэтому std::cin >> name будет читать только одно слово. Для чего-то вроде имени мы предпочитаем getline() по этой причине.

Если вы запускаете вашу программу из командной строки, вам не понадобятся все эти system("pause") вызовы, либо ...

Обновление: Как правило, не рекомендуется смешивать извлечение токенов (>>) с чтением строк (getline()), поскольку первое не сожрает новые строки, а второе - нет. Лучше всего придерживаться только одного из двух, в зависимости от того, что больше подходит для формата ввода.

Если вы используете только чтение строк, вам все равно придется обрабатывать каждую строку, возможно, снова путем извлечения токена. Для этого вам нужен поток строк . Включите <sstream> и замените последнюю строку на:

std::string line; // you can put this at the top with the other declarations
std::getline(std::cin, line);

std::istringstream iss(line);
iss >> id;
0 голосов
/ 31 октября 2011

scanf вызывает проблемы с буфером.Вам нужно очистить буфер после его использования.fflush(stdin).это очистит ваш буфер и ввод остановится для идентификатора и других входных данных.

Также вы можете использовать getch() вместо system ("PAUSE");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...