实验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 }

 

posted @ 2023-04-15 19:52  202113020120张艳  阅读(12)  评论(0编辑  收藏  举报