C语言-实验7-函数
本系列将以一个学习者的眼光,从零基础一步一步学会最基础的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 = 305 + 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;}/* 请在这里填写答案 */输入示例:
32 13 24 0输出示例:
231
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;}/* 请在这里填写答案 */输入示例:
51 2 3 4 52 3 4 5 63 4 5 6 74 5 6 7 85 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!
给出两个数 ,求 和 。
计算公式
输入数据有多组(数据组数不超过 250),到 EOF 结束。
对于每组数据,输入两个用空格隔开的整数 ()。
对于每组数据输出一行,依次输出 和 ,两个数之间用空格隔开。
注意:因为 和 数据较大,定义数据类型应使用
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 15 34 3输出示例:
1 160 1024 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 42 2输出示例:
94.733.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输出示例:
12345
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语言实验—计算表达式
计算下列表达式值:
输入格式:输入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),并输出。每个结果占一行。
输入示例:
21 12 3输出示例:
17
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 求组合数
本题要求编写程序,根据公式
算出从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。
输入格式:输入在一行中给出一个正整数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 计算圆柱体的体积
输入圆柱的高和半径,求圆柱体积,
。要求定义和调用函数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语言程序的函数及其相关知识点!一起加油吧!
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!