大一小弟,第一次搞项目,请请教一个问题,谢谢了.

cf527085608 2009-05-24 09:26:40
void addstudent( )//增加学生
{
int tag=1;char choice;
while(tag)
{
cout<<"增加学生:"<<endl;
cout<<"请输入学生学号:";
int n;
student *s;
cin>>n;
s=query1(n);
if(s==NULL)
cout<<"该学号已经存在!"<<endl;
else
{ cout<<"请输入学生姓名:";
char na[6];
cin>>na;
top++;
stu[top].addstudent(n,na);
}
int tag1=1;
while(tag1)
{
cout<<"想继续操作吗?(y/n)"<<endl;
cin>>choice;
if(choice=='y')
{tag=1;tag1=0;}
else
if(choice=='n')
{tag=0;tag1=0;}
else
{tag1=1;tag=1;cout<<"输入错误,请重新输入!"<<endl;}
}
}
}

小弟想了几个小时都没想出到低是哪错了,无论我输入的是'Y'还是'N',程序总是继续执行操作,哪位大哥大姐帮忙下,这是我第一次搞项目,不想就这么失败了.谢谢了.
所有代码在下面,因为我是刚测试,所以可能还有很多错误,所有请大家先把这个问题给解决了,由于大一菜菜,编得不好,献丑了.
# include<iostream.h>
# include<iomanip.h>
# include<fstream.h>
# include<string.h>
const int Maxs=10;
//using namespace std;
class student//学生类
{
private:
int tag;//删除标记,1已删除,0未删除
char name[6];//姓名
int num;//学号
float english;//英语成绩
float chinese;//语文成绩
float math;//数学成绩
public:
student(){}//构造函数
int gettag()const//获取删除标记
{
return tag;
}
char *getname()//获取姓名
{
return name;
}
int getnum()const//获取学号
{
return num;
}
float getenglish()const//获取英语成绩
{
return english;
}
float getchinese()const//获取语文成绩
{
return chinese;
}
float getmath()const//获取数学成绩
{
return math;
}
void settag(const int t)//设置删除标记
{
tag=t;
}
void setname(const char *n)//设置姓名
{
strcpy(name,n);
}
void setnum(const int n)//设置学号
{
num=n;
}
void setenglish(const float e)//设置英语成绩
{
english=e;
}
void setchinese(const float c)//设置语文成绩
{
chinese=c;
}
void setmath(const float m)//设置数学成绩
{
math=m;
}
float getsum()//求总分
{
return (english+math+chinese);
}
float getaverage()//求平均分
{
return float(getsum()/3);
}
void disp()//输出学生信息
{
cout<<"姓名:"<<name<<endl<<"学号:"<<num<<endl<<"英语成绩:"<<english<<endl<<"语文成绩:"<<chinese<<endl
<<"数学成绩:"<<math<<endl<<"总分:"<<getsum()<<endl<<"平均分:"<<getaverage()<<endl;
}
void addstudent(int n,char *na,float e=0,float m=0,float c=0)//增加学生
{
tag=0;
strcpy(name,na);
num=n;
english=e;
math=m;
chinese=c;
}
void delstudent()//删除学生
{
tag=1;
}
};

class sdatabase//学生库类
{
private:
int top;//数据指针
student stu[Maxs];//数据记录
public:
sdatabase()//构造函数,把数据从文件读到内存
{
student s;
top=-1;
fstream file("student.txt",ios::in);
while(1)
{
file.read((char *)&s,sizeof(s));
if(!file) break;
top++;
stu[top]=s;
}
file.close();
}
~sdatabase()//析构函数,把数据从内存写到文件
{
fstream file("student.txt",ios::out);
for(int i=0;i<=top;i++)
if(stu[i].gettag()==0)
file.write((char *)&stu[i],sizeof(stu[i]));
file.close();
}
student *query1(int n)//判断函数
{
for(int i=0;i<=top;i++)
if(stu[i].getnum()==n&&stu[i].gettag()==0)
return NULL;
return &stu[i];
}
student *query2(int n)//判断函数
{
for(int i=0;i<=top;i++)
if(stu[i].getnum()==n&&stu[i].gettag()==0)
return &stu[i];
return NULL;
}
void addstudent( )//增加学生
{
int tag=1;char choice;
while(tag)
{
cout<<"增加学生:"<<endl;
cout<<"请输入学生学号:";
int n;
student *s;
cin>>n;
s=query1(n);
if(s==NULL)
cout<<"该学号已经存在!"<<endl;
else
{ cout<<"请输入学生姓名:";
char na[6];
cin>>na;
top++;
stu[top].addstudent(n,na);
}
int tag1=1;
while(tag1)
{
cout<<"想继续操作吗?(y/n)"<<endl;
cin>>choice;
if(choice=='y')
{tag=1;tag1=0;}
else
if(choice=='n')
{tag=0;tag1=0;}
else
{tag1=1;tag=1;cout<<"输入错误,请重新输入!"<<endl;}
}
}
}

void delstudent( )//删除学生
{ int tag;char choice;
while(tag)
{
cout<<"减少学生:"<<endl;
cout<<"请输入学生学号:";
int n;
cin>>n;
student *s;
s=query2(n);
if(s==NULL)
cout<<"该学号不存在!"<<endl;
else
(*s).delstudent();
int tag1=1;
while(tag1)
{
cout<<"想继续操作吗?(y/n)"<<endl;
cin>>choice;
if(choice=='y')
{tag=1;tag1=0;}
else if(choice=='n')
{tag=0;tag1=0;}
else
{tag1=1;cout<<"输入错误,请重新输入!"<<endl;}
}
}
}
说我帖子内容过长,就放在下面了.









...全文
326 30 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
Haumwell 2009-05-25
  • 打赏
  • 举报
回复
的确,大一就这样."孺子可教也",呵呵
ysysbaobei 2009-05-25
  • 打赏
  • 举报
回复
ysysbaobei 2009-05-25
  • 打赏
  • 举报
回复
smillyz 2009-05-24
  • 打赏
  • 举报
回复
在循环变量控制是否结束的时候用的是字符变量就不能正确执行。如果你定义个整形变量就不会出错了,输入0结束,输入非零字符继续
这个问题我以前也遇见过,改后就正确了,至于why?sorry,i do not know。
下次再贴不要贴这么长的代码,看着就不爽,怎么帮你解决问题!
windsting 2009-05-24
  • 打赏
  • 举报
回复
关于你的第一个疑问,我运行了你的那个内层的while循环,
输入"n"的时候就退出了,而且这时候tag的值是0,
所以,如果在你的函数里,这就退出了外层的循环,
看看你测试的时候是不是CapsLock键按下了,导致输入的既不是"y"也不是"n"。

另外,这个程序整个都是你自己写的么?还是弄了一个已有的框架看了看就进行修改了?

如果是你自己写的,那么再问一下,你是自学的程序还是老师上课教的?

如果是自学的,找一本好点的教材,你先在看的这本书要把你带回到C的时代去了。

如果是老师教的,有两种可能,一种是:
你们老师教这门课已经10--15年了,对于C++这些年的变化不知情,或者没了解过,
另一种是:
教他C++的人属于第一种,而他则从来没有参与过真正的项目开发。
最好让学校知道这个“老师不能胜任他的工作”,或者让他自己知道,然后再好好学学。
别做的太直接,否则容易遭受到打击报复,over!
MichaelBomb 2009-05-24
  • 打赏
  • 举报
回复
晚上回来研究
raoyc2008 2009-05-24
  • 打赏
  • 举报
回复
帮顶!!!
liliangbao 2009-05-24
  • 打赏
  • 举报
回复
帮顶!!!
lzh9955 2009-05-24
  • 打赏
  • 举报
回复
我靠! 这么多,得伤多少脑细胞! 如果不是真正用到实处真不想看!
pathuang68 2009-05-24
  • 打赏
  • 举报
回复
一看你的代码,应该是稍微思考了一下,就开始敲键盘了。这毕竟是一个项目,所以最好先认真思考一下。比如3L说的可以考虑用STL中的container...
aaaa3105563 2009-05-24
  • 打赏
  • 举报
回复
呵呵 帮顶
na2650945 2009-05-24
  • 打赏
  • 举报
回复
有点缩进会好看很多。
pengzhixi 2009-05-24
  • 打赏
  • 举报
回复
while(1)
{
switch(choice)
{
case 1:sd.addstudent();break;
case 2:sd.delstudent();break;
case 3:sd.perachieve();break;
case 4:sd.tolist();break;
case 5:sd.elist();break;
case 6:sd.clist();break;
case 7:sd.mlist();break;
case 8:sd.setresult();break;
case 9:sd.result_in();break;
case 10:sd.result_del();break;
default:cout < <"输入有误!" < <endl;
}
你这个while循环拿什么退出?
datacodebugs 2009-05-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ltc_mouse 的回复:]
楼主输入的小写的n吗? 你代码中判断的是小写的~

一般可以处理同时判断大小写,就可以与键盘的CapsLock是否按下无关,更人性化点
C/C++ code

...
int tag1=1;
cin.clear(); //这里可以加上cin.clear(),用来清除之前的输入错误,等待下面的输入
while(tag1)
{
cout <<"想继续操作吗?(y/n)" <<endl;
cin>>choice;
if(choice=='y'||choice=='Y')
{tag=1;tag1=0;}
else if(choice=='n' || choice=='N…
[/Quote]

要同时判断大写、小写字母嘛
pengzhixi 2009-05-24
  • 打赏
  • 举报
回复
while(tag1)
{
cout < <"想继续操作吗?(y/n)" < <endl;
cin>>choice;
if(choice=='y') //choice=='y'||choice=='Y'
{tag=1;tag1=0;}
else
if(choice=='n') //choice=='N'||choice=='n'
{tag=0;tag1=0;}
else
{tag1=1;tag=1;cout < <"输入错误,请重新输入!" < <endl;}
wanlong1215 2009-05-24
  • 打赏
  • 举报
回复
你是大一的吗 ?
Vegertar 2009-05-24
  • 打赏
  • 举报
回复
汗,我觉得楼主就应该尝试下STL的container
ltc_mouse 2009-05-24
  • 打赏
  • 举报
回复
楼主输入的小写的n吗? 你代码中判断的是小写的~

一般可以处理同时判断大小写,就可以与键盘的CapsLock是否按下无关,更人性化点

...
int tag1=1;
cin.clear(); //这里可以加上cin.clear(),用来清除之前的输入错误,等待下面的输入
while(tag1)
{
cout <<"想继续操作吗?(y/n)" <<endl;
cin>>choice;
if(choice=='y'||choice=='Y')
{tag=1;tag1=0;}
else if(choice=='n' || choice=='N')
{tag=0;tag1=0;}
else
{tag1=1;tag=1;cout <<"输入错误,请重新输入!" <<endl;}
}
...
cf527085608 2009-05-24
  • 打赏
  • 举报
回复
void disp()//输出所有学生信息
{
cout<<"所有学生信息:"<<endl;
for(int i=0;i<=top;i++)
if(stu[i].gettag()==0)
stu[i].disp();
}
void perachieve()//个人成绩查询
{
int tag=1;char choice;
while(tag)
{
cout<<"个人成绩查询:"<<endl;
student *s;
int n;
cout<<"请输入学生学号:";
cin>>n;
s=query2(n);
if(s==NULL)
cout<<"不存在该学生!"<<endl;
else
(*s).disp();
int tag1=1;
while(tag1)
{
cout<<"想继续操作吗?(y/n)"<<endl;
cin>>choice;
if(choice=='y')
{tag=1;tag1=0;}
else if(choice=='n')
{tag=0;tag1=0;}
else
{tag1=1;cout<<"输入错误,请重新输入!"<<endl;}
}
}
}

void tolist()//按总分排名
{
cout<<"按总分排名:"<<endl;
student b;
for(int i=0;i<top;i++)
for(int j=i+1;j<=top;j++)
if(stu[i].getsum()<stu[j].getsum())
{
b=stu[i];
stu[i]=stu[j];
stu[j]=b;
}
}

void clist()//按语文成绩排名
{
cout<<"按语文排名:"<<endl;
student b;
for(int i=0;i<top;i++)
for(int j=i+1;j<=top;j++)
if(stu[i].getchinese()<stu[j].getchinese())
{
b=stu[i];
stu[i]=stu[j];
stu[j]=b;
}
}
void elist()//按英语成绩排名
{
cout<<"按英语排名:"<<endl;
student b;
for(int i=0;i<top;i++)
for(int j=i+1;j<=top;j++)
if(stu[i].getenglish()<stu[j].getenglish())
{
b=stu[i];
stu[i]=stu[j];
stu[j]=b;
}
}
void mlist()//按数学成绩排名
{
cout<<"按数学排名:"<<endl;
student b;
for(int i=0;i<top;i++)
for(int j=i+1;j<=top;j++)
if(stu[i].getmath()<stu[j].getmath())
{
b=stu[i];
stu[i]=stu[j];
stu[j]=b;
}
}

void setresult()//修改成绩
{
int tag=1;char choice;
while(tag)
{
cout<<"修改学生成绩:"<<endl;
cout<<"请输入学生学号:";
int n;student *s;
cin>>n;
s=query2(n);
if(s==NULL)
cout<<"该学生不存在!"<<endl;
else
{
cout<<"请选择要修改的科目:1 语文 2 数学 3英语"<<endl;
int b;
cin>>b;
switch(b)
{
case 1:{cout<<"要修改的科目是语文,请输入新的成绩:";
float c;cin>>c;(*s).setchinese(c);
}
case 2:{cout<<"要修改的科目是数学,请输入新的成绩:";
float m;cin>>m;(*s).setmath(m);
}
case 3:{cout<<"要修改的科目是英语,请输入新的成绩:";
float e;cin>>e;(*s).setenglish(e);
}
default:cout<<"输入有误!"<<endl;
}
int tag1=1;
while(tag1)
{
cout<<"想继续操作吗?(y/n)"<<endl;
cin>>choice;
if(choice=='y')
{tag=1;tag1=0;}
else if(choice=='n')
{tag=0;tag1=0;}
else
{tag1=1;cout<<"输入错误,请重新输入!"<<endl;}
}
}
}
}
void result_in()//成绩录入
{
int tag=1;char choice;
while(tag)
{
cout<<"学生成绩录入:"<<endl;
cout<<"请输入学生学号:";
int n;
cin>>n;
student *s;
s=query2(n);
if(s==NULL)
cout<<"该学生不存在!"<<endl;
else
{
cout<<"请输入语文成绩:";
float c;
(*s).setchinese(c);
cout<<endl<<"请输入数学成绩:";
float m;
(*s).setmath(m);
cout<<endl<<"请输入英语成绩:";
float e;
(*s).setenglish(e);
}
int tag1=1;
while(tag1)
{
cout<<"想继续操作吗?(y/n)"<<endl;
cin>>choice;
if(choice=='y')
{tag=1;tag1=0;}
else if(choice=='n')
{tag=0;tag1=0;}
else
{tag1=1;cout<<"输入错误,请重新输入!"<<endl;}
}
}
}
void result_del()//删除成绩
{
cout<<"成绩删除:"<<endl;
cout<<"请输入学生学号:";
int n;
cin>>n;
student *s;
s=query2(n);
if(s==NULL)
cout<<"该学生不存在!"<<endl;
else
{
(*s).setchinese(0);
(*s).setmath(0);
(*s).setenglish(0);
}
}
};
void main()
{
sdatabase sd;//定义学生库类对象
int choice;//选择
cout<<"***************************学生成绩管理系统(曹锋版)****************************"<<endl<<endl<<endl<<endl<<endl;
cout<<"\t\t\t(1)增加学生 (2)删除学生\n\t\t\t(3)个人成绩排名 (4)按总分排名\n\t\t\t(5)按英语排名 (6)按语文排名\n\t\t\t(7)按数学排名 (8)修改学生成绩\n\t\t\t(9)录入学生成绩 (10)删除学生成绩\n\t\t\t(11)输出所有学生信息(0)退出系统"<<endl;
cout<<"请选择:";
cin>>choice;
while(1)
{
switch(choice)
{
case 1:sd.addstudent();break;
case 2:sd.delstudent();break;
case 3:sd.perachieve();break;
case 4:sd.tolist();break;
case 5:sd.elist();break;
case 6:sd.clist();break;
case 7:sd.mlist();break;
case 8:sd.setresult();break;
case 9:sd.result_in();break;
case 10:sd.result_del();break;
default:cout<<"输入有误!"<<endl;
}
}
}
Greg_han 2009-05-24
  • 打赏
  • 举报
回复
xue xi
加载更多回复(9)

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧