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

 

posted @ 2023-11-14 10:42  If-You  阅读(47)  评论(0)    收藏  举报