Echo_晨星 发表于 2021-4-21 22:05:02

c语言期中大作业

c语言期中大作业:只学了一些基础的,学的最难的就是循环、函数了,在此基础上越花哨越好。
非常感谢非常感谢!

一、课题要求:
编写一个小学生计算机辅助教学系统,帮助小学生学习四则运算。课题由易到难设置六个任务点,可循序渐进完成。
任务1:程序随机产生两个1~10之间的正整数,在屏幕上打印出问题,例如:
6 * 7 = ?
让学生输入答案。程序检查答案是否正确,输出相应提示告知学生正确与否,若错误,提示学生重做,直到答对为止。
任务2:在任务1的基础上,当学生回答错误时,最多给3次重做的机会,3次仍未做对,则输出提示语,结束程序。
任务3:在任务1的基础上,连续做10道乘法运算题,不给机会重做,学生回答后,输出相应提示告知学生正确与否。10题全部做完后,按每题10分统计并输出总分。同时为了记录学生能力提高的过程,在输出学生的回答正确率。
任务4:在任务3的基础上,通过计算机随机产生10道四则运算题,两个操作数为1~10之间的随机数,运算类型为随机产生的加、减、乘、除中的任意一种,不给机会重做,学生回答后,输出相应提示告知学生正确与否。10题全部做完后,按每题10分统计并输出总分,输出学生的回答正确率。
任务5:在任务4的基础上,为使学生通过反复练习熟练掌握所学内容,在学生完成10道运算题后,若回答正确率低于75%,则重新做10道题,直到回答正确率高于75%时才退出程序。
任务6:在任务5的基础上对人机对话界面进行优化,为学生输入的每个正确或者错误的答案输出不同的评价。
对于正确答案,可在以下4种提示信息中随机选择一个输出:
Very good!
Excellent!
Nice work!
Keep up the good work!
对于错误答案,可在以下4种提示信息中随机选择一个输出:
No. Please try again.
Wrong. Try once more.
No. Don’t give up!
Not correct. Keep trying.
二、课题评分说明
1. 课题基本分为8分,完成所有给定任务点得7分,程序结构合理得1分。如果能进行 模块化设计(函数)将有加分,如果能为这个程序再设计出其他的功能,将会有额外加分,总分最高可加至15分。
评分方法如下:
   完成任务点               得分
任务1                      2
任务2                      3
任务3                      4
任务4                      5
任务5                      6
任务6                      7
程序结构合理               1
使用函数进行模块化设计      加分
自主功能设计                加分

wp231957 发表于 2021-4-22 07:55:35

没啥技术含量,也没有挑战性,但是代码量也不小,所以呢,看看是不是有其他人帮你吧

yuxijian2020 发表于 2021-4-22 22:52:19

本帖最后由 yuxijian2020 于 2021-4-22 23:00 编辑

我来了{:10_256:}   我就是工具人{:10_266:}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>

typedef int                  BOOL;
#define TRUE                  1
#define FALSE                   0

#define MAX_LEN               50
#define MAX_INT               2147483647

//运算符数组
const char ops = { '+', '-', '*', '/' };
//提示数组
const char* correct = { "Very good!", "Excellent!", "Nice work!", "Keep up the good work!" };
const char* wrong = { "No. Please try again.", "Wrong. Try once more.", "No. Don’t give up!", "Not correct. Keep trying." };

typedef struct _Formula
{
    int first;                  //第一个数
    char operator;            //操作符
    int second;               //第二个数
    int result;               //结果
    double fResult;             //除法结果
    char formula;      //整个公式字符串

} Formula;

//生成运算公式,并计算结果保存在结构体中
Formula* CreateFormula()
{
    //种子
    static unsigned int seed = 1;
    int i = 0;
    Formula* result = (Formula*)malloc(sizeof(Formula));
    if (result == NULL)
      printf_s("生成运算失败...\n");

    memset(result, 0, sizeof(Formula));

    //设置随机数种子
    srand(seed + time(0));
    //种子变化
    seed++;

    result->first = rand() % 10;
    result->second = rand() % 10;
    i = rand() % 4;
    result->operator = ops;
    switch (i)
    {
    case 0:
      result->result = result->first + result->second;
      break;
    case 1:
      result->result = result->first - result->second;
      break;
    case 2:
      result->result = result->first * result->second;
      break;
    case 3:
      //除法时,确保除数不为0
      while (result->second == 0)
            result->second = rand() % 10;

      result->fResult = (double)result->first / (double)result->second;
      break;
    default:
      break;
    }

    sprintf_s(result->formula, MAX_LEN, "%d %c %d = ", result->first, result->operator, result->second);

    return result;
}
//任务一
void TaskOne()
{
    Formula* task = CreateFormula();
    double result = MAX_INT;
    printf_s("请输入下列公式的结果:\n");

    while (result != task->result)
    {
      printf_s("%s ", task->formula);
      scanf_s("%lf%*c", &result);

      if (task->operator != '/' && result != task->result)
            printf_s("答案错误请重新输入!\n");
      else if (task->operator == '/' && fabs(result - task->fResult) > 1e-4)//除法计算出4位小数即可
            printf_s("答案错误请重新输入!\n");
    }

    printf_s("答案正确!\n");
    free(task);
}
//任务二
void TaskTwo()
{
    Formula* task = CreateFormula();
    double result = MAX_INT;
    int count = 3;
    printf_s("请输入下列公式的结果:\n");
    printf_s("你有3次尝试的机会,请好好把握!\n");

    while (count > 0 && result != task->result)
    {
      printf_s("%s ", task->formula);
      scanf_s("%lf%*c", &result);

      count--;

      if (task->operator != '/' && result != task->result && count > 0)
            printf_s("答案错误请重新输入!\n");
      else if(task->operator == '/' && fabs(result - task->fResult) > 1e-4 && count > 0)
            printf_s("答案错误请重新输入!\n");
    }

    if (result != task->result)
      printf_s("很遗憾,3次尝试都失败了!游戏结束!\n");
    else
      printf_s("回答正确!\n");

    free(task);
}
//任务三
void TaskThree()
{
    Formula* task;
    double result;
    for (int i = 0; i < 10; i++)
      task = CreateFormula();

    int rightNum = 0;

    printf_s("一共10道题目,只有一次机会!请谨慎填写!\n");

    for (int i = 0; i < 10; i++)
    {
      printf_s("(%d) %s", i + 1, task->formula);
      scanf_s("%lf%*c", &result);
      if (task->operator != '/' && result == task->result)
            rightNum += 1;
      else if(task->operator == '/' && fabs(result - task->fResult) < 1e-4)
            rightNum += 1;
    }
    //10题每题10分
    printf_s(" 你的总分为: %d\n 正确率为: %d%%", rightNum * 10, rightNum * 10);
    //释放空间
    for (int i = 0; i < 10; i++)
      free(task);
}
//任务四
int TaskFour()
{
    Formula* task;
    double result;
    for (int i = 0; i < 10; i++)
      task = CreateFormula();

    int rightNum = 0;

    printf_s("一共10道题目,只有一次机会!请谨慎填写!\n");

    for (int i = 0; i < 10; i++)
    {
      printf_s("(%d) %s", i + 1, task->formula);
      scanf_s("%lf%*c", &result);
      if (task->operator != '/' && result == task->result)
      {
            printf_s("答案正确!\n");
            rightNum += 1;
      }
      else if (task->operator == '/' && fabs(result - task->fResult) < 1e-4)
      {
            printf_s("答案正确!\n");
            rightNum += 1;
      }
      else
      {
            printf_s("答案错误!\n");
      }
    }
    //10题每题10分
    printf_s(" 你的总分为: %d\n 正确率为: %d%%", rightNum * 10, rightNum * 10);
    //释放空间
    for (int i = 0; i < 10; i++)
      free(task);

    return rightNum * 10;
}
//任务五
void TaskFive()
{
    while (TaskFour() < 75)
    {
      printf_s("正确率低于75%%, 请重新做题!\n");
      printf_s("-------------------------------------\n");
    }
}
//任务六
//人机回复 参数为回答正确或错误
void RobotReply(BOOL isCorrect)
{
    //种子
    static unsigned int seed = 0;
    //设置随机数种子
    srand(seed + time(0));
    int i = rand() % 4;
    if (isCorrect)
      printf_s("%s\n", correct);
    else
      printf_s("%s\n", wrong);

    //种子变化
    seed++;
}
//设置问题并要求用户输入回复 -- 基本同TaskFour只是改了回复
int MakeQuestion()
{
    Formula* task;
    double result;
    for (int i = 0; i < 10; i++)
      task = CreateFormula();

    int rightNum = 0;

    printf_s("一共10道题目,只有一次机会!请谨慎填写!\n");

    for (int i = 0; i < 10; i++)
    {
      printf_s("(%d) %s", i + 1, task->formula);
      scanf_s("%lf%*c", &result);
      if (task->operator != '/' && result == task->result)
      {
            RobotReply(TRUE);
            rightNum += 1;
      }
      else if (task->operator == '/' && fabs(result - task->fResult) < 1e-4)
      {
            RobotReply(TRUE);
            rightNum += 1;
      }
      else
      {
            RobotReply(FALSE);
      }
    }
    //10题每题10分
    printf_s(" 你的总分为: %d\n 正确率为: %d%%", rightNum * 10, rightNum * 10);
    //释放空间
    for (int i = 0; i < 10; i++)
      free(task);

    return rightNum * 10;
}

void TaskSix()
{
    while (MakeQuestion() < 75)
    {
      printf_s("正确率低于75%%, 请重新做题!\n");
      printf_s("-------------------------------------\n");
    }
}

//自定义功能
void TaskCustom()
{
    //自定义功能自己写吧...
}

int main()
{
    //TaskOne();
    //TaskTwo();
    //TaskThree();
    //TaskFour();
    //TaskFive();
    TaskSix();

    return 0;
}

Echo_晨星 发表于 2021-4-23 14:26:18

yuxijian2020 发表于 2021-4-22 22:52
我来了   我就是工具人

谢谢谢谢
页: [1]
查看完整版本: c语言期中大作业