实验3 函数

实验任务1

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

 

static变量p使p仅在编译时被赋值一次1,在后续运行中用于参与累乘

添加一行打印p的值后

 局部static变量的特性:它的数据存储在静态存储区,当再次进入该函数时,将保存上一次的结果

 

8,17

p1=3+4+1=8

p2=9+3+4+1=17

#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);
}

 

实验任务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=1;i<=n;i++)
    {
        printf("%c",symbol);
    }
    
}

 

实现方式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);
    }
}

 实验任务三

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

 

实验任务四

#include<stdio.h>
#include<math.h>
int isPrime(int a);

int main()
{
    int num;
    int count=0;
    for(num=101;num<=200;num++)
    {
        while(!isPrime(num))
        {
            printf("%d\t",num);
            count++;
            break;
        }
        
    }
    printf("\n101~200之间一共有%d个非素数",count);
}

int isPrime(int a)
{
    int i;
    for(i=sqrt(a);i>=2;i--)
    {
        if(a%i==0)
        {
            return 0;
        }
    }
    if(i==1)
    return 1;
}

 

 

 实验任务5

#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)
{
    int i=10,t,k=0;
    for(;s!=0;)
    {
        t=s%i;
        s=s/i;
        if((t%2)!=0)
        {
            k=k*10+t;
        }
    }
    s=k;
    k=0;
    for(;s!=0;)
    {
        t=s%i;
        s=s/i;
        k=k*10+t;
    }
    
    return k;
}

 

实验任务6

#include<stdio.h>
double fun(int n);

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 i,k=1,j=1;
    double result=0;
    double a;
    for(i=1;i<=n;i++)
    {
        
        k=k*i;
        a=1.0/k;
        result=result+j*a;
        j*=-1;
    }
    return result;
}

 

实验总结

注意输出要求

注意函数声明,函数调用,函数定义的格式

区分迭代和递归

要给递归设计出口

 

对迭代的使用和理解尚不熟练

 

posted @ 2021-11-24 20:48  波叶海菜花  阅读(57)  评论(2编辑  收藏  举报