C语言函数与宏定义实验报告
C语言函数与宏定义实验报告
姓名:胡熙国 实验地点:一教524 实验时间:2021-5-18
一、实验目的与要求
- 掌握函数的定义方法和调用规则。
- 掌握在C语言程序中主调函数和被调函数之间进行数据传递的规则。
- 了解函数的返回值及其类型,并正确使用。
- 了解局部变量和全局变量的作用城及它们与存做分类的关系,理解变量的存在性和可见性的概念
二、实验内容
实验一
1.问题描述
- 求两个数的最大公约数
2.试验代码
#include <stdio.h>
int gcd(int a, int b)
{
int temp;
int remainder;
if (a < b)
{
temp = a;
a = b;
b = temp;
}
remainder = a % b;
while (remainder != 0)
{
a = b;
b = remainder;
remainder = a % b;
}
return b;
}
int main(void)
{
int x, y;
int fac;
printf("请输入两个整数\n");
scanf("%d,%d", &x, &y);
fac = gcd(x, y);
printf("最大公约数为%d\n", fac);
}
3.效果截图
4.问题分析
解决该问题的关键是如何将辗转相除法转化为相应的代码。
实验二
1.问题描述
- 输入n,输出高度为n的正三角形
2.试验代码
#include <stdio.h>
void trangle(int n)
{
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j < n - i; j++)
{
printf(" ");
}
for (j = 0; j <= 2 * i; j++)
{
printf("*");
}
putchar('\n');
}
}
int main(void)
{
int n;
printf("请输入三角形的高度\n");
scanf("%d", &n);
printf("\n");
trangle(n);
}
3.效果截图
4.问题分析
该问题的关键点在于输出的高度是变化的,要用到合适的变量去将高度的变化表示出来,这个问题还可以将前一章的for循环复习。
实验三
1.问题描述
- 求500以内的所有亲密数对
2.试验代码
#include <stdio.h>
int func(int m)
{
int sum = 1, f = 2;
while (f <= m / 2)
{
if (m % f == 0)
{
sum = sum + f;
}
f++;
}
return sum;
}
int main(void)
{
int m = 3, n, k;
while (m <= 500)
{
n = func(m);
k = func(n);
if (m == k && m <= n)
{
printf("%d,%d\n", m, n);
}
m++;
}
}
3.效果截图
4.问题分析
解决问题的关键点在于先把一个数的因子累加,再把求出来的因子作为返回值,看返回后的第二个因子是否和之前的因子相等。
实验四
1.问题描述
- 计算Ackerman函数
2.试验代码
#include <stdio.h>
int Ack(int n, int x, int y)
{
int a;
if (n == 0)
{
a = x + 1;
}
else if (n == 1 && y == 0)
{
a = x;
}
else if (n == 2 && y == 0)
{
a = 0;
}
else if (n == 3 && y == 0)
{
a = 1;
}
else if (n >= 4 && y == 0)
{
a = 2;
}
else
{
a = Ack(n - 1, Ack(n, x, y - 1), x);
}
return a;
}
int main()
{
int n, x, y, jj;
printf("请输入三个数n,x,y:");
scanf("%d,%d,%d", &n, &x, &y);
jj = Ack(n, x, y);
printf("Ack(%d,%d,%d)=%d\n", n, x, y, jj);
}
3.效果截图
4.问题分析
解决问题的关键点在于用多重的if-else循环去判断循环的条件。