关于这段代码:
- 数据存放在一个叫data的文件中
- 增加了结构体排序,对小学生们的成绩排名
- 其他要求如同题干
大一时写的版本,没文件读写,大三时写的在下面。
项目一 小学生测验 16学时
问题描述:面向小学1~2年级学生,随机选择两个整数的加减法形成算式要求学生解答。
1.基本要求
(1)电脑随机出10道题,每题10分,程序结束时显示学生得分;
(2)确保算式没有超出1~2年级的水平,只允许进行50以内的加减法,不允许两数之和或差超出0~50的范围,负数更是不允许的;
(3)每道题学生有三次机会输入答案,当学生输入错误答案时,提醒学生重新输入,如果三次机会结束则输出正确答案;
(4)对于每道题,学生第一次输入正确答案得10分,第二次输入正确答案得7分,第三次输入正确答案得5分,否则不得分;
(5)总成绩90以上显示“SMART”,80-90显示“GOOD”,70-80显示“OK”,60-70显示“PASS”,60以下“TRY AGAIN”
#include<iostream>
#include<stdlib.h>
#include<math.h>
#include<stdio.h>
#include<time.h>
using namespace std;
typedef struct node
{
int jiajian;
int num1;
int num2;
int trytimes;
}specific;
specific informat[10];
void changesi(int p)
{
if(p==0)cout<<"+";
if(p==1)cout<<"-";
}
int getgrade(int m)//把做错的次数转换成应得的分数return
{
if(m==0)return 10;
if(m==1)return 7;
if(m==2)return 5;
if(m==3)return 0;
}
int suijishu(int &a,int &b,int &c,int t)
{
int a1,b1;
do
{
a1=rand()%50;
b1=rand()%50;
}while(!(a1+b1>=0&&a1+b1<=50&&a1-b1>=0&&a1-b1<=50));
informat[t].num1=a=a1;
informat[t].num2=b=b1;
informat[t].jiajian=c=rand()%2;
return 0;
}
void show_rank(int sum)
{
cout<<endl<<endl;
cout<<"总分:"<<sum<<endl;
if(sum>=90)cout<<"Rank:SMART"<<endl;
else if(sum<90&&sum>=80)cout<<"Rank:GOOD"<<endl;
else if(sum<80&&sum>=70)cout<<"Rank:OK"<<endl;
else if(sum<70&&sum>=60)cout<<"Rank:PASS"<<endl;
else cout<<"please TRE AGAIN"<<endl;
}
int main()
{
srand(time(NULL));
cout<<"----------------------------pupil exercise system---------------------------- " <<endl;
int t=1,cnt=0,sum=0,a,b,c,ans;
while(t<=10)
{
cout<<"this is the "<<t<<" question"<<endl;
suijishu(a,b,c,t);
while(cnt<=3)
{
if(c==0)//add
{
printf("%d+%d=",a,b);
scanf("%d",&ans);
if(a+b==ans)
{
cout<<"Right"<<endl;
break;
}
else
{
cnt++;
cout<<"Wrong!!"<<endl;
if(cnt==3)
{
//cnt++;
cout<<"anwser:"<<a+b<<endl;
break;
}
}
}
else if(c==1)
{
printf("%d-%d=",a,b);
scanf("%d",&ans);
if(a-b==ans)
{
cout<<"Right"<<endl;
break;
}
else
{
cnt++;
cout<<"Wrong!!"<<endl;
if(cnt==3)
{
cout<<"anwser is:"<<a-b<<endl;
break;
}
}
}
}
informat[t].trytimes=cnt;
if(cnt==0)sum+=10;
if(cnt==1)sum+=7;
if(cnt==2)sum+=5;
t++;
cnt=0;
cout<<endl<<endl;
cout<<"--------------------------------------------------------------------- " <<endl;
}
show_rank(sum);
cout<<endl<<endl;
for(int i=1;i<=10;i++)
{
cout<<"第"<<i<<"题:"<<informat[i].num1;changesi(informat[i].jiajian);cout<<informat[i].num2<<"=";
if(informat[i].jiajian==0)cout<<informat[i].num1+informat[i].num2<<endl;
else if(informat[i].jiajian==1)cout<<informat[i].num1-informat[i].num2<<endl;
cout<<"你错了"<<informat[i].trytimes<<"次,得了"<<getgrade(informat[i].trytimes);
cout<<"分"<<endl;
}
//getchar();getchar();
}
大三时重写的版本,有文件读写,有排序
小学生测验系统
面向小学1~2年级学生,随机选择两个整数和加减法形成算式要求学生解答。
功能要求:
(1)电脑随机出10道题,每题10分,程序结束时显示学生得分并记录该学生的名称;
(2)确保算式没有超出1~2年级的水平,只允许进行50以内的加减法,不允许两数之和或之差超出0~50的范围,负数更是不允许的;
(3)每道题学生有三次机会输入答案,当学生输入错误答案时,提醒学生重新输入,如果三次机会结束则输出正确答案;
(4)对于每道题,学生第一次输入正确答案得10分,第二次输入正确答案得7分,第三次输入正确答案得5分,否则不得分;
(5)总成绩90以上显示“SMART”,80-90显示“GOOD”,70-80显示“OK”,60-70显示“PASS”,60以下“TRY AGAIN”
(6) 根据得分高低排序显示所有用户的成绩;
(7)用户输入名称,获得其得分信息。
(二)其它要求:
(1)只能使用C/C++语言,源程序要有适当的注释,使程序容易阅读
(2)至少采用文本菜单界面(如果能采用图形菜单界面更好)
(3)学生可自动增加新功能模块(视情况可另外加分)
(4)写出课程设计报告,具体要求见相关说明文档
部分运行截图,因为没有积分了,所以设置的积分下载,没有的话可以私信我。
#include<iostream>
#include<stdlib.h>
#include<math.h>
#include<stdio.h>
#include<time.h>
#include<fstream>
using namespace std;
int UserNumber=0;//所有用户数
typedef struct node
{
int jiajian;//1代表加法,0代表减法
int num1;
int num2;
int ans;
int trytimes;//错误次数,0是直接做对,十分。1为错误一次,七分。2为错误两次,五分。错了三次,不得分。
int sum;
}question;
question que[11];//问题结构体,用来保存生成的测试的问题
typedef struct node1
{
string name;
int grade;
}StudentItem;
StudentItem temp;//当前学生的情况
StudentItem StudentList[300];//打开文件之后用这个来维护考过试的学生的信息
string changeaddsub(int op)// 把代表加法减法的1或0转成字符串
{
string str1="+";
string str0="-";
if(op==1)return str1;
else return str0;
}
void ShowRank(int mark)//显示成绩的等级
{
if(mark>90)cout<<"SMART"<<endl;
else if(mark>80)cout<<"GOOD"<<endl;
else if(mark>60)cout<<"Pass"<<endl;
else cout<<"TRY AGAIN"<<endl;
getchar();getchar();
}
int suiji(question &quee) //随机生成数字,初始化一个题目的结构体
{
int a1,b1;
do
{
a1=rand()%50;
b1=rand()%50;
}while(!(a1+b1>=0&&a1+b1<=50&&a1-b1>=0&&a1-b1<=50));
quee.num1=a1;
quee.num2=b1;
quee.jiajian=rand()%2;
if(quee.jiajian==1) quee.ans=a1+b1;
else quee.ans=a1-b1;
quee.trytimes=0;
quee.sum=0;
return 0;
}
void InitQuestion()//初始化问题
{
srand(time(NULL));
for(int i=0;i<=10;i++)
{
suiji(que[i]);
}
}
//对每一题测试过程
void EachQsestionText(question &quee,int t)
{
int tempinput;
int cnt=0;
system("cls");
cout<<"当前是第"<<t<<"个题目:"<<endl;
cout<<quee.num1<<changeaddsub(quee.jiajian)<<quee.num2<<"=___"<<endl<<"请输入你的答案:";
cin>>tempinput;
if(tempinput==quee.ans){
quee.sum+=10;
return;
}
else quee.trytimes++;
system("cls");
cout<<"你输错了一次,请重新尝试"<<endl;
cout<<quee.num1<<changeaddsub(quee.jiajian)<<quee.num2<<"=___"<<endl<<"请输入你的答案:";
cin>>tempinput;
if(tempinput==quee.ans){
quee.sum+=7;
return;
}
else quee.trytimes++;
system("cls");
cout<<"你输错了两次,请重新尝试"<<endl;
cout<<quee.num1<<changeaddsub(quee.jiajian)<<quee.num2<<"=___"<<endl<<"请输入你的答案:";
cin>>tempinput;
if(tempinput==quee.ans){
quee.sum+=5;
return;
}
else quee.trytimes++;
system("cls");
cout<<"你输错了三次,答案是"<<quee.ans<<endl<<"输入任意键进入下一题";
getchar();getchar();return;
}
void SortUser()//在这个里面对所有用户进行排序
{
StudentItem t;
for(int i=0;i<UserNumber-1;i++)
{
for(int j=0;j<UserNumber-1-i;j++)
{
if(StudentList[j].grade < StudentList[j+1].grade)
{
t.name=StudentList[j].name;
t.grade=StudentList[j].grade;
StudentList[j].name=StudentList[j+1].name;
StudentList[j].grade=StudentList[j+1].grade;
StudentList[j+1].name=t.name;
StudentList[j+1].grade=t.grade;
}
}
}
}
void SaveFile()//保存用户信息到文件
{
ofstream fout("data",ios::out);
if(!fout)
{
printf("errror!\n");
exit(-1);
}
SortUser();
fout<<UserNumber<<endl;
for(int i=0;i<UserNumber;i++)
{
fout<<StudentList[i].name<<" "<<StudentList[i].grade<<" ";
}
fout.close();
}
//一个人的测验过程 ,做十题
int EachPersonTest()
{
InitQuestion();//初始化问题
//测试过程控制,
for(int i=1;i<=10;i++)
{
EachQsestionText(que[i],i);
temp.grade+=que[i].sum;
}
//对 StudentItem temp维护
string studentname;
system("cls");
cout<<"请输入你的姓名"<<endl;
cin>>temp.name;
StudentList[UserNumber].name=temp.name;
StudentList[UserNumber].grade=temp.grade;
UserNumber++;
SortUser();
SaveFile();
ShowRank(temp.grade);
}
//显示所有的成绩 ,先读出文件里的信息,
int ShowAllGrades()
{
system("cls");
cout<<"共"<<UserNumber<<"个用户"<<endl;
for(int i=0;i<UserNumber;i++)
{
cout<<StudentList[i].name<<"的成绩 "<<StudentList[i].grade<<endl;
}
getchar();getchar();
}
//主要的交互界面
int Menu()
{
system("cls");
cout<<"请选择功能:"<<endl;
cout<<"1.进入测试"<<endl;
cout<<"2.显示其所有人的的成绩"<<endl;
cout<<"3.成绩查询"<<endl;
cout<<"4.退出"<<endl;
int mode;
do{
cin>>mode;
}while(mode>4|mode<1);
return mode;
}
//输入人名,从文件里查询成绩信息,从上至下,找到匹配的利用id输出成绩
void QueryGrade()
{
system("cls");
string name;
cout<<"请输入要查询的姓名"<<endl;
cin>>name;
for(int i=1;i<UserNumber;i++)
{
if(name==StudentList[i].name)
{
system("cls");
cout<<name<<"的成绩"<<StudentList[i].grade<<endl;
getchar();getchar();
return;
}
}
system("cls");
cout<<name<<" "<<"查无此人"<<endl;
getchar();getchar();
}
void ReadFile()//读文件到结构体
{
ifstream fin("data",ios::in);
if(!fin)
{
cout<<"error"<<endl;
exit(-1);
}
fin>>UserNumber;
for(int i=0;i<UserNumber;i++)
{
fin>>StudentList[i].name>>StudentList[i].grade;
}
fin.close();
}
void Welcome()//欢迎界面
{
cout<<"-------------------------欢迎使用小学生测验系统----------------------------"<<endl;
cout<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl;
cout<<" Created By @@@@@ "<<endl;
cout<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl;
cout<<"##########################回车键进入使用###################################"<<endl;
getchar();
}
int main()
{
ReadFile();
Welcome();
while(1)//选择功能
{
int mode=Menu();
switch(mode)
{
case 1:EachPersonTest();break;
case 2:ShowAllGrades();break;
case 3:QueryGrade();break;
case 4:exit(1);
}
}
}
用devc++来编译
要在.exe文件夹下有一个名为data的文件
格式为
第一个是数字(总人数),之后姓名和分数用空格隔开