注意:本项目采用多文件编译(开发软件为VS2022),请先按照如下步骤进行设置:
1.项目->(项目名称xxx)属性->C/C++->预处理器->预处理器定义->编辑中添加:_CRT_SECURE_NO_WARNINGS (这一步是防止vs2022对于printf等基础函数不安全的报错.)
2.项目->(项目名称xxx)属性->链接器->命令行->其他选项中添加:/FORCE:MULTIPLE (防止link找到多个定义的报错)
3.在C盘中创建名为C_DEMO的文件夹(本项目涉及文件读写)
4.展示如下
头文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int menu(void);
void test(int n);
FILE* exam(int n, int difficulty);
void showinfo(FILE*);
void main()
{
int diff = 3;
int choices = 999;
int qs = 0;
FILE* fpt = NULL;
while (choices != 4)
{
choices = menu();
switch (choices)
{
case 1:
printf("输入题目数:\n");
scanf("%d",&qs);
test(qs);
break;
case 2:
printf("难度为%d级!\n",diff);
printf("输入题目数:\n");
scanf ("%d", &qs);
fpt = exam(qs, diff);
break;
case 3:
printf("选择难度等级:(有1.2.3三级)\n");
scanf("%d",&diff);
case 4:break;
case 5:
showinfo(fpt);
break;
}
}
}
menu函数
( 在解决方案资源管理器->源文件 一栏中创建,以下函数同)
#include"head.h"
int menu()
{
printf("\033[44m练习:1 测验:2 设置:3 退出:4 查看成绩:5\033[0m\n");
printf("请选择:\n");
int choice = 0,logic = 0;
scanf("%d",&choice);
while (logic == 0)
{
if (choice<=5&&choice>=1)logic = 1;
else
{
printf("无该选项!重新选择:\n");
scanf("%d", &choice);
}
}
return choice;
}
test函数
(用于练习)
#include"head.h"
void test(int n)
{
int count = n;
int tick = 0;
int i = 1;
for (; i <= count; i++)
{
float a = (rand() % 10000 + 1) / 10;//0-999随机小数
float b = (rand() % 10000 + 10) / 10;//1-999随机小数
int sign = rand() % 4 + 1; //1.2.3.4对应加减乘除
char c = '0';
switch (sign)
{
case 1:c = '+'; break;
case 2:c = '-'; break;
case 3:c = '*'; break;
case 4:c = '/'; break;
}
printf("第%d题:%.2f %c %.2f = ", i,a,c,b);
float user_answear = 0,std_an = 0;
scanf("%f", &user_answear);
switch (sign)
{
case 1:std_an = a + b; break;
case 2:std_an = a - b; break;
case 3:std_an = a * b; break;
case 4:std_an = a / b; break;
}
if (fabs(std_an - user_answear)<=0.01 )
{
printf("正确!答案为%.2f\n", std_an);
tick++;
}
else
{
printf("错误!正确答案为%.2f\n",std_an);
}
printf("\033[31m当前共有%d题 答对%d道 正确率:%.2f\n\033[0m",i,tick, ((float)tick / i * 100));
if (i != count)
{
printf("是否继续?(输入0结束)\n");
int end = 9;
scanf("%d", &end);
if (end == 0)break;
}
printf("测试完毕 返回菜单!\n");
}
}
exam函数
(用于测验,本函数会将测验结果写入文件)
#include"head.h"
FILE* exam(int n, int difficulty)
{
FILE* fpt = fopen("C:\\C_DEMO\\exam.txt", "w + ");
fprintf(fpt, "本次考试共有%d题!\n",n);
fclose(fpt);
int count = n;
int tick = 0;
int i = 1;
float a;
float b;
for (; i <= count; i++)
{
switch (difficulty)
{
case 1: a = (rand() % 100 + 1) / 10;//0-9随机小数
b = (rand() % 100 + 10) / 10;//1-9随机小数
break;
case 2: a = (rand() % 1000 + 1) / 10;//0-99随机小数
b = (rand() % 1000 + 10) / 10;//1-99随机小数
break;
case 3: a = (rand() % 10000 + 1) / 10;//0-999随机小数
b = (rand() % 10000 + 10) / 10;//1-999随机小数
break;
default:printf("难度设置错误!\n");
return NULL;
}
int sign = rand() % 4 + 1; //1.2.3.4对应加减乘除
char c = '0';
switch (sign)
{
case 1:c = '+'; break;
case 2:c = '-'; break;
case 3:c = '*'; break;
case 4:c = '/'; break;
}
//开文件
fpt = fopen("C:\\C_DEMO\\exam.txt", "a ");
fprintf(fpt, "第%d题:%.2f %c %.2f = ?", i, a, c, b);
fclose(fpt);
printf("第%d题:%.2f %c %.2f = ", i, a, c, b);
float user_answear = 0, std_an = 0;
scanf("%f", &user_answear);
switch (sign)
{
case 1:std_an = a + b; break;
case 2:std_an = a - b; break;
case 3:std_an = a * b; break;
case 4:std_an = a / b; break;
}
if (fabs(std_an - user_answear) <= 0.01)
{
printf("正确!\n");
fpt = fopen("C:\\C_DEMO\\exam.txt", "a");
fprintf(fpt, "本题正确 答案为%.2f\n", std_an);
fclose(fpt);
tick++;
}
else
{
printf("错误!正确答案为%.2f\n", std_an);
fpt = fopen("C:\\C_DEMO\\exam.txt", "a");
fprintf(fpt, "本题错误 答案为%.2f\n", std_an);
fclose(fpt);
}
}
printf("\033[31共有%d道题 答对%d道 正确率:%.2f\n\033[0m",n, tick, (((float)tick / n )* 100));
fpt = fopen("C:\\C_DEMO\\exam.txt", "a ");
fprintf(fpt, "本次考试得分:%.0f", (((float)tick / n) * 100));
fclose(fpt);
}
showinfo函数
(读取文件中的测验结果并展示)
#include"head.h"
void showinfo(FILE*fpt)
{
fpt = fopen("C:\\C_DEMO\\exam.txt", "r");
char c = '0';
c = fgetc(fpt);
while (c != EOF)
{
putchar(c);
c = fgetc(fpt);
}
fclose(fpt);
putchar('\n');
}
//代码结束