实验4 C语言数组应用编程
1. 实验任务1
task1_1.c
1 #include<stdio.h> 2 #define N 4 3 void test1() 4 { 5 int a[N]={1,9,8,4}; 6 int i; 7 //输出数组a占用的内存字节数 8 printf("sizeof(a)=%d\n",sizeof(a)); 9 10 //输出int类型数组a中每个元素的地址、值 11 for(i=0;i<N;++i) 12 printf("%p: %d\n",&a[i],a[i]); 13 14 //输出数组名a对应的值 15 printf("a = %p\n",a); 16 } 17 void test2() 18 { 19 char b[N]={'1','9','8','4'}; 20 int i; 21 22 //输出数组b占用的内存字节数 23 printf("sizeof(b)= %d\n",sizeof(b)); 24 25 //输出char类型数组b中每个元素的地址、值 26 for(i=0;i<N;++i) 27 printf("%p: %c\n",&b[i],b[i]); 28 29 //输出数组名b对应的值 30 printf("b = %p\n",b); 31 } 32 int main() 33 { 34 printf("测试1:int类型一维数组\n"); 35 test1(); 36 37 printf("\n测试2:char类型一维数组\n"); 38 test2(); 39 40 return 0; 41 }

①int 类型数组a,在内存中是连续存放的,每个元素占用4个内存字节单元,数组名a对应的值,和&a[0]是一样的
②char型数组b,在内存中是连续存放的,每个元素占用1个内存字节单元, 数组名b对应的值,和&b[0]是一样的
task1_2.c
1 #include<stdio.h> 2 #define N 2 3 #define M 4 4 5 void test1() 6 { 7 8 int a[N][M]={1,9,8,4,2,0,4,9}; 9 int i,j; 10 11 //输出int类型二维数组a占用的内存字节数 12 printf("sizeof(a) = %d\n",sizeof(a)); 13 14 //输出int类型二维数组a中每个元素的地址、值 15 for(i=0;i<N;++i) 16 for(j=0;j<M;++j) 17 printf("%p : %d\n",&a[i][j],a[i][j]); 18 printf("\n"); 19 20 //输出int类型二维数组名a,以及a[0],a[1]的值 21 printf("a= %p\n",a); 22 printf("a[0]= %p\n",a[0]); 23 printf("a[1]= %p\n",a[1]); 24 printf("\n"); 25 } 26 27 void test2() 28 { 29 char b[N][M]={'1','9','8','4','2','0','4','9'}; 30 int i,j; 31 32 //输出char类型二维数组b占用的内存字节数 33 printf("sizeof(b) = %d\n",sizeof(b)); 34 35 //输出char类型二维数组b中每个元素的地址、值 36 for(i=0;i<N;++i) 37 for(j=0;j<M;++j) 38 printf("%p : %c\n",&b[i][j],b[i][j]); 39 printf("\n"); 40 41 //输出int类型二维数组名a,以及a[0],a[1]的值 42 printf("b= %p\n",b); 43 printf("b[0]= %p\n",b[0]); 44 printf("b[1]= %p\n",b[1]); 45 printf("\n"); 46 } 47 48 int main() 49 { 50 printf("测试1:int型两维数组"); 51 test1(); 52 53 printf("测试2:char型两维数组"); 54 test2(); 55 56 return 0; 57 }

① int型二维数组a,在内存中是"按行连续存放"的,每个元素占用4个内存字节单元,数组名a的值、a[0]的值、&a[0][0]的值,在数字字面值上,是一样的
② char型二维数组b,在内存中是"按行连续存放"的,每个元素占用1个内存字节单元,数组名b的值、b[0]的值、&b[0][0]的值,在数字字面值上,是一样的
③ 对于二维数组, 观察a[0], a[1]的值,它们之间相差16,观察b[0]和b[1]的值,它们之间
相差4,都是相差一行元素所占用的字节数
2. 实验任务2
1 #include<stdio.h> 2 #include<string.h> 3 #define N 80 4 5 void swap_str(char s1[N],char s2[N]); 6 void test1(); 7 void test2(); 8 9 int main() 10 { 11 printf("测试1:用两个一维char数组,实现两个字符串交换\n"); 12 test1(); 13 14 printf("\n测试2:用二维char数组,实现两个字符串交换\n"); 15 test2(); 16 17 return 0; 18 } 19 20 void test1() 21 { 22 char views1[N]="hey,c,I hate u"; 23 char views2[N]="hey,c,I love u"; 24 25 printf("交换前:\n"); 26 puts(views1); 27 puts(views2); 28 29 swap_str(views1,views2); 30 31 printf("交换后:\n"); 32 puts(views1); 33 puts(views2); 34 35 } 36 37 void test2() 38 { 39 char views[2][N]={"hey,c,I hate u","hey,c,I love u"}; 40 41 printf("交换前:\n"); 42 puts(views[0]); 43 puts(views[1]); 44 45 swap_str(views[0],views[1]); 46 47 printf("交换后:\n"); 48 puts(views[0]); 49 puts(views[1]); 50 } 51 void swap_str(char s1[N],char s2[N]) 52 { 53 char tmp[N]; 54 55 strcpy(tmp,s1); 56 strcpy(s1,s2); 57 strcpy(s2,tmp); 58 }

一维数组名views1,views2,代表的是该数组的起始地址,二维数组中views[0],views[1]是行地址,代表第一个第二个字符串的起始地址,相当于两个一维数组的起始地址,swap_str函数调用时,形参是一维数组的起始地址,所以一个用views,一个用views[]
3. 实验任务3
task3_1.c
1 #include<stdio.h> 2 #define N 80 3 4 int count(char x[]); 5 6 int main() 7 { 8 char words[N+1]; 9 int n; 10 11 while(gets(words)!=NULL) 12 { 13 n=count(words); 14 printf("单词数:%d\n\n",n); 15 } 16 17 return 0; 18 } 19 20 int count(char x[]) 21 { 22 int i; 23 int word_flag=0; 24 int number=0; 25 26 for(i=0;x[i]!='\0';++i) 27 { 28 if(x[i]==' ') 29 word_flag=0; 30 else if(word_flag==0) 31 { 32 word_flag=1; 33 number++; 34 } 35 } 36 return number; 37 }

改进后的:
1 #include<stdio.h> 2 #define N 80 3 4 int count(char x[]); 5 6 int main() 7 { 8 char words[N+1]; 9 int n; 10 11 while(gets(words)!=NULL) 12 { 13 n=count(words); 14 printf("单词数:%d\n\n",n); 15 } 16 17 return 0; 18 } 19 20 int count(char x[]) 21 { 22 int i; 23 int word_flag=0; 24 int number=0; 25 26 for(i=0;x[i]!='\0';++i) 27 { 28 if((x[i]<'a'||x[i]>'z ')&&(x[i]<'A'||x[i]>'Z')&&x[i]!='-') 29 word_flag=0; 30 else if(word_flag==0) 31 { 32 word_flag=1; 33 number++; 34 } 35 } 36 return number; 37 }

1 #include<stdio.h> 2 #define N 1000 3 4 int main() 5 { 6 char line[N]; 7 int word_len;//记录当前单词长度 8 int max_len;//记录最长单词长度 9 int end;//记录最长单词结束位置 10 int i; 11 12 while(gets(line)!=NULL) 13 { 14 word_len=0; 15 max_len=0; 16 max_len=0; 17 end=0; 18 i=0; 19 20 while(1) 21 { 22 //跳过连续空格 23 while((line[i]<'a'||line[i]>'z ')&&(line[i]<'A'||line[i]>'Z')&&(line[i]!='-')) 24 { 25 word_len=0;//单词长度置为0,为新单词统计单词做准备 26 i++; 27 } 28 29 //在一个单词中,统计当前单词长度 30 while(line[i]!='\0'&&((line[i]>='a'&&line[i]<='z')||(line[i]>='A'&&line[i]<='Z')||(line[i]=='-'))) 31 { 32 word_len++; 33 i++; 34 } 35 36 //更新更长单词长度,并记录最长单词结束位置 37 if(max_len<word_len) 38 { 39 max_len=word_len; 40 end=i;//end保存的是单词结束的下一个坐标位置 41 } 42 43 //遍历到文本结束时,终止循环 44 if(line[i]=='\0') 45 break; 46 } 47 48 //输出最长单词 49 printf("最长单词:"); 50 for(i=end-max_len;i<end;++i) 51 printf("%c",line[i]); 52 printf("\n\n"); 53 } 54 return 0; 55 }

4. 实验任务4
1 #include<stdio.h> 2 #define N 100 3 void dec_to_n(int x,int n); 4 5 int main() 6 { 7 int x; 8 9 printf("输入一个十进制整数:"); 10 11 while(scanf("%d",&x)!=EOF) 12 { 13 dec_to_n(x,2); 14 dec_to_n(x,8); 15 dec_to_n(x,16); 16 17 printf("\n输入一个十进制整数:"); 18 } 19 return 0; 20 } 21 22 void dec_to_n(int x,int n) 23 { 24 int r,i=0,z; 25 char y[N],m[N]="0123456789ABCDEF"; 26 27 if(x<0) 28 z=-x; 29 else 30 z=x; 31 32 while(z!=0) 33 { 34 35 r=z%n; 36 y[i++]=m[r]; 37 z/=n; 38 } 39 40 if(x<0) 41 y[0]*=-1; 42 43 for(i=i-1;i>=0;--i) 44 printf("%c",y[i]); 45 46 printf("\n"); 47 }

5. 实验任务5
1 #include<stdio.h> 2 #define N 5 3 4 //函数声明 5 void input(int x[],int n); 6 void output(int x[],int n); 7 double average(int x[],int n); 8 void bubble_sort(int x[],int n); 9 10 int main() 11 { 12 int scores[N]; 13 double ave=0; 14 15 printf("录入%d个分数:\n",N); 16 input(scores,N); 17 18 printf("\n输出课程分数:\n"); 19 output(scores,N); 20 21 printf("\n课程分数处理:计算均分、排序...\n"); 22 ave=average(scores,N); 23 bubble_sort(scores,N); 24 25 printf("\n输出课程均分:%.2lf\n",ave); 26 printf("\n输出课程分数(高->低):\n"); 27 output(scores,N); 28 29 return 0; 30 31 } 32 33 void input(int x[],int n) 34 { 35 int i; 36 for(i=0;i<n;++i) 37 scanf("%d",&x[i]); 38 39 } 40 void output(int x[],int n) 41 { 42 int i; 43 for(i=0;i<n;++i) 44 printf("%d ",x[i]); 45 printf("\n"); 46 } 47 double average(int x[],int n) 48 { 49 int i; 50 double ave=0; 51 52 for(i=0;i<n;++i) 53 ave+=x[i]; 54 ave/=n; 55 56 return ave; 57 } 58 void bubble_sort(int x[],int n) 59 { 60 int i,j,t,k; 61 for(i=0;i<n-1;++i) 62 { 63 for(j=i,k=0;j<n-1;++j) 64 if(x[j]<x[j+1]) 65 { 66 t=x[j]; 67 x[j]=x[j+1]; 68 x[j+1]=t; 69 k++; 70 } 71 if(k==0) 72 break; 73 } 74 }

6. 实验任务6
1 #include<stdio.h> 2 #include<string.h> 3 4 #define N 5 5 #define M 20 6 7 //函数声明 8 void output(char str[][M],int n); 9 void bubble_sort(char str[][M],int n); 10 11 int main() 12 { 13 char name[][M]={"Bob","Bill","Joseph","Tay","George"}; 14 15 printf("输出初始名单:\n"); 16 output(name,N); 17 18 printf("\n排序中...\n"); 19 bubble_sort(name,N); 20 21 printf("\n按字典序输出名单:\n"); 22 output(name,N); 23 24 return 0; 25 } 26 27 void output(char str[][M],int n) 28 { 29 30 int i; 31 32 for(i=0;i<N;++i) 33 printf("%s ",str[i]); 34 printf("\n"); 35 } 36 37 void bubble_sort(char str[][M],int n) 38 { 39 int i,j,k; 40 char tep[M]; 41 42 for(j=0;j<N-1;++j) 43 { 44 for(i=0,k=0;i<N-j-1;++i) 45 if(strcmp(str[i],str[i+1])>0) 46 { 47 strcpy(tep,str[i]); 48 strcpy(str[i],str[i+1]); 49 strcpy(str[i+1],tep); 50 k++; 51 } 52 if(k==0) 53 break; 54 } 55 }

7. 实验任务7
1 #include<stdio.h> 2 #define N 200 3 void is_repeated(char x[]); 4 int main() 5 { 6 char a[N]; 7 8 while(gets(a)!=NULL) 9 is_repeated(a); 10 11 return 0; 12 } 13 void is_repeated(char x[]) 14 { 15 int i, j; 16 char m[11]="0123456789"; 17 18 for(i=0;x[i]!='\0';++i) 19 { 20 for(j=0;j<10;++j) 21 if(x[i]==m[j]) 22 { 23 m[j]='10'; 24 break; 25 } 26 if(j==10) 27 { 28 printf("YES\n\n"); 29 break; 30 } 31 } 32 33 if(x[i]=='\0') 34 printf("NO\n\n"); 35 }

8. 实验任务8
1 #include<stdio.h> 2 #define N 100 3 #define M 4 4 5 void output(int x[][N],int n); 6 void rotate_to_right(int x[][N],int n); 7 8 int main() 9 { 10 int t[][N]={{21,12,13,24}, 11 {25,16,47,38}, 12 {29,11,32,54}, 13 {42,21,33,10}}; 14 15 printf("原始矩阵:\n"); 16 output(t,M); 17 18 rotate_to_right(t,M); 19 20 printf("变换后矩阵:\n"); 21 output(t,M); 22 23 return 0; 24 } 25 void output(int x[][N],int n) 26 { 27 int i,j; 28 for(i=0;i<n;++i) 29 { 30 for(j=0;j<n;++j) 31 printf("%d ",x[i][j]); 32 printf("\n"); 33 } 34 } 35 void rotate_to_right(int x[][N],int n) 36 { 37 int i,j; 38 int m[N]; 39 40 for(j=n-1;j>=0;--j) 41 for(i=0;i<n;++i) 42 if(j==n-1) 43 { 44 m[i]=x[i][j]; 45 x[i][j]=x[i][j-1]; 46 } 47 else if(j==0) 48 x[i][j]=m[i]; 49 else 50 x[i][j]=x[i][j-1]; 51 52 }

9. 实验任务9
1 #include<stdio.h> 2 # define N 100 3 void output(int x[][N],int n); 4 void mofang(int x[][N],int n); 5 int jianyan(int x[][N],int n); 6 int main() 7 { 8 int n; 9 int x[N][N]; 10 11 while(scanf("%d",&n)!=EOF) 12 { 13 mofang(x,n); 14 output(x,n); 15 if(jianyan(x,n)) 16 printf("每行、每列、每条对角线上的和都是:%d\n",jianyan(x,n)); 17 printf("\n"); 18 } 19 20 return 0; 21 } 22 23 void output(int x[][N],int n) 24 { 25 int i,j; 26 27 for(i=0;i<n;++i) 28 { 29 for(j=0;j<n;++j) 30 printf("%6d",x[i][j]); 31 printf("\n"); 32 } 33 printf("\n"); 34 } 35 36 void mofang(int x[][N],int n) 37 { 38 int i,j,k; 39 40 for(i=0;i<n;++i) 41 for(j=0;j<n;++j) 42 x[i][j]=0; 43 44 for(i=0,j=n/2,k=1;k<=n*n;) 45 { 46 if(i<0) 47 i=n+i; 48 if(j>=n) 49 j=j-n; 50 51 if(x[i][j]!=0) 52 { 53 i=i+2; 54 j--; 55 } 56 57 if(i>=n) 58 i=i-n; 59 if(j<0) 60 j=n+j; 61 62 if(x[i][j]==0) 63 x[i--][j++]=k++; 64 else 65 continue; 66 } 67 } 68 int jianyan(int x[][N],int n) 69 { 70 int i,j,a[N]={0},b[N]={0},c[N]={0}; 71 72 for(i=0;i<n;++i) 73 for(j=0;j<n;++j) 74 a[i]+=x[i][j]; 75 76 for(j=0;j<n;++j) 77 for(i=0;i<n;++i) 78 b[j]+=x[i][j]; 79 80 for(i=0;i<n;++i) 81 c[0]+=x[i][i]; 82 for(i=0,j=n-1;i<n;++i,--j) 83 c[1]+=x[i][j]; 84 85 if(c[0]!=c[1]) 86 return 0; 87 for(i=0;i<n-1;++i) 88 if(a[i]!=a[i+1]||b[i]!=b[i+1]||a[i]!=b[i]||a[i]!=c[1]) 89 return 0; 90 91 if(i==n-1) 92 return c[0]; 93 }

浙公网安备 33010602011771号