高考试题管理系统出题模块
项目说明:
该课程设计是在学校学习完相关课程以后制作的课程作业,分为两段源代码,需要建立一个工程文件,如果使用的是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.本课程设计代码不存在编译问题,是已经编译通过的源代码,自己编译时应该注意一些小问题,如果有任何问题,欢迎留言;