1.static是存储类型的关键字
2.static修饰的变量,存储在静态区,是独立于所在函数而存在
3.函数的局部变量的生命周期会随着所在函数开始而开始,函数的结束而停止。而静态变量不隶属于任何一个函数,也不属于主函数
4.静态变量的生命周期:在编译阶段分配内存空间,到整个程序结束而结束
5.静态变量分为:静态局部变量和静态全局变量
6.静态局部变量:就是定义在函数体内的静态变量,虽然在该函数内定义出来,但是并不隶属于该函数,生命周期与该函数无关。但是,整个程序中,只能被所在的函数使用
7.静态全局变量:定义在函数体外部的静态变量,该变量只能在当前文件使用,其他文件无权使用
#include<stdio.h>
int num = 520; //定义一个全局变量
//作用域:从定义开始到整个程序结束
//自定义函数
void func(int m, int n) //m和n是局部变量
//当前函数结束,声明周期结束
{
int value = 0; //局部变量
static int temp = 0; //静态局部变量
//作用域:从程序运行开始,到程序结束为止
value++; //局部变量自增
temp++; //静态局部变量自增
printf("value=%d, temp = %d\n", value, temp);
}
int main(int argc, const char *argv[])
{
int key = 1314; //局部变量
//从定义开始到当前函数结束
//printf("temp = %d\n", temp); //? 不能使用其他函数的局部变量
for(int i=0; i<3; i++) //循环三次
{
func(555,666); //调用函数三次
}
return 0;
}
数组作为函数参数传递
1.数组名是一个地址,作为参数传递时,属于地址传递
2.由于传递的是整个数组位置,那么被调函数中,找到的是主程序中该数组的位置
3.主调函数和被调函数使用的是同一个数组,被调函数对其进行改变,主调函数跟着改变
#include<stdio.h>
//定义添加函数
void add(int arr[], int n) //brr用于接受数组地址, n用于接收数组长度
{
//找到任意一个元素
for(int i=0; i<n; i++)
{
arr[i] += 10;
}
printf("执行成功\n");
}
//定义函数接收数组后,并对其进行升序排序
void up_sort(int arr[], int n)
{
//判断给的数据个数
if(n<=1)
{
printf("操作失败\n");
return ; //强制结束当前函数
}
//执行排序
for(int i=1; i<n; i++) //外层循环控制趟数
{
for(int j=0; j<n-i; j++) //内层循环控制趟数及元素
{
if(arr[j] > arr[j+1]) //大升小降
{
//交换三部曲
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
printf("排序成功\n");
}
//定义输出给定的可变数组
void print_arr(int arr[], int len)
{
printf("目前数组中的元素分别是:");
for(int i=0; i<len; i++)
{
printf("%d\t", arr[i]); //?
}
printf("\n");
}
/******************主程序*******************/
int main(int argc, const char *argv[])
{
int arr[] = {3,8,2,4,6,9,7};
int len = sizeof(arr)/sizeof(arr[0]); //求出数组长度
//调用一个函数,将数组中的每个元素自增10
add(arr, len);
//调用输出函数
print_arr(arr, len);
//调用冒泡排序函数,对该数组进行升序排序
up_sort(arr, len);
//调用输出函数
print_arr(arr, len);
return 0;
}
练习:
1> 主程序中定义一个数组,可以存储10名学生的成绩
2> 定义函数实现完成这10名学生成绩的录入
3> 定义函数完成这10名学生成绩的输出
4> 定义函数输出这10名学生的最高分以及最低分
5> 定义函数完成对这10名学生进行降序排序(选择排序)
#include<stdio.h>
//定义输入函数
void input_score(int score[], int n)
{
for(int i=0; i<n; i++)
{
printf("请输入第%d个学生的成绩:", i+1);
scanf("%d", &score[i]);
}
printf("录入成功\n");
}
//定义输出函数
void output_score(int score[], int n)
{
printf("此时学生成绩分别是:");
for(int i=0; i<n; i++)
{
printf("%d\t", score[i]);
}
printf("输出成功\n");
}
//定义求最值函数
void max_score(int score[], int n)
{
int max= score[0];
int min = score[0];
//遍历任意一个进行比较
for(int i=0; i<n; i++)
{
//进行比较
if(score[i]>=max)
{
max = score[i];
}
if(score[i]<=min)
{
min = score[i];
}
}
printf("最高分为:%d,最低分为:%d\n", max, min);
}
//定义-排序函数
void select_sort_score(int score[], int n)
{
for(int i=0; i<n; i++) //遍历已排序序列
{
int maxi = i; //先把待排序序列的第一个当坐最值
for(int j=i; j<n; j++)
{
//跟待排序序列的数据进行比较
if(score[maxi] <= score[j])
{
maxi = j;
}
}
//判断最值是否为待排序序列第一个
if(maxi != i)
{
int temp = score[maxi];
score[maxi] = score[i];
score[i] = temp;
}
}
printf("排序成功\n");
}
/*******************8主程序********************/
int main(int argc, const char *argv[])
{
int score[10] = {0}; //定义一个成绩数组
//调用函数输入学生成绩
input_score(score, 10);
//调用输出函数
output_score(score, 10);
//调用求最值函数
max_score(score, 10);
//调用排序函数
select_sort_score(score, 10);
//调用输出函数
output_score(score, 10);
return 0;
}
值传递与地址传递
值传递
1.当函数的实参是一个普通变量或者是一个表达式的值时,形式参数对应的类型和实际参数对应的类型一致时,此时为值传递
2.在值传递过程中,形式参数变量的空间与实际变量的空间属于完全不同的空间
3.形式参数的改变不会影响到实际参数的改变
4.传递方式:普通变量、常量。表达式的结果

地址传递
1.当主函数是某个变量的地址时,形参使用能够接受地址的容器进行接收,并且在被调函数中,对地址中的数据进行更改时,此时为地址传递。
2.形式参数:数组名、指针名 实际参数:数组名、变量地址
3、当进行地址传递时,形参数据和实参数据属于一个内存空间,形参对地址中的内容进行更改,实参对应的地址空间中的数据跟着改变

递归函数
#include<stdio.h> void story() { printf("从前有座山,山里有个庙,庙里有个老和尚给小和尚讲故事,故事里说:"); //调用一个故事函数 story(); } int main(int argc, const char *argv[]) { //调用讲故事函数 story(); return 0; }递归分类:
普通递归函数:包括递归出口和递归表达式的递归(执行一定程度后会自动结束)
死递归:没有递归出口的递归函数
递归条件:
递归出口:当递归函数执行到该处后,会自动返回
递归表达式:能够进行更小规模的同等问题的函数自我调用
递归思想:逐层分解到最小单元,再逐层合并到问题解决
求阶乘
#include<stdio.h>
//fun函数实现给定一个整数,求出该整数的阶乘结果
//参数:整数n,返回值值:n!
int fun(int n)
{
if(n==0) //递归出口
{
return 1;
}else
{
return n*fun(n-1); //递归表达式
}
}
int main(int argc, const char *argv[])
{
int num = 0;
printf("请输入num的值:");
scanf("%d", &num);
int res = fun(num); //求n的阶乘
printf("%d的阶乘为:%d\n", num, res);
return 0;
}

作业
1.给定一个幂的底数和指数,求该幂的值 例如:底数为2 指数为3 幂值为8
求x的n次方的值
2. 提示并输入一个数,使用递归的方式输出该数据的每一位
3. 提示并输入斐波那契数量的项数,输出该项数对应的数值
1 1 2 3 5 8 13 21 。。。
4. 老汉赶鸭子问题:
一个老汉,赶着一群鸭子到每个村售卖,每经过一个村庄,卖出剩余鸭子的一半又多一只。这样经过7个村子后,还剩下1只鸭子。使用递归求出该老汉出发时的鸭子数量
5.仿照strcpy原理,手动实现 myStrcpy函数,不能使用库函数
6.仿照strcmp原理,手动实现 myStrcmp函数,不能使用库函数
7. 仿照strcat原理,手动实现 myStrcat函数,不能使用库函数
8. 手动实现 myStratoi函数 :字符串参数包含一个或多个数字,函数把这些数字字符转换为整数,并返回整数值。如果字符串参数包含了非数字字符,函数返回零
输入: "1234" ---> 1234
"he888lloo" ---> 0
9.主程序中提供两个整形数组,分别初始化如下: int arr[] = {2,3,7,6,8,9,4,5,1}; int brr[] = {3,4,10,6,20,1};
定义函数传递这两个数组,并传递一个新数组
函数体内完成求出这两个数组的交集放入新数组中,并在主程序中输出新数组中的数据
上面链接上的 函数 函数小结的选择题完成
11 思维导图
#include <stdio.h>
void fun(char arr[])
{
char brr[128]="";
int k=0;
for (int i=0;arr[i]!='\0';i++)
{
brr[k]=arr[i];
k++;
}
brr[k]='\0';
puts(brr);
printf("%s\n",brr);
}
int main(int argc, const char *argv[])
//实现strcpy功能
{
char arr[128]="";
//定义一个数组存储字符串
printf("请输入一串字符:\n");
gets(arr);
fun(arr);
return 0;
}
#include <stdio.h>
void fun(char crr[],char drr[])
{
int k=0;
for (int i=0;crr[i]!='\0';i++)
{
if (crr[i]==drr[k])
{
k++;
}else
{
printf("no\n");
return;
}
}printf("yes\n");
}
int main(int argc, const char *argv[])
{
//比较两个字符串的大小
char arr[128];
char brr[128];
printf("请输入两个字符串:");
gets(arr);
gets(brr);
//比较大小
fun(arr,brr);
return 0;
}
#include <stdio.h>
void fun(char crr[],char drr[])
{
int k=0;
//用来计数
char x[128]="";
//定义一个空字符数组用来存储
for (int i=0;crr[i]!='\0';i++)
{
x[k]=crr[i];
k++;
}for (int i=0;drr[i]!='\0';i++)
{
x[k]=drr[i];
k++;
}
printf("%s",x);
}
int main(int argc, const char *argv[])
{
//实现字符串的连接
char arr[128]="";
char brr[128]="";
printf("请输入两个字符串:");
gets(arr);
gets(brr);
fun(arr,brr);
return 0;
}
#include <stdio.h>
int fuc(char arr[])
{
int count=0;
int num=0;
int sum=0;
//用来计数
//定义一个数组存储纯数字的情况
for (int i=0;arr[i]!='\0';i++)
{
if(arr[i]<'0'||arr[i]>'9')
{
return 0;
}count++;
}for (int i=count-1;i>=0;i--)
{
num=arr[i]-'0';
for (int j=1;j<count-i;j++)
{
num*=10;
}
sum=num+sum;
}return sum;
}
int main(int argc, const char *argv[])
{
//手动实现mystratoi函数
char arr[128]="";
//定义一个数组承接返回值
printf("请输入一个字符串\n");
gets(arr);
int ret=fuc(arr);
printf("%d\n",ret);
return 0;
}
#include <stdio.h>
int fun(int n)
{
if(n==0)
{
return 1;
}else
{
return 2*(fun(n-1)+1);
}
}
int main(int argc, const char *argv[])
{
int num;
printf("请输入老汉经过几个村庄:");
scanf("%d",&num);
int ret = fun(num);
printf("一共有%d只鸭子\n",ret);
return 0;
}
#include <stdio.h>
int fun(int n)
{
if(n==1||n==2)
{
return 1;
}
else
{
return fun(n-1)+fun(n-2);
}
}
int main(int argc, const char *argv[])
{
//斐波那契数列
int num;
printf("请输入项数:");
scanf("%d",&num);
for (int i=1;i<=num;i++)
{
int ret=fun(i);
printf("第%d项是%d\n",i,ret);
}
putchar("10");
return 0;
}
#include <stdio.h>
void fun(int n)
{
if(n<10)
{
printf("%d",n%10);
}else{
printf("%d",n%10);
fun(n/10);
}
}
int main(int argc, const char *argv[])
{
//提示输入一个数,使用递归方式输出数据的每一项
int num;
printf("请输入一个数:");
scanf("%d",&num);
fun(num);
return 0;
}
#include <stdio.h>
int fun(int x,int y)
{
if(y==0)
{
return 1;
}else
{
y--;
return x*fun(x,y);
}
}
int main(int argc, const char *argv[])
{
int a,b;
printf("请输入底数和指数:");
scanf("%d%d",&a,&b);
int ret=fun(a,b);
printf("幂值为:%d",ret);
return 0;
}

1402

被折叠的 条评论
为什么被折叠?



