作业要求:
- 小学老师要每周给同学出300道四则运算练习题。
选择c语言进行实现
–两个运算符,100 以内的数字,不需要写答案。
–需要检查答案是否正确,并且保证答案在 0..100 之间
–尽可能地多设置一些条件 - 也可以让同学们自选一个小应用程序进行结对编程的开发
- 请两位同学以结对编码(一个同学coding,另一个同学在旁边审核代码,之后再交换角色)的方式完成本次实验,并把程序、运算结果、博客体会等截屏发到其中一位同学的博客上,并在博客中体现另一位同学的学号(仅学号不体现姓名)
另一位结对同学:2252601
代码的编写过程:
- 编译出随机生成四则运算的基本代码,代码的构想为通过do while函数随机生成数字和运算符,构成表达式
- 编译用户回答以及判断用户答案是否正确或退出的代码。
- 完善代码,检查漏洞,如除数不可为0,减法不能出现负数,代码结果在0-100以内,清除缓冲区字符等。
- 构造程序界面,改变字体颜色,让程序变得更美观。
遇到的问题:
1.减法出现问题,当x-x的时候答案应该为0,但正确答案却显示为负数,这是因为在编程中先令result=0,然后才使num1=num2,两行交换一下就行
2.用来实现输出居中的Myprintf()不能传变量,但是调整了一下循环就不用全部使用myprintf()就可以实现居中。
3.传递代码的时候出现中文乱码的情况,后来用复制处理了
4.未输出计算结果就清屏了,添加一个system(“pause”)即可
感想:
在四则运算代码的编写过程中,结对编程有助于我们一个人在写代码时,另一个人可以很敏锐的检查出代码的错误并修改、改进。生成四则运算的基础代码很简单,但在改进代码过程中我们也遇到了一些小坎坷,在结对编程中,我们能够发现对方发现不了的错误,让这些坎坷更容易度过,与此同时也提高了纠错的能力。此外,结对编程还能够使程序更丰富更完美。
代码:
点击查看代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
void SetSize(unsigned uCol,unsigned uLine)
{
char cmd[64];
sprintf(cmd,"mode con cols=%d lines=%d",uCol,uLine);
system(cmd);
}
int lenth, lenth2;
int hight, hight2;
void myprintf(boolean b, char *str) {
COORD coord;
if(!b) { //几句纯粹是调一下左右,更好看
lenth =lenth2- strlen(str);
}
coord.X = lenth;
coord.Y = hight = (b ? hight+2 : hight2);
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
printf(str) ; //这个函数没办法把可变参数传进来
}
int main() {
HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO scr;
GetConsoleScreenBufferInfo(out, &scr);
lenth2 = lenth = scr.srWindow.Right / 2; //初始化横向位置
char opera;
int num1, num2, result, answer;
int i;
// 初始化随机数生成器
srand(time(NULL));
do {
system("color 9E");
myprintf(FALSE,"\033[1;36m");
myprintf(TRUE,"#############################################\n");
myprintf(TRUE,"# 四则运算练习程序 #\n");
myprintf(TRUE,"############输入101可退出本程序###############\n");
myprintf(TRUE,"\033[0m");
// 随机生成运算符和数字
num1 = rand() % 100 + 1;
num2 = rand() % 100 + 1;
opera = rand() % 4;
switch (opera) {
case 0:
opera = '+';
result = num1 + num2;
break;
case 1:
opera = '-';
result = num1 - num2;
if (result < 0) { // 确保结果非负
num1 = num2;
result = 0; //bug修正
}
break;
case 2:
opera = '*';
result = num1 * num2;
break;
case 3:
opera = '/';
// 确保不会除以0,且结果为整数
num2 = rand() % (num1 + 1);
if (num2 == 0) num2 = 1; // 防止除以0
while (num1 % num2 != 0) {
num2 = rand() % (num1 + 1);
if (num2 == 0) num2 = 1; // 防止除以0
}
result = num1 / num2;
break;
default:
myprintf(TRUE,"运算符错误!\n");
return 1;
}
// 确保结果在0-100范围内
if (result <0 || result >100) {
continue;
}
myprintf(TRUE,"\033[1;33m");
printf("请计算:%d %c %d = ", num1, opera, num2);
myprintf(TRUE,"\033[0m");
if (!scanf("%d", &answer)) {
// 如果用户没有输入数字,清空输入缓冲区
scanf("%*s");
answer = -1; // 设置一个不可能的答案,以便于后续判断
}
// 判断用户答案是否正确或退出
if (answer == 101) {
break; // 用户选择退出
} else if (answer == result) {
myprintf(TRUE,"\033[1;32m");
myprintf(TRUE,"回答正确!\n");
myprintf(TRUE,"\033[0m");
system("pause") ;
system("cls") ;
} else {
myprintf(TRUE,"\033[1;31m");
printf("回答错误,正确答案是:%d\n", result);
myprintf(TRUE,"\033[0m");
system("pause") ; //不加这个就会直接清屏
system("cls") ;
}
// 清除字符
while (getchar() != '\n') {
;
}
myprintf(TRUE,"\033[1;34m");
for (i = 0; i < 40; i++) {
printf("-");
}
myprintf(TRUE,"\n");
myprintf(TRUE,"\033[0m");
} while (1);
myprintf(TRUE,"\033[1;36m");
myprintf(TRUE,"#############################################\n");
myprintf(TRUE,"# 感谢使用本程序! #\n");
myprintf(TRUE,"#############################################\n");
myprintf(TRUE,"\033[0m");
return 0;
}