实验四

一:实验结论:

   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)希望能在之后的学习中掌握。

  

posted @ 2021-04-29 07:57  Dictator——博客  阅读(97)  评论(1编辑  收藏  举报