实验四 C语言数组应用编程
1.任务1
1-1.c
1 #include <stdio.h> 2 #define N 4 3 4 void test1() { 5 int a[N] = {1, 9, 8, 4}; 6 int i; 7 printf("sizeof(a) = %d\n", sizeof(a)); 8 for (i = 0; i < N; ++i) 9 printf("%p: %d\n", &a[i], a[i]); 10 printf("a = %p\n", a); 11 } 12 13 void test2() { 14 char b[N] = {'1', '9', '8', '4'}; 15 int i; 16 printf("sizeof(b) = %d\n", sizeof(b)); 17 for (i = 0; i < N; ++i) 18 printf("%p: %c\n", &b[i], b[i]); 19 printf("b = %p\n", b); 20 } 21 22 int main() { 23 printf("测试1: int类型一维数组\n"); 24 test1(); 25 printf("\n测试2: char类型一维数组\n"); 26 test2(); 27 28 return 0; 29 }

回答:1:int型数组a,在内存中是连续存放的,每个元素占用4个内存字节单元,数组名a对应的值和&a[0]一样
2:char型数组b,在内存中是连续存放的,每个元素占用1个内存字节单元,数组名b对 应的值,和&b[0]是一样的
1-2.c
1 #include <stdio.h> 2 #define N 2 3 #define M 4 4 5 void test1() { 6 int a[N][M] = {{1, 9, 8, 4},{2,0,4,9}}; 7 int i,j; 8 printf("sizeof(a) = %d\n", sizeof(a)); 9 for (i = 0; i < N; ++i) 10 for(j=0;j<M;j++) 11 printf("%p: %d\n", &a[i][j], a[i][j]); 12 printf("\n"); 13 14 printf("a=%p\n",a); 15 printf("a[0]=%p\n",a[0]); 16 printf("a[1]=%p\n",a[1]); 17 printf("\n"); 18 } 19 20 void test2() { 21 char b[N][M] = {{'1', '9', '8', '4'},{'2','0','4','9'}}; 22 int i,j; 23 printf("sizeof(b) = %d\n", sizeof(b)); 24 for (i = 0; i < N; ++i) 25 for(j=0;j<M;++j) 26 printf("%p: %c\n", &b[i][j], b[i][j]); 27 printf("\n"); 28 printf("b=%p\n",b); 29 printf("b[0]=%p\n",b[0]); 30 printf("b[1]=%p\n",b[1]); 31 } 32 33 int main() { 34 printf("测试1: int型两维数组"); 35 test1(); 36 printf("\n测试2: char型两维数组"); 37 test2(); 38 39 return 0; 40 }

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

回答:1:一维数组数组名不一样,二位数组数组名一样
2:一维数组不用加【】,二维数组需要
3.实验3
3-1.c
1 #include <stdio.h> 2 3 #define N 80 4 5 int count(char x[]); 6 7 int main() { 8 char words[N+1]; 9 int n; 10 11 while(gets(words)!=NULL){ 12 n=count(words); 13 printf("单词数:%d\n\n",n); 14 } 15 16 return 0; 17 } 18 19 int count(char x[]){ 20 int i; 21 int word_flag=0; 22 int number=0; 23 24 for(i=0;x[i]!='\0';i++){ 25 if(x[i]==' ') 26 word_flag=0; 27 else if(word_flag==0){ 28 word_flag=1; 29 number++; 30 } 31 } 32 return number; 33 }

3-2.c
1 #include <stdio.h> 2 3 #define N 1000 4 5 6 int main() { 7 char line[N]; 8 int word_len; 9 int max_len; 10 int end; 11 int i; 12 13 while(gets(line)!=NULL){ 14 word_len=0; 15 max_len=0; 16 end=0; 17 i=0; 18 while(1){ 19 while(line[i]==' '){ 20 word_len=0; 21 i++; 22 }
23 while(line[i]!='\0'&&line[i]!=' '){
24 word_len++; 25 i++; 26 } 27 if(max_len<word_len){ 28 max_len=word_len; 29 end=i; 30 } 31 if(line[i]=='\0') 32 break; 33 } 34 printf("最长单词:"); 35 for(i=end-max_len;i<end;++i) 36 printf("%c",line[i]); 37 printf("\n\n"); 38 } 39 40 return 0; 41 }

思考:可以将其他符号先转换成空格,再用当前代码统计,或者在条件语句中增添其他符号限制。
4.任务4
1 #include <stdio.h> 2 #define N 100 3 void dec_to_n(int x,int n); 4 5 int main() { 6 int x; 7 8 printf("请输入一个十进制整数:"); 9 while(scanf("%d",&x)!=EOF){ 10 dec_to_n(x,2); 11 dec_to_n(x,8); 12 dec_to_n(x,16); 13 14 printf("\n输入一个十进制证整数:"); 15 16 } 17 18 return 0; 19 } 20 21 void dec_to_n(int x,int n){ 22 int i=0; 23 int m[N]; 24 while(x){ 25 i++; 26 m[i]=x%n; 27 x=x/n; 28 if(m[i]>9) 29 m[i]='A'+(m[i]-10); 30 else 31 m[i]='0'+m[i]; 32 } 33 for(int j=i;j>0;j--) 34 printf("%c",m[j]); 35 printf("\n"); 36 37 38 }

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

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

7.实验7
1 #include<stdio.h> 2 #define N 100 3 void panduan(char y[N]); 4 int main(){ 5 char x[N]; 6 while(gets(x)!=NULL) 7 panduan(x); 8 9 return 0; 10 } 11 void panduan(char y[N]){ 12 int i,k,t=0; 13 for(i=0;y[i]!='\0';++i){ 14 for(k=i+1;y[k]!='\0';++k){ 15 if(y[i]==y[k]) 16 t=1; 17 } 18 } 19 if(t==1) 20 printf("YES\n"); 21 else 22 printf("NO\n"); 23 printf("\n"); 24 }

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 int t[][N] = {{21, 12, 13, 24}, 10 {25, 16, 47, 38}, 11 {29, 11, 32, 54}, 12 {42, 21, 33, 10}}; 13 14 printf("原始矩阵:\n"); 15 output(t, M); 16 17 rotate_to_right(t, M); 18 19 printf("变换后矩阵:\n"); 20 output(t, M); 21 22 return 0; 23 } 24 25 void output(int x[][N], int n) { 26 int i, j; 27 28 for (i = 0; i < n; ++i) { 29 for (j = 0; j < n; ++j) 30 printf("%4d", x[i][j]); 31 32 printf("\n"); 33 } 34 } 35 void rotate_to_right(int x[][N], int n){ 36 int list[n]; 37 int i,j; 38 for(i=0;i<n;++i) 39 list[i]=x[i][n-1]; 40 for(i=0;i<n;++i){ 41 for(j=n-1;j>0;--j){ 42 x[i][j]=x[i][j-1]; 43 } 44 } 45 for(i=0;i<n;++i) 46 x[i][0]=list[i]; 47 48 }


浙公网安备 33010602011771号