C语言博客作业03--函数
0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
1.c语言中函数的分类:
1.库函数
比如:
strcpy
Char strcpy(char* destination,const char* source);
Printf
Int printf (const char* format,…);
Memset
Memset(void* ptr,int value,size_t num);
*2.自定义函数
函数组成:
type name(paral)
{
Statement;//语句项
}
type 返回类型
name 函数名
Paral 函数参数
2.函数的声明和定义
*1.函数声明:
告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,无关紧要。
函数的声明一般出现在函数的使用之前。要满足先声明后使用。
函数的声明一般要放在头文件中的。
*2.函数定义:
函数的定义是指函数的具体实现,交待函数的功能实现。
头文件:#include <stdio.h>
include<time.h>
include <stdlib.h>
include<math.h>
void ListMenu1(int n);
void GetChoise();
3.函数的参数
*1.实际参数
真实传给函数的参数,实参可以是:常量,变量,表达式,函数等。无论参数是何种类型,都必须有真实确定的值。
*2.形式参数
函数名括号后的变量,形参只有在函数调用的时候才实例化,当函数调用完成就销毁了。
区别
*一、函数中使用:
形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。
实参出现在主调函数中,进入被调函数后,实参变量也不能使用。
*二、调用
形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。
//求最大公约数
#include <stdio.h>
int gcd( int x, int y );
int main()
{
int x, y;
scanf("%d %d", &x, &y);
printf("%d\n", gcd(x, y));
return 0;
}
int gcd( int x, int y )
{
int i;
for(i=x;i>=1;i--){
if(x%i==0&&y%i==0)
break;
}
return i;
}
4.全局变量和 局部变量
*局部变量:“在函数内定义的变量”,即在一个函数内部定义的变量,只在本函数范围内有效。
*全局变量:“在函数外定义的变量”,即从定义变量的位置到本源文件结束都有效。
局部变量的有效适用范围被局限于所在函数内,因此主调函数只有通过参数传递,才能把实参数据传递给函数使用;同样,形参的改变也不会影响到实参变量。这种变量的有效使用范围,最大程度确保了
各函数之间的独立性,避免函数之间相互干扰。
全局变量:当一些变量需要被多个函数共同使用时。参数传递虽然是一个办法,但必须通过函数调用才能实现,并且函数只能返回一个结果,这会是程序设计受到很大限制。为了解决多个函数之间的变量
共用,因此定义了全局变量
(由于全局变量和局部变量的作用范围不同,因此允许他们同名,当在同一函数中同名时,全局变量不起作用而由局部变量起作用)
#include<stdio.h>
int i;
void mysub();
void main()
{
int j = 5;
i = 50;
mysub(j);
printf("i = %d\t%d\n", i, j);
}
void mysub(int j)
{
i += 80;
j += 100;
}
静态局部变量
*静态局部变量存放在静态储存区不会像普通局部变量一样因函数调用结束而被系统回收,他的生存周期会持续到程序结束。由于储存单元被保留,一旦含有静态局部变量的函数被再次调用,则静态局部变量会被再次激活,上一次函数调用的值仍然保存着。
定义格式
static 类型名 变量表
(静态变量赋初值只在函数第一次调用时起作用,若没有赋初值,系统将自动赋零)
#include <stdio.h>
void f();
void main()
{
int i;
for(i=1;i<=5;i++)
f();
}
void f()
{
static int j = 0;
++j;
printf("%d\n", j);
}
1.2 本章学习体会及代码量学习体会
1.2.1 学习体会
从学习了函数这一章节开始,老师就一直给我们强调函数的重要性,即我们之后的很多代码都要通过函数来完成,并且比较复杂的代码通过函数的方式也比较容易差错甚至更好的拓展,思路也会更加清晰,但是我总是觉得不习惯,可能一部分原因时代码量不够吧,我还是会倾向于把代码从头打到尾,但是做了一些pta题集里的题目,现在的观点也有一些改善,其实,函数还是有很多妙用的,像参数的传递,函数的嵌套,感觉是可以非常巧妙的把繁琐的代码简化,更快的打到目的。尤其是在复杂的程序里,重复的函数是可以通过一句函数调用来解决的。
1.2.2 代码累计
2.综合作业
2.本次作业的函数关系图
3.函数功能及全局变量介绍
count统计做对的题目个数,便于最后计算正确率
a,b分别作为随机数生成不同的数字分别满足一二三年纪的需求
3.2.ListMenu()函数
选择年级
选择一年级后口算的题目类型
选择二年级后口算的题目类型
选择三年级后口算的题目类型
3.3GetOneExpression1~5()
2.
3.
4.
5.
选择一年级后五种题目选项,选择一种进入其中一个函数
3.4GetOneExpression6~11()
7.
8.
9.
10.
11.
选择二年级后六种题目选项,选择一种进入其中一个函数
3.5GetOneExpression12~16()
13.
14.
15.
16.
选择三年级后六种题目选项,选择一种进入其中一个函数
3.5Cheer()
答对之后随机输出鼓励的话
答错之后随机输出鼓励的话
4.运行结果截图,测试用例
一年级:整十数加一位数的加法,整十数减整十数的减法,两位数减整十数的减法,10以内三个数连加,100以内连加连减混合运算等
二年级:1-9以内的表内乘除法,整十数加整十数的加法(进位的),尾数是0三位数加法(和在一千以内的),整百数加减法(和超过一千的,退位的),10以内除法加法混合运算,有余数的除法等
三年级:三位数加三位数的加法(含连续进位的),一位数乘一位、二位、三位数,整十数乘整十数,一位数的四则运算:6÷3+8=?,两位数除以一位数(有余数),万以内的加减法等等
5. 调试碰到问题及解决办法
1.当写到三个数字混合运算时,进行判断时发生了错误,我是用op字符变量直接代替了运算符号,结果出现错误,最后还是在生成随机符号后面直接跟上判断并用number先储存好计算结果,最后在进行判断
2.当进行到除法运算时,有时会提示发生错误,是因为随机数的生成使除数有可能为0 因此使程序发生错误,我对此加上了一个判断判断是否为0是则将i的值还原,并且跳过本次循环
6.大作业总结
像很多同学一样,刚听到要打出一段复杂的程序时内心时焦虑的,不知道从何下手,因为整个相对来说比较复杂,且要调用比较多的函数,这就很使思路 混乱,但老师博客作业的其中一个要求引起了我的注意。就是思维导图的编写,看了范例之后,我便发现,其实思维导图可以很快的帮我们理清思路,并且可以一个一个的去实践,而不用担心你会忘了下一步该做什么,相当于把一个大致的框架先理好,再把框架具体化,这样的思考量也会减少,也不用担心思路短路的问题,对于我自己来说其实对函数的应用还不是那么的自然,还是喜欢直接写代码,不调用新的函数,但这次大作业过后,我对复杂的程序要用函数表示深深的赞同,因为如果你不用,你可能会倒在电脑前····这次大作业让我对函数的理解加深了很多,希望再接再厉。