• 我の第四篇博客


    这个作业属于哪个班级 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("***************
    ");
    }
    void print_message()               //定义print_message函数
    {
    	printf("Hello World!
    ");
    }
    

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

    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
    ", 1 + (int)2.0);//强制类型转换, int(2.0)
    	printf("浮点数输出:%f
    ", 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("******************************************
    ");
    		printf("1.一年级口算
    ");
    		printf("2.二年级口算
    ");
    		printf("3.三年级口算
    ");
    		printf("4.退出系统
    ");
    		printf("******************************************
    ");
    		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("
    谢谢您的参与!
    ");
    			Sleep(500);
    			exit(0);
    		default:
    			printf("您输入不对,只能输入1,2,3,4,请重输!
    ");
    			Sleep(500);
    		}
    	} while (!(option >= '1' && option <= '4'));
    }
    

    2.一年级答题系统

    int GradeOneMenu()        //一年级答题系统
    {
    	int oneright = 0;     //一年级题目正确个数
    	int onewrong = 0;     //一年级题目错误个数
    	while (1)
    	{
    		system("cls");
    		printf("*********************一年级小朋友好!********************************
    ");
    		printf("系统将随机生成一个口算式,如果您会做,则输入y,输入结果。
    ");
    		printf("**如果您不想做,输入n退回主菜单。
    ");
    		printf("***************************************************************
    ");
    
    		/*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即可退出答题,按下回车可继续
    ");
    				getchar();
    				scanf("%c", &a);
    				if (a == 'n')
    				{
    
    					system("cls");
    					printf("************************
    ");
    					printf("      小朋友你好!
    ");
    					printf("你在本次游戏中一共答了%d题
    ", amount + 1);
    					printf("本次游戏答对了%d题
    本次游戏答错了%d题
    ", oneright, onewrong);
    					printf("本次游戏您的正确率为%.2f
    ", oneright * 1.0 / (amount + 1));//正确率
    					printf("
        累积答对了%d题
        累积答错了%d题
    ", right, wrong);
    					printf("    累积正确率为%.2f
    ", right * 1.0 / (right + wrong));
    					printf("************************
    ");
    					Sleep(1000);
    					printf("再输入n可返回操作界面噢~
    ");
    					getchar();
    					if (getchar() == 'n')//如果为n
    					{
    						OperateMenu();//则返回操作界面
    					}
    				}
    				else
    				{
    					continue;      //如果不为n,则继续答题
    				}
    			}
    		}
    
    		system("cls");
    		printf("************************
    ");
    		printf("      小朋友你好!
    ");
    		printf("你在本次游戏中一共答了%d题
    ", amount);
    		printf("本次游戏答对了%d题
    本次游戏答错了%d题
    ", oneright, onewrong);
    		printf("本次游戏您的正确率为%.2f
    ", oneright * 1.0 / amount);//正确率
    		printf("
        累积答对了%d题
        累积答错了%d题
    ", right, wrong);
    		printf("    累积正确率为%.2f
    ", right * 1.0 / (right + wrong));
    
    		printf("************************
    ");
    		Sleep(1000);
    		printf("输入n可返回操作界面噢~
    ");
    		getchar();
    		if (getchar() == 'n')
    		{
    			OperateMenu();
    		}
    	}
    }
    

    3.二年级答题系统

    int GradeTwoMenu()        //二年级答题系统
    {
    	int tworight = 0;     //二年级题目正确个数
    	int twowrong = 0;     //二年级题目错误个数
    	while (1)
    	{
    		system("cls");
    		printf("*********************二年级小朋友好!********************************
    ");
    		printf("系统将随机生成一个口算式,如果您会做,则输入y,输入结果。
    ");
    		printf("**如果您不想做,输入n退回主菜单。
    ");
    		printf("***************************************************************
    ");
    
    		/*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即可退出答题,按下回车可继续
    ");
    				getchar();
    				scanf("%c", &a);
    				if (a == 'n')//如果为n,则结束答题
    				{
    
    					system("cls");
    					printf("************************
    ");
    					printf("      小朋友你好!
    ");
    					printf("你在本次游戏中一共答了%d题
    ", amount + 1);
    					printf("本次游戏答对了%d题
    本次游戏答错了%d题
    ", tworight, twowrong);
    					printf("本次游戏您的正确率为%.2f
    ", tworight * 1.0 / (amount + 1));//正确率
    					printf("
        累积答对了%d题
        累积答错了%d题
    ", right, wrong);
    					printf("    累积正确率为%.2f
    ", right * 1.0 / (right + wrong));
    					printf("************************
    ");
    					Sleep(1000);
    					printf("再输入n可返回操作界面噢~
    ");
    					getchar();
    					if (getchar() == 'n')//如果为n
    					{
    						OperateMenu();///则返回操作界面
    					}
    				}
    				else
    				{
    					continue;   //如果不为n,则继续答题
    				}
    			}
    		}
    
    		system("cls");
    		printf("************************
    ");
    		printf("      小朋友你好!
    ");
    		printf("你在本次游戏中一共答了%d题
    ", amount);
    		printf("本次游戏答对了%d题
    本次游戏答错了%d题
    ", tworight, twowrong);
    		printf("本次游戏您的正确率为%.2f
    ", tworight * 1.0 / amount);//正确率
    		printf("
        累积答对了%d题
        累积答错了%d题
    ", right, wrong);
    		printf("    累积正确率为%.2f
    ", right * 1.0 / (right + wrong));
    
    		printf("************************
    ");
    		Sleep(1000);
    		printf("输入n可返回操作界面噢~
    ");
    		getchar();
    		if (getchar() == 'n')//如果为n
    		{
    			OperateMenu();//则返回操作界面
    		}
    	}
    }
    

    4.三年级答题系统

    int GradeThreeMenu()        //三年级答题系统
    {
    	int threeright = 0;     //三年级题目正确个数
    	int threewrong = 0;     //三年级题目错误个数
    	while (1)
    	{
    		system("cls");
    		printf("*********************三年级大朋友好!********************************
    ");
    		printf("系统将随机生成一个口算式,如果您会做,则输入y,输入结果。
    ");
    		printf("**如果您不想做,输入n退回主菜单。
    ");
    		printf("***************************************************************
    ");
    
    		/*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即可退出答题,按下回车可继续
    ");
    				getchar();      //吸收回车
    				scanf("%c", &a);
    				if (a == 'n')//如果是n,则结束答题
    				{
    
    					system("cls");
    					printf("************************
    ");
    					printf("      小朋友你好!
    ");
    					printf("你在本次游戏中一共答了%d题
    ", amount + 1);
    					printf("本次游戏答对了%d题
    本次游戏答错了%d题
    ", threeright, threewrong);
    					printf("本次游戏您的正确率为%.2f
    ", threeright * 1.0 / (amount + 1));//正确率
    					printf("
        累积答对了%d题
        累积答错了%d题
    ", right, wrong);
    					printf("    累积正确率为%.2f
    ", right * 1.0 / (right + wrong));
    					printf("************************
    ");
    					Sleep(1000);
    					printf("再输入n可返回操作界面噢~
    ");
    					getchar();
    					if (getchar() == 'n')//如果是n,则返回操作界面
    					{
    						OperateMenu();
    					}
    				}
    				else
    				{
    					continue;//如果不是n,则继续答题
    				}
    			}
    		}
    
    		system("cls");
    		printf("************************
    ");
    		printf("      小朋友你好!
    ");
    		printf("你在本次游戏中一共答了%d题
    ", amount);
    		printf("本次游戏答对了%d题
    本次游戏答错了%d题
    ", threeright, threewrong);
    		printf("本次游戏您的正确率为%.2f
    ", threeright * 1.0 / amount);//正确率
    		printf("
        累积答对了%d题
        累积答错了%d题
    ", right, wrong);
    		printf("    累积正确率为%.2f
    ", right * 1.0 / (right + wrong));
    
    		printf("************************
    ");
    		Sleep(1000);
    		printf("输入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("答错了噢,别气馁!
    ");
    		break;
    	}
    	case 2:
    	{
    		printf("答错啦,是不是马虎了呢?
    ");
    		break;
    	}
    	case 3:
    	{
    		printf("你答错了,不要灰心,再接再厉噢~
    ");
    		break;
    	}
    	case 4:
    	{
    		printf("答错啦,未曾失败的人恐怕也未曾成功过。
    ");
    		break;
    	}
    	case 5:
    	{
    		printf("答错啦,失败是成功的mother~
    ");
    		break;
    	}
    	}
    }
    

    2.回答正确鼓励的话

    void RightRand()//回答正确的鼓励
    {
    	int language = rand() % 3 + 1;//鼓励的语言
    	switch (language)
    	{
    	case 1:
    	{
    		printf("答对啦,你真棒!继续加油鸭~
    ");
    		break;
    	}
    	case 2:
    	{
    		printf("答对啦,不要骄傲噢~
    ");
    		break;
    	}
    	case 3:
    	{
    		printf("答对啦,但成功只是一个过程,并不是一个结果。继续加油噢~
    ");
    		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("请回答下面的问题,打出你认为的结果。
    ");
    	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
    ", 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("请回答下面的问题,打出你认为的结果。
    ");
    	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
    ", 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("请回答下面的问题,打出你认为的结果。
    ");
    	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
    ", 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(数字)来延迟界面,(数字)为暂缓的时间
    • 遇到大工程的时候,不能盲目直接去敲代码,而是要先用流程图构思好,然后把用户的需求分成好几个点,分别去写。
  • 相关阅读:
    【转】P2P通信原理与实现(C++)
    【转】P2P通信标准协议(二)之TURN
    【转】P2P之UDP穿透NAT的原理与实现
    【转】P2P的原理和常见的实现方式
    【转】linux中man使用技巧
    【转】go编译时,加入svn版本信息
    各种移动GPU压缩纹理的使用方法
    Unity贴图压缩格式设置
    关于U3D贴图格式压缩
    可能会导致.NET内存泄露的8种行为
  • 原文地址:https://www.cnblogs.com/qq690775749/p/14054319.html
Copyright © 2020-2023  润新知