刚刚写完c语言课设。
课设要求是:
(1)电脑随机出10道题,每题10分,程序结束时显示学生得分;
(2)确保算式没有超出12年级的水平,只允许进行50以内的加减法,不允许两数之和或之差超出050的范围,负数更是不允许的;
(3)每道题学生有三次机会输入答案,当学生输入错误答案时,提醒学生重新输入,如果三次机会结束则输出正确答案;
(4)对于每道题,学生第一次输入正确答案得10分,第二次输入正确答案得7分,第三次输入正确答案得5分,否则不得分;
(5)总成绩90以上显示“SMART”,80-90显示“GOOD”,70-80显示“OK”,60-70显示“PASS”,60以下“TRY AGAIN”。
(6)不及格的学生,由学生自己选择是否重新来一次。重做机会只有一次。
为了满足课设要求,我引入了登录系统。
因为是匆忙完成的,系统还有很多小bug,但不影响运行。
main函数在写的过程中没有太注意,导致只有引入一个函数,其他的功能都是在函数的嵌套中完成的,求大佬轻喷。
下面贴出源代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include <windows.h>
#include <time.h>
#define MAXLEN 30
int shouldsave=0;//用于信息的保存
int times=0;
void menu1();
void menu2();
void printstart();
void wrong();
void Create_File();
void registers();
void Input_login();
void dati(char name[MAXLEN],char num[MAXLEN]);
void myoutput(int t);
void showfp(char name[MAXLEN],char num[MAXLEN]);
void out1();
void out2(char name[MAXLEN],char num[MAXLEN]);
main(){
menu1();
}
//结构体定义
typedef struct user
{
char num[MAXLEN];//学号
char pwd[20]; //密码
char name[MAXLEN];//姓名
char sex; //性别为单个字符
char cla[MAXLEN];//班级
char birth[MAXLEN];//出生日期
}users;
/*菜单1*/
void menu1()
{
system("cls");
int cho;
printf("\n\n\n");
printf("***********************************欢迎光临***********************************\n");
printf("|| ||\n");
printf("|| ||\n");
printf("|| 0 退出小学生测验系统 ||\n");
printf("|| 1 登录小学生测验系统 ||\n");
printf("|| 2 注册小学生测验系统 ||\n");
printf("|| ||\n");
printf("|| ||\n");
printf("******************************************************************************\n");
while(1){
printf("******************************************************************************\n");
printf(" 请输入编号:") ;
scanf("%d",&cho);
if(cho==0){
out1();
break;
}
else if(cho==1){
Input_login();
break;
}
else if(cho==2){
registers();
break;
}
else{
printf(" 输入有误!请重新输入!\n");
}
}
}
/*菜单2*/
void menu2(char name[MAXLEN],char num[MAXLEN])
{
char name1[MAXLEN];
strcpy(name1,name);
system("cls");
printf("\n\n\n");
printf("****************************欢迎进入测验系统,%s*******************************\n",name1);
printf("|| ||\n");
printf("|| ||\n");
printf("|| 0 开始测试 ||\n");
printf("|| 1 查看上一次测验题目 ||\n");
printf("|| 2 重做上一次测验题目 ||\n");
printf("|| 3 开始新的测试 ||\n");
printf("|| 4 退出系统 ||\n");
printf("|| ||\n");
printf("|| ||\n");
printf("******************************************************************************\n");
while(1){
int cho;
printf("******************************************************************************\n");
printf(" 请输入编号:") ;
scanf("%d",&cho);
if(cho==0){
dati(name1,num);
break;
}
else if(cho==1){
showfp(name1,num);
break;
}
else if(cho==2){
out2(name1,num);
break;
}
else if(cho==3){
dati(name1,num);
break;
}
else if(cho==4){
out2(name1,num);
break;
}
else{
printf(" 输入有误!请重新输入!\n");
}
}
}
/*输出字符*/
void printstart()
{
printf("------------------------------------------------------------------------------\n");
}
/*输出错误信息*/
void wrong()
{
printf("\n======>提示:输入错误!\n");
}
/*创建储存用户账号密码的文件*/
void Create_File()
{
FILE *fp;
if ((fp = fopen("users.txt","rb"))==NULL) /*如果此文件不存在*/
{
if ((fp = fopen("users.txt","wb+"))==NULL)
{
printf("无法建立文件!\n");
exit(0);
}
}
}
/*注册账号*/
void registers() //按结构体的大小,一次写入或者读入1个结构体大小
{
system("cls"); //清屏
int num_true=0;
users a,b;//结构体 The_users 重命名定义
FILE *fp;
char temp[20];
int count = 0;
printf("******************************欢迎来到注册界面!******************************\n");
printf("******************************************************************************\n");
Sleep(500);
fp = fopen("users.txt","r");
/*While()*/
while(1)
{
fread(&b, sizeof(struct user), 1, fp); //读入一个结构体字符块 到b
printf("|| 请输入学号:");
scanf("%s",&a.num);
if (strcmp(a.num, b.num)!=0)
{
if (!feof(fp))
{
fread(&b, sizeof(struct user), 1, fp);
}
else
break;
}
else
{
printf("|| 此用户名已存在!请重新注册!\n");
Sleep(1000);
fclose(fp);
}
}
printf("|| 请输入姓名:");
scanf("%s",&a.name);
printf("|| 请输入性别(f(女)/m(男)):");
scanf(" %c",&a.sex);
do{
if(a.sex != 'f' && a.sex != 'm'){
printf("|| 性别输入错误!请重新输入!");
scanf("%c",&a.sex);
}
}while(a.sex != 'f' && a.sex != 'm');
getchar();
printf("|| 请输入班级:");
scanf("%s",&a.cla);
printf("|| 请输入出生日期:");
scanf("%s",&a.birth);
printf("|| 请输入密码:");
scanf(" %s",&a.pwd);
printf("|| 请确认密码:");
scanf(" %s",&temp);
do{
if(!strcmp(a.pwd,temp)){
fp = fopen("users.txt","a");
fwrite(&a, sizeof(struct user), 1, fp);
printf("|| 账号注册成功,请登录!\n");
printstart();
Sleep(500);
fclose(fp);
return menu1();
}else{
printf("|| 两次密码不匹配!请重新输入!\n");
scanf("%s",&a.pwd);
printf("|| 请确认密码:");
scanf("%s",&temp);
}
}while(1);
}
/*登录系统*/
void Input_login()
{
system("cls");
users a,b;//定义结构体别名
FILE *fp;
printf("******************************欢迎来到登录界面!******************************\n");
Sleep(500);
fp = fopen("users.txt","r");
printf("******************************************************************************\n");
fread(&b, sizeof(struct user), 1, fp); //读入一个结构体字符块 写入b
printf("|| 请输入账号:");
scanf("%s",&a.num);
while (1)
{
if (strcmp(a.num, b.num)==0) //如果有此用户名
{
break;
}
else
{
if (!feof(fp)) //如果文件没有读完
{
fread(&b, sizeof(struct user), 1, fp);
}
else
{
printf("|| 此用户名不存在,请重新输入!\n");
Sleep(500);
fclose(fp);
return Input_login();
}
}
}
printf("|| 请输入密码:");
scanf("%s",&a.pwd);
do{
if (strcmp(a.pwd, b.pwd)==0) /*如果密码匹配*/
{
fclose(fp);
printf("|| 登录成功,欢迎使用!\n");
printstart();
printstart();
Sleep(1000);
return menu2(a.num, a.name);
}
else
{ printf("|| 密码不正确!请重新输入密码:");
scanf("%s",&a.pwd);
}
}while(strcmp(a.pwd, b.pwd)==0);
}
/*答题系统*/
void dati(char name[MAXLEN],char num[MAXLEN])
{
system("cls");
char cha[]=".txt";
int a,b,c,i,j,n,k,e;
int r[4][2]={{0,0},{1,5},{2,7},{3,10}}; /*存储四次分数 r[1][5]表示答对当前题目时还剩下1次机会时的5分*/
int cj = 0; /*存储成绩*/
srand(time(0)); /*获取系统当前时间作为rand()基础*/
strcat(name,cha);
FILE *fpWrite=fopen(name,"w");
if(fpWrite==NULL)
{
return;
}
printf("****************************小学生测验系统***********************************\n\n");
fprintf(fpWrite,"****************************小学生测验系统***********************************\n\n",i,a,c);
printf("*****************************************************************************\n");
fprintf(fpWrite,"*****************************************************************************\n",i,a,c);
for(i=1;i<=10;i++,printf("*****************************************************************************\n"))
{
a=rand()%51;
b=rand()%(51-a)+a; /*给a,b赋随机值,且0<=a<=b<=50*/
c=b-a; /*则c也为随机变量,且0<=a,c<=b<=50*/
n=rand()%2; /*使n在0,1中随机取值*/
if(n==0) /*当n为0时,给出加法题目*/
{
printf("|| 第%d道算数题:%d+%d=___.\n",i,a,c);
fprintf(fpWrite," 第%d道算数题:%d+%d=___.\n",i,a,c);
for(j=3,e=0;j>=1;j--) /*当j=3时,表示有三次答题机会,答对则退出循环*/
{
printf("|| 你的答案是(你还有%d次回答的机会):",j-1);
scanf("%d",&k);
fprintf(fpWrite,"|| 你的第%d次答案是:%d.",++e,k);
if(k==b)
{
printf("|| Very Good!!!\n\n");
fprintf(fpWrite," 正确\n");
cj=cj+r[j][1]; /*将所得分数进行累加*/
break;
}
else
{
printf("|| 回答不正确.\n");
fprintf(fpWrite," 错误\n");
}
}
if(j==0)printf("|| 三次机会用完咯,别灰心,来答下一道题吧!\n\n");
}
else /*当n为1时,给出减法题目*/
{
printf("|| 第%d道算数题:%d-%d=___.\n",i,b,c);
fprintf(fpWrite,"|| 第%d道算数题:%d-%d=___.\n",i,a,c);
for(j=3,e=0;j>=1;j--) /*当j=3时,表示有三次答题机会,答对则退出循环*/
{
printf("|| 你的答案是(你还有%d次回答的机会):",j-1);
scanf("%d",&k);
fprintf(fpWrite,"|| 你的第%d次答案是:%d.\n",++e,k);
if(k==a)
{
printf("|| Very Good!!!\n\n");
cj=cj+r[j][1]; /*将所得分数进行累加*/
break;
}
else
{
printf("|| 回答不正确.\n");
}
}
if(j==0)printf("|| 三次机会用完咯,别灰心,来答下一道题吧!\n\n");
}
}
fprintf(fpWrite,"*****************************************************************************\n",i,a,c);
fprintf(fpWrite,"*****************************************************************************\n",i,a,c);
printf("****************************成绩评价中***********************************\n\n");
printf("****************************请耐心等待***********************************\n\n");
Sleep(2000);
return myoutput(cj);
}
/*成绩输出*/
void myoutput(int t)
{
printf("*****************************************************************************\n");
printf("*****************************************************************************\n");
printf("|| 您的最终得分是:%d ||\n",t);
printf("|| 评价:");
if(times==0){
switch(t/10)
{
case 10:
case 9:printf("SMART");break;
case 8:printf("GOOD");break;
case 7:printf("OK");break;
case 6:printf("PASS");break;
default:printf("TRY AGAIN");break;
}
printf(" ||\n") ;
printf("*****************************************************************************\n");
}
else{
switch(t/10)
{
case 10:
case 9:printf("SMART");break;
case 8:printf("GOOD");break;
case 7:printf("OK");break;
case 6:printf("PASS");break;
default:printf("GAME OVER");break;
}
printf(" ||\n") ;
printf("*****************************************************************************\n");
}
}
/*显示用户文件内容*/
void showfp(char name[MAXLEN],char num[MAXLEN]){
int a;
char name1[MAXLEN-1];
system("cls");
char c[]=".txt";
FILE *fp1 ;
strcpy(name1,name);
strcat(name1,c);
fp1 =fopen(name, "r");
while( ! feof(fp1) )
{
int ch;
if( (ch = fgetc(fp1)) != EOF )
putchar(ch);
}
fclose(fp1);
printf("\n");
printf("\n");
Sleep(1000);
printf("输入0退出系统!\n") ;
printf("输入1回到登录界面!\n");
while(1){
scanf("%d",&a);
if(a==1){
return menu2(name,num);
break;
}
else if(a==0){
out2(name,num);
}
else{
printf("输入有误,请重新输入!\n");
}
}
}
/*回退未登录时的界面*/
void out1(){
system("cls");
printf("\n\n\n");
printf("******************************是否退出本系统******************************\n");
printf("|| ||\n");
printf("|| ||\n");
printf("|| 0 取消并返回主界面 ||\n");
printf("|| 1 确定退出系统 ||\n");
printf("|| ||\n");
printf("|| ||\n");
printf("**************************************************************************\n");
while(1){
int cho;
printf("******************************************************************************\n");
printf(" 请输入编号:") ;
scanf("%d",&cho);
if(cho==0){
menu1();
break;
}
else if(cho==1){
system("pause");
break;
}
else{
printf(" 输入有误!请重新输入!\n");
}
}
}
/*回退登录时的界面*/
void out2(char name[MAXLEN],char num[MAXLEN]){
system("cls");
printf("\n\n\n");
printf("******************************是否退出本系统******************************\n");
printf("|| ||\n");
printf("|| ||\n");
printf("|| 0 取消并返回主界面 ||\n");
printf("|| 1 确定退出系统 ||\n");
printf("|| ||\n");
printf("|| ||\n");
printf("**************************************************************************\n");
while(1){
int cho;
printf("******************************************************************************\n");
printf(" 请输入编号:") ;
scanf("%d",&cho);
if(cho==0){
menu2(name,num);
break;
}
else if(cho==1){
system("pause");
break;
}
else{
printf(" 输入有误!请重新输入!\n");
}
}
}