实验3

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

void printText(int line,int co1,char text[]);  //函数声明
void printspaces(int n);  //函数声明
void printBlinkLines(int n);  //函数声明

int main()
{
    int line,co1,i;
    char text[N] = "hi,May~";
    srand(time(0));  //以当前系统时间作为随机种子
    
    for(i=1;i<=10;++i)
    {
        line=rand()%25;
        co1=rand()%80;
        printText(line,co1,text);
        Sleep(1000);  //暂停1000ms
         
     } 
     return 0;
 } 
 
 //打印n个空格
 void printSpaces(int n)
 {
     int i;
     
     for(i=1;i<=n;++i)
           printf(" ");
  } 
  
//打印n行空白行
void printBlankLines(int n)
{
    int i;
    
    for(i=1;i<=n;++i)
         printf("\n");
 } 
 //在第line行第co1列打印一段文本
 void printText(int line,int co1,char text[])
 {
     printBlankLines(line-1);  //打印n-1行空行
    printSpaces(co1-1);  //打印n-1列空格
    printf("%s",text); 
  } 

程序实现功能:在随即行随机列出现10个“hi,May~”形成动画

 

 

//task2_1.c//
//利用局部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 = %d\n",p);        //此为新加 ,打印p的值  p
=p*n; return p; }

 

 

//task2_2.c//
//练习:局部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;
  } 

 

 实验运行结果与我的理论分析一致。

局部static变量的特性:初始化只进行一次,再次进入该函数,保留上次结果。

 

 

//task.3//
#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 result;
     if(n==0)  result=0;
    else result= 2*fun(n-1)+1;
    return result;
     
 }

 

 

 

//task4.c//
#include <stdio.h>
int h(int m);
void hanoi(unsigned n, char from, char temp, char to);  // 函数声明 
void moveplate(unsigned n, char from ,char to);  // 函数声明 

int main() 
{
    unsigned n;  // 盘子数目
    int s;
    while(scanf("%u", &n) != EOF)
     {
       hanoi(n, 'A', 'B', 'C');
      printf("一共移动盘子的次数:%ld",h(n));
     }
      0;
}

// 函数定义
// 功能描述:把n个盘子,从from →to, 借助temp
void hanoi(unsigned 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); 
    }
}

// 函数定义
// 功能描述:把第n个盘子,从from →to
void moveplate(unsigned n, char from, char to) {
    printf("第%u个盘子: %c --> %c\n", n, from, to);
}
int h(int m)
{
    int s;
    if(m==1)
        s=1;
    else
        s=2*h(m-1)+1;
    return s;
}

 

 

 

//task5.c//
#include<stdio.h>
#include<math.h>
#define N 20 int is_prime(int n); int main() { int m,i,a,b; { for(m=4;m<=N;m+=2) { for(i=2;i<=m;i++) { if(is_prime(i)&&is_prime(m-i)) {a=i;b=m-i;break;} } printf("%d = %d + %d \n",m,a,b); } } return 0; } int is_prime(int n) { int j,k, Flag=1; k=sqrt(n); if(n==2) return Flag=1; else for(j=2;j<=k;j++) { if((n%j)==0) {Flag=0; break;} } return Flag; }

 

 

 

 

//task.6.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 a,b,c,d;
    b=0;d=0;
    while(s)
    {
        a=s%10;
        s/=10;
        if(a%2)
          {b=b*10+a;}
    
    }
    while(b)
    {
        c=b%10;
        b/=10;
        d=d*10+c;
    }
    return d;
}

 

 

实验总结:1、本次实验实践了局部变量static,掌握了又一种求阶乘的方法,并且这种方法更简单明了。

                  2、在写程序过程中出现小的细节问题和卡壳,其实本质还是书上的例题,所以还是要把熟练和独立完成作为努力的目标。

posted @ 2022-04-19 20:30  星咸  阅读(52)  评论(2)    收藏  举报