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("*********************一年级小朋友好!********************************\n");
		printf("系统将随机生成你希望数量的口算式,如果您会做,则输入y,输入结果。\n");
		printf("**如果您不想做,输入n退回主菜单。\n");
		printf("***************************************************************\n");
		printf("是否继续答题y/n:");
		char ch;
		scanf("\n%c", &ch);
		if (ch == 'n')//返回主菜单
		{
			Sleep(500);
			OperateMenu();
			return;
		}
		else//选择答题
		{	
			printf("输入你想回答的题目数量:");
			scanf("%d", &num);
			do
			{	
				i++;
				printf("是否继续答题,是则输入y,否则输入n:");
				scanf("\n%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=?\n", 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,再来一题吧。\n",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或某一函数中
  • 独立功能代码块、重复功能代码块、各种异常情况要单独封装函数处理,让程序的扩展性更强
posted @ 2020-11-30 19:38  山无垢山城  阅读(128)  评论(1编辑  收藏  举报