高考试题管理系统出题模块——C语言课程设计

高考试题管理系统出题模块

项目说明:

该课程设计是在学校学习完相关课程以后制作的课程作业,分为两段源代码,需要建立一个工程文件,如果使用的是vc++6.0,可以按步骤:新建→项目→win32 console application→项目命名,建立一个空项目。因为大多数的C语言课程设计都具有相似性,因此具有借鉴意义。

本课程设计包含的小功能:

  • 1. 输出系统当前时间,格式:    2017-6-1 10:42:1;
  • 2.实现万年历算法;
  • 3.登陆有效次数控制在三次,超过则系统安全退出;
  • 4.密码要求密文;
  • 5.排序:    选择排序/快排/堆排/...;
  • 6.修改密码;

程序代码:

登陆界面:

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include<time.h>
#include <conio.h>

int login();              //管理员登录函数
void changepwd();         //修改密码函数
void read();              //文件读取函数
int rili();              //日历函数 
void showMenu();          //管理员界面
void showCopy();          //显示菜单函数
void beijinshijian();     //北京时间函数
char uname[20]="jjy";     //用户名
char pwd[20]="123456";    //密码


int main()
{
	int flag=1;
	int choice;
	int i;
	do
	{
		system("cls");
		printf("***********************************************************************\n");
		printf("\n\t\t\t高考试题管理系统出题模块\n");
		printf("\t\t\t------------------------\n");
		printf("\t\t\t      1. 管理员登录\n\n");
		printf("\t\t\t      2. 修改密码\n\n");
		printf("\t\t\t      3. 日历\n\n");
		printf("\t\t\t      4. 北京时间\n\n");
		printf("\t\t\t      5. 退出\n\n");
		printf("***********************************************************************\n");
		printf("请输入您的选项\n");        //提示用户输入1-5选项
		scanf("%d",&choice);               //判断输入的choice是几
		switch( choice )                   //使用switch..case函数
		{
			case 1: 
			    flag=login();
				break;
			case 2:
				changepwd();
				break;
			case 3: 
				rili();
				break;
			case 4:
			    beijinshijian();
				break;
			case 5: 
			    flag=0;
				break;
			default: 
				printf("没有这个选项,请重新输入...\n");  //提示用户没有该选项需要重新选择
				getch();   
				break;
		}
	}while( flag);
	printf("\n系统安全退出....\n");  //提示系统安全退出
	for( i=0;i<10;i++)
	{
		printf("..");
		printf("\a");
	}
	printf("\n");
	return 0;
}


int login()     //管理员登录函数       
{
	int i,z;
	int m=1;
	char uname1[20],pwd1[20];
	for(i=0;i<3;i++)
	{
		system("cls");
		showCopy();
	    printf("请输入用户名:\n");
	    scanf("%s",uname1);
		printf("请输入密码:\n");
	    for(z=0;z<20;z++)         //该循环用来实现密码输入时密文操作
		{
			pwd1[z]=getch();
		    if(pwd1[z]=='\r')
			{
				pwd1[z]='\0';
			    break;
			}
		    printf("*");
		}
    	if(strcmp(uname1,uname)==0    &&    strcmp(pwd1,pwd)==0)    //比较输入的用户名和密码与原用户名、密码是否相同
		{
	    	printf("\n登录成功\n");
			read();
	    	getch();
			showMenu();
	    	break;
		}
    	else
		{
	        printf("\n用户名或密码错误\n");
         	getch();
		}
	    if(i==2)   //判断是否输入三次
		{
	    	m=0;
	    	break;
		}
	}
	return m;
}

void changepwd()              //修改密码函数
{
	char pwd1[20];
	int z;
	printf("请输入原密码:\n");
	for(z=0;z<20;z++)      //该循环用来实现密码输入时密文操作
	{
		pwd1[z]=getch();
		if(pwd1[z]=='\r')
		{
			pwd1[z]='\0';
			break;
		}
		printf("*");
	}
	if(strcmp(pwd,pwd1)!=0)   //判断密码与原密码是否相同
	{
		printf("\n密码错误...\n");
		getch();
		return;
	}
		printf("\n请用户输入新密码:\n");
		for(z=0;z<20;z++)         //该循环用来实现密码输入时密文操作
	{
		pwd[z]=getch();
		if(pwd[z]=='\r')
		{
			pwd[z]='\0';
			break;
		}
		printf("*");
	}
		printf("\n修改密码成功\n");
		getch();
}


int rili()            //日历函数 
{
	int i,x,day,j,s=0,sum=365,m,month,c,d; 
	printf("请输入年月:\n"); 
	scanf("%d %d",&x,&month); 
	while(1)
	{ 
		int a[12]={31,28,31,30,31,30,31,31,30,31,30,31}; 
		day=(x+(x-1)/4-(x-1)/100+(x-1)/400)%7; 
		if(x%100==0) 
		{
			if(x%400==0) {a[1]++;sum++;}
		} 
		else if(x%4==0)
		{
			a[1]++;sum++;
		} 
		if(day==0) day=7; 
		sum=sum+day; 
		for(i=0;i<12;i++) 
		{
			if(i==month-1)
			{
				printf("%d年%d月日历如下:\n\n",x,month);
				printf("   日   一   二   三   四   五   六\n");
				printf("===================================\n");
			} 
				for(j=1;j<=a[i];j++)
				{
					if(j==1)
						for(m=0;m<day%7*5;m++) 
							if(i==month-1) 
								printf(" ");
							if(i==month-1)
								printf("%5d",j); 
							if((day+j)%7==0) if(i==month-1) printf("\n");
				} day=(day+a[i])%7;
		} 
		c=getch();
		if(c==27) return 0; 
		d=getch();
		if(c==72&&d==224||c==224&&d==72)
		{
			system("cls");
			x--;
		} 
		else if(c==224&&d==80||c==80&&d==224) {system("cls");x++;
		}
		else if(c==75&&d==224||c==224&&d==75) {system("cls");
		month--;
		if(month<=0) {x--;month=12;
		}
		}
		else if(c==77&&d==224||c==224&&d==77)
		{
			system("cls");
			month++; 
			if(month>12) 
			{
				month=1;
				x++;
			}
		} 
		else break;
	}
	return 0;
}


void beijinshijian()          //北京时间函数
{
	time_t tval;
    struct tm *now;
    tval = time(NULL);
    now = localtime(&tval);
    printf("北京时间: %4d年%d月%02d日 %d:%02d:%02d\n",  now->tm_year+1900, now->tm_mon+1, now->tm_mday,
    now->tm_hour, now->tm_min, now->tm_sec);
	printf("\n");
	printf("按任意键继续\n");
    getch();
}


void showCopy()     //显示菜单函数
{
		printf("***********************************************************************\n");
		printf("\n\t\t\t高考试题管理系统出题模块\n");
		printf("\t\t\t------------------------\n");
		printf("\t\t\t      1. 管理员登录\n\n");
		printf("\t\t\t      2. 修改密码\n\n");
		printf("\t\t\t      3. 日历\n\n");
		printf("\t\t\t      4. 北京时间\n\n");
		printf("\t\t\t      5. 退出\n\n");
		printf("***********************************************************************\n");
	    printf("请输入您的选项\n\n");
}

 

管理员使用界面:

#include<stdio.h>
#include <stdlib.h>
#include<string.h>
#include <conio.h>

void showMenu();              //管理员使用界面主菜单
void Input_questions();       // 录入试题函数
void Classified_examination_questions();    //分类显示试题函数
void Random_questions();       //随机出题函数
void showStyle();             //分类显示试题类型
void showCpy();        //显示showMenu()的操作界面
void read();           //读取
void save();           //保存

struct Question         //定义试题结构体
{
	char name[50];    //题目
	char type[50];    //分类
	char A[50];       //选项
	char B[50];
	char C[50];
	char D[50];
	char answer[10];      //答案
};

struct Question problem[1000];     //定义结构体变量存取试题 
char style[4][50]={{"语文"},{"数学"},{"英语"},{"其他类型"}};   //高考试题的类型
int size=0;      //记录试题实际数目

void showMenu()           //管理员使用界面主菜单
{
	int flag=1;
	int choice;
	do{
		system("cls");    //清屏
		printf("***********************************************************************\n");
		printf("\n\t\t\t高考试题管理系统出题模块\n");
		printf("\t\t\t------------------------\n");
		printf("\t\t\t1. 录入高考试题\n\n");
		printf("\t\t\t2. 分类显示各高考试题\n\n");
		printf("\t\t\t3. 随机出题\n\n");
		printf("\t\t\t4. 返回上一级\n\n");
		printf("***********************************************************************\n");
		printf("请输入您的选项\n");     	//提示用户输入选项1-5
		scanf("%d",&choice);               	//判断输入的choice是几   
		switch( choice )                    //使用switch..case函数
		{
			case 1:
			    Input_questions();  //录入高考试题
				break;
			case 2:
				Classified_examination_questions();  //分类显示各高考试题
				break;
			case 3: 
			    Random_questions();  //随机出题
				break;
			case 4: 
				save();   //保存 
			    flag=0;   //返回上一级
				break;
			default:   //提示用户没有该选项需要重新选择
				printf("没有这个选项,请重新输入...\n");
				getch();  
				break;
		}
	}while(flag);
}

void Input_questions()    // 录入试题函数
{
	int index;
	printf("请输入题目\n");
	scanf("%s",problem[size].name);
	showStyle();
	printf("请输入试题类型选项:\n"); //提示用户输入选项1-2
	scanf("%d",&index);
	strcpy(problem[size].type,style[index]);  //把style[index]中的字符串复制到problem[size].type
	printf("请输入A选项\n");
    scanf("%s",problem[size].A);
	printf("请输入B选项\n");
	scanf("%s",problem[size].B);
	printf("请输入C选项\n");
	scanf("%s",problem[size].C);
	printf("请输入D选项\n");
	scanf("%s",problem[size].D);
	printf("请输入该试题的正确答案:\n");
	scanf("%s",problem[size].answer);
	printf("保存成功\n");
	size++;
	getch();
}

void Classified_examination_questions()   //分类显示试题函数
{
	int i;
	int z;
    printf("\t\t\t%s\n",style[0]);
	printf("\t\t====================\n");
	z=1;
	for(i=0;i<size;i++)    //表示语文试题类型
	{
		if(strcmp(problem[i].type,style[0])==0)  //比较两个字符串数组中的字符串是否相同
		{
			printf("\t\t\t试题:%d\n",z);
            printf("题目:%s\n",problem[i].name);
			printf("A:%s\n",problem[i].A);
			printf("B:%s\n",problem[i].B);
			printf("C:%s\n",problem[i].C);
			printf("D:%s\n",problem[i].D);
			printf("答案:%s\n",problem[i].answer);
			z++;
		}
	}
	printf("\n");
	printf("\t\t\t%s\n",style[1]);
	printf("\t\t====================\n");
	z=1;
	for(i=0;i<size;i++)  //表示数学试题类型
	{
		if(strcmp(problem[i].type,style[1])==0)  //比较两个字符串数组中的字符串是否相同
		{
			printf("\t\t\t试题:%d\n",z);
            printf("题目:%s\n",problem[i].name);
			printf("A:%s\n",problem[i].A);
			printf("B:%s\n",problem[i].B);
			printf("C:%s\n",problem[i].C);
			printf("D:%s\n",problem[i].D);
			printf("答案:%s\n",problem[i].answer);
			z++;
		}
	}
    printf("\n");
	printf("\t\t\t%s\n",style[2]);
	printf("\t\t====================\n");
	z=1;
	for(i=0;i<size;i++)    //表示英语试题类型
	{
		if(strcmp(problem[i].type,style[2])==0)   //比较两个字符串数组中的字符串是否相同
		{
			printf("\t\t\t试题:%d\n",z);
            printf("题目:%s\n",problem[i].name);
			printf("A:%s\n",problem[i].A);
			printf("B:%s\n",problem[i].B);
			printf("C:%s\n",problem[i].C);
			printf("D:%s\n",problem[i].D);
			printf("答案:%s\n",problem[i].answer);
			z++;
		}
	}
	printf("\n");
	printf("\t\t\t%s\n",style[3]);
	printf("\t\t====================\n");
	z=1;
	for(i=0;i<size;i++)    //表示其它类型的试题
	{
		if(strcmp(problem[i].type,style[3])==0)  //比较两个字符串数组中的字符串是否相同
		{
			printf("\t\t\t试题:%d\n",z);
            printf("题目:%s\n",problem[i].name);
			printf("A:%s\n",problem[i].A);
			printf("B:%s\n",problem[i].B);
			printf("C:%s\n",problem[i].C);
			printf("D:%s\n",problem[i].D);
			printf("答案:%s\n",problem[i].answer);
			z++;
		}
	}
   	printf("\n按任意键继续\n");
   	getch();
}


void Random_questions()    //随机出题函数
{
	int i;
    int index;
	int p;
	int N=size;
	int temp=N;
	int ps[ 1000 ];
	for(i=0;i<size;i++)
	{
		ps[i]=i;
	}
	printf("下面开始随机出题:\n");
	for(i=0;i<N;i++)
	{
    	index=rand()%temp;    //取小于size的随机整数
    	printf("%d、%s\n", i+1, problem[  ps[index]  ].name  );  //显示随机试题
		printf("A. %s\n",  problem[  ps[index]  ].A  );
		printf("B. %s\n",  problem[  ps[index]  ].B  );
		printf("C. %s\n",  problem[  ps[index]  ].C  );
		printf("D. %s\n",  problem[  ps[index]  ].D  );
		printf("\n按任意键进入下一题\n");
    	getch();
     	p=ps[index];   
    	ps[index]=ps[N-1-i];
        ps[N-1-i]=p;
     	temp--;
		showCpy();
	}
	printf("\n\n考试结束\n");
	getch();
}


void showStyle()    //分类显示试题类型
{
	int i;
	printf("\n常用试题类型如下:\n\n");
	printf("编号\t\t类型\n");
	for(i=0;i<4;i++)
	{
		printf("%d\t\t%s\n",i,style[i]);
	}
	printf("\n");
}

void showCpy()  //显示showMenu()的操作界面
{
	system("cls");
	printf("***********************************************************************\n");
	printf("\n\t\t\t高考试题管理系统出题模块\n");
	printf("\t\t\t------------------------\n");
	printf("\t\t\t1. 录入高考试题\n\n");
	printf("\t\t\t2. 分类显示各高考试题\n\n");
	printf("\t\t\t3. 随机出题\n\n");
	printf("\t\t\t4. 返回上一级\n\n");
	printf("***********************************************************************\n");
	printf("请输入您的选项\n\n");
	printf("下面开始随机出题:\n");
}

void save()  //保存
{
	struct Question p;
	FILE *fp;
	int i;
	if(  (fp=fopen("a.dat","wb"))==NULL)
	{
		printf("\n文件不存在!");
		getch();
		return;
	}
	for(i=0;i<size;i++)
	{
		p=problem[i];
		fwrite(&p,sizeof(struct Question),1,fp);
	}
	fclose(fp );
	printf("保存文件成功...\n");
	getch();
}

void read()  //读取
{
	int num;
	struct Question p;
	FILE *fp;
	size=0;
	if(  (fp=fopen("a.dat","rb"))==NULL)
	{
		printf("\n文件不存在!");
		getch();
		return;
	}
	while( ( num=fread( &p,sizeof(struct Question),1,fp))>0 )
	{
		problem[size]=p;
		size++;
	}
	fclose(fp );
}

补充说明:

1.因为一个程序只有一个主函数,因此main()函数只有一个,在登陆界面中;

2.直接复制这两段源代码会提示文件不存在,因为在两段代码中使用了fopen函数,打开了一个文件,并且使用方式为只读“rb”,如果该文件不存在,将会出错,需要在该文件夹中建立一个“a.dat”的文件,文件格式应为“.dat”数据流格式。

3.本课程设计代码不存在编译问题,是已经编译通过的源代码,自己编译时应该注意一些小问题,如果有任何问题,欢迎留言;

 

 

 

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值