结对编程(c语言)

作业要求:

  1. 小学老师要每周给同学出300道四则运算练习题。
    选择c语言进行实现
    –两个运算符,100 以内的数字,不需要写答案。
    –需要检查答案是否正确,并且保证答案在 0..100 之间
    –尽可能地多设置一些条件
  2. 也可以让同学们自选一个小应用程序进行结对编程的开发
  3. 请两位同学以结对编码(一个同学coding,另一个同学在旁边审核代码,之后再交换角色)的方式完成本次实验,并把程序、运算结果、博客体会等截屏发到其中一位同学的博客上,并在博客中体现另一位同学的学号(仅学号不体现姓名)

另一位结对同学:2252601

代码的编写过程:

  1. 编译出随机生成四则运算的基本代码,代码的构想为通过do while函数随机生成数字和运算符,构成表达式
  2. 编译用户回答以及判断用户答案是否正确或退出的代码。
  3. 完善代码,检查漏洞,如除数不可为0,减法不能出现负数,代码结果在0-100以内,清除缓冲区字符等。
  4. 构造程序界面,改变字体颜色,让程序变得更美观。



遇到的问题:
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;
}
posted @ 2024-04-17 08:54  茶菹不是沮  阅读(13)  评论(0编辑  收藏  举报