实验11 函数嵌套和递归调用
目录
1:函数的递归调用:在调用一个函数的过程中又出现直接或间接地调用该函数本身
题目1.c:输入4个整数,找出其中最大的数。用函数的嵌套调用来处理。
提高题:一只刚出生的奶牛,4年生1只奶牛,以后每一年生1只。现在给你一只刚出生的奶牛,求20年后有多少奶牛。(腾讯面试题)
题目4.c:编程实现findmax函数,返回一维数组中的最大元素及其下标值和地址值。
题目5.c:调用函数输入一行数据并计算它的长度;输入空行结束程序。
题目5.c: 有一个一维数组,内放10个学生成绩,写一个函数,当主函数调用此函数后,能求出平均分、最高分和最低分。
题目6.c:编写一个函数,把一个char组成的字符串循环右移n位。例如,原来是“abcdefghi”,如果 n=2,移位后应该是“hiabcdefg”。
题目7.c:给定b的值,在主函数中输入a和m,计算a*b,调用power函数计算am。要求main函数和power函数放在不同的文件中。
题目8:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
一:学习目的
1:正确理解函数在C语言程序设计中的作用和地位。
2:理解函数、形参、实参、作用域、生存期的概念。
3:掌握各种函数的定义、原型声明和调用的方法。
二:实验内容提要
1:函数的递归调用:在调用一个函数的过程中又出现直接或间接地调用该函数本身
注意:递归结束条件
2:局部变量和全局变量
- 局部变量
- 在函数内的开头位置定义:只在函数内有效
- 在函数内的复合语句内定义:只在复合语句内有效
- 不同的函数中可以使用同名的变量,它们代表不同的对象,互不干扰
- 全局变量
- 在函数之外定义的变量称为外部变量,外部变量是全局变量(也称全程变量)
- 全局变量可以为本文件中其他函数所共用,通常是为了参数传递或计算结果的返回
- 若局部变量与全局变量同名,则优先使用局部变量
3:变量的存储方式
- 静态存储方式:程序运行期间都存在的固定存储空间
- 全局变量
- 函数中定义的static局部变量
- 动态存储方式:程序运行期间根据需要动态分配存储空间
- 函数形式参数
- 函数中定义的自动变量(普通变量)
4:变量的存储类别
- 局部变量
- auto:默认类别,可省略,自动分配和释放
- static:只分配并赋初值一次,不释放,但不能被其他函数使用
- register:在CPU中的寄存器,存取速度快
- 全局变量
外部变量:extern
三:实验题目
题目1.c:输入4个整数,找出其中最大的数。用函数的嵌套调用来处理。
题目2.c:有5个学生坐在一起
- 问第5个学生多少岁?他说比第4个学生大2岁
- 问第4个学生岁数,他说比第3个学生大2岁
- 问第3个学生,又说比第2个学生大2岁
- 问第2个学生,说比第1个学生大2岁
- 最后问第1个学生,他说是10岁
- 请问第5个学生多大
题目3.c:用递归方法求n!。
提高题:一只刚出生的奶牛,4年生1只奶牛,以后每一年生1只。现在给你一只刚出生的奶牛,求20年后有多少奶牛。(腾讯面试题)
参考程序: C语言奶牛生子的问题(腾讯面试题)_C语言中文网
题目4.c:编程实现findmax函数,返回一维数组中的最大元素及其下标值和地址值。
题目5.c:调用函数输入一行数据并计算它的长度;输入空行结束程序。
题目5.c: 有一个一维数组,内放10个学生成绩,写一个函数,当主函数调用此函数后,能求出平均分、最高分和最低分。
题目6.c:编写一个函数,把一个char组成的字符串循环右移n位。例如,原来是“abcdefghi”,如果 n=2,移位后应该是“hiabcdefg”。
#include <stdio.h>
#include <string.h>
#define MAX_LEN 100
void LoopMove(char *pStr, int steps){
int n = strlen(pStr) - steps;
char tmp[MAX_LEN];
strcpy(tmp, pStr+n); //拷贝字符串
strcpy(tmp+steps, pStr);
*(tmp + strlen(pStr)) = '\0';
strcpy(pStr, tmp); //合并得到结果
}
int main(){
char str[] = "www.coderbbs.com";
LoopMove(str, 3);
printf("%s\n", str);
return 0;
}
题目6.c:若外部变量与局部变量同名,分析结果。
题目7.c:给定b的值,在主函数中输入a和m,计算a*b,调用power函数计算am。要求main函数和power函数放在不同的文件中。
//a1.c
#include<stdio.h>
int A;
int main()
{ int power(int);
int b=3,c,d,m;
printf("enter a and m:\n");
scanf("%d,%d",&A,&m);
c=A*b;
printf("%d*%d=%d\n",A,b,c);
d=power(m);
printf("%d**%d=%d\n",A,m,d);
}
//a2.c
extern A;
int power(int n)
{ int i,y=1;
for(i=1;i<=n;i++)
y*=A;
return y;
}
题目8:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
#include "stdio.h"
main()
{
int i=5;
void palin(int n);
printf("Please enter 5 characters:");
palin(i);
printf("\n");}
void palin(int n)
{
char next;
if(n<=1)
{
next=getchar();
printf("the result is:");
putchar(next);
}else
{
next=getchar();
palin(n-1);
putchar(next);}
}
}
ex题目9:学习static定义静态变量的用法
#include "stdio.h"
varfunc()
{
int var=0;
static int static_var=0;
printf("\40:var equal %d \n",var);
printf("\40:static var equal %d \n",static_var);
printf("\n");
var++;
static_var++;
}
void main()
{
int i;
for(i=0;i<3;i++)
varfunc();
}
ex题目10:比较auto变量和static变量。
#include "stdio.h"
main()
{
int i,num;
num=2;
for (i=0;i<3;i++)
{
printf("\40: The num equal %d \n",num);
num++;
{
auto int num=1; //auto改为static
printf("\40: The internal block num equal %d \n",num);
num++;
}
}
}
附注:实验为博主刚学C语言时候老师布置的作业,发表出来,仅供做题与参考。