小学生测验系统

刚刚写完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");
		} 
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值