实验四
一:实验结论:
1:设n取值范围在0~32之间。设计一个函数模块fun(),用来实现:
提供n的数值,返回该函数计算式 的结果。
要求:使用递归算法实现 不允许使用标准库函数pow()。
(1)源代码:
#include <stdio.h>
long long fun(int n);
int main() {
int n;
long long f;
while(scanf("%d", &n) != EOF) {
f = fun(n);
printf("n = %d, f = %lld\n", n, f);
}
return 0;
}
long long fun(int n){
long long s;
if(n==1)
s=1;
else
s=2*fun(n-1)+1;
return s;
}
(2)运行结果截图:

2:理解函数模块fac()定义中, 局部static变量起到的作用。
(1)源代码:
a:
// 利用局部static变量特性计算阶乘
#include <stdio.h>
long long fac(int n); // 函数声明
int main() {
int i,n;
printf("Enter n: ");
scanf("%d", &n);
for(i=1; i<=n; ++i)
printf("%d! = %lld\n", i, fac(i));
return 0;
}
// 函数定义
long long fac(int n) {
static long long p = 1;
p = p*n;
return p;
}
b:
// 利用局部static变量特性计算阶乘
#include <stdio.h>
long long fac(int n); // 函数声明
int main() {
int i,n;
printf("Enter n: ");
scanf("%d", &n);
for(i=1; i<=n; ++i)
printf("%d! = %lld\n", i, fac(i));
return 0;
}
// 函数定义
long long fac(int n) {
static long long p = 1;
printf("p=%11d\n",p);
p = p*n;
return p;
}
(2)运行结果截图:
a:
b:
(3)使用关键字static修饰的局部变量的特性:
a:加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。
b:static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。
c:static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加’\0’太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是’\0’。
3:寻找两个整数之间的所有素数(包括这两个整数),把结果保存在数组bb中,函数返回素数的个数。
(1)源代码:
//寻找两个整数之间的所有素数(包括这两个整数),把结果保存在数组bb中,函数返回素数的个数。
// 例如,输入6和21,则输出为:7 11 13 17 19。
#include <stdio.h>
#include <stdlib.h>
#define N 1000
int fun(int n,int m,int bb[N]) {
int i,j,k=0,flag;
for(j=n;j<=m;j++) {
flag=1;
for(i=2;i<j;i++)
if(j%i==0) {
flag=0;
break;
}
if(flag==1)
bb[k++]=j;
}
return k;
}
int main(){
int n=0,m=0,i,k,bb[N];
scanf("%d",&n);
scanf("%d",&m);
for(i=0;i<m-n;i++)
bb[i]=0;
k=fun(n,m,bb);
for(i=0;i<k;i++)
printf("%4d",bb[i]);
return 0;
}
(2)运行结果截图:
4:一个函数dec2n(),实现把一个十进制数据x转换成n进制。(n取2,8,16)。
(1)源代码:
#include <stdio.h>
void dec2n(int x, int n); // 函数声明
int main() {
int x;
printf("输入一个十进制整数: ");
scanf("%d", &x);
dec2n(x, 2); // 函数调用: 把x转换成二进制输出
dec2n(x, 8); // 函数调用: 把x转换成八进制输出
dec2n(x, 16); // 函数调用: 把x转换成十六进制输出
return 0;
}
// 函数定义
// 功能: 把十进制数x转换成n进制,打印输出
// 补足函数实现
void dec2n(int x, int n) {
int i = 0, a[32],b[32],c[32];
char t;
//转化为二进制
if(n==2){
while (x > 0) {
a[i] = x % 2;
i = i + 1;
x = x / 2;
}
for (i--; i >= 0; i--)
printf("%d", a[i]);
printf("\n");
}
//转化为八进制
else if(n==8){
while (x > 0) {
b[i] = x % 8;
i = i + 1;
x = x / 8;
}
for (i--; i >= 0; i--)
printf("%d", b[i]);
printf("\n");
}
//转化为十六进制
else if (n==16){
while (x > 0) {
c[i] = x % 16;
i = i + 1;
x = x / 16;
}
for (i--; i >= 0; i--){
if(c[i]>=10){
t = 'A'+c[i]-10;
printf("%c",t);
}
else
printf("%d", c[i]);
}
printf("\n");
}
}
(2)运行结果截图:
二:实验总结:
1:收获:(1)通过实验更为清晰的认识到了;
(2)对函数的嵌套,调用及数组的运用有了更直观的了解;
(3)掌握了进制转化的算法,操作及c语言编写。
2:尚存的问题:(1)对任务一的选做题的把握还不到位;
(2)对数组的认识有待提高;
(3)对细节的掌握还存在不足;
(4)希望能在之后的学习中掌握。

浙公网安备 33010602011771号