• 第一次 C语言课程设计


    小学生测验

    最近比较忙,就拿前几天做的课设项目水一水。

    内容

      面向小学1~2年级学生,随机选择两个整数和加减法形成算式要求学生解答。
    功能要求:
    (1)电脑随机出10道题,每题10分,程序结束时显示学生得分;
    (2)确保算式没有超出12年级的水平,只允许进行50以内的加减法,不允许两数之和或之差超出050的范围,负数更是不允许的;
    (3)每道题学生有三次机会输入答案,当学生输入错误答案时,提醒学生重新输入,如果三次机会结束则输出正确答案;
    (4)对于每道题,学生第一次输入正确答案得10分,第二次输入正确答案得7分,第三次输入正确答案得5分,否则不得分;
    (5)总成绩90以上显示“SMART”,80-90显示“GOOD”,70-80显示“OK”,60-70显示“PASS”,60以下“TRY AGAIN”

    思路

      这个项目的重点在于随机的十道加法或减法题目,所以我选择结构体数组来完成题目的构建与保存,虽然题目并未要求保存题目,有对应分数即可。但是我认为如果以后增加功能,比如列出做错的题目的话。用结构体数组可以更加便捷的完成方法的构建,而不用重新构建数组。
      在随机生成运算符与运算数时,因为种类较多,所以我构建了新的随机数函数。如下:
      

    int ran(int n,int m) {
        srand((unsigned)time( NULL ));
        return rand()%(m-n+1);
    }
    

      这样可以很方便的生成指定区间内的随机数。

    代码

    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    #include <conio.h>
    #define a 0
    #define b 50  // 算式范围为0-50 
    #define k 10  // 算式个数为10 
    
    struct questions {
    	int x;
    	int y;
    	int result;
    	int score;
    	char op;
    } que[11]={0};
    
    int ran(int n,int m) {
    	srand( (unsigned)time( NULL ) );
    	return rand()%(m-n+1);
    }
    
    int main() {
    	int i,j,c,r,s=0;
    	printf("下面开始测验,请做好准备。按任意键开始。 
    ") ;
    	getch();
    	for (i=0;i<k;i++) {
    		c = ran(0,1);
    
    		if (c == 0) {
    			que[i].result = ran(a,b);
    			que[i].x = ran(a,que[i].result);
    			que[i].y = que[i].result - que[i].x;
    			que[i].op = '+';    
    		} else {
    			que[i].x = ran(a,b);
    			que[i].y = ran(a,que[i].x);
    			que[i].result = que[i].x - que[i].y;
    			que[i].op = '-';
    		}
    			
    		for (j=0;j<3;j++) {
    			printf("%d: %d%c%d = ",i+1,que[i].x,que[i].op,que[i].y);
    			scanf("%d",&r);
    	
    			if (r != que[i].result && j<2) {
    			    printf("输入错误,请重新输入,你还有%d次机会!加油!
    ",2-j);
    				continue;
    			} else if (r != que[i].result && j==2) {
    			    printf("很遗憾,三次机会已用完,正确答案为%d,继续努力!加油!
    ",que[i].result);	
    			    break;
    		    }
    			
    		    if (j == 0) 
    	    		que[i].score = 10;
    		    else if (j == 1) 
    		    	que[i].score = 7;
    	    	else
    	        	que[i].score = 5;
    		    	
    		    printf("恭喜你,回答正确,加%d分。",que[i].score); 
    		
    	    	if (i < k-1) {
    	    		printf("请开始下一题
    ");
    	    	} else {
    	    		printf("
    ");
    	    	}
    	    	break;	
    	    }
        }
        for (i=0;i<k;i++) {
    	    s += que[i].score;
        }
        printf("
    答题结束,按任意键可得到结果。
    "); 
    	getch();
    	printf("
    结果为:"); 
    
    	if (s > 90) {
    		printf("SMART!
    ");
    	} else if (s > 80) {
    		printf("GOOD!
    ");
    	} else if (s > 70) {
    		printf("OK!
    ");
    	} else if (s >= 60) {
    		printf("PASS!
    ");
    	} else {
    		printf("TRY AGAIN!
    ");
    	}
    	// printf("本次得分为:%d分
    ",s);
    	printf("
    测验结束,按任意键退出");
    	getch();
    	return 0; 
    }
    

    总结

      第一次做课设,一开始想的有些简单。起初想一口气生成十道题,再解答。但是同时生成十道题就会有一个很尴尬的问题:题目无论是运算符还是运算数都几乎相同(十道题目一样,最多两种样子。。。)。所以我只好将其设计成:一题答对后再生成下一题,直到十道题目都解答完毕。题目几乎相同的原因是随机数函数为伪随机数函数,它的生成与随机数种子有关,一般我们将随机数种子用当前时间毫秒数构成。所以,同一时间生成的随机算式,几乎相同。(不知道我说清没有,有不懂的欢迎大家提问 哈)
      

    附:图

    ps:不是我照的,是我一个好朋友,他的版权哈!

    以上

  • 相关阅读:
    vue开发chrome扩展,数据通过storage对象获取
    Vue手动集成less预编译器
    Google Translate寻找之旅
    Javascript Range对象的学习
    Javascript Promises学习
    SublimeText 建立构建Node js系统
    We're sorry but demo3 doesn't work properly without JavaScript enabled. Please enable it to continue.
    npm安装包出现UNMET DEPENDENCY报错
    (转载)命令行说明中格式 尖括号 中括号的含义
    Linux重启网卡服务Failed to start LSB: Bring up/down networking.
  • 原文地址:https://www.cnblogs.com/mxwbq/p/6822600.html
Copyright © 2020-2023  润新知