? ?C语言程序设计函数实验,分享记录。
(1)掌握函数的概念、定义、说明与调用。
(2)掌握函数嵌套调用、递归调用,并能进行简单的编程应用。
(1)编写函数,功能为输出区间[n,m]内的素数,区间范围由用户输入,并统计所输出的素数总数。
# define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int fun1(int x, int m);
void main() {
int n, m, i, count;
count = 0;
printf("输入区间范围[n,m]:");
scanf("%d %d", &n, &m);
for (i = n; i <= m; i++) {
if (fun1(i, m) == 1) {
count++;
printf("%4d", i);
}
}
printf("\n素数共有 %d 个", count);
}
int fun1(int x, int m) {
int f;
if (x <= 1) return 0;
for (f = 2; f <= m; f++) {
if (x % f == 0) return 0;
return 1;
}
}
(2)编写函数 void fun(int xx[M][N],int pp[]),其功能是:将二维数组 xx中的数据元素依次存放在一维数组 pp 中(M 和 N 是符号常量)。并编写 main()函数进行测试。
例如,xx 数组存放如下数据:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
则 pp 数组中的内容是:1 5 9 13 2 6 10 14 3 7。
# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
# define M 4
# define N 4
// 将二维数组 xx 中的数据元素依次存放在一维数组 pp 中
void fun(int xx[M][N], int pp[]) {
int i = 0;
// 遍历二维数组 xx,按列将元素存放在一维数组 pp 中
for (int j = 0; j < N; j++) {
for (int k = 0; k < M; k++) {
pp[i] = xx[k][j];
i++;
}
}
}
int main() {
int xx[M][N],i,j;
printf("输入二维数组的内容:\n");
for (i = 0; i < M; i++) {
for (j = 0; j < N; j++)
scanf("%d", &xx[i][j]);
}
int pp[M * N];
fun(xx, pp);
printf("一位数组的内容是:\n");
for (int i = 0; i < M * N; i++) {
printf("%d ", pp[i]);
}
return 0;
}
(3)请编写函数 int fun(int n),其功能是:判断形参 n 中的正整数是几位数(输入数据的位数不要超过 5 位)并将结果通过函数值返回,并编写 main()函数进行测试。
# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
// 计算正整数的位数
int fun(int n) {
int count = 0;
// 通过反复除以 10,统计位数
while (n > 0) {
n /= 10;
count++;
}
return count;
}
int main() {
int n, count;
// 获取用户输入的正整数
printf("请输入一个正整数:");
scanf("%d", &n);
// 调用函数计算位数,并输出结果
count = fun(n);
printf("%d 是 %d 位数", n, count);
return 0;
}
(4)分别设计递归与非递归函数 int age(int n),实现问题求解:计算学生的年龄。已知学生序列中年龄最小的学生为 10 岁,其余学生的年龄一个比一个大2 岁,求第 n 个学生的年龄。并编写 main()函数进行测试。
使用非递归函数实现:
# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
// 非递归函数,计算第 n 个学生的年龄
int age(int n) {
int sage = 10;
for (int i = 1; i < n; i++) {
sage += 2;
}
return sage;
}
int main() {
int n;
printf("请输入要求的学生是第几个:");
scanf("%d", &n);
// 调用函数计算年龄并输出结果
int sage = age(n);
printf("第 %d 个学生的年龄是 %d 岁\n", n, sage);
return 0;
}
使用递归函数实现:
# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
// 递归函数,计算第 n 个学生的年龄
int age(int n) {
if (n == 1) {
return 10;
}
else {
return age(n - 1) + 2; // 递归调用,每个学生的年龄比前一个大 2 岁
}
}
int main() {
int n;
printf("请输入要求的学生是第几个:");
scanf("%d", &n);
// 调用递归函数计算年龄并输出结果
int sage = age(n);
printf("第 %d 个学生的年龄是 %d 岁\n", n, sage);
return 0;
}
(5)拓展题(选)
查阅资料,使用递归方法实现汉诺塔问题的求解编程。
# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
// 递归函数实现汉诺塔问题的移动
void fun(int n, char y_zhu, char f_zhu, char m_zhu) {
// 基本情况:当只有一个盘子时直接移动
if (n == 1) {
printf("将盘子 %d 从 %c 移动到 %c\n", n, y_zhu, m_zhu);
return;
}
// 递归步骤:先将 n-1 个盘子从源柱移动到辅助柱
fun(n - 1, y_zhu, m_zhu, f_zhu);
// 将最大的盘子从源柱移动到目标柱
printf("将盘子 %d 从 %c 移动到 %c\n", n, y_zhu, m_zhu);
// 再将 n-1 个盘子从辅助柱移动到目标柱
fun(n - 1, f_zhu, y_zhu, m_zhu);
}
int main() {
int num;
// 用户输入盘子数量
printf("请输入盘子的数量:");
scanf("%d", &num);
// 调用递归函数解决汉诺塔问题
printf("移动步骤如下:\n");
fun(num, 'A', 'B', 'C');
return 0;
}
(6)拓展题(选)
编程验证哥德巴赫猜想((二重)哥德巴赫猜想:任意大于或等于 6 的偶数都可以分解为两个素数之和),并且要求输出所有的可能情况。
# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
// 判断一个数是否为素数
int fun1(int num) {
for (int i = 2; i * i <= num; i++) {
if (num % i == 0)
return 0;
}
// 是素数
return 1;
}
// 验证哥德巴赫猜想并输出素数对
void fun2(int num) {
// 输入检查,要求输入大于等于6的偶数
if (num < 6 || num % 2 != 0) {
printf("输入的数字不符合要求\n");
return;
}
printf("\n哥德巴赫猜想的验证结果:\n");
// 遍历寻找素数对
for (int i = 2; i < num / 2; i++) {
if (fun1(i) && fun1(num - i))
printf("%d = %d + %d\n", num, i, num - i);
}
}
int main() {
int num;
printf("请输入一个大于等于 6 的偶数:");
scanf("%d", &num);
fun2(num);
return 0;
}
????????在本章实验中掌握函数的概念、定义、说明与调用,以及函数的嵌套调用、递归调用,并能进行简单的编程应用。从这次实验中让我更加深刻的认识到了函数在一些场景中的广泛运用,让我清晰的知道我有那些知识点的不足,能够更好的补充相关的知识点。