实验三

实验三

task1.c

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#define N 80

void printText(int Line, int col, char text[]);
void printSpaces(int n);
void printBlankLines(int n);

int main()                      /*在屏幕上随机位置打印 10 个“hi, May~”*/
{
    int line, col, i;
    char text[N]="hi, May~";

    srand(time(0));

    for(i=0;i<=10;i++)
    {
        line = rand()%25;
        col = rand()%80;
        printText(line, col, text);
        Sleep(1000);
    }

    return 0;
}

void printSpaces(int n)
{
    int i;

    for(i=1; i<=n; i++)
    {
        printf(" ");
    }
}

void printBlankLines(int n)
{
    int i;

    for(i=1; i<=n; i++)
    {
        printf("\n");
    }
}

void printText(int line, int col, char text[])
{
    printBlankLines(line-1);
    printSpaces(col-1);
    printf("%s",text);
}

task2_1.c

#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;             /*static可使被定义变量储存在全局数据中,即使函数返回,也不会改变其值*/
    /*printf("p=%lld\n",p);*/
    p=p*n;

    return p;
}

task2_2.c

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

结果是一致的。

 

static变量特性是:

1)其储存于全局数据中,类似于全局变量,但不完全相同。

2)其只可在其被声明的函数中被调用,而无法像全局变量一样,可以任意调用。

 task3.c

#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 f;
    int i;

    if(n==1)
        f=1;
    else
        f=2*fun(n-1)+1;

    return f;
}

task4.c

#include<stdio.h>
void hanoi(unsigned int n,char from, char temp, char to);
void moveplate(unsigned int n,char from, char to);
int i;

int main()
{
    unsigned int n;
    while(scanf("%u",&n)!=EOF)
    {
        i=0;
        hanoi(n,'A','B','C');
        printf("\n一共移动了%d次\n\n",i);
    }
    return 0;
}

void hanoi(unsigned int n,char from, char temp, char to)
{
    if(n==1)
        moveplate(n,from,to);
    else
    {
        hanoi(n-1,from,to,temp);
        moveplate(n,from,to);
        hanoi(n-1,temp,from,to);
    }
}

void moveplate(unsigned int n,char from, char to)
{
    printf("第%u个盘子:%c-->%c\n",n,from,to);
    i++;
}

task5.c

#include<stdio.h>
#include<math.h>
#define Num 20
int is_prime(int n);
int databace(int prime[],int Even_num[]);
void output(int prime[],int Even_num[]);

int main()
{
    int prime[Num],Even_num[Num];
    databace(prime,Even_num);
    output(prime,Even_num);

    return 0;
}

int is_prime(int n)
{
    int flag=1,i;
    double N;
    N=sqrt(n);

    for(i=2;i<=N;i++)
    {
        if(n%i==0&&n!=2)
        {
            flag=0;
            break;
        }
    }
    if(n==1)
        flag=0;
    return flag;
}

int databace(int prime[],int Even_num[])
{
    int i,j=0,k=0;

    for(i=1;i<=Num;i++)
    {
        if(is_prime(i)==1)
        {
            prime[j]=i;
            j++;
        }
        if(i%2==0)
        {
            Even_num[k]=i;
            k++;
        }
    }
    prime[j]='\0';
    Even_num[k]='\0';
}

void output(int prime[],int Even_num[])
{
    int i,j,k,flag;
    int times=0;

    for(i=0;Even_num[i]!='\0';i++)
    {
        flag=0;

        for(j=0;prime[j]!='\0'&&flag==0;j++)
        {
            for(k=0;prime[k]!='\0'&&flag==0;k++)
            {
                if(Even_num[i]==prime[j]+prime[k])
                {
                    printf("%d = %d + %d \n",Even_num[i],prime[j],prime[k]);
                    flag=1;
                    times++;
                }
            }
        }
    }
    if(times!=i-1)
        printf("Error!!!");
}

task6.c

#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,j,k=0;
    long l,t;
    l=s;
    for(i=0;l!=0;i++)
        l/=10;
    long start[i],end[i];
    for(j=0;s!=0;j++)
    {
        start[j]=s%10;
        if(start[j]%2!=0)
            end[k++]=start[j];
        s/=10;
    }
    end[k]='\0';
    for(k=k-1;k>=0;k--)
    {
        t*=10;
        t=end[k]+t;
    }
    return t;
}

 

五、实验总结:

 关于 task5.c  task6.c 这里是使用了数组进行了解决,主要目的是使数据分类更加有序,利于直接观察;不过,与此同时,也极大增加了代码行数。假如不使用数组,应该是会减少很多行代码的。

posted @ 2022-04-26 09:45  韩轩昂HXAaa  阅读(52)  评论(4编辑  收藏  举报