实验3
task1
1.代码
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 #include <windows.h> 5 #define N 80 6 void print_text(int line, int col, char text[]); // 函数声明 7 void print_spaces(int n); // 函数声明 8 void print_blank_lines(int n); // 函数声明 9 int main() 10 { 11 int line, col, i; 12 char text[N] = "hi, November~"; 13 srand(time(0)); // 以当前系统时间作为随机种子 14 for(i = 1; i <= 10; ++i) { 15 line = rand() % 25; 16 col = rand() % 80; 17 print_text(line, col, text); 18 Sleep(1000); // 暂停1000ms 19 } 20 system("pause"); 21 return 0; 22 } 23 void print_spaces(int n) 24 { 25 int i; 26 for(i = 1; i <= n; ++i) 27 printf(" "); 28 } 29 // 打印n行空白行 30 void print_blank_lines(int n) 31 { 32 int i; 33 for(i = 1; i <= n; ++i) 34 printf("\n"); 35 } 36 // 在第line行第col列打印一段文本 37 void print_text(int line, int col, char text[]) 38 { 39 print_blank_lines(line-1); // 打印(line-1)行空行 40 print_spaces(col-1); // 打印(col-1)列空格 41 printf("%s", text); // 在第line行、col列输出text中字符串 42 }
2.运行
3.功能
随机延时生成字符串
task2
task2.1
1.代码
1 #include <stdio.h> 2 long long fac(int n); // 函数声明 3 4 int main() { 5 int i, n; 6 7 printf("Enter n: "); 8 scanf("%d", &n); 9 10 for (i = 1; i <= n; ++i) 11 printf("%d! = %lld\n", i, fac(i)); 12 13 return 0; 14 } 15 16 // 函数定义 17 long long fac(int n) { 18 static long long p = 1; 19 20 p = p * n; 21 printf("p = %lld\n", p); 22 return p; 23 }
2.运行
task2.2
1.代码
1 #include <stdio.h> 2 int func(int, int); // 函数声明 3 4 int main() { 5 int k = 4, m = 1, p1, p2; 6 7 p1 = func(k, m); // 函数调用 8 p2 = func(k, m); // 函数调用 9 printf("%d, %d\n", p1, p2); 10 11 return 0; 12 } 13 14 // 函数定义 15 int func(int a, int b) { 16 static int m = 0, i = 2; 17 18 i += m + 1; 19 m = i + a + b; 20 21 return m; 22 }
预测:8 17
2.运行
局部变量static的特性: 1.根据第一个程序可以知道被static 标注的局部变量会随着所在函数区块内的运算而改变,并且每一次计算的值都会顶替原有值变为static的变量。
被static标注的变量始终存在。
2.根据第二个程序可知,static局部变量与主函数同名变量无关
task3
1.代码
1 #include <stdio.h> 2 long long func(int n); // 函数声明 3 4 int main() { 5 int n; 6 long long f; 7 8 while (scanf("%d", &n) != EOF) { 9 f = func(n); // 函数调用 10 printf("n = %d, f = %lld\n", n, f); 11 } 12 13 return 0; 14 } 15 long long func(int n){ 16 if(n==1) 17 return 1; 18 else{ 19 return func(n-1)*2+1; 20 } 21 }
2.运行
task4
1.代码
迭代
1 #include <stdio.h> 2 int func(int n, int m); 3 4 int main() { 5 int n, m; 6 7 while(scanf("%d%d", &n, &m) != EOF) 8 printf("n = %d, m = %d, ans = %d\n", n, m, func(n, m)); 9 10 return 0; 11 } 12 int func(int n, int m){ 13 int i,j,t,a=1,b=1,c=1; 14 if(n<m) 15 return 0; 16 else if(m==0) 17 return 1; 18 else { 19 for(i=1;i<=m;++i)//m! 20 a*=i; 21 for(j=1;j<=n;++j)//n! 22 b*=j; 23 for(t=1;t<=(n-m);++t)//(n-m)! 24 c*=t; 25 return b/(a*c);} 26 }
递归
1 #include <stdio.h> 2 int func(int n, int m); 3 int func1(int n, int m); 4 int main() { 5 int n, m; 6 7 while(scanf("%d%d", &n, &m) != EOF) 8 printf("n = %d, m = %d, ans = %d\n", n, m, func(n, m)); 9 10 return 0; 11 } 12 int func(int n, int m){ 13 if(m>n) 14 return 0; 15 else if(m==0) 16 return 1; 17 else 18 return func1(n-1,m)+func1(n-1,m-1); 19 } 20 int func1(int n, int m){ 21 int i,j,t,a=1,b=1,c=1; 22 for(i=1;i<=m;++i)//m! 23 a*=i; 24 for(j=1;j<=n;++j)//n! 25 b*=j; 26 for(t=1;t<=(n-m);++t)//(n-m)! 27 c*=t; 28 return b/(a*c); 29 }
2.运行
task5
1.代码
1 #include<stdio.h> 2 #include<stdlib.h> 3 void hanoi(unsigned int n,char from,char temp,char to); 4 void moveplate(unsigned int n,char from,char to); 5 int count; 6 int main(){ 7 unsigned int n; 8 while(scanf("%u",&n)!=EOF){ 9 count=0; 10 hanoi(n,'A','B','C'); 11 printf("一共移动了%d次\n",count);} 12 system("pause"); 13 return 0; 14 } 15 void hanoi(unsigned int n,char from,char temp,char to){ 16 if(n==1) 17 moveplate(n,from,to); 18 else{ 19 hanoi(n-1,from,to,temp); 20 moveplate(n,from,to); 21 hanoi(n-1,temp,from,to); 22 } 23 } 24 void moveplate(unsigned int n,char from,char to){ 25 printf("%u:%c-->%c\n",n,from,to); 26 ++count; 27 }
2.运行
task6
1.代码
1 #include <stdio.h> 2 #include <math.h> 3 long func(long s); // 函数声明 4 5 int main() { 6 7 long s, t; 8 9 printf("Enter a number: "); 10 while (scanf("%ld", &s) != EOF) { 11 t = func(s); // 函数调用 12 printf("new number is: %ld\n\n", t); 13 printf("Enter a number: "); 14 } 15 return 0; 16 } 17 long func(long s){ 18 long p=0,t,m,a,b=0; 19 while(s!=0){ 20 if(s%10==0&&s>0){ 21 s=s+2; 22 continue; 23 } 24 else if(s%2==0) 25 s=s/10; 26 else{ 27 t=s%10; 28 p=10*p+t; 29 s=s/10;} 30 } 31 while(p!=0) 32 { 33 a=p%10; 34 b=b*10+a; 35 p=p/10; 36 } 37 return b; 38 }
2.运行
task7
1.代码
1 #include<stdio.h> 2 int pingfang(int n); 3 int lifang(int n); 4 int main(){ 5 int i=1,m,t,x[10],j,d; 6 while(1){ 7 m=pingfang(i); 8 t=lifang(i); 9 j=0; 10 while(m!=0){ 11 if(m%10==0){ 12 x[j]=0; 13 m=(m+1)/10; 14 ++j; 15 } 16 else{ 17 x[j]=m%10; 18 m=m/10; 19 ++j; 20 } 21 } 22 while(t!=0){ 23 if(t%10==0){ 24 x[j]=0; 25 t=(t+1)/10; 26 ++j; 27 } 28 else{ 29 x[j]=t%10; 30 t=t/10; 31 ++j; 32 } 33 } 34 int b,c; 35 for(b=0;b<9;++b){ 36 for(c=0;c<9-b;++c){ 37 if(x[c]>x[c+1]){ 38 d=x[c]; 39 x[c]=x[c+1]; 40 x[c+1]=d; 41 } 42 } 43 } 44 if(x[0]==0&&x[1]==1&&x[2]==2&&x[3]==3&&x[4]==4&&x[5]==5&&x[6]==6&&x[7]==7&&x[8]==8&&x[9]==9) 45 break; 46 ++i; 47 } 48 printf("%d",i); 49 return 0; 50 } 51 int pingfang(int n){ 52 n=n*n; 53 return n; 54 } 55 int lifang(int n){ 56 n=n*n*n; 57 return n; 58 }
2.运行