C语言(谭浩强版本,主讲人:小甲鱼)P32-P40

本文通过多个示例展示了C语言中函数的应用,包括计算两个数的最大值、阶乘、汉诺塔问题、字符计数等。还探讨了递归在计算阶乘中的实现,并对比了普通循环计算阶乘的方法。此外,涉及到了全局变量、局部变量、静态变量的概念以及它们在函数调用中的作用。
摘要由CSDN通过智能技术生成

函数在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

#include<stdio.h>
int main()
{
	int a,b,z;
	int aa(int a, int b);//对aa函数进行声明(形参)
	printf("请输入两个整数:");
	scanf("%d %d", &a, &b);
	z=aa(a,b);//给aa函数传递数据并调用aa函数(实参)
	printf("max:%d", z);
	return 0;

}
int aa(int a, int b)//形参
{
	int max;
	max = a > b ? a : b;
	return max;//返回结果把结果赋值给c
}
//请输入两个整数:23 124
//max : 124

在这里插入图片描述

#include<stdio.h>
int main()
{
	void a();//对a函数进行声明
	void b();//对b函数进行声明
	a();//调用a函数
	b();//调用b函数
	return 0;
}
void a()
{
	printf("我是A\n");
}
void b()
{
	printf("我是B\n");
}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<stdio.h>
int main()
{
	int a,b,z;
	int max(int a, int b);//对aa函数进行声明(形参)
	printf("请输入两个整数:");
	scanf("%d %d", &a, &b);
	z=aa(a,b);//给aa函数传递数据并调用aa函数(实参)
	printf("max:%d", z);
	return 0;

}
int max(int a, int b)//形参
{
	int c;
	c= a > b ? a : b;
	return c;//返回结果把结果赋值给z
}
//请输入两个整数:5 2
//max : 5

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<stdio.h>
main()//自动转换成int main
{

}

在这里插入图片描述

#include<stdio.h>
int main()
{
	float a, b;
	float c;
	float max(float a, float b);
	printf("请输入两个数:");
	scanf("%f %f", &a, &b);
	c = max(a, b);//调用a函数
	printf("max:%.3f", c);
	return 0;

}
float max(float a, float b)
{
	float z;
	z = a > b ? a : b;
	return z;
}
//请输入两个数:3.4 14.23
//max : 14.230

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<stdio.h>
int main()
{
	int f(int a, int b);
	int i =2, p;
	p = f(i, ++i);//自右向左的顺序求实参的值,f(3,3);
	printf("%d\n", p);
	return 0;

}
int f(int a, int b)
{
	int c;
	if (a > b)
	{
		c = 1;
	}
	else if (a == b)
	{
		c = 0;
	}
	else
	{
		c = -1;
	}
	return c;
}
//0

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<stdio.h>
int main()
{
	int f(int a, int b);//对f函数进行声明
}
int f(int a, int b)
{
}

在这里插入图片描述

#include<stdio.h>
#include<math.h>
int main()
{
	double x = 2.0;
	double y = 3.0;
	printf("%lf\n", pow(x, y));
	return 0;
}
//8.000000
#include<stdio.h>
int main()
{
	double power(double a, double b);
	double x = 2.0 ,y = 3.0;
	double result;
	result = power(x, y);
	printf("%lf", result);
	return 0;
}
double power(double a, double b)
{
	double z;
	double sum = a;
	for (int i = 1; i <(int)b; i++)
	{
		z = sum * a;
		sum = z;
	}
	//while(--b)
	//{
	//	z = sum * a;
	//	sum = z;
	//}
	return sum;
}
//8.000000

在这里插入图片描述

#include<stdio.h>
#include<math.h>
int main()
{
	double x = 4.0;
	double result;
	result = sqrt(x);//计算平方根
	printf("%lf", result);
}
//2.000000
#include<stdio.h>
int main()
{
	int sqrt(int b);
	int x, y;
	printf("请输入一个整数:");
	scanf("%d", &x);
	y = sqrt(x);
	if (y < 0)
	{
		printf("输入错误\n");
	}
	else
	{
		printf("%d的平方根为:%d\n", x, y);
	}
}
int sqrt(int b)
{
	int temp = b / 2;
	while (temp-->0)
	{
		if (temp * temp == b)
		{
			return temp;
		}
	}
	return -1;
}
//请输入一个整数:9
//9的平方根为 : 3

在这里插入图片描述

#include<stdio.h>
int main()
{
	int c, nb, nt, nl, na, nc,nA;
	nb = 0, nt = 0, nl = 0, na = 0, nc = 0, nA=0;
	while ((c = getchar()) != EOF)
	{
		if (c == ' ')
		{
			nb++;
		}
		if (c == '\t')
		{
			nt++;
		}
		if (c == '\n')
		{
			nl++;
		}
		if (c >= 'a' && c <= 'z')
		{
			na++;
		}
		if (c >= 'A' && c <= 'Z')
		{
			nA++;
		}
		if (c >= '1' && c <= '9')
		{
			nc++;
		}
	}
	printf("空格有%d个\n制表符有%d个\n换行符有%d个\n小写字母有%d个\n大写字母有%d个\n数字有%d个\n", nb, nt, nl,na, nA,nc);
}
//abc ABC 123
//
//
//空格有2个
//制表符有2个
//换行符有3个
//小写字母有3个
//大写字母有3个
//数字有3个

在这里插入图片描述

#include<stdio.h>
int main()
{
	int a();
	a();
	return 0;
}
int a()
{
	printf("我是a函数\n");
	int b();
	b();
	return 0;
}
int b()
{
	printf("我是b函数\n");
	return 0;
}
//我是a函数
//我是b函数

在这里插入图片描述

#include<stdio.h>
int main()
{
	int first(int x, int y);
	int a = 2;
	int b = 3;
	int result;
	result=first(a, b);
	printf("结果为:%d\n", result);
}
int first(int x, int y)
{
	int s = x * x;
	int z = y * y;
	int result;
	int second(int x, int y);
	result =second(s, z);
	return result;
}
int second(int x, int y)
{
	int result;
	int sum,num=1;
	for (int i = x; i >= 1; i--)
	{
		sum = num * i;
		num = sum;
	}
	int sums = 1;
	for (int i = 1; i <= y; i++)
	{
		sums = sums * i;
	}
	result = sum + sums;
	return result;
}
//结果为:362904

在这里插入图片描述
在这里插入图片描述

使用递归程序
在这里插入图片描述

#include<stdio.h>
int main()
{
	int recursion(int n);
	int a,result;
	printf("请输入一个整形:");
	scanf("%d", &a);
	result = recursion(a);
	printf("%d的阶乘为:%d\n",a,result);
}
int recursion(int n)
{
	int temp;
	if (n < 0)
	{
		printf("输入错误\n");
	}
	else if (n==0||n==1)//退出程序条件
	{
		temp = 1;
	}
	else
	{
		temp = recursion(n - 1) * n;
	}
	return temp;
}
//请输入一个整形:4
//4的阶乘为 : 24

在这里插入图片描述
在这里插入图片描述

使用普通程序

#include<stdio.h>
int main()
{
	int a=4;
	int c=1;
	for (int i = 1; i <=a; i++)
	{
		c *= i;
	}
	printf("%d的阶乘为:%d", a,c);
}
//4的阶乘为 : 24

在这里插入图片描述

#include<stdio.h>
int main()
{
	void hanoi(int n, char one, char two, char three);
	int m;
	printf("请输入盘子的数量:");
	scanf("%d", &m);
	hanoi(m, 'A', 'B', 'C');
}
void hanoi(int n,char one,char two,char three)
{
	void move(char x, char y);
	if (n==1) // 退出程序条件
	{
		move(one, three);
	}
	else
	{
		hanoi(n - 1, one, three, two);
		move( one, three);
		hanoi(n - 1, two, one, three);
	}
}
void move(char x, char y)
{
	printf("%c-->%c\n", x, y);;
}
//请输入盘子的数量:3
//A-- > C
//A-- > B
//C-- > B
//A-- > C
//B-- > A
//B-- > C
//A-- > C

在这里插入图片描述
在这里插入图片描述

#include<stdio.h>
void main()
{
	void test(int v);
	int a[10] = { 1,2,3,4,-1,-2,-3,-4,2,3 };
	for (int i = 0; i < 10; i++)
	{
		test(a[i]);
	}
}
void test(int v)
{
	if (v > 0)
	{
		printf("%d\n", v);
	}
	else
	{
		printf("0\n");
	}
}
//1
//2
//3
//4
//0
//0
//0
//0
//2
//3

在这里插入图片描述

#include<stdio.h>
void main()
{
	void test(int b[10]);
	int a[10] = { 1,2,3,4,-1,-2,-3,-4,2,3 };
	test(a);
}
void test(int b[10])
{
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", b[i]);
	}
}
//1 2 3 4 - 1 - 2 - 3 - 4 2 3

在这里插入图片描述

#include<stdio.h>
void main()
{
	double score[10] = { 87.5,78,97.5,67,84,91,76.5,65,58,68 };
	double result;
	double average(double a[10]);
	//double average(double a[]);
	result=average(score);
	printf("平均数为:%.2lf", result/10);
}
double average(double a[10])
//double average(double a[])
{
	double result=0;
	for (int i = 0; i < 10; i++)
	{
		result = result + a[i];
	}
	return result;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
复合语句

#include<stdio.h>
int main()
{
	int a=3,b=4;
	if(a<b)
	{
		int max=b;//复合语句也可以定义变量
	}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<stdio.h>
int s1, s2, s3;//全局变量
void main()
{
	int vs(int a, int b, int c);
	int l, w, h, v;
	printf("请分别输入正方体的长宽高:");
	scanf("%d %d %d", &l, &w, &h);
	v = vs(l,w,h);
	printf("正方体的体积为:%d,s1:%d,s2:%d,s3:%d", v,s1,s2,s3);
}
int vs(int a,int b,int c)
{
	int v;//局部变量
	v = a * b * c;
	s1 = a * b;
	s2 = b * c;
	s3 = a * c;
	return v;
}
//请分别输入正方体的长宽高:2 3 4
//正方体的体积为 : 24, s1 : 6, s2 : 12, s3 : 8

在这里插入图片描述

#include<stdio.h>
double max,min;
void main()
{
    double score[10],a;
    printf("请输入10位学生的分数:");
    for (int i = 0; i < 10; i++)
    {
        scanf("%lf", &a);
        score[i] = a;
    }
    double avg(double a[10]);
    double result;
    result = avg(score);
    printf("平均分为:%.2lf\n", result / 10);
    printf("最高分为:%.2lf\n", max);
    printf("最低分为:%.2lf\n", min);

}
double avg(double a[10])
{
    double avg = 0;
    min= max = a[0];
    for (int i = 0; i < 10; i++)
    {
        if (max < a[i])
        {
            max = a[i];
        }
        else if (min > a[i])
        {
            min = a[i];
        }
        avg = avg + a[i];
    }
    return avg;
}
//请输入10位学生的分数:87.5 78 97.5 67 84 91 76.5 65 58 68
//平均分为 : 77.25
//最高分为 : 97.50
//最低分为 : 58.00
#include<stdio.h>
void main()
{
    double score[10], a;
    printf("请输入10位学生的分数:");
    for (int i = 0; i < 10; i++)
    {
        scanf("%lf", &a);
        score[i] = a;
    }
    double result, results, resultss;
    double avg(double a[10]);
    double max(double b[10]);
    double min(double c[10]);
    result = avg(score);
    printf("平均分为:%.2lf\n", result / 10);
    results = max(score);
    printf("最高分为:%.2lf\n", results);
    resultss = min(score);
    printf("最低分为:%.2lf\n", resultss);

}
double avg(double a[10])
{
    double avg = 0;
    for (int i = 0; i < 10; i++)
    {
        avg = avg + a[i];
    }
    return avg;
}
double max(double b[10])
{
    double max = b[0];
    for (int i = 0; i < 10; i++)
    {
        if (max < b[i])
        {
            max = b[i];
        }
    }
    return max;
}
double min(double c[10])
{
    double min = c[0];
    for (int i = 0; i < 10; i++)
    {
        if (min > c[i])
        {
            min = c[i];
        }
    }
    return min;
}
//请输入10位学生的分数:87.5 78 97.5 67 84 91 76.5 65 58 68
//平均分为 : 77.25
//最高分为 : 97.50
//最低分为 : 58.00

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<stdio.h>
int f(int a)
{
	auto int b = 0;//默认
	static int c = 3;
	b = b + 1;//1,1,1
	c = c + 1;//4,5,6
	return (a + b + c);//7,8,9
}
void main()
{
	int a = 2;
	for (int i = 0; i < 3; i++)
	{
		printf("%d\n", f(a));//2,2,2
	}
}
//7
//8
//9

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<stdio.h>
int f(int a)
{
	static int result=1;
	result = result * a;//1,2,6,24,120
	return result;
}
void main()
{
	for (int i = 1; i <= 5; i++)
	{
		printf("%d!=%d\n",i,f(i));
	}
}

在这里插入图片描述
在这里插入图片描述

#include<stdio.h>
int f(int a)
{
	register int result=1;
	for (int i = 1; i <= a; i++)
	{
		result = result * i;
	}
	return result;
}
void main()
{
	int result;
	result=f(15);
	printf("%d", result);
}
//2004310016

在这里插入图片描述

#include<stdio.h>
int max(int a,int b)
{
	int z;
	z = a>b?a:b;
	return z;
}
void main()
{
	extern A, B;//不管在那个位置,使用extern调用全局变量
	printf("%d\n", max(A, B));
}
int A = 13, B = -8;//全局变量末尾
//13
```c
#include<stdio.h>
int max(int a,int b)
{
	int z;
	z = a>b?a:b;
	return z;
}
void main()
{
	A, B;//如果没有使用extern来调用全局变量,程序会报错。因为全局变量定义在末尾
	printf("%d\n", max(A, B));
}
int A = 13, B = -8;//全局变量末尾

在这里插入图片描述

test1.c

#include<stdio.h>
int A;
void main()
{
	int power(int n);
	int result,m;
	scanf("%d %d", &A, &m);//输入:2 3
	result = power(m);//power(3)
	printf("%d", result);//8
}

test2.c

extern A;//A=2
int power(int n)//n=3
{
	int y = 1;
	for (int i = 1; i <=n; i++)
	{
		y = y * A;//1*2=2,2*2=4,4*2=8;
	}
	return y;
}
//2 3
//8

或者直接定义在一个文件上

#include<stdio.h>
void main()
{
	int power(int n,int m);
	int result,A,B;
	scanf("%d %d", &A, &B);//2 3
	result = power(A,B);//power(2,3)
	printf("%d", result);//8
}
int power(int n, int m)//power(2,3)
{
	int y = 1;
	for (int i = 1; i <= m; i++)
	{
		y = y * n;//1*2=2,2*2=4,4*2=8
	}
	return y;//8
}
//2 3
//8

在这里插入图片描述
test1.c

#include<stdio.h>
static int A;//这里增加了static不让别的文件引用
void main()
{
	int power(int n);
	int result,m;
	scanf("%d %d", &A, &m);//输入:2 3
	result = power(m);//power(3)
	printf("%d", result);//8
}

test2.c

extern A;//A=2
int power(int n)//n=3
{
	int y = 1;
	for (int i = 1; i <=n; i++)
	{
		y = y * A;//1*2=2,2*2=4,4*2=8;
	}
	return y;
}
//报错

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
test1.c

#include<stdio.h>
int A;
void main()
{
	int power(int n);//调用失败,因为power()被定义static为内部函数
	int result,m;
	scanf("%d %d", &A, &m);//输入:2 3
	result = power(m);//power(3)
	printf("%d", result);//8
}

test2.c

extern A;//A=2
static int power(int n)//n=3 添加了static之后该函数只能在本文本上被调用(内部函数)
{
	int y = 1;
	for (int i = 1; i <=n; i++)
	{
		y = y * A;//1*2=2,2*2=4,4*2=8;
	}
	return y;
}
//报错

在这里插入图片描述
test1.c

#include<stdio.h>
int A;
void main()
{
	int power(int n);//调用power()函数
	int result,m;
	scanf("%d %d", &A, &m);//输入:2 3
	result = power(m);//power(3)
	printf("%d", result);//8
}

test2.c

extern A;//A=2
extern int power(int n)//n=3 添加了extern之后该函数能在其他本文本上被调用(外部函数),可以省略extern 不写,系统默认
{
	int y = 1;
	for (int i = 1; i <=n; i++)
	{
		y = y * A;//1*2=2,2*2=4,4*2=8;
	}
	return y;
}
//2 3
//8

在这里插入图片描述

#include<stdio.h>
int first(char str[100], char a);
void main()
{
	char str[100];
	char a;
	printf("请输入一段字符:");
	scanf("%s", &str);
	printf("请输入要删除的一个字符:");
	scanf(" %c", &a);
	first(str, a);
	printf("结果为:%s\n", str);
}
int first(char str[100], char ch)
{
	int i, j;
	for(i=j=0;str[i]!='\0'; i++)
	{
		if (str[i] != ch)
		{
			str[j++] = str[i];
		}
	}
	str[j] = '\0';
}
//请输入一段字符:abcd
//请输入要删除的一个字符 : a
//结果为 : bcd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值