一.实验目的
1、加深理解C语言编程基本程序框架;
2、培养自学能力,学习自主查阅文献;
3、掌握顺序结构、分支结构和单层循环结构程序设计方法及代码编写;
4、学习相关开发平台和开发工具的使用方法;
5、掌握流程图的绘制方法。
二.实验内容
完成“学生计算能力进阶训练程序”,具体要求如下:
1.自定义难度等级(例如:第1级为一位数和一位数的加法,减法和乘法运算;第2级为一位数和两位数的加法,减法和乘法运算;第3级为两位数和两位数的加法,减法和乘法运算),学生可以选择不同等级练习,某个等级练习的正确率在90%以上,可以升级;正确率在60%以下,则要降级;
2.每组难度题目数量为10题,软件随机出题,学生填写答案;
3、一组题全部答完后,显示学生成绩,并根据结果自动升降级,完成通关训练。
三.解答
1.实验设计
1> 定义函数①来随机生成两个数,并根据等级来控制随机生成数的范围。其中rand()函数和指针的使用参考了CSDN上的相关文章。
2> 定义函数②来随机生成一个运算符,用作随机算式的运算。
3> 定义函数③来运算函数①提供的随机数和函数②提供的随机运算符的算式并得出结果。
4> 在主函数中定义level(等级)、score=0(初始得分)、correct=0(初始正确数)、total=10(题目总数)、num1(算式中的第一个数)、num2(算式中的第二个数)、answer(用户输入的答案)、sign(运算符)等变量,并让用户自己输入level的值来选择难度等级。为了提高程序的可扩充性,在主函数中单独定义total而不是直接使用10,这样在后期修改题目总数时只需更改total的赋值即可。同时,为了方便后人进行程序的更改,我在源码中写入了大量的注释方便后来的程序员进行解读并在题目要求的基础上添加了除法运算使程序更完善。
5> 进入循环体,利用for()循环语句配合定义的函数①和函数②来随机生成题目,并打印在用户的屏幕上,再使用if条件语句和函数③返回的正确值与用户输入的值进行做差取绝对值判断误差是否小于0.01,如果误差小于0.01则给初始正确数+1,并根据total总数来确定总循环次数。
6> 在用户回答完每一等级所有题目后,计算出用户所得分数并打印在屏幕上给用户看。
7> 根据用户的得分情况判断是满足升级、保级、降级之中的哪一个,升级则给level加1,保级则level不变,降级则给level减1。
8> 当level发生变化时重置correct数量和total的数量方便进行下一次的分数计算。
9> 判断当变量level大于3时"打印恭喜你通关了!"在用户的屏幕上,并在用户按下任意键后结束进程。
2.源代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
// 随机生成两个数
void suijishu(int level, float* num1, float* num2)
{
switch (level)
{
case 1:
*num1 = rand() % 10 + 0;//随机从1到10取数
*num2 = rand() % 10 + 1;
break;
case 2:
*num1 = rand() % 90 + 0;//随机从1到90取数
*num2 = rand() % 90 + 1;
break;
case 3:
*num1 = rand() % 90 + 10;//随机从10到90取数
*num2 = rand() % 90 + 10;
break;
default:
break;
}
}
// 随机生成运算符
char fuhao()
{
int sign = rand() % 4;
switch (sign)
{
case 0:
return '+';
case 1:
return '-';
case 2:
return '*';
case 3:
return '/';
default:
return '+';
}
}
// 计算结果
float jisuan(float num1, float num2, char sign)
{
switch (sign)
{
case '+':
return num1 + num2;
case '-':
return num1 - num2;
case '*':
return num1 * num2;
case '/':
return num1 / num2;
default:
return num1 + num2;
}
}
int main()
{
srand(time(NULL)); // 初始化随机数种子
int level; //定义变量level等级
int score = 0; // 初始得分为0
int correct = 0; // 初始正确数量为0
int total = 10; // 初始题目数量为10
float num1, num2, answer;//定义计算数和答案
char sign;//定义符号为字符型
printf("请输入练习难度1或2或3 -> ");
scanf("%d", &level);
while (1)
{
// 随机生成题目
for (int i = 0; i < total; i++)
{
suijishu(level, &num1, &num2);
sign = fuhao();
printf("%.0f %c %.0f = ", num1, sign, num2);
scanf("%f", &answer);
if (fabs(answer - jisuan(num1, num2, sign)) < 0.01)
{
printf("正确!\n");
correct++;
}
else
{
printf("错误!\n");
}
}
// 计算得分
score = correct * 10 / total;
printf("本次得分:%d\n", score);
// 根据得分升降级
if (score >= 9)
{
level++;
printf("恭喜你升级到等级%d!\n", level);
}
else if (score < 6)
{
level--;
printf("很遗憾,你降级到等级%d!\n", level);
}
// 重置正确数量和题目数量
correct = 0;
switch (level)
{
case 1:
total = 10;
break;
case 2:
total = 10;
break;
case 3:
total = 10;
break;
default:
break;
}
// 判断是否通关
if (level > 3)
{
printf("恭喜你通关了!\n");
break;
}
}
system("pause");
return 0;
}
今天的内容就分享这么多
求三连!!!
求关注!!!