头歌C语言实验 练习8:自定义函数

第1关:计算圆的面积

问题描述
编写一个函数,函数的功能是根据指定的半径r,计算圆的面积S,圆周率π取值3.14。
主函数中由用户输入半径r,然后调用函数计算圆的面积并输出圆的面积。

输入
一个浮点数r,表示圆的半径。

输出
按照格式“半径为r的圆的面积为:s。”的格式输出圆的面积,其中r和s为实际的浮点数,保留2位小数。

输入示例
5.0

输出示例
半径为5.00的圆的面积为78.50。

提示
设计函数时重点关注函数自身的功能,而不要考虑整个
程序的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

#define PI 3.14

float GetArea(float r);

int main() {
/* Write your code here */
float r;
float s;
scanf("%f",&r);
s=GetArea(r);
printf("半径为%.2f的圆的面积为%.2f。",r,s);
return 0;
}

float GetArea(float r) {
/* Write your code here */
return PI*r*r;
}

第2关:排列与组合

问题描述
请分别设计并编写三个函数,分别实现以下功能:
函数1:用于计算非负整数n的阶乘,注意0! = 1! = 1。
函数2:根据排列公式计算排列Amn。
函数3:根据组合公式计算组合Cmn。
其中,排列A和组合C的计算公式如下:
,
主函数中由用户输入两个非负整数m和n(为确保在计算阶乘的过程中不会产生溢出,假定用户输入的m和n值不会超过15),调用函数计算并输出排列Amn和组合Cmn的值。

输入
用一个空格分开的两个两个非负整数m和n,输入数据保证0≤n≤m≤15。

输出
参照示例分两行分别输出排列和组合的值。

输入示例
5 2

输出示例
A(5,2)=20
C(5,2)=10

提示
设计函数时重点关注函数自身的功能,而不要考虑整个
程序的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<stdio.h>
int GetFactorial(int n);
int GetArray(int m,int n);
int GetCombine(int m,int n);
int main(){
int m,n,Array,Combine;
scanf("%d %d",&m,&n);
Array=GetArray(m,n);
Combine=GetCombine(m,n);
printf("A(%d,%d)=%d\nC(%d,%d)=%d",m,n,Array,m,n,Combine);
return 0;
}
int GetFactorial(int n){
int i,Factorial=1;
if(n!=0&&n!=1){
for(i=2;i<=n;i++){
Factorial*=i;
}
}
return Factorial;
}
int GetArray(int m,int n){
return GetFactorial(m)/GetFactorial(m-n);
}
int GetCombine(int m,int n){
return GetFactorial(m)/(GetFactorial(n)*GetFactorial(m-n));
}

第3关:费波拉契数列

问题描述
设计并编写一个函数,用迭代的方法计算费波拉契数列的第n(n≥1)项。
主函数中读入由用户输入的整数n,利用循环反复调用函数计算并输出费波拉契数列的前n项。

输入
一个正整数n(n≥1)。

输出
分n行输出费波拉契数列的前n项。

输入示例
5

输出示例
Fib(1) = 1
Fib(2) = 1
Fib(3) = 2
Fib(4) = 3
Fib(5) = 5

提示
设计函数时重点关注函数自身的功能,而不要考虑整个程序的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>
void GetFib(int n);
int main(){
int n;
scanf("%d",&n);
GetFib(n);
return 0;
}
void GetFib(int n){
int i;
int Fn=0,F1=1,F2=1;
for(i=0;i<n;i++){
if(i==0||i==1)
printf("Fib(%d) = %d\n",i+1,F1);
else{
Fn=F1+F2;
printf("Fib(%d) = %d\n",i+1,Fn);
F1=F2;
F2=Fn;
}
}
}

第4关:加密字符串

问题描述
请设计并编写一个函数,用于加密单个字符,字符加密的规则是:

对于任意的字母(包括大写和小写字母)字符,替换为其后的第3个字母,如a替换为d,而x则替换为a,y替换为b,z替换为c;
对于非字母字符,不作任何处理。
主函数中使用循环依次读取用户输入的一行字符(“\n”是单行输入的结束标记),调用函数加密后输出加密后的字符。
提示:每次循环过程中只处理其中的单个字符。

输入
一行字符串。

输出
加密后的一行字符串。

输入示例
I went to the zoo with Marry last Sunday.

输出示例
L zhqw wr wkh crr zlwk Pduub odvw Vxqgdb.

提示
设计函数时重点关注函数自身的功能,而不要考虑整个程序的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* encrypt(char str[100]);
int main(){
char str[100],str1[100];
char ch;
int i=0;
while((ch=getchar())!='\n'){
str[i]=ch;
i++;
}
str[i]='\0';
strcpy(str1,encrypt(str));
for(i=0;str1[i]!='\0';i++){
putchar(str1[i]);
}
return 0;
}
char* encrypt(char str[100]){
int i=0;
while(str[i]!='\0'){
if(str[i]>='a' && str[i]<='w'||str[i]>='A' && str[i]<='W'){
str[i]+=3;
}
else if(str[i]>='x' && str[i]<='z'||str[i]>='X' && str[i]<='Z'){
str[i]=str[i]-('x'-'a');
}
i++;
}
return str;
}

第5关:水仙花数

问题描述
水仙花数是指一个三位数,其百位数、十位数和个位数的立方和就等于该数本身,例如153就是一个水仙花数,因为13+53+33=153。
请设计并编写一个函数,其功能是判定一个整数是否是水仙花数。
主函数中负责找到并输出所有的水仙花数。

输入
无。

输出
输出所有的水仙花数,每两个水仙花数之间用一个空格分开。

输入示例
无。

输出示例
153 370 371 407

提示
设计函数时重点关注函数自身的功能,而不要考虑整个程序的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <math.h>
int judgenum(int num){
int i,a,b,c;
a=num/100;
b=num%100/10;
c=num%10;
if(pow(a,3)+pow(b,3)+pow(c,3)==num)
return 1;
else
return 0;
}
int main(){
int i;
for(i=100;i<=999;i++){
if(judgenum(i)){
printf("%d ",i);
}
}
return 0;
}