我の第四篇博客

| 这个作业属于哪个班级 | C语言--网络2011/2012 |
| ---- | ---- | ---- |
| 这个作业的地址 | C博客作业03--函数 |
| 这个作业的目标 | 学习如何设计函数、C语言基本数据类型 |
| 姓名 | 付峻霖 |

0.展示PTA总分

1.本章学习总结

1.1 函数定义、调用、声明

⭐ 语法

#include<stdio.h>
int main()
{
	{
		void printstar();           //对printstar函数声明
		void print_message();       //对print_message函数声明

		printstar();             //调用printstar函数
		print_message();         //调用print_message函数
		printstar();           //调用printstar函数
	} 
}
void printstar()                  //定义printstar函数
{
	printf("***************\n");
}
void print_message()               //定义print_message函数
{
	printf("Hello World!\n");
}

⭐ 案例:使用函数求素数和
案例其实非常多,说白了函数调用,就是把原本的复杂问题简单化,把需要做的几件事情,分别放在几个区域去做,看起来比较友好。

1.2 全局、局部变量、静态局部变量

全局变量:具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。
局部变量:也只有局部作用域,他是自动对象,他在程序运行期间不是一直存在,而是只在函数执行期
间存在,函数的一次调用结束后,变量就被撤销,其所占用的内存也被收回。
静态变量:会被放在程序的静态数据存储区里,这样可以在下一次调用的时候还可以保持原来的赋值。

1.3 C数据类型及注意点

名称 类别名 转换说明 特点
[有符号]整型 int %d十进制,%x15进制,%X16进制数,%o八进制 有正负
[无符号]整型 unsigned %u 只有正
字符型 char %c 字符要用单引号
单精度浮点型 float %lf 有浮点误差
双精度浮点型 double %f 有浮点误差
浮点误差如何解决呢?
如果是一个非常接近整数的值,13.999999这类的话,加上一个0.000001就可以解决。
而且浮点数判断是否相等,也不能直接(i == 10.0),而应该是(i - 10.0 <= 0.000001)
为何int类型只能到2的31次方呢?
那是因为最高位的1和0用来定义正负号了
unsigned的作用就是将数字类型无符号化
例如 int 型的范围:-2^31 ~ 2^31 - 1,而unsigned int的范围:0 ~ 2^32。

1.4 C运算符

⭐1. 取余左右两边操作数必须是整数,如5%3
⭐2. 单目双目中的指的是操作数个数
⭐3. 运算符的优先级和结合性
案例:a+=a-=a*a;
结合性:所有赋值运算符都是从右往左结合。
优先级:先乘除后加减

   //因此可以把上面的表达式拆分成以下两个表达式
   //1.a=a-a*a
   //2.a=a+a

⭐4. 强制类型转换

#include<stdio.h>
int main()
{
	printf("整型输出:%d\n", 1 + (int)2.0);//强制类型转换, int(2.0)
	printf("浮点数输出:%f\n", 1 + 2.0);    //强制转换成浮点数
}

2.综合作业:小学生口算表达式自动生成系统

2.1.模块流程图

一年级流程图

二年级流程图

三年级流程图

2.2.函数功能及全局变量介绍

2.2.1.全局变量

变量名,作用

char a;//是否要继续做题的字符
int sum;//总答题数量
int conserve;//用于保存expression返回的值
static int amount = 0;//答题总数
int right = 0; //答对的题目数量
int wrong = 0; //答错的题目数量

2.2.2 菜单相关函数

函数功能、思路

⭐从游戏界面进入答题系统

void OperateMenu();//游戏操作界面
int GradeOneMenu();//一年级答题系统
int GradeTwoMenu();//二年级答题系统
int GradeThreeMenu();//三年级答题系统

函数代码

1.游戏操作界面

void OperateMenu()//游戏操作界面
{
	char option;
	system("cls");//清屏
	do
	{
		system("cls");
		printf("******************************************\n");
		printf("1.一年级口算\n");
		printf("2.二年级口算\n");
		printf("3.三年级口算\n");
		printf("4.退出系统\n");
		printf("******************************************\n");
		printf("请输入您的选择:");
		scanf(" %c", &option);//选择您的难度级别
		switch (option)
		{
		case '1':               //难度一年级
			system("cls");
			GradeOneMenu();
			//GradeOneMenu();
			break;
		case '2':               //难度二年级
			system("cls");
			GradeTwoMenu();
			break;
		case '3':               //难度三年级
			system("cls");
			GradeThreeMenu();
			break;
		case '4':               //退出游戏
			printf("\n谢谢您的参与!\n");
			Sleep(500);
			exit(0);
		default:
			printf("您输入不对,只能输入1,2,3,4,请重输!\n");
			Sleep(500);
		}
	} while (!(option >= '1' && option <= '4'));
}

2.一年级答题系统

int GradeOneMenu()        //一年级答题系统
{
	int oneright = 0;     //一年级题目正确个数
	int onewrong = 0;     //一年级题目错误个数
	while (1)
	{
		system("cls");
		printf("*********************一年级小朋友好!********************************\n");
		printf("系统将随机生成一个口算式,如果您会做,则输入y,输入结果。\n");
		printf("**如果您不想做,输入n退回主菜单。\n");
		printf("***************************************************************\n");

		/*1.生成操作数函数*/
		/*2.生成随机运算符函数*/
		/*3.根据年级判断生成的表达式是否合理的函数(选做)*/
		/*4.生成表达式函数,并输出展示*/
		printf("请输入你的答题的数量:");
		scanf("%d", &sum);               //输入答题数量
		for (amount = 0; amount < sum; amount++)//题目循环
		{
			conserve = OneExpression();//保存返回值
			if (conserve == 1)//如果返回值为1
			{
				right++;    //正确数+1
				oneright++;//总正确数+1
			}
			else
			{

				wrong++;   //错误数+1
				onewrong++;//总错误数+1
			}
			if (amount < sum - 1)
			{
				Sleep(500);
				printf("是否要继续做题?输入n即可退出答题,按下回车可继续\n");
				getchar();
				scanf("%c", &a);
				if (a == 'n')
				{

					system("cls");
					printf("************************\n");
					printf("      小朋友你好!\n");
					printf("你在本次游戏中一共答了%d题\n", amount + 1);
					printf("本次游戏答对了%d题\n本次游戏答错了%d题\n", oneright, onewrong);
					printf("本次游戏您的正确率为%.2f\n", oneright * 1.0 / (amount + 1));//正确率
					printf("\n    累积答对了%d题\n    累积答错了%d题\n", right, wrong);
					printf("    累积正确率为%.2f\n", right * 1.0 / (right + wrong));
					printf("************************\n");
					Sleep(1000);
					printf("再输入n可返回操作界面噢~\n");
					getchar();
					if (getchar() == 'n')//如果为n
					{
						OperateMenu();//则返回操作界面
					}
				}
				else
				{
					continue;      //如果不为n,则继续答题
				}
			}
		}

		system("cls");
		printf("************************\n");
		printf("      小朋友你好!\n");
		printf("你在本次游戏中一共答了%d题\n", amount);
		printf("本次游戏答对了%d题\n本次游戏答错了%d题\n", oneright, onewrong);
		printf("本次游戏您的正确率为%.2f\n", oneright * 1.0 / amount);//正确率
		printf("\n    累积答对了%d题\n    累积答错了%d题\n", right, wrong);
		printf("    累积正确率为%.2f\n", right * 1.0 / (right + wrong));

		printf("************************\n");
		Sleep(1000);
		printf("输入n可返回操作界面噢~\n");
		getchar();
		if (getchar() == 'n')
		{
			OperateMenu();
		}
	}
}

3.二年级答题系统

int GradeTwoMenu()        //二年级答题系统
{
	int tworight = 0;     //二年级题目正确个数
	int twowrong = 0;     //二年级题目错误个数
	while (1)
	{
		system("cls");
		printf("*********************二年级小朋友好!********************************\n");
		printf("系统将随机生成一个口算式,如果您会做,则输入y,输入结果。\n");
		printf("**如果您不想做,输入n退回主菜单。\n");
		printf("***************************************************************\n");

		/*1.生成操作数函数*/
		/*2.生成随机运算符函数*/
		/*3.根据年级判断生成的表达式是否合理的函数(选做)*/
		/*4.生成表达式函数,并输出展示*/
		printf("请输入你的答题的数量:");
		scanf("%d", &sum);               //输入答题数量
		for (amount = 0; amount < sum; amount++)   //题目循环
		{
			conserve = TwoExpression();//保存返回值
			if (conserve == 1)//返回值为1
			{
				right++;   //正确数+1
				tworight++;//则总正确数+1
			}
			else           //返回值为0
			{

				wrong++;   //则错误数+1
				twowrong++;//则总错误数+1
			}
			if (amount < sum - 1) //打印是否继续答题?
			{
				Sleep(500);
				printf("是否要继续做题?输入n即可退出答题,按下回车可继续\n");
				getchar();
				scanf("%c", &a);
				if (a == 'n')//如果为n,则结束答题
				{

					system("cls");
					printf("************************\n");
					printf("      小朋友你好!\n");
					printf("你在本次游戏中一共答了%d题\n", amount + 1);
					printf("本次游戏答对了%d题\n本次游戏答错了%d题\n", tworight, twowrong);
					printf("本次游戏您的正确率为%.2f\n", tworight * 1.0 / (amount + 1));//正确率
					printf("\n    累积答对了%d题\n    累积答错了%d题\n", right, wrong);
					printf("    累积正确率为%.2f\n", right * 1.0 / (right + wrong));
					printf("************************\n");
					Sleep(1000);
					printf("再输入n可返回操作界面噢~\n");
					getchar();
					if (getchar() == 'n')//如果为n
					{
						OperateMenu();///则返回操作界面
					}
				}
				else
				{
					continue;   //如果不为n,则继续答题
				}
			}
		}

		system("cls");
		printf("************************\n");
		printf("      小朋友你好!\n");
		printf("你在本次游戏中一共答了%d题\n", amount);
		printf("本次游戏答对了%d题\n本次游戏答错了%d题\n", tworight, twowrong);
		printf("本次游戏您的正确率为%.2f\n", tworight * 1.0 / amount);//正确率
		printf("\n    累积答对了%d题\n    累积答错了%d题\n", right, wrong);
		printf("    累积正确率为%.2f\n", right * 1.0 / (right + wrong));

		printf("************************\n");
		Sleep(1000);
		printf("输入n可返回操作界面噢~\n");
		getchar();
		if (getchar() == 'n')//如果为n
		{
			OperateMenu();//则返回操作界面
		}
	}
}

4.三年级答题系统

int GradeThreeMenu()        //三年级答题系统
{
	int threeright = 0;     //三年级题目正确个数
	int threewrong = 0;     //三年级题目错误个数
	while (1)
	{
		system("cls");
		printf("*********************三年级大朋友好!********************************\n");
		printf("系统将随机生成一个口算式,如果您会做,则输入y,输入结果。\n");
		printf("**如果您不想做,输入n退回主菜单。\n");
		printf("***************************************************************\n");

		/*1.生成操作数函数*/
		/*2.生成随机运算符函数*/
		/*3.根据年级判断生成的表达式是否合理的函数(选做)*/
		/*4.生成表达式函数,并输出展示*/
		printf("请输入你的答题的数量:");
		scanf("%d", &sum);               //输入答题数量
		for (amount = 0; amount < sum; amount++)        //题目循环
		{
			conserve = ThreeExpression();//保存返回值
			if (conserve == 1)  //返回值为1
			{
				right++;    //正确数+1
				threeright++;//总正确数+1
			}
			else              //返回值为0
			{
				wrong++;  //错误数+1
				threewrong++;//总错误数+1
			}
			if (amount < sum - 1)
			{
				Sleep(500);
				printf("是否要继续做题?输入n即可退出答题,按下回车可继续\n");
				getchar();      //吸收回车
				scanf("%c", &a);
				if (a == 'n')//如果是n,则结束答题
				{

					system("cls");
					printf("************************\n");
					printf("      小朋友你好!\n");
					printf("你在本次游戏中一共答了%d题\n", amount + 1);
					printf("本次游戏答对了%d题\n本次游戏答错了%d题\n", threeright, threewrong);
					printf("本次游戏您的正确率为%.2f\n", threeright * 1.0 / (amount + 1));//正确率
					printf("\n    累积答对了%d题\n    累积答错了%d题\n", right, wrong);
					printf("    累积正确率为%.2f\n", right * 1.0 / (right + wrong));
					printf("************************\n");
					Sleep(1000);
					printf("再输入n可返回操作界面噢~\n");
					getchar();
					if (getchar() == 'n')//如果是n,则返回操作界面
					{
						OperateMenu();
					}
				}
				else
				{
					continue;//如果不是n,则继续答题
				}
			}
		}

		system("cls");
		printf("************************\n");
		printf("      小朋友你好!\n");
		printf("你在本次游戏中一共答了%d题\n", amount);
		printf("本次游戏答对了%d题\n本次游戏答错了%d题\n", threeright, threewrong);
		printf("本次游戏您的正确率为%.2f\n", threeright * 1.0 / amount);//正确率
		printf("\n    累积答对了%d题\n    累积答错了%d题\n", right, wrong);
		printf("    累积正确率为%.2f\n", right * 1.0 / (right + wrong));

		printf("************************\n");
		Sleep(1000);
		printf("输入n可返回操作界面噢~\n");
		getchar();
		if (getchar() == 'n')
		{
			OperateMenu();//如果是n,则返回操作界面
		}
	}
}

2.2.2 出题相关函数

函数功能、思路

⭐从答题系统中调用随机表达式鼓励的话

void WrongRand();//回答错误鼓励的话
void RightRand();//回答正确鼓励的话
int OneExpression();//一年级随机表达式
int TwoExpression();//二年级随机表达式
int ThreeExpression();//三年级随机表达式
int TwoDivision();//二年级除法
int ThreeDivision();//三年级除法

函数代码

1.回答错误鼓励的话

void WrongRand()//回答错误的鼓励
{
	int language = rand() % 5 + 1;//鼓励的语言
	switch (language)
	{
	case 1:
	{
		printf("答错了噢,别气馁!\n");
		break;
	}
	case 2:
	{
		printf("答错啦,是不是马虎了呢?\n");
		break;
	}
	case 3:
	{
		printf("你答错了,不要灰心,再接再厉噢~\n");
		break;
	}
	case 4:
	{
		printf("答错啦,未曾失败的人恐怕也未曾成功过。\n");
		break;
	}
	case 5:
	{
		printf("答错啦,失败是成功的mother~\n");
		break;
	}
	}
}

2.回答正确鼓励的话

void RightRand()//回答正确的鼓励
{
	int language = rand() % 3 + 1;//鼓励的语言
	switch (language)
	{
	case 1:
	{
		printf("答对啦,你真棒!继续加油鸭~\n");
		break;
	}
	case 2:
	{
		printf("答对啦,不要骄傲噢~\n");
		break;
	}
	case 3:
	{
		printf("答对啦,但成功只是一个过程,并不是一个结果。继续加油噢~\n");
		break;
	}
	}
}

3.一年级随机表达式

int OneExpression()//一年级随机生成表达式
{

	int num1, num2;   //两随机数
	int result;       //真正的答案
	int userresult;   //小学生输入的答案
	srand(time(0));
	num1 = 1 + rand() % 9;//十以内的随机数
	num2 = 1 + rand() % 9;//十以内的随机数
	char ch;
	int num = 1 + rand() % 2;//生成1到2的随机数 分别代表加减
	int swap;

	if (num1 < num2)//交换数字
	{
		swap = num1; num1 = num2; num2 = swap;
	}

	printf("请回答下面的问题,打出你认为的结果。\n");
	switch (num)   //随机加减
	{
	case 1:
		ch = '+'; printf("%d%c%d=", num1, ch, num2);
		result = num1 + num2;//答案
		break;
	case 2:
		ch = '-'; printf("%d%c%d=", num1, ch, num2);
		result = num1 - num2;//答案
		break;
	}
	scanf("%d", &userresult);
	if (userresult != result)//如果不相等,那么鼓励一下
	{
		printf("正确答案为%d\n", result);
		WrongRand();//答错了,不要气馁
		return 0;
	}
	else                      //如果相等,也鼓励一下
	{
		RightRand();//答对了,鼓励一下
		return 1;
	}
}

4.二年级随机表达式

int TwoExpression()//二年级随机生成表达式
{
	int num1, num2;   //两随机数
	int Result;       //真正的答案
	int UserResult;   //小学生输入的答案
	srand(time(0));
	num1 = 1 + rand() % 20;//1到20的随机数
	num2 = 1 + rand() % 20;//1到20的随机数
	char ch;
	int num = 1 + rand() % 4;//生成1到4的随机数 分别代表加减乘除
	int swap;

	if (num1 < num2)//交换数字
	{
		swap = num1; num1 = num2; num2 = swap;
	}

	printf("请回答下面的问题,打出你认为的结果。\n");
	switch (num)   //随机加减乘除
	{
	case 1:
		ch = '+'; printf("%d%c%d=", num1, ch, num2);
		Result = num1 + num2;//答案
		break;
	case 2:
		ch = '-'; printf("%d%c%d=", num1, ch, num2);
		Result = num1 - num2;//答案
		break;
	case 3:
		ch = '*'; printf("%d%c%d=", num1, ch, num2);
		Result = num1 * num2;//答案
		break;

	case 4:
		ch = '/';

		/*printf("%d%c%d=", num1, ch, num2);*/
		Result = TwoDivision();//答案
		break;
	}
	scanf("%d", &UserResult);
	if (UserResult != Result)//如果不相等,那么鼓励一下
	{
		printf("正确答案为%d\n", Result);
		WrongRand();//答错了,不要气馁
		return 0;
	}
	else                      //如果相等,也鼓励一下
	{
		RightRand();//答对了,鼓励一下
		return 1;
	}
}

5.三年级随机表达式

int ThreeExpression()//三年级随机表达式
{
	int num1, num2;   //两随机数
	int result;       //真正的答案
	int userresult;   //小学生输入的答案
	srand(time(0));
	num1 = 1 + rand() % 30;//30以内的随机数
	num2 = 1 + rand() % 30;//30以内的随机数
	char ch;
	int num = 1 + rand() % 4;//生成1到4的随机数 分别代表加减乘除
	int swap;

	if (num1 < num2)//交换数字
	{
		swap = num1; num1 = num2; num2 = swap;
	}

	printf("请回答下面的问题,打出你认为的结果。\n");
	switch (num)   //随机加减乘除
	{
	case 1:
		ch = '+'; printf("%d%c%d=", num1, ch, num2);
		result = num1 + num2;//答案
		break;
	case 2:
		ch = '-'; printf("%d%c%d=", num1, ch, num2);
		result = num1 - num2;//答案
		break;
	case 3:
		ch = '*'; printf("%d%c%d=", num1, ch, num2);
		result = num1 * num2;//答案
		break;

	case 4:
		ch = '/';

		/*printf("%d%c%d=", num1, ch, num2);*/
		result = ThreeDivision();//答案
		break;
	}
	scanf("%d", &userresult);
	if (userresult != result)//如果不相等,那么鼓励一下
	{
		printf("正确答案为%d\n", result);
		WrongRand();//答错了,不要气馁
		return 0;
	}
	else                      //如果相等,也鼓励一下
	{
		RightRand();//答对了,鼓励一下
		return 1;
	}
}

6.二年级除法

int TwoDivision()    //   二年级除法
{
	int num3;
	int num4;
	do
	{
		num3 = rand() % 15 + 1;//随机数
		num4 = rand() % 5 + 1;//随机数
		if (num3 % num4 == 0)//需要整除
		{
			printf("%d/%d=", num3, num4);
		}
	} while (num3 % num4 != 0);
	int num5 = num3 / num4;
	return num5;
}

7.三年级除法

int ThreeDivision()    //   三年级除法
{
	int num3;
	int num4;
	do
	{
		num3 = rand() % 40 + 1;//随机数
		num4 = rand() % 5 + 1;//随机数
		if (num3 % num4 == 0)//需要整除
		{
			printf("%d/%d=", num3, num4);
		}
	} while (num3 % num4 != 0);
	int num5 = num3 / num4;
	return num5;
}

2.3.运行结果截图,测试用例

2.4.大作业中编程技巧总结

总结大作业编程中用到哪些课堂没有学过知识点

  • 学会了用system("cls")清屏,使界面更简洁
  • 学会了Sleep(数字)来延迟界面,(数字)为暂缓的时间
  • 遇到大工程的时候,不能盲目直接去敲代码,而是要先用流程图构思好,然后把用户的需求分成好几个点,分别去写。
posted @ 2020-11-30 22:21  强扭的甜瓜  阅读(100)  评论(2编辑  收藏  举报