【发布时间】:2011-10-31 12:56:40
【问题描述】:
我的任务是输入一些学生数据,例如
- 选项 1:输入学生姓名和 ID。
- 选项 2:输入 i.d(根据学生 ID 验证 - 输入选项 1),为学生输入最多 10 个成绩,然后计算学生的平均成绩和字母成绩
- 选项3:输出学生姓名、id和字母成绩。
程序必须以类类结构编写 - 在结构中声明变量和函数。
我还被赋予了使用班级结构输入 3 名学生的详细信息的任务。为简单起见,我现在只是为一名学生编写一个程序。
程序编译成功
第一个具体遇到的问题:当我选择选项“我”时,程序让我输入学生姓名,就是这样! - 出于某种原因跳过 id 输入并继续。
问题是我一直使用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;
}
【问题讨论】:
-
为什么把C的scanf和C++的cin混在一起?作为一名 c++ 程序员,我永远无法成功地让 c 的函数正常工作。
-
如果这是家庭作业,请确保将问题标记为这样,因为假装明显的课堂练习是“真正的”编程问题被认为是一种糟糕的形式(并且响应的方法非常不同)。
-
不,Kerrek SB 这不是课堂作业问题,问题来自教科书,我正在自学
-
Hossein - 没有意识到 scanf() 是 C 的,而 cin 是 C++ 的,所以现在我知道了! - 谢谢。
-
就像@Hossein 所说,不要将
cin与旧的C 函数(如scanf)混合,输入缓冲很可能无法处理它。使用其中一种。