实验3 函数

 

实验任务一

// 利用局部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;
 }

 

 插入代码printf("p  = %lld\n",p);后,

// 利用局部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  = %lld\n",p);
     p = p*n;
     
     return p;
 }

 

 

1-2
// 练习:局部static变量特性

#include <stdio.h>
int func(int,int);   //函数声明 

int main()
{
    int k = 4,m = 1,p1,p2;
    
    p1 = func(k,m);  //函数调用 
    p2 = func(k,m);  //函数调用 
    printf("%d,%d\n",p1,p2);
    
    return 0; 
}

//函数定义
int func(int a,int b)
{
    static int m = 0,i = 2;
    
    i += m + 1;
    m = i + a + b;
    
    return (m);
 } 
 

 

1、实验运行结果与理论分析得到的结果一致;

2、总结局部static变量的特性:静态局部变量的数据储存在静态存储区,再次进入此函数时将保存上一次的结果。

 

实验任务二

2-1迭代

#include <stdio.h>

void printSymbol(int n,char symbol);   //函数声明

int main()
{
    int n;
    char symbol;
    
    while(scanf("%d %c",&n,&symbol) != EOF)
    {
        printSymbol(n,symbol);  //函数调用 
        printf("\n");
    }
    
    return 0;
 } 

void printSymbol(int n,char symbol)
{
    int i;
    for(i=0;i<n;i++)
    {
        printf("%c",symbol);
    }

}

 2-2 递归

#include <stdio.h>

void printSymbol(int n,char symbol);   //函数声明

int main()
{
    int n;
    char symbol;
    
    while(scanf("%d %c",&n,&symbol) != EOF)
    {
        printSymbol(n,symbol);  //函数调用 
        printf("\n");
    }
    
    return 0;
 } 

void printSymbol(int n,char symbol)
{
    if(n==1)
    {
        printf("%c",symbol);
    }
    else
    {
        printSymbol(n-1,symbol);
        printf("%c",symbol);
    }
    
}

 针对这个具体编程问题,对比两种实现方式,我认为迭代的实现方式更好,因为此问题的要求较为简单,使用迭代的方法只需for循环即可完成,更加方便易懂。

 

实验任务三

 

#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 i;
    if(n==0)
    {
        i = 0;
        return i;
    }
    
    else
    {
        i =1 + 2*fun(n-1);
    }
    return i;
}

 实验任务四

#include <stdio.h>
#include <math.h>
int isPrime(int n);
int main()
{
    int a,n,i=0;
    for(n=101;n<=200;n++)
    {
        if(isPrime(n)==0)
        {
            printf("%8d",n);
            i++;
        }       
    }
    printf("\n");
    printf("101~200之间一共有%d个非素数",i);
    return 0;
}

int isPrime(int n)
{
    int p;
    for(p=2;p<=n;p++)
    {
        if(n%p==0)
        break;
      }
       if(p<n)    //有非自身的因数 
        {
            return 0;
        }
        else
        {
             return 1;
        }    
}

 

实验任务五
#include <stdio.h>
long fun(long s);
int main()
{
    long s,t;    
    printf("Enter a number: ");
    while(scanf("%ld",&s) != EOF)
    {
        t = fun(s);
        printf("new number is:%ld\n\n",t);
        printf("Enter a number: ");
    }
    
    return 0;
}

long fun(long s)
{
    long m=0,a=0,b=1;
    while(s>0)
    {
        m = s%10;
        if(m%2!=0)
        {
            a = a + m*b;
            b = b*10;
        }
        s = s/10;
    }
    return a;
}

 

实验任务六
#include <stdio.h>
double fun(int n);  //声明
double myabs(int a);
int main()
{
    int n;
    double s;
    printf("Enter n(1~10): ");
    while(scanf("%d",&n) != EOF)
    {
        s = fun(n);
        printf("n = %d,s = %f\n\n",n,s);
        printf("Enter n(1~10): ");
    }
    return 0;
} 

double fun(int n)
{
    int t;
    double sum=0;
    for(t=1;t<=n;t++)
    {
        if(t%2 != 0)
        {
            sum = sum + 1/myabs(t);
        }
        else if(t%2==0)
        {
            sum = sum - 1/myabs(t);
        }
        
    }
    return sum;
}

double myabs(int a)
{
    if(a==1)
           return 1;  
       else
           return a*myabs(a-1);          
}


  

 

实验总结

1、收获的具体知识点:利用实验学习了局部static变量的特性;了解了迭代与递归这两种方法的不同处;使用递归法时应先找到第n项与第n-1项的关系,并以此为根据设计算法;

2、本次实验的体会:动手敲代码之前一定要先理解题目的要求,理清逻辑、想清用什么算法之后再动手书写,若写完后再重新修改算法逻辑会很麻烦;

3、尚存的问题:实验任务六试了很多别的算法都不行,但也找不出错误之处;(如:若将每项的正负判断放进第二个自定义的函数,得出的运行结果不正确;以及 若不在第一个调用的函数中用“1/myabs(t)”来表示每一项,而是在第二个调用的函数中用"1/(a*myabs(a-1))"来确定每一项的值,运行结果也不正确。

posted @ 2021-11-25 15:26  唐文轩  阅读(43)  评论(0编辑  收藏  举报