3678 字
18 分钟

C语言-实验7-函数

2026-02-26
浏览量 加载中...
Note

本系列将以一个学习者的眼光,从零基础一步一步学会最基础的C语言编程,本文将讲解C语言第七个板块:函数。

作为C语言的核心组成部分,函数是实现代码模块化、复用性的关键。这篇博客会从零基础视角,带你全面认识C语言函数,包含清晰的概念讲解和可直接运行的示例代码,帮你彻底掌握函数的使用。

函数的认识#

你可以把函数理解为 “一个封装好的、能完成特定任务的代码块”。就像生活中的 “洗衣机”—— 你只需要放入衣服、按下启动键(传入参数),它就会自动完成洗衣、甩干的工作(执行函数逻辑),最后输出干净的衣服(返回结果)。

在 C 语言中,函数的核心价值:

  • 代码复用:避免重复写相同逻辑
  • 模块化:将复杂程序拆分成多个小功能
  • 易维护:修改一个函数即可更新对应功能

函数的分类#

库函数#

输入输出:printf()scanf()(头文件 stdio.h) 数学计算:sqrt()(开平方)、pow()(幂运算)(头文件 math.h) 字符串处理:strlen()(字符串长度)(头文件 string.h

自定义函数#

根据需求自己定义的函数,是编程中最核心的部分。 自定义函数的结构

返回值类型 函数名(参数类型1 参数名1, 参数类型2 参数名2, ...) {
// 函数体(要执行的代码)
return 返回值; // 无返回值时(void)可省略
}

返回值类型:函数执行完返回结果的类型(如int、float,无返回值则写void) 函数名:符合 C 语言命名规则的名称(如add、calculateArea) 参数:函数执行需要的输入(可无参数,括号内写void或空) return:将结果返回给调用者,结束函数

函数的嵌套调用#

函数可以调用另一个函数,这是实现复杂逻辑的基础。

示例#

1.使用库函数计算平方根#

#include <stdio.h>
#include <math.h>
int main() {
double num = 16.0;
double result = sqrt(num);
printf("%.1f的平方根是:%.1f\n", num, result);
return 0;
}

输出

16.0的平方根是:4.0

2.无参数、无返回值的函数#

#include <stdio.h>
void printWelcome() {
printf("欢迎学习C语言函数!\n");
}
int main() {
printWelcome();
return 0;
}

输出

欢迎学习C语言函数!

3.有参数、有返回值的函数#

#include <stdio.h>
int add(int a, int b) {
int sum = a + b;
return sum;
}
int main() {
int num1 = 10, num2 = 20;
int result = add(num1, num2);
printf("%d + %d = %d\n", num1, num2, result);
printf("5 + 8 = %d\n", add(5, 8));
return 0;
}

输出

10 + 20 = 30
5 + 8 = 13

4.定义函数计算 “两个数的和的平方”#

#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int square(int a, int b) {
int sum = add(a, b);
return sum * sum;
}
int main() {
printf("(2+3)² = %d\n", square(2, 3));
return 0;
}

输出

(2+3)² = 25

应用#

6-1 sdut-C语言实验-计算组合数

计算组合数。C(n,m),表示从n个数中选择m个的组合数。

计算公式如下:

若:m=0,C(n,m)=1

否则, 若 n=1,C(n,m)=1

否则,若m=n,C(n,m)=1

否则 C(n,m) = C(n-1,m-1) + C(n-1,m).

函数接口定义

在这里描述函数接口。例如:
int fun(int n,int m);

其中 n 和 m 都是用户传入的参数(0 <= m <= n <= 20)。

裁判测试程序样例

#include <stdio.h>
#include <stdlib.h>
int fun(int n,int m);
int main()
{
int t,n,m,i;
scanf("%d",&t);
for(i=1;i<=t;i++)
{
scanf("%d %d",&n,&m);
printf("%d\n",fun(n,m));
}
return 0;
}
/* 请在这里填写答案 */

输入示例

3
2 1
3 2
4 0

输出示例

2
3
1
6-1 解答:
int fun(int n,int m){
if(m==0){
return 1;
}else if(n==1){
return 1;
}else if(m==n){
return 1;
}else{
return fun(n - 1, m - 1) + fun(n - 1, m);
}
}

6-2 sdut- C语言实验——矩阵下三角元素之和

输入一个正整数n(1<=n<=10),再输入n*n的矩阵,要求求该矩阵的下三角元素之和。

函数接口定义

int f(int (*p)[10],int n);

其中 p 和 n 都是用户传入的参数。 p 的值为地址; n 是[1, 10]区间内的个位数。函数需要返回求和后的数据。

裁判测试程序样例

#include<stdio.h>
int f(int (*p)[10],int n);
int main()
{
int n,i,j,sum;
int a[10][10];
scanf("%d",&n);
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
scanf("%d",&a[i][j]);
}
}
sum=f(a,n);
printf("%d",sum);
return 0;
}
/* 请在这里填写答案 */

输入示例

5
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9

输出示例

75
6-2 解答:
int f(int (*p)[10],int n){
int result = 0;
for(int k=0;k<n;k++){
for(int l=0;l<n;l++){
if(k>=l){
result += p[k][l];
}
}
}
return result;
}

6-3 sdut-C语言实验- N!

给出两个数 n,mn, m,求 AnmA_n^mCnmC_n^m

计算公式

Anm=n!(nm)!A_n^m = \frac{n!}{(n - m)!}Cnm=n!(nm)!m!C_n^m = \frac{n!}{(n - m)!m!}

输入数据有多组(数据组数不超过 250),到 EOF 结束。

对于每组数据,输入两个用空格隔开的整数 n,mn, m0mn200 \le m \le n \le 20)。

对于每组数据输出一行,依次输出 AnmA_n^mCnmC_n^m,两个数之间用空格隔开。

注意:因为 n!n!m!m! 数据较大,定义数据类型应使用 long long int,输出格式为 %lld

函数接口定义

long long int f(long long int n);

其中 n 是用户传入的参数。函数须返回n!的值。

裁判测试程序样例

#include <stdio.h>
long long int f(long long int n);
int main()
{
long long int n,m,i;
while(~scanf("%lld %lld",&n,&m))
{
long long int a,c;
a=f(n)/f(n-m);
c=f(n)/f(n-m)/f(m);
printf("%lld %lld\n",a,c);
}
return 0;
}
/* 请在这里填写答案 */

输入示例

1 1
5 3
4 3

输出示例

1 1
60 10
24 4
6-3 解答:
long long int f(long long int n){
long long int result=1;
for(long long int i=1;i<=n;i++){
result *= i;
}
return result;
}

6-4 sdut-C语言-使用函数验证哥德巴赫猜想

本题要求实现一个判断素数的简单函数,并利用该函数验证哥德巴赫猜想:任何一个不小于6的偶数均可表示为两个奇素数之和。素数就是只能被1和自身整除的正整数。输入一个不小于6的偶数n,找出两个素数,使它们的和为n。注意:1不是素数,2是素数。

函数接口定义

int isPrime( int x );
void Goldbach( int n );

其中函数isPrime当用户传入参数x为素数时返回1,否则返回0;函数Goldbach按照格式“n=p+q”输出n的素数分解,其中p≤q均为素数。又因为这样的分解不唯一(例如24可以分解为5+19,还可以分解为7+17),要求必须输出所有解中p最小的解。

裁判测试程序样例

#include <stdio.h>
int isPrime( int x );
void Goldbach( int n );
int main()
{
int n;
scanf("%d",&n);
if(n%2==0)
Goldbach( n );
return 0;
}
/* 请在这里填写答案 */

输出示例

80

输出示例

80=7+73
6-4 解答:
int isPrime( int x ){
if (x < 2) {
return 0;
}
if (x == 2) {
return 1;
}
if (x % 2 ==0){
return 0;
}
for (int i = 3; i * i <= x; i += 2) {
if (x % i == 0) {
return 0;
}
}
return 1;
}
void Goldbach( int n){
for(int p=1;p<=n/2;p++){
int q;
q = n-p;
if(isPrime(p)==1&&isPrime(q)==1){
printf("%d=%d+%d\n", n, p, q);
break;
}
}
}

6-5 sdut-C语言实验- 求数列的和

数列的定义如下: 数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。

提示:因为自定义函数中用到数学函数,因此本题目的提交答案需要包括头文件在内的主函数和自定义函数。

函数接口定义

double s(double n,int m);

其中 n 和 m 都是用户传入的参数。 n 的值不超过double的范围; m 的值不超过int的范围。函数须返回数列前m项的和。

提示:本题需要在自定义函数中使用sqrt()数学函数,因此在填写答案时需要提交完整的程序,既题目已经给定的代码部分和需要填写的答案部分。

裁判测试程序样例

#include <stdio.h>
#include <math.h>
double s(double n,int m);
int main()
{
int a,b,m,i;
double sum,n;
while (scanf("%lf %d",&n,&m)!=EOF)
{
sum=s(n,m);
printf("%.2lf\n",sum);
}
return 0;
}
/* 请在这里填写答案 */

输出示例

81 4
2 2

输出示例

94.73
3.41
6-5 解答:
#include <stdio.h>
#include <math.h>
double s(double n,int m);
int main()
{
int a,b,m,i;
double sum,n;
while (scanf("%lf %d",&n,&m)!=EOF)
{
sum=s(n,m);
printf("%.2lf\n",sum);
}
return 0;
}
double s(double n, int m) {
double result = n;
double a = n;
for (int j = 1; j < m; j++) {
a = sqrt(a);
result += a;
}
return result;
}

6-6 递归实现顺序输出整数

本题要求实现一个函数,对一个整数进行按位顺序输出。

函数接口定义

void printdigits( int n );

函数printdigits应将n的每一位数字从高位到低位顺序打印出来,每位数字占一行。

裁判测试程序样例

#include <stdio.h>
void printdigits( int n );
int main()
{
int n;
scanf("%d", &n);
printdigits(n);
return 0;
}
/* 你的代码将被嵌在这里 */

输出示例

12345

输出示例

1
2
3
4
5
6-6 解答:
void printdigits( int n ){
if(n<10){
printf("%d\n",n);
}else{
printdigits(n/10);
printf("%d\n",n%10);
}
}

7-1 sdut- C语言实验—计算表达式

计算下列表达式值:

f(x,n)=n+(n1)+(n2)++1+xf(x,n) = \sqrt{n + \sqrt{(n-1) + \sqrt{(n-2) + \sqrt{\cdots + \sqrt{1 + x}}}}}

输入格式:输入x和n的值,其中x为非负实数,n为正整数。

输出格式:输出f(x,n),保留2位小数。

输入示例

3 2

输出示例

2.00
7-1 解答:
#include <stdio.h>
#include <math.h>
double f(double x, int n);
int main(){
double x;
int n;
scanf("%lf %d",&x,&n);
double result = f(x,n);
printf("%.2lf",result);
return 0;
}
double f(double x, int n) {
double temp = x;
for (int i = 1; i <= n; i++) {
temp = sqrt(i + temp);
}
return temp;
}

7-2 sdut-C语言实验- 计算题

一个简单的计算,你需要计算f(m,n),其定义如下:

当m=1时,f(m,n)=n;

当n=1时,f(m,n)=m;

当m>1,n>1时,f(m,n)= f(m-1,n)+ f(m,n-1)

输入格式:第一行包含一个整数T(1<=T<=100),表示下面的数据组数。

以下T行,其中每组数据有两个整数m,n(1<=m,n<=2000),中间用空格隔开。

输出格式:对每组输入数据,你需要计算出f(m,n),并输出。每个结果占一行。

输入示例

2
1 1
2 3

输出示例

1
7
7-2 解答:
#include <stdio.h>
int f(int x,int y);
int main(){
int m,n,a,result;
scanf("%d",&a);
for(int i = 0;i<a;i++){
scanf("%d %d",&m,&n);
result = f(m,n);
printf("%d\n",result);
}
return 0;
}
int f(int x,int y){
if(x==1){
return y;
}else if(y==1){
return x;
}else{
return f(x-1,y)+f(x,y-1);
}
}

7-3 sdut-C语言实验-斐波那契数列

编写计算斐波那契(Fibonacci)数列的第n项函数fib(n)(n < 40)。

数列描述:

f1=f2==1;

fn=fn-1+fn-2(n>=3)。

输入格式:输入整数 n 的值(0 < n < 40)。

输出格式:输出fib(n)的值。

输入示例

7

输出示例

13
7-3 解答:
#include <stdio.h>
int fib(int x);
int main(){
int n,result;
scanf("%d",&n);
result = fib(n);
printf("%d",result);
return 0;
}
int fib(int x){
if(x == 1||x == 2){
return 1;
}else{
return fib(x-1)+fib(x-2);
}
}

7-4 求组合数

本题要求编写程序,根据公式

Cnm=n!m!(nm)!C_n^m = \frac{n!}{m!(n-m)!}

算出从n个不同元素中取出m个元素(m≤n)的组合数。

建议定义和调用函数fact(n)计算n!,其中n的类型是int,函数类型是double。

输入格式:输入在一行中给出两个正整数m和n(m≤n),以空格分隔。

输出格式:按照格式“result = 组合数计算结果”输出。题目保证结果在double类型范围内。

输入示例

2 7

输出示例

result = 21
7-4 解答:
#include <stdio.h>
double fact(int x);
int main(){
int m,n;
scanf("%d %d",&m,&n);
double result;
result = (fact(n))/((fact(m))*(fact(n-m)));
printf("result = %.0lf",result);
return 0;
}
double fact(int x){
double temp = 1;
for(int i=1;i<=x;i++){
temp *= i;
}
return temp;
}

7-5 求算式的和[1]

定义函数main(),输入正整数n,计算并输出下列算式的值。要求调用函数f(n)计算n*(n+1)…(2n-1),函数返回值类型是double。

s=1+123+1345++1n(n+1)(2n1)s = 1 + \frac{1}{2 \cdot 3} + \frac{1}{3 \cdot 4 \cdot 5} + \dots + \frac{1}{n \cdot (n+1) \cdot \dots \cdot (2n-1)}

输入格式:输入在一行中给出一个正整数n。

输出格式:在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后六位,请注意等号的左右各有一个空格。题目保证计算结果不超过双精度范围。

输入示例

3

输出示例

sum = 1.183333
7-5 解答:
#include <stdio.h>
double f(int n);
int main() {
int n;
scanf("%d", &n);
double sum = 0.0;
for (int i = 1; i <= n; i++) {
sum += 1.0 / f(i);
}
printf("sum = %.6f\n", sum);
return 0;
}
double f(int n) {
double product = 1.0;
for (int i = n; i <= 2 * n - 1; i++) {
product *= i;
}
return product;
}

7-6 计算圆柱体的体积

输入圆柱的高和半径,求圆柱体积,

volume=π×r2×hvolume = \pi \times r^2 \times h

。要求定义和调用函数cylinder (r, h )计算圆柱体的体积。

输入格式:输入在一行中给出2个实数,分别为半径r和高h。

输出格式:在一行中以“Volume = 值”的形式输出圆柱体的体积,结果保留三位小数。

输入示例

3.0 10

输出示例

Volume = 282.743
7-6 解答:
#include <stdio.h>
double cylinder(double x,double y);
int main(){
double r,h,volume;
scanf("%lf %lf",&r,&h);
volume = cylinder(r,h);
printf("Volume = %.3lf",volume);
return 0;
}
double cylinder(double x,double y){
double π=3.1415926;
return π*x*x*y;
}

7-7 出生年

以上是新浪微博中一奇葩贴:“我出生于1988年,直到25岁才遇到4个数字都不相同的年份。”也就是说,直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求,自动填充“我出生于y年,直到x岁才遇到n个数字都不相同的年份”这句话。

输入格式:输入在一行中给出出生年份y和目标年份中不同数字的个数n,其中y在[1, 3000]之间,n可以是2、或3、或4。注意不足4位的年份要在前面补零,例如公元1年被认为是0001年,有2个不同的数字0和1。

输出格式:根据输入,输出x和能达到要求的年份。数字间以1个空格分隔,行首尾不得有多余空格。年份要按4位输出。注意:所谓“n个数字都不相同”是指不同的数字正好是n个。如“2013”被视为满足“4位数字都不同”的条件,但不被视为满足2位或3位数字不同的条件。

输入示例1

1988 4

输出示例1

25 2013

输入示例2

1 2

输出示例2

0 0001
7-7 解答:
#include <stdio.h>
#include <string.h>
int countDistinct(int year);
int main() {
int y, n;
scanf("%d %d", &y, &n);
int targetYear;
for (targetYear = y;; targetYear++) {
if (countDistinct(targetYear) == n) {
break;
}
}
int x = targetYear - y;
printf("%d %04d\n", x, targetYear);
return 0;
}
int countDistinct(int year) {
int d1 = year / 1000;
int d2 = (year / 100) % 10;
int d3 = (year / 10) % 10;
int d4 = year % 10;
int used[10] = {0};
used[d1] = 1;
used[d2] = 1;
used[d3] = 1;
used[d4] = 1;
int count = 0;
for (int i = 0; i < 10; i++) {
count += used[i];
}
return count;
}

总结#

OK了,今天你学会了C语言程序的函数及其相关知识点!一起加油吧!

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
C语言-实验7-函数
https://blog.pigeons2023.asia/posts/20260226/
作者
Pigeons2023
发布于
2026-02-26
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
Pigeons2023
不曾与你分享的时间,我在进步.
公告
欢迎光临我的博客 🎉 ,这里会分享我的日常和学习中的收集、整理及总结,希望能对你有所帮助:) 💖
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
19
分类
4
标签
6
总字数
62,837
运行时长
0
最后活动
0 天前

目录