zoukankan      html  css  js  c++  java
  • C博客作业03--函数

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

    0.展示PTA总分

    1.0本章学习总结

    1.1 函数定义、调用、声明

    1.函数的定义

    函数是一个完成特定工作的独立程序模块,包括库函数和自定义函数两种。比如scanf()、printf()等为库函数,由C语言系统提供定义,编程时直接调用即可;而某些需要用户自己定义,属于自定义函数。

    函数定义的一般形式为:

    函数类型 函数名(形式参数表)/*函数首部*/  //形参表不能写成 double x,y;函数首部后面不能加分号
    {
    函数实现过程  /*函数体*/  //用于计算、完成特定工作,并用return返回运算的结果
    }
    

    2.函数的调用

    函数调用的一般形式为:

    函数名(实际参数表)
    

    函数的形参必须是变量,用于接收实参传递过来的值;而实参可以是常量、变量或表达式,其作用是把常量、变量、或表达式的值传递给形参。
    参数的传递是单向的,只允许实参把值复制给形参,形参的值即使在函数中改变了,也不会反过来影响实参。

    3.函数原型声明

    如果自定义函数放在主调函数后面,需要在函数调用前加上函数原型声明。

    函数声明的一般格式为:

    函数类型 函数名(参数表);//函数声明是一条C语句,要加分号
    

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

    1.全局变量

    定义在函数外面而不属于任何函数的变量称为全局变量。作用范围是从函数定义到程序所在文件的结束,他对作用范围内所有的函数都起作用。
    一般吧全局变量定义在程序的最前面且可以和局部变量同名

    2.局部变量

    定义在函数内部的变量称为局部变量
    

    3.静态局部变量

    静态变量定义格式:

                static 类型名 变量表
    

    静态变量赋初值只在函数第一次调用时起作用,若没有赋初值,系统将自动赋0,静态变量只能用于所定义函数,而不能用于其他函数。

    1.3 C数据类型及注意点

    • 基本数据类型:

    • 强转类型转换:
      使用强制类型转换运算符可以将一个表达式转换成给定的类型,一般形式是:

        (类型名)  表达式;
    

    强制转换是运算符不是函数,(int)x不能写成int(x)

    1.4 C运算符

    • 算数运算符
      用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。
    • 关系运算符
      用于比较运算。包括大于(>)、小于(<)、等于(==)、 大于等于(>=)、小于等于(<=)和不等于(!=)六种。
    • 逻辑运算符
      用于逻辑运算。包括与(&&)、或(||)、非(!)三种。
    • 位操作运算符
      参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。
    • 赋值运算符
      用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。
    • 指针运算符
      用于取内容(*)和取地址(&)二种运算。
    • 求字节数运算符
      用于计算数据类型所占的字节数(sizeof)。
    • 特殊运算符
      有括号(),下标[],成员(→,.)等几种。
    • 双目运算符

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

    2.1.模块流程图

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

    void OperateMenu();//游戏操作界面 
    void GradeOneMenu();//一年级
    void GradeTwoMenu();//二年级
    void GradeThreeMenu();//三年级
    int GetValue(int grade);//生成随机操作数函数
    char GetSign(int grade);//生成随机运算符函数
    

    2.2.1.全局变量

    2.2.2 菜单相关函数

      #include<stdio.h>
      #include<windows.h>
      #include<stdlib.h>
      #include<time.h>
    
    void OperateMenu();//游戏操作界面
    void GradeOneMenu();//一年级
    int GetValue(int grade);
    int GetSign(int grade);
    int main(void)
    {
    	OperateMenu();//游戏操作界面	
    	return 0;
    }
    void OperateMenu()//游戏操作界面
    {
    	char option;
    	int i;
    	int temp;
    	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':
    			break;
    		case '3':
    			break;
    		case '4':
    			printf("
    谢谢您的参与!
    ");
    			Sleep(500);
    			exit(0);
    		default:
    			printf("您输入不对,只能输入1,2,3,4,请重输!
    ");
    			Sleep(500);
    		}
    	} while (!(option >= '1' && option <= '4'));
    }
    

    2.2.2 出题相关函数

    void GradeOneMenu()//一年级
    {
    	while (1)
    	{
    		system("cls");
    		printf("*********************一年级小朋友好!********************************
    ");
    		printf("系统将随机生成一个口算式,如果您会做,则输入y,输入结果。
    ");
    		printf("**如果您不想做,输入n退回主菜单。
    ");
    		printf("***************************************************************
    ");
    
    		printf("是否继续答题y/n:");
    		char ch;
    		scanf("
    %c", &ch);
    		if (ch == 'n')
    		{
    			Sleep(500);
    			OperateMenu();
    			return;//退回主菜单
    		}
    		else//选择答题
    		{
    			/*答题模块*/
    			printf("输入你想做的题数:");
    			int cnt;//要做的题目数量
    			int i;
    			double rightPercentage;//正确率
    			int value1, value2;
    			char sign;
    			int answer, realAnswer;
    			int rightcnt = 0;
    			int temp;
    
    			scanf("%d", &cnt);
    			for (i = 1; i <= cnt; i++)//连续输出算式
    			{
    				value1 = GetValue(1);//1.生成操作数函数
    				value2 = GetValue(1);
    				sign = GetSign(1);//2.生成随机运算符函数
    
    				if (value1 < value2)
    				{
                                       temp = value1;value1 = value2;value2 = temp;
    				}
    				printf("%d%c%d= ", value1, sign, value2);//4.生成表达式
    				scanf("%d", &answer);
    				switch (sign)
    				{
    				case '+': realAnswer = value1 + value2;//计算正确答案
    				case '-': realAnswer = value2 - value2;
    				}
    				if (realAnswer == answer)//判断用户的计算结果
    				{
    					rightcnt++;//正确题目数量
    					printf("算对了!");
    				}
    				else
    				{
    					printf("算错了-_- 答案是:%d", realAnswer);//用户算错时输出正确答案
    				}
                                         
    		                	printf("
    ");
    				        Sleep(2000);
    			}
               
                      rightPercentage=rightcnt*1.0/count;
                      Printf("你的正确率是:%.0lf",rightPercentage);
                      Sleep(1000);
    			}
    			
    		}
    	}
    
    }
    
    void GradeTwoMenu()//二年级
    {
    	while (1)
    	{
    		system("cls");
    		printf("*********************一年级小朋友好!********************************
    ");
    		printf("系统将随机生成一个口算式,如果您会做,则输入y,输入结果。
    ");
    		printf("**如果您不想做,输入n退回主菜单。
    ");
    		printf("***************************************************************
    ");
    
    		printf("是否继续答题y/n:");
    		char ch;
    		scanf("
    %c", &ch);
    		if (ch == 'n')
    		{
    			Sleep(500);
    			OperateMenu();
    			return;//退回主菜单
    		}
    		else//选择答题
    		{
    			/*答题模块*/
    			printf("输入你想做的题数:");
    			int cnt;//要做的题目数量
    			int i;
    			double rightPercentage;//正确率
    			int value1, value2;
    			char sign;
    			int answer, realAnswer;
    			int rightcnt = 0;
    			int temp;
    
    			scanf("%d", &cnt);
    			for (i = 1; i <= cnt; i++)//连续输出算式
    			{
    				
    				sign = GetSign(1);//2.生成随机运算符函数
                                    if (sign == '*')
    				{
    					value1 = GetValue(1);
    					value= GetValue(1);
    				}
    				else if (sign == '/')
    				{
    					value2 = GetValue(1);
    					value1 = GetValue(1) * value2;
    				}
    				else
    				{
    				       value1 = GetValue(2);
    					value2 = GetValue(2);
    				}
    				if (value1 < value2)
    				{
    					temp = value1;value1 = value2;value2 = temp;
    				}
    				
    				printf("%d%c%d= ", value1, sign, value2);//4.生成表达式
    				scanf("%d", &answer);
    				switch (sign)
    				{
    				case '+': realAnswer = value1 + value2; break;
    				case '-': realAnswer = value2 - value2; break;
    				case '*': realAnswer = value1 * value2; break;
    				case '/': realAnswer = value1 / value2; break;
    				}
    				if (realAnswer == answer)
    				{
    					rightcnt++;
    					printf("算对了!");
    				}
    				else
    				{
    					printf("算错了-_- 答案是:%d", realAnswer);
    				}
    			
    		                	printf("
    ");
    				        Sleep(2000);
    			}
                      rightPercentage=rightcnt*1.0/count;
                      Printf("你的正确率是:%.0lf",rightPercentage);
                      Sleep(1000);
    		}
    	}
    
    }
    
    
    void GradeThreeMenu();//三年级
    void GradeThreeMenu()//三年级
    {
    	while (1)
    	{
    		system("cls");
    		printf("*********************一年级小朋友好!********************************
    ");
    		printf("系统将随机生成一个口算式,如果您会做,则输入y,输入结果。
    ");
    		printf("**如果您不想做,输入n退回主菜单。
    ");
    		printf("***************************************************************
    ");
    
    		printf("是否继续答题y/n:");
    		char ch;
    		scanf("
    %c", &ch);
    		if (ch == 'n')
    		{
    			Sleep(500);
    			OperateMenu();
    			return;//退回主菜单
    		}
    		else//选择答题
    		{
    			/*答题模块*/
    			printf("输入你想做的题数:");
    			int cnt;//要做的题目数量
    			int i;
    			double rightPercentage;//正确率
    			int value1, value2;
    			char sign;
    			int answer, realAnswer;
    			int rightcnt = 0;
    			int temp;
    
    			scanf("%d", &cnt);
    			for (i = 1; i <= cnt; i++)//连续输出算式
    			{
    				value1 = GetValue(3);//1.生成操作数函数
    				value2 = GetValue(3);
    				sign = GetSign(2);//2.生成随机运算符函数
                                    if (sign == '/')
    				{
    					Value2 = Getvalue(3);
    					Value1 = Getvalue(2) * Value2;
    				}
    				else
    				{
    					Value1 = Getvalue(2);
    					Value2 = Getvalue(2);
    				}
    				if (value1 < value2)
    				{ 
                                        temp = value1;value1 = value2;value2 = temp;
    				}
    				printf("%d%c%d= ", value1, sign, value2);//4.生成表达式
    				scanf("%d", &answer);
    				switch (sign)
    				{
    				case '+': realAnswer = value1 + value2; break;
    				case '-': realAnswer = value2 - value2; break;
    				case '*': realAnswer = value1 * value2; break;
    				case '/': realAnswer = value1 / value2; break;
    				}
    				if (realAnswer == answer)
    				{
    					rightcnt++;
    					printf("算对了!");
    				}
    				else
    				{
    					printf("算错了-_- 答案是:%d", realAnswer);
    				}
    			                 printf("
    ");
    				         Sleep(2000);
    			}
                      rightPercentage=rightcnt*1.0/count;
                      Printf("你的正确率是:%.0lf",rightPercentage);
                      Sleep(1000);
    			
    		}
    	}
    
    }
    

    1.先对用户询问是否想继续答题,若不想退到主菜单
    2.让用户输入题目数量然后连续输出算式,因为涉及到减法且一二年级没有学习负数的运算,三年级没有学习小数运算,
    所以当第一个数<第二个数时将二者交换位置以实现在正数范围内的运算
    3.让计算机算出正确答案与用户的答案进行比较,记录答题情况,算错时输出正确答案
    4.题目全部答完后计算正确率

    
    int GetValue(int grade)//1.生成操作数函数
    {
    	int value;
    
    	value = 1 + rand() % 9;//10以内
    	value = 1 + rand() % 99;//两位数以内
    	value = 1 + rand() % 999;//三位数以内
    
    	return value;
    }
    
    
    
    char GetSign(int grade)//2.生成随机运算符函数
    {
    	char sign;
    	int value = 0;
    
    	switch (grade)
    	{
    	case 1:value = rand() % 2; break;//一二年级只做加减运算
    	case 2:value = rand() % 4; break;//三年级四种运算都可以做
    	}
    	switch (value)
    	{
    	case 0:sign = '+'; break;
    	case 1:sign = '-'; break;
    	case 2:sign = '*'; break;
    	case 3:sign = '/'; break;
    	}
    	return sign;
    }
    
    

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

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

    使用随机种子以实现随机数和随机运算符的生成
    用开关语句可以控制四种运算符使代码看起来简洁明了,可读性高

  • 相关阅读:
    CF1117G Recursive Queries
    P6604 [HNOI2016]序列 加强版
    高级图论
    P7708「Wdsr-2.7」八云蓝自动机 Ⅰ
    ISIJ2020 游记
    计算几何笔记 (模板)
    AC自动机学习笔记
    KMP学习笔记
    treap学习笔记
    HolyK学长的杂题选讲
  • 原文地址:https://www.cnblogs.com/chtdeboke/p/14037874.html
Copyright © 2011-2022 走看看