【C】C课程设计-驾校考试模拟系统

C课程设计-驾校考试模拟系统

基本设计要求:

采用链表(系统中可以设定任意数目的记录,但难度较大)或者结构体数组(只能限定一定数目的记录)完成系统。系统要求设计一个驾校考试模拟系统, 可以进行考试,成绩记录等操作。

基本系统功能

课程要求最低完成以下任务
» 注册用户
» 考试,可以多次考试
从文件中读取题目(选择题),随机抽取N题,不重复
» 自动阅卷
根据输入的答案自动判断对错并记录下分数
» 记录用户成绩
将最新的成绩添加到注册用户的信息中(覆盖掉原有成绩)
» 查找用户考试信息
根据用户名查找用户的考试成绩
» 退出系统

团队3人合作一周的结果,在程序健壮性上下了很多功夫,但仍有许多值得完善的地方,仅供相同设计课题的同学参考。

程序中使用的文件:
user.txt(考生档案文件,必须先在文件夹中手动新建,否则第一次运行时程序提示无法打开考生档案文件)
text.txt(试题文件,必须先在文件夹中手动新建,否则运行时程序提示无法打开试题文件)
information.txt(考生信息文件,无需手动新建,注册时程序自动新建写入内容保存)
score.txt(记录考生历次考试成绩的文件,无需手动创建,考完试自动新建写入成绩保存)

几点重要说明

  1. 试题文件即题库必须按以下方式保存:

对发生道路交通事故需要收集证据的事故车,交通警察可以依法扣留。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
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值