实验三
实验三
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 这里是使用了数组进行了解决,主要目的是使数据分类更加有序,利于直接观察;不过,与此同时,也极大增加了代码行数。假如不使用数组,应该是会减少很多行代码的。