因为我们专业这学期有门课要求是每个人都需要上讲台去讲15分钟数学相关的课,然后还会有评分等等,所以没办法,只能准备准备了。我打算讲高一的进制转换,但是我觉得常规的讲可能会没啥意思,所以就思考着能不能利用程序来做点什么,为微课堂比赛添点新意。
说干就干,我打算讲进制的转换,这是属于高一数学书上的内容。都是这么过来的,那时候特别喜欢玩游戏,所以如果把底下的同学当成高一的学生,就必须要拿他们感兴趣的东西来吸引他们注意力,能不能把进制的转换做成一个小游戏呢?
既然是游戏,那肯定就是有分数和做题环节了,我把整体分成了三个部分:1、十进制转二进制 2、二进制转十进制 3、任意进制转换。游戏的前两个部分可以在课前给大家看看,然后引入讲课的主题,同时在结束的时候带大家一起玩一下;第3部分作为教学部分,教学部分可以将进制转换具体描述,如十进制转换成其他进制是怎么转换的?商余法究竟是怎么操作的?如其他进制转换成十进制又是如何做到的?好了,一个大致的框架就打好了,接下来开始操作了。
首先是引入我们可能需要使用到的头文件
#include<stdio.h> #include<time.h> #include<windows.h> #include<string.h>
然后再main函数开始处利用时间函数初始化随机种子,方便后续做题产生随机数。
srand((unsigned)time(NULL));
然后设计一个菜单
void menu() { int select; printf(" 请输入游戏模式:1、给出十进制求二进制 2、给出二进制求十进制 3、演示十进制转换成其他进制"); scanf("%d",&select); run(select); }
run函数自然就是我们整个游戏的框架了。根据玩家的选择,决定最后执行的操作。因为课堂只有15分钟,所以我这里是设定初始分数为10分,12分以上则成功。
void run(int flag) { int score = 10,input,i = 0,num,old,New; char* str = (char*)malloc(sizeof(char)*100); while(score > 0) { if(flag == 1) { num = Rand(5,30); printf("据说分数到达12分以上,就可以顺利通过你现在最希望通过的一门考试哟!!! 这是一个随机给你的十进制数字 %d,请输入它的二进制表达:",num); scanf("%d",&input); //将input转换成一个字符串保存起来 //if(strcmp(NumToStr(input),NumToStr(TenToOther(num,2))) == 0) if(input == TenToOther(num,2)) { printf(" Right "); score+=2; printf("当前得分为:%d ",score); if(score>12) { MessageBox(0, TEXT(" 许好愿望后 点击确定即会美梦成真!"), TEXT("许愿台"), 0); break; } } else { score--; printf("Error 正确为%d",TenToOther(num,2)); printf("当前得分为:%d ",score); } } else if(flag == 2) { num = Rand(5,30); printf("据说分数到达12分以上,就可以顺利通过你现在最希望通过的一门考试哟!!! 这是一个随机给你的二进制数字 %d,请输入它的十进制表达:",TenToOther(num,2)); scanf("%d",&input); if(num == OtherToTen(TenToOther(num,2),2)) { printf("Right "); score+=2; printf("当前得分为:%d ",score); if(score>12) { MessageBox(0, TEXT(" 许好愿望后 点击确定即会美梦成真!"), TEXT("许愿台"), 0); break; } } else { score--; printf("Error 正确为%d %d ",OtherToTen(TenToOther(num,2),2),num); printf("当前得分为:%d ",score); } } else if(flag == 3) { while(1) { printf("请分别输入一个数字、它的进制以及你想要转换成的进制:"); scanf("%d%d%d",&input,&old,&New); TenToOtherJiaoXue(input,old,New); printf(" "); system("pause"); } } } system("pause"); if(score <= 0) over(); }
当然,重头戏还是我们的教学讲解部分啦,首先是如何将二进制转换成十进制,因为刚开始是没打算用程序来展现过程的,所以走了蛮多弯路,做了输入一个十进制的数,得到二进制的数的字符串形式。具体怎么转换的我删了,当时的思路好像是除一次就会得到一个余数,然后就保存起来,然后结束后只要倒序输出,就得到了该数字的二进制了
数字转换成字符串我是将数字不断对10除和取余,不断比较除的的结果,如果不为零则不断将这个数字变成字符储存起来
//将数字转换成字符串 char* NumToStr(int num) { int devisor,remain,i = 0; char* str = (char*)malloc(sizeof(char)*100); devisor = num/10; remain = num%10; while(devisor != 0) { str[i++] = remain+48; num = devisor; devisor = num/10; remain = num%10; } str[i++] = remain+48; str[i] = '