实验4 数组应用编程
1.task1
task1_1.c
1 #include<stdio.h> 2 #define N 4 3 int main() 4 { 5 int a[N]={2,0,2,3}; 6 char b[N]={'2','0','2','3'}; 7 int i; 8 printf("sizeof(int)=%d\n",sizeof(int)); 9 printf("sizeof(char)=%d\n",sizeof(char)); 10 printf("\n"); 11 //输出int型数组a中每个元素的地址、值 12 for(i=0;i<N;++i) 13 printf("%p:%d\n",&a[i],a[i]); //%p用于以十六进制输出地址 14 printf("\n"); 15 16 //输出char型数组b中每个元素的地址、值 17 for(i=0;i<N;++i) 18 printf("%p:%c\n",&b[i],b[i]); 19 printf("\n"); 20 //输出数组名a和b对应的值 21 printf("a=%p\n",a); 22 printf("c=%p\n",b); 23 return 0; 24 25 }
1.int型数组a在内存中连续存放,每个元素占用4个内存字节单元。
2.char型数组a在内存中连续存放,每个元素占用1个内存字节单元。
数组名a对应的值和&a[0]一样;数组名b对应的值和&b[0]一样。
task1_2.c
1 #include<stdio.h> 2 #define N 2 3 #define M 3 4 5 int main() 6 { 7 int a[N][M]={{1,2,3},{4,5,6}}; 8 char b[N][M]={{'1','2','3'},{'4','5','6'}}; 9 int i,j; 10 11 //输出int型二维数组a中每个元素的地址、值 12 for(i=0;i<N;++i) 13 for(j=0;j<M;++j) 14 printf("%p:%d\n",&a[i][j],a[i][j]); 15 16 printf("\n"); 17 18 //输出int型二维数组名a,以及a[0],a[1]的值 19 printf("a=%p\n",a); 20 printf("a[0]=%p\n",a[0]); 21 printf("a[1]=%p\n",a[1]); 22 printf("\n"); 23 24 //输出char型二维数组b中每个元素的地址、值 25 for(i=0;i<N;++i) 26 for(j=0;j<M;++j) 27 printf("%p:%c\n",&b[i][j],b[i][j]); 28 printf("\n"); 29 30 //输出char型二维数组名b,以及 b[0],b[1]的值 31 printf("b=%p\n",b); 32 printf("b[0]=%p\n",b[0]); 33 printf("b[1]=%p\n",b[1]); 34 printf("\n"); 35 36 return 0; 37 }
1.int型二维数组a在内存中按行连续存放,每个元素占用4个内存字节单元。
2.int型二维数组a,数组名a的值和&a[0][0]的值在数字字面上一致。
3.char型二维数组b,在内存中按按行连续存放,每个元素占用1个内存字节单元。
4.char型二维数组b,数组名b的值&b[0][0]在数字字面上一致。
5.对于二维数组,a[0]和a[1]内存地址差12个内存字节单元;b[0]和b[1]差3个内存字节单元。
2.task2
task2.c
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 int main() 10 { 11 printf("测试1:用两个一维数组,实现两个字符串交换\n"); 12 test1(); 13 14 printf("测试2:用二维数组,实现两个字符串交换\n"); 15 test2(); 16 } 17 void test1() 18 { 19 char views1[N]="hey,c,i hate u"; 20 char views2[N]="hey,c,i love u"; 21 22 printf("交换前:\n"); 23 puts(views1); 24 puts(views2); 25 26 swap_str(views1,views2); 27 28 printf("交换后:\n"); 29 puts(views1); 30 puts(views2); 31 } 32 33 void test2() 34 { 35 char views[2][N]={"hey,c,i hate u.","hey,c,i love u"}; 36 37 printf("交换前:\n"); 38 puts(views[0]); 39 puts(views[1]); 40 41 swap_str(views[0],views[1]); 42 43 printf("交换后:\n"); 44 puts(views[0]); 45 puts(views[1]); 46 } 47 48 void swap_str(char s1[N],char s2[N]) 49 { 50 char tmp[N]; 51 strcpy(tmp,s1); 52 strcpy(s1,s2); 53 strcpy(s2,tmp); 54 }
一维数组元素在内存中线性存储,不用加中括号就能找到第一个元素存储的地址;二维数组可以看成是一维数组的数组,所以需要加中括号来找到其中一个一维数组的存储地址。
3.task3
task3_1.c
1 /* 2 从键盘输入一行英文文本,统计英文单词总数 3 为了简化问题处理,只考虑单词以空格间隔的情形 4 对教材例5.22代码做了些微改动: 5 1. 统计单词个数,编写成函数模块;增加了多组输入 6 2. 去掉了不必要的中间变量 7 */ 8 9 #include <stdio.h> 10 11 #define N 80 12 13 int count(char x[]); 14 15 int main() { 16 char words[N+1]; 17 int n; 18 19 while(gets(words) != NULL) { 20 n = count(words); 21 printf("单词数: %d\n\n", n); 22 } 23 24 return 0; 25 } 26 27 int count(char x[]) { 28 int i; 29 int word_flag = 0; // 用作单词标志,一个新单词开始,值为1;单词结束,值为0 30 int number = 0; // 统计单词个数 31 32 for(i = 0; x[i] != '\0'; i++) 33 { 34 if((x[i] == ' ')||(x[i]==',')) 35 word_flag = 0; 36 else if(word_flag == 0) 37 { 38 word_flag = 1; 39 number++; 40 } 41 } 42 43 return number; 44 }
task3_2.c
1 /* 2 输入一行英文文本,统计最长单词,并打印输出。 3 为简化问题,只考虑单词之间用空格间隔的情形。 4 相较于教材例5.24,做了以下改动: 5 1. 增加了多组输入,因此,一些变量初始化放到了第一层循环里面 6 2. 微调了代码书写逻辑和顺序 7 */ 8 9 #include <stdio.h> 10 #define N 1000 11 12 int main() 13 { 14 char line[N]; 15 int word_len;//记录当前单词长度 16 int max_len;//记录最长单词长度 17 int end;//记录最长单词结束位置 18 int i; 19 while(gets(line)!=NULL) 20 { 21 word_len=0; 22 max_len=0; 23 end=0; 24 25 i=0; 26 while(1) 27 { 28 //跳过连续空格 29 while(line[i]==' ') 30 { 31 word_len=0;//单词长度置为0,为新单词统计做准备 32 i++; 33 } 34 35 //在一个单词中,统计当前单词长度 36 while(line[i]!='\0'&&line[i]!=' ') 37 { 38 word_len++; 39 i++; 40 } 41 42 //更新更长单词长度,并记录最长单词结束位置 43 if(max_len<word_len) 44 { 45 max_len=word_len; 46 end=i;//end保存的是单词结束的下一个坐标位置 47 } 48 49 //遍历到文本结束时,终止循环 50 if(line[i]=='\0') 51 break; 52 } 53 54 //输出最长单词 55 printf("最长单词:"); 56 for(i=end-max_len;i<end;++i) 57 printf("%c",line[i]); 58 printf("\n\n"); 59 } 60 return 0; 61 }
可以通过判断其元素的ascii是否位于65-90或97-122之间来判断的。
4.task4
task4.c
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; 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输出课程均分:%.2f\n",ave); 26 printf("\n输出课程分数(高->低):\n"); 27 output(scores,N); 28 return 0; 29 } 30 31 //函数定义 32 //输入n个整数保存到整型数组x中 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 //输出整型数组x中n个元素 41 void output(int x[],int n) 42 { 43 int i; 44 for(i=0;i<n;++i) 45 printf("%d ",x[i]); 46 printf("\n"); 47 } 48 49 //计算整型数组x中n个元素均值,并返回 50 double average(int x[],int n) 51 { 52 int i; 53 double sum=0.0,ave=0.0; 54 for(i=0;i<n;i++) 55 sum=sum+x[i]; 56 ave=sum/n; 57 return ave; 58 } 59 60 61 //对整型数组x中的n个元素降序排序 冒泡排序算法 62 void bubble_sort(int x[],int n) 63 { 64 int i,j,t; 65 66 for(i=0;i<n-1;i++) 67 for(j=0;j<n-1;j++) 68 if(x[j]<x[j+1]) 69 { 70 t=x[j]; 71 x[j]=x[j+1]; 72 x[j+1]=t; 73 } 74 }
5.task5
task5.c
1 #include <stdio.h> 2 #define N 100 3 void dec2n(int x, int n); // 函数声明 4 5 int main() { 6 int x; 7 8 printf("输入一个十进制整数: "); 9 while(scanf("%d", &x) != EOF) { 10 dec2n(x, 2); // 函数调用: 把x转换成二进制输出 11 dec2n(x, 8); // 函数调用: 把x转换成八进制输出 12 dec2n(x, 16); // 函数调用: 把x转换成十六进制输出 13 14 printf("\n输入一个十进制整数: "); 15 } 16 17 return 0; 18 } 19 void dec2n(int x, int n) 20 { 21 int i,j; 22 int a[N]; 23 char ch[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; 24 if (n==2||n==8) 25 { 26 for(i=0;x!=0;i++) 27 { 28 a[i]=x%n; 29 x=x/n; 30 } 31 for(j=i-1;j>=0;j--) 32 printf("%d",a[j]); 33 printf("\n"); 34 } 35 if(n==16) 36 { 37 for(i=0;x!=0;i++) 38 { 39 a[i]=x%n; 40 x=x/n; 41 } 42 for(j=i-1;j>=0;j--) 43 { 44 printf("%c",ch[a[j]]); 45 } 46 printf("\n"); 47 } 48 49 }
6.task6
task6.c
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 9 int main() { 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 26 // 函数定义 27 // 功能: 输出一个n*n的矩阵x 28 void output(int x[][N], int n) { 29 int i, j; 30 31 for (i = 0; i < n; ++i) { 32 for (j = 0; j < n; ++j) 33 printf("%4d", x[i][j]); 34 35 printf("\n"); 36 } 37 } 38 void rotate_to_right(int x[][N], int n) 39 { 40 int a[N]; 41 int i,j,k; 42 for(i=0;i<n;i++) 43 a[i]=x[i][n-1]; 44 for(j=n-2;j>=0;j--) 45 { 46 for(i=0;i<=n-1;i++) 47 x[i][j+1]=x[i][j]; 48 } 49 for(i=0;i<=n-1;i++) 50 { 51 x[i][0]=a[i]; 52 } 53 54 }
7.task7.c
task7_1.c
1 #include <stdio.h> 2 #define N 80 3 4 void replace(char x[], char old_char, char new_char); // 函数声明 5 6 int main() { 7 char text[N] = "c programming is difficult or not, it is a question."; 8 9 printf("原始文本: \n"); 10 printf("%s\n", text); 11 12 replace(text, 'i', '*'); // 函数调用 注意字符形参写法,单引号不能少 13 14 printf("处理后文本: \n"); 15 printf("%s\n", text); 16 17 return 0; 18 } 19 20 // 函数定义 21 void replace(char x[], char old_char, char new_char) { 22 int i; 23 24 for (i = 0; x[i] != '\0'; ++i) // 思考: '\0'是什么,为什么能作为循环结束条件 25 if (x[i] == old_char) 26 x[i] = new_char; 27 }
1.replace的功能是把字符串中的某个字符全部替换为另一个字符。
2.'\0'表示字符串的结束。
task7_2.c
1 #include <stdio.h> 2 #define N 80 3 4 int main() { 5 char str[N], ch; 6 int i; 7 8 printf("输入字符串: "); 9 gets(str); 10 11 printf("输入一个字符: "); 12 ch = getchar(); 13 14 printf("截断处理......"); 15 16 i = 0; 17 while (str[i] != '\0') { 18 if (str[i] == ch) 19 str[i]='\0';// blank1 20 21 i+=1;// blank2 22 } 23 str[i] ='\0'; // blank3 24 25 printf("\n截断处理后字符串: %s\n", str); 26 27 return 0; 28 }
8.task8
task8.c
1 #include <stdio.h> 2 #include <string.h> 3 4 #define N 5 5 #define M 20 6 7 void bubble_sort(char str[][M], int n); // 函数声明 8 9 int main() { 10 char name[][M] = {"Bob", "Bill", "Joseph", "Taylor", "George"}; 11 int i; 12 13 printf("输出初始名单:\n"); 14 for (i = 0; i < N; i++) 15 printf("%s\n", name[i]); 16 17 printf("\n排序中...\n"); 18 bubble_sort(name, N); // 函数调用 19 20 printf("\n按字典序输出名单:\n"); 21 for (i = 0; i < N; i++) 22 printf("%s\n", name[i]); 23 24 return 0; 25 } 26 27 void bubble_sort(char str[][M], int n) 28 { 29 int i,j; 30 char t[50]; 31 for(i=0;i<=n-1;i++) 32 { 33 for(j=0;j<=n-1;j++) 34 if(strcmp(str[j],str[j+1])>0) 35 { 36 strcpy(t,str[j]); 37 strcpy(str[j],str[j+1]); 38 strcpy(str[j+1],t); 39 } 40 } 41 }