day14 静态变量

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};

定义函数传递这两个数组,并传递一个新数组

函数体内完成求出这两个数组的交集放入新数组中,并在主程序中输出新数组中的数据

10.0-C基础知识 答案 · 华清远见工作空间

上面链接上的 函数 函数小结的选择题完成

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;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值