C课程设计-驾校考试模拟系统
基本设计要求:
采用链表(系统中可以设定任意数目的记录,但难度较大)或者结构体数组(只能限定一定数目的记录)完成系统。系统要求设计一个驾校考试模拟系统, 可以进行考试,成绩记录等操作。
基本系统功能
课程要求最低完成以下任务
» 注册用户
» 考试,可以多次考试
从文件中读取题目(选择题),随机抽取N题,不重复
» 自动阅卷
根据输入的答案自动判断对错并记录下分数
» 记录用户成绩
将最新的成绩添加到注册用户的信息中(覆盖掉原有成绩)
» 查找用户考试信息
根据用户名查找用户的考试成绩
» 退出系统
团队3人合作一周的结果,在程序健壮性上下了很多功夫,但仍有许多值得完善的地方,仅供相同设计课题的同学参考。
程序中使用的文件:
user.txt(考生档案文件,必须先在文件夹中手动新建,否则第一次运行时程序提示无法打开考生档案文件)
text.txt(试题文件,必须先在文件夹中手动新建,否则运行时程序提示无法打开试题文件)
information.txt(考生信息文件,无需手动新建,注册时程序自动新建写入内容保存)
score.txt(记录考生历次考试成绩的文件,无需手动创建,考完试自动新建写入成绩保存)
几点重要说明
- 试题文件即题库必须按以下方式保存:
对发生道路交通事故需要收集证据的事故车,交通警察可以依法扣留。T
年龄在50周岁以上的机动车驾驶人,应当每年进行一次身体检查,并向公安机关交通管理部门申报身体条件情况。T
下面哪种做法能帮助您避免被其他车辆从后方追撞?
a、在任何时候都打开转向灯
b、在转弯前提前打开相应的转向灯
c、一直打开双闪
d、转弯前鸣笛示意B
实习期驾驶人驾驶机动车上高速公路行驶,以下做法正确的是什么?
a、任何情况下都不允许上高速
b、不需要其他人员陪同
c、需要持有相应或者更高准驾车型驾驶证三年以上的驾驶人陪同
d、需要持有相应或者更高准驾车型驾驶证、同在实习期内的驾驶人陪同C
因为代码实现读题时已经设定好读取答案的形式,即在题目的末尾,若要修改,修改源代码即可。同时要先存判断题,再存单选题,同理,读题时已经设定好读取题目的形式,单选题比判断题多占四行。
2.程序用了较多的fgetc,fputc,因此后续用fread,fwrite,fscanf,fprintf优化效率会更高。
3.采用动态链表会比采用结构体数组好很多,内存的开销也占的少。
4.可以再开发一个管理员系统,可以浏览任意用户的所有成绩,实现对注册用户的管理等等功能。
5.有些地方可能未注意到’\0’的写入。
6.界面的优化可以做的更出色。
主函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "windows.h"
void register_now();
void login_now();
void exit_now();
void search_now();
int main()
{
char choice[2] = {
'0'};/*将choice定义成一个二维数组,而不是char型变量,以防止用户输入aab时,char choice仍然得到的是'a'*/
Rechoice:
do
{
system("color f0");//背景换为白色
printf("T———————————————————————T\n");
printf("|----------欢迎进入驾校考试模拟系统!-------------|\n");
printf("|---------------------------------------------|\n");
printf("|-----|A.立即登录|------------|B.立即注册|-------|\n");
printf("|---------------------------------------------|\n");
printf("|-----|C.查询成绩|------------|D.立即退出|-------|\n");
printf("|_____________________________________________|\n");
printf("请选择您需要的功能:");
gets(choice);
fflush(stdin);
system("cls");
if(strlen(choice) == 1 && (choice[0] == 'A' || choice[0] == 'B' || choice[0] == 'C' || choice[0] == 'D' ||
choice[0] == 'a' || choice[0] == 'b' || choice[0]== 'c' || choice[0] == 'd'))//杜绝非法输入
{
switch(choice[0])
{
case 'A':
case 'a':
login_now();
break;
case 'B':
case 'b':
register_now();
break;
case 'C':
case 'c':
search_now();
break;
case 'D':
case 'd':
exit_now();
break;
}
}
else
{
printf("输入无效!\n");
fflush(stdin);
system("pause");
system("cls");
goto Rechoice;
}
}
while(1);
}
login_now()函数
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include "conio.h"
#define M 1000
#define N 1000
typedef struct a//定义结构体,text存题目,answer存答案
{
char text[M][N];
char answer[M];
} text_answer;
typedef struct date//定义结构体,分别存放年月日
{
int year;
int month;
int day;
} DATE;
typedef struct user//定义结构体,包括用户名,密码,性别等
{
char username[20];
char password[20];//最大二十位密码
char gender;
DATE birthday;
} USER;
typedef struct judge//判断用户名及密码是否存在的数组
{
char username[20];
char password[20];
} JUDGE;
int judge_user(char account[], char password[]);
void login_now_menu();
void test_now(char account[]);
int valid_username(char *p);
void update_password(char account[]);
void study_text();
void hidden_password(char password[]);
void login_now()
{
char choice[2];
char account[15];
char password[20];
int flag = -1, i, k;
char ch;
char ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8;
FILE *fp;
USER users[N];
Restart1:
fflush(stdin);
printf("请输入您的用户名:");
gets(account);
if(strlen(account) > 20 || strlen(account) < 1 || !valid_username(account))
{
printf("您输入的用户名不合法,请重新输入!\n");
goto Restart1;
}
fflush(stdin);
printf("请输入您的密码:");
hidden_password(password);
fflush(stdin);
if(judge_user(account, password))
{
if((fp = fopen("information.txt","r")) == NULL )//判断文件是否打开成功
{
printf("考生信息文件打开失败!");
return;
}
for(i = 0, k = 0; ch != EOF; k++)
{
ch = fgetc(fp);
if(ch == '\n')
{
i++;
k = -1;
}
else
{
if(ch == '|')
{
users[i].username[k] = '\0';
users[i].gender = fgetc(fp);
ch = fgetc(fp);
if(ch == '|')//因为在注册函数中,不同类信息间用|分隔
{
ch1 = fgetc(fp);
ch2 = fgetc(fp);
ch3 = fgetc(fp);
ch4 = fgetc(fp);
users[i].birthday.year = ((int)ch1 - 48) * 1000 + ((int)ch2 - 48) * 100 + ((int)ch3 - 48) * 10 + ((int)ch4 - 48);//将字符转为其表示的值
if((ch = fgetc(fp)) == '|')
{
ch5 = fgetc(fp);
ch6 = fgetc(fp);
users[i].birthday.month = ((int)ch5 - 48) * 10 + ((int)ch6 - 48);
if((ch = fgetc(fp)) == '|')
{
ch7 = fgetc(fp);
ch8 = fgetc(fp);
users[i].birthday.day = ((int)ch7 - 48) * 10 + ((int)ch8 - 48);
}
}
}
}
else
users[i].username[k] = ch;
}
}
for(i = 0; i < N; i++)
{
if(strcmp(users[i].username, account) == 0)
flag = i;
}
printf("登录成功!\n");
printf("请核对您的身份!\n");
printf("您的用户名:%s\n",users[flag].username);
printf("您的性别:%c\n",users[flag].gender);
printf("您的生日是:%d/%d/%d\n",users[flag].birthday