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

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

    0.展示PTA总分


    (7.1和7.5未拿满分,7.1明明是正确的但是不给我通过,7.5应该存在编程问题,暂时没找出来)

    1.本章学习总结

    1.1 函数定义、调用、声明

    函数声明:分为有无返回值两种情况:
    1.有返回值时:前面用int float double char 来定义,如int f(int n);
    2.无返回值时:前面用void来写在前面,如void f(int n);

    函数定义
    1.无参函数的定义:如果函数不接收用户传递的数据,那么定义时可以不带参数
    例如,定义一个函数,计算从 1 加到 100 的结果:

    int sum()
    {
        int i, sum=0;
        for(i=1; i<=100; i++)
        {
            sum+=i;
        }
        return sum;
    }
    

    2.有参函数的定义:如果函数需要接收用户传递的数据,那么定义时就要带上参数
    数据通过参数传递到函数内部进行处理,处理完成以后再通过返回值告知函数外部
    例如,计算从 m 加到 n 的结果:

    int sum(int m, int n)
    {
        int i, sum=0;
        for(i=m; i<=n; i++)
        {
            sum+=i;
        }
        return sum;
    }
    

    补充:函数不能嵌套定义

    函数调用:没返回值的函数一般直接调用如:f(n); 有返回值的一般语言定义一个变量如c=f(n);

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

    局部变量:定义在函数内部的变量称为局部变量,它的作用域仅限于函数内部, 离开该函数后就是无效的,再使用就会报错
    例如:

    int f1(int a)
    {
        int b,c;  //a,b,c仅在函数f1()内有效
        return a+b+c;
    }
    int main()
    {
        int m,n;  //m,n仅在函数main()内有效
        return 0;
    }
    

    全局变量:在所有函数外部定义的变量称为全局变量,它的作用域默认是整个程序,也就是所有的源文件,包括 .c 和 .h 文件
    例如:

    int a, b;  //全局变量
    void func1()
    {
        //TODO:
    }
    float x,y;  //全局变量
    int func2()
    {
        //TODO:
    }
    int main()
    {
        //TODO:
        return 0;
    }
    

    静态局部变量:静态局部变量属于静态存储类别,在静态存储区内分配存储单元,静态局部变量在编译时赋初值,即只赋初值一次。
    说明:如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值 0(对 数值型变量)或空字符(对字符变量)

    1.3 C数据类型及注意点

    数据类型
    1.整型变量
    int类型
    取值范围(16位):-32768~32767(-2^15— 2^15-1)
    转换说明:%d

    short int(或简写为short)
    取值范围(16位):-32768~32767(-2^15— 2^15-1)
    转换说明:%d

    -long int(或简写为long)
    取值范围(16位):取值范围(16位)-2147483648~2147483648(-2^31— 2^31-1)
    转换说明:%ld

    unsigned+声明语句表示无符号类型(即非负数)
    转换说明:%u (十进制无符号整数 )l和u能一起用(%lu)

    2.浮点数
    单精度float
    取值范围:10^-37 —10^37
    转换说明:%f

    双精度double
    取值范围:(2^63— 2^63-1)
    转换说明:%f

    注意点

    • 赋值中的类型转换当赋值运算符两边的运算对象类型不同时,将要发生类型转换,转换的规则是:把赋值运算符右侧表达式的类型转换为左侧变量的类型
    • 一般相关的值与值的数据类型应该要相互对应好,这样一般可以避免范围不够造成的程序数据溢出
    • 浮点类型的不能做“模”运算

    1.4 C运算符

    1. 算术运算符
    • 一元运算符:+(正号)、-(负号)、++(增1)、--(减1)
    • 二元运算符:+(求和)、-(求差)、*(求积)、/(求商)、%(求余)
      (一元运算符的优先级一般高于二元运算符)
    1. 赋值运算符
    • 基本赋值 =
    • 复合赋值:+=、-=、*=、/=、%=
    a+=b; 等价于 a=a+b;
    a-=b; 等价于 a=a-b;
    a*=b; 等价于 a=a*b;
    a/=b; 等价于 a=a/b;
    

    (由于赋值运算符的优先级很低,仅高于逗号运算符,故最后做赋值操作)

    1. 逻辑运算符
    • 一元:!(逻辑非)
    • 二元:&&(逻辑与)、||(逻辑或)
    1. 关系运算符
    • 二元:>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、==(等于)和 !=(不等于)
      (在以上 6 种关系运算符中,前 4 个的优先级高于最后两个)

    总结
    算术、逻辑、关系、赋值运算符的优先级顺序为:
    逻辑非 !>算术>关系>逻辑与&&、逻辑或||>赋值=

    学习体会

    • 函数容易理解但不容易应用,需要进行较多的练习
    • 数据类型是比较基础的东西,需要熟记并灵活运用
    • 运算符要分清含义和优先级,要做到能准确的使用

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

    2.1 板块流程图

    各年级模块流程图

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

    2.2.1 全局变量

    int num;//题目数量
    int digital1;//随机数1
    int digital2;//随机数2
    int operators;//随机运算符
    int right;//正确答案
    int answer;//操作者回答
    int temp;//交换数字储存
    int reckon = 0;//答对次数
    int i = 0;//循环次数
    char ch;//判断是否继续答题
    double accuracy;//正确率
    

    2.2.2 菜单相关函数

    void GradeOneMenu();//一年级界面
    
    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("输入你想回答的题目数量:");
    			scanf("%d", &num);
    			do
    			{	
    				i++;
    				printf("是否继续答题,是则输入y,否则输入n:");
    				scanf("
    %c", &ch);
    				if (ch == 'n')
    				{
    					break;
    				}
    				else
    				{
    					srand((unsigned)time(NULL));
    					digital1 = Random_Numbers(1);
    					digital2 = Random_Numbers(1);
    					operators = Random_Operators(1);
    					if (operators == '-' && digital2 > digital1)
    					{
    						digital1 = temp;
    						digital1 = digital2;
    						digital2 = temp;
    					}
    					printf("%d%c%d=?
    ", digital1, operators, digital2);
    					scanf("%d", &answer);
    					switch (operators)
    					{
    					case '+':right = digital1 + digital2; break;
    					case '-':right = digital1 - digital2; break;
    					case '*':right = digital1 * digital2; break;
    					case '/':right = digital1 / digital2; break;
    					}
    					if (right == answer)
    					{
    						printf("恭喜你回答正确!");
    						reckon++;
    					}
    					else
    					{
    						printf("你答错了真可惜,正确答案是:%d,再来一题吧。
    ",right);
    					}
    				}
    			} while (i < num);
    		accuracy = 1.0*reckon / num;
    		printf("你的正确率是:%.2f", accuracy);
    		Sleep(2500);
    		}
    	}
    }
    

    2.2.3 出题相关函数

    int Random_Numbers(int grade);//生成随机数
    
    int Random_Numbers(int grade)//生成随机数
    {
    	int digital;
    	if (grade == 1)
    	{
    		digital = 1 + rand() % 9;//生成十以内随机数
    	}
    	if (grade == 2)
    	{
    		digital = 1 + rand() % 99;//生成一百以内随机数
    	}
    	if (grade == 3)
    	{
    		digital = 1 + rand() % 999;//生成一千以内随机数
    	}
    	return  digital;
    }
    
    char Random_Operators(int grade);//生成随机运算符
    
    char Random_Operators(int grade)//生成随机运算符
    {
    	char operators;
    	int digital;
    	if(grade == 1)
    	{
    		digital = 1 + rand() % 1;//生成1到2
    	}
    	else
    	{
    		digital = 1 + rand() % 3;//生成1到4
    	}
    
    	switch (digital)
    	{
    	case 1:operators = '+'; break;
    	case 2:operators = '-'; break;
    	case 3:operators = '*'; break;
    	case 4:operators = '/'; break;
    	}
    	return operators;
    }
    

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

    一年级

    二年级

    三年级

    2.4 大作业中编程技巧总结

    • 在编程之前如果操作比较复杂有必要先设计一个流程图,用流程图来整理清楚整个流程
    • 对照流程图编程时,要学会运用函数分装,不要都写在main或某一函数中
    • 独立功能代码块、重复功能代码块、各种异常情况要单独封装函数处理,让程序的扩展性更强
  • 相关阅读:
    关于区间 $mex$ 的几种做法
    Selenium+TestNG+Maven+Jenkins+SVN(转载)
    Selenium+Java的TestNG测试报告优化
    使用Log4J收集日志
    Selenium+TestNG+Maven(2)
    自动化测试用例设计实例
    自动化测试用例的编写规则
    selenium 总结篇,常见方法和页面元素的操作
    Selenium Webdriver元素定位的八种常用方式(转载)
    selenium+java利用AutoIT实现文件上传
  • 原文地址:https://www.cnblogs.com/miao-witch/p/14057410.html
Copyright © 2011-2022 走看看