实验4

task1

1.1

代码

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

截图

是。4个。一样。

是。1个。一样。

1.2

代码

 1 #include <stdio.h>
 2 #define N 2
 3 #define M 4
 4 void test1() {
 5     int a[N][M] = {{1, 9, 8, 4}, {2, 0, 4, 9}};
 6     int i, j;
 7     // 输出int类型二维数组a占用的内存字节数
 8     printf("sizeof(a) = %d\n", sizeof(a));
 9     // 输出int类型二维数组a中每个元素的地址、值 
10     for (i = 0; i < N; ++i)
11         for (j = 0; j < M; ++j)
12             printf("%p: %d\n", &a[i][j], a[i][j]);
13     printf("\n");
14     // 输出int类型二维数组名a, 以及,a[0], a[1]的值
15     printf("a = %p\n", a);
16     printf("a[0] = %p\n", a[0]);
17     printf("a[1] = %p\n", a[1]);
18     printf("\n");
19 }
20 void test2() {
21     char b[N][M] = {{'1', '9', '8', '4'}, {'2', '0', '4', '9'}};
22     int i, j;
23     // 输出char类型二维数组b占用的内存字节数
24     printf("sizeof(b) = %d\n", sizeof(b));
25     // 输出char类型二维数组b中每个元素的地址、值
26     for (i = 0; i < N; ++i)
27         for (j = 0; j < M; ++j)
28             printf("%p: %c\n", &b[i][j], b[i][j]);
29     printf("\n");
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 }
35 int main() {
36     printf("测试1: int型两维数组");
37     test1();
38     printf("\n测试2: char型两维数组");
39     test2();
40     return 0;
41 }
View Code

截图

是。4个字节。是一样的。
是。1个字节。是一样的。
相差16个字节。相差4个字节。正好是一行数组的所占字节数。

task2

代码

 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 }
View Code

截图

因为test2中用了一个二维数组做两个数组的交换,需要用[]表明两个数组的不同。而test1中用了两个不同的一维数组,无需标注。

task3

3.1

代码

 1 #include <stdio.h>
 2 #define N 80
 3 int count(char x[]);
 4 int main() {
 5     char words[N+1];
 6     int n;
 7     while(gets(words) != NULL) {
 8         n = count(words);
 9         printf("单词数: %d\n\n", n);
10     }
11     return 0;
12 }
13 int count(char x[]) {
14     int i;
15     int word_flag = 0;  // 用作单词标志,一个新单词开始,值为1;单词结束,值为0
16     int number = 0;  // 统计单词个数
17     for(i = 0; x[i] != '\0'; i++) {
18         if(x[i] == ' ')
19             word_flag = 0;
20         else if(word_flag == 0) {
21             word_flag = 1;
22             number++;
23         }
24     }
25     return number;
26 }
View Code

截图

3.2

代码

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

截图

task4

代码

 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);  // 函数调用: 把x转换成二进制输出
11         dec_to_n(x, 8);  // 函数调用: 把x转换成八进制输出
12         dec_to_n(x, 16); // 函数调用: 把x转换成十六进制输出
13 
14         printf("\n输入一个十进制整数: ");
15     }
16 
17     return 0;
18 }
19 
20 void dec_to_n(int x,int n){
21     int i=0,j,a;
22     char t[10000]={0};
23     while(x!=0){
24         a=x%n;
25         if(a<10)
26             t[i]=a;
27         else{
28             switch(a){
29                 case 10:t[i]='A';break;
30                 case 11:t[i]='B';break;
31                 case 12:t[i]='C';break;
32                 case 13:t[i]='D';break;
33                 case 14:t[i]='E';break;
34                 case 15:t[i]='F';break;
35             }
36         }
37         x=x/n;
38         ++i;
39     }
40     if(n!=16)
41         for(j=i-1;j>=0;j--)
42             printf("%d",t[j]);
43     else{
44         for(j=i-1;j>=0;j--)
45             if(t[j]<='F'&&t[j]>='A')
46                 printf("%c",t[j]);
47         else
48             printf("%d",t[j]);
49     }
50     printf("\n");
51 } 
52 // 函数定义
53 // 功能: 把十进制数x转换成n进制,打印输出
54 // 补足函数实现
55 // ×××
View Code

截图

task5

代码

 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     return 0;
27 }
28 // 函数定义
29 // 输入n个整数保存到整型数组x中 
30 void input(int x[], int n) {
31     int i;
32     for(i = 0; i < n; ++i)
33         scanf("%d", &x[i]); 
34 }
35 // 输出整型数组x中n个元素 
36 void output(int x[], int n) {
37     int i;
38     for(i = 0; i < n; ++i)
39         printf("%d ", x[i]);
40     printf("\n");
41 }
42 // 计算整型数组x中n个元素均值,并返回 
43 // 补足函数average()实现
44 // ×××
45 double average(int x[], int n){
46     int i,avg=0;
47     for(i=0;i<n;++i)
48         avg=x[i]+avg;
49     avg=avg/n;
50     return avg;
51 } 
52 // 对整型数组x中的n个元素降序排序 
53 // 补足函数bubble_sort()实现
54 // ×××
55 void bubble_sort(int x[], int n){
56     int i,k,j;
57     for(i=0;i<n-1;++i){
58         for(j=0;j<n-1-i;++j)
59             if(x[j]<x[j+1]){
60                 k=x[j];
61                 x[j]=x[j+1];
62                 x[j+1]=k;
63             }
64     }
65 } 
View Code

截图

task6

代码

 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     char name[][M] = {"Bob", "Bill", "Joseph", "Taylor", "George"};
13     int i;
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 // 函数定义
28 // 功能:按行输出二维数组中的字符串
29 void output(char str[][M], int n) {
30     int i;
31 
32     for(i = 0; i < n; ++i)
33         printf("%s\n", str[i]);
34 }
35 
36 // 函数定义
37 // 功能:使用冒泡排序算法对二维数组str中的n个字符串按字典序排序
38 // 补足函数bubble_sort()实现 
39 // ×××
40 void bubble_sort(char str[][M], int n){
41     int i,j,t=1;
42     char k[1000];
43     for(i=0;i<n-1;++i){
44         for(j=0;j<n-1-i;++j){
45             if(strcmp(str[j],str[j+1])>0){
46                 strcpy(k,str[j]);
47                 strcpy(str[j],str[j+1]);
48                 strcpy(str[j+1],k);
49             }
50         }
51     }
52 }
View Code

截图

task7

代码

 1 #include<stdio.h>
 2 int main(){
 3     char x[100];
 4     while(gets(x)!=NULL){
 5         int y[10],i,t,j=0;
 6         for(i=0;i<10;++i)
 7             y[i]=0;
 8         for(i=0;x[i]!='\0';++i){
 9             t=x[i]-48;
10             switch(t){
11                 case 0:++y[0];break;
12                 case 1:++y[1];break;
13                 case 2:++y[2];break;
14                 case 3:++y[3];break;
15                 case 4:++y[4];break;
16                 case 5:++y[5];break;
17                 case 6:++y[6];break;
18                 case 7:++y[7];break;
19                 case 8:++y[8];break;
20                 case 9:++y[9];break;
21             }
22  
23         }
24         while(y[j]<2&&j<i)
25             ++j;
26         if(j==i)
27             printf("NO\n");
28         else
29             printf("YES\n");
30     }
31     return 0;
32 }
View Code

截图

task8

代码

 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     rotate_to_right(t, M);//函数调用 
18     printf("变换后矩阵\n");
19     output(t, M); //函数调用 
20 
21     return 0;
22 }
23 
24 //函数调用 
25 //功能:输出一个n*n的矩阵x
26 void output(int x[][N], int n) {
27     int i, j;
28 
29     for (i = 0; i < n; ++i) {
30         for (j = 0; j < n; ++j)
31             printf("%4d", x[i][j]);
32         printf("\n");
33     }
34 }
35 
36 //待补足3:函数rotate_to_right()定义 
37 //功能:把一个n*n的矩阵x,每一列向右移,最右边被移出去的一列绕回左边 
38 // xxx
39 void rotate_to_right(int x[][N], int n){
40     int i,j,y[N][N]={0},t;
41     for(i=0;i<n;++i)
42         for(j=0;j<n;++j)
43             y[i][j]=x[i][j];
44     for(i=n-1;i>0;i--){
45              for(j=0;j<n;j++)
46              x[j][i]=y[j][i-1];
47      }
48     for(j=0;j<n;j++)
49              x[j][0]=y[j][n-1];
50 }
View Code

截图

 

posted @ 2023-11-19 16:03  Alex013  阅读(2)  评论(0编辑  收藏  举报