实验4

task1

1. int型数组a,在内存中是连续存放的,每个元素占用4个内存字节单元,数组名a对应的值,和&a[0]一样
2. char型数组b,在内存中是连续存放的,每个元素占用1个内存字节单元,数组名b对应的值,和&b[0]一样

 

3. int型二维数组a,在内存中按行连续存放,每个元素占用4个内存字节单元
    数组名a的值、a[0]的值、 &a[0][0]的值,在数字字面值上一样
4. char型二维数组b,在内存中按行连续存放,每个元素占用1个内存字节单元
    数组名b的值、b[0]的值、 &b[0][0]的值,在数字字面值上一样
5. 对于二维数组,a[0], a[1]的值之间相差4
    b[0]和b[1]的值,它们之间相差1
    相差一个sizeof(int)和sizeof(char)

 

 

 

task2

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 80
 4 void swap_str(char s1[N], char s2[N]);
 5 void test1();
 6 void test2();
 7 int main() {
 8 printf("测试1: 用两个一维char数组,实现两个字符串交换\n");
 9 test1();
10 printf("\n测试2: 用二维char数组,实现两个字符串交换\n");
11 test2();
12 return 0;
13 }
14 void test1() {
15 char views1[N] = "hey, C, I hate u.";
16 char views2[N] = "hey, C, I love u.";
17 printf("交换前: \n");
18 puts(views1);
19 puts(views2);
20 swap_str(views1, views2);
21 printf("交换后: \n");
22 puts(views1);
23 puts(views2);
24 }
25 void test2() {
26 char views[2][N] = {"hey, C, I hate u.",
27 "hey, C, I love u."};
28 printf("交换前: \n");
29 puts(views[0]);
30 puts(views[1]);
31 swap_str(views[0], views[1]);
32 printf("交换后: \n");
33 puts(views[0]);
34 puts(views[1]);
35 }
36 void swap_str(char s1[N], char s2[N]) {
37     char tmp[N];
38     strcpy(tmp, s1);
39     strcpy(s1, s2);
40     strcpy(s2, tmp);
41 }

函数模块swap_str()的形参是一维数组。为什么test1()和test2()模块中调用时,实参的书写形式一个不加[]、一个加[]?

因为test1中,view代表一个一维数组
而在test2中代表一个二维数组,view[x]则是一个一维数组

 

 

 

task3_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 }

 

task3_2

#include <stdio.h>
#define N 1000
int main() {
    char line[N];
    int word_len; // 记录当前单词长度
    int max_len; // 记录最长单词长度
    int end; // 记录最长单词结束位置
    int i;
    while (gets(line) != NULL) {
        word_len = 0;
        max_len = 0;
        end = 0;
        i = 0;
        while (1) {
            // 跳过连续空格
            while (line[i] == ' ') {
                word_len = 0; // 单词长度置0,为新单词统计做准备
                i++;
            }
            // 在一个单词中,统计当前单词长度
            while (line[i] != '\0' && line[i] != ' ') {
                word_len++;
                i++;
            }
            // 更新更长单词长度,并,记录最长单词结束位置
            if (max_len < word_len) {
                max_len = word_len;
                end = i; // end保存的是单词结束的下一个坐标位置
            }
            // 遍历到文本结束时,终止循环
            if (line[i] == '\0')
                break;
        }
        // 输出最长单词
        printf("最长单词: ");
        for (i = end - max_len; i < end; ++i)
            printf("%c", line[i]);
        printf("\n\n");
    }
    return 0;
}

 

 

 

task4

#include <stdio.h>
#include <math.h>
#define N 100
void dec_to_n(int x, int n); // 函数声明
int main() {
    int x;
    printf("输入一个十进制整数: ");
    while (scanf("%d", &x) != EOF) {
        dec_to_n(x, 2); // 函数调用: 把x转换成二进制输出
        dec_to_n(x, 8); // 函数调用: 把x转换成八进制输出
        dec_to_n(x, 16); // 函数调用: 把x转换成十六进制输出
        printf("\n输入一个十进制整数: ");
    }
    return 0;
}

void dec_to_n(int x, int n) {
    char s[10] = { 0 };
    int a[10];
    int cnt = 0;
    while (x > 0) {
        a[cnt] = x % n;
        x /= n;
        cnt++;
    }
    for (int i = 0; i < cnt; i++) {
        s[i] = a[i] + 48;
        if (s[i] == ':') {
            s[i] = 'A';
        }
        else if (s[i] == ';') {
            s[i] = 'B';
        }
        else if (s[i] == '<') {
            s[i] = 'C';
        }
        else if (s[i] == '=') {
            s[i] = 'D';
        }
        else if (s[i] == '>') {
            s[i] = 'E';
        }
        else if (s[i] == '?') {
            s[i] = 'F';
        }
    }

    for (int cntt = cnt - 1; cntt >= 0; cntt--) {
        printf("%c", s[cntt]);
    }
    printf("\n");

}

 

 

 

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 int main() {
 9     int scores[N];
10     double ave;
11     printf("录入%d个分数:\n", N);
12     input(scores, N);
13     printf("\n输出课程分数: \n");
14     output(scores, N);
15     printf("\n课程分数处理: 计算均分、排序...\n");
16     ave = average(scores, N);
17     bubble_sort(scores, N);
18     printf("\n输出课程均分: %.2f\n", ave);
19     printf("\n输出课程分数(高->低):\n");
20     output(scores, N);
21     return 0;
22 }
23 // 函数定义
24 // 输入n个整数保存到整型数组x中
25 void input(int x[], int n) {
26     int i;
27     for (i = 0; i < n; ++i)
28         scanf("%d", &x[i]);
29 }
30 // 输出整型数组x中n个元素
31 void output(int x[], int n) {
32     int i;
33     for (i = 0; i < n; ++i)
34         printf("%d ", x[i]);
35     printf("\n");
36 }
37 // 计算整型数组x中n个元素均值,并返回
38 double average(int x[], int n) {
39     double ave;
40     double sum = 0;
41     for (int cnt = 0; cnt < n; cnt++) {
42         sum += x[cnt];
43     }
44     ave = 1.0 * sum / n;
45     return ave;
46 }
47 
48 // 对整型数组x中的n个元素降序排序
49 void bubble_sort(int x[], int n) {
50     int round;
51     for (int cnt = 0; cnt < n; cnt++) {
52         round = n - cnt;
53         for (int cnt = 0; cnt < round; cnt++) {
54             if (x[cnt] <= x[cnt + 1]) {
55                 int i = x[cnt];
56                 x[cnt] = x[cnt + 1];
57                 x[cnt + 1] = i;
58             }
59         }
60     }
61     return x;
62 }

 

 

 

task6

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 5
 4 #define M 20
 5 // 函数声明
 6 void output(char str[][M], int n);
 7 void bubble_sort(char str[][M], int n);
 8 int main() {
 9     char name[][M] = { "Bob", "Bill", "Joseph", "Taylor", "George" };
10     int i;
11     printf("输出初始名单:\n");
12     output(name, N);
13     printf("\n排序中...\n");
14     bubble_sort(name, N); // 函数调用
15     printf("\n按字典序输出名单:\n");
16     output(name, N);
17     return 0;
18 }
19 // 函数定义
20 // 功能:按行输出二维数组中的字符串
21 void output(char str[][M], int n) {
22     int i;
23     for (i = 0; i < n; ++i)
24         printf("%s\n", str[i]);
25 }
26 
27 void bubble_sort(char str[][M], int n) {
28     int round;
29     for (int cnt = 0; cnt < n; cnt++) {
30         round = n - cnt;
31         for (int cnt = 0; cnt < round; cnt++) {
32             if (strcmp(str[cnt], str[cnt + 1]) > 0) {
33                 char i[M];
34                 strcpy(i, str[cnt + 1]);
35                 strcpy(str[cnt + 1], str[cnt]);
36                 strcpy(str[cnt], i);
37             }
38         }
39     }
40 }

 

 

 

task7

 1 #include <stdio.h>
 2 #include <string.h>
 3 int main()
 4 {
 5     char a[110];
 6     while (scanf("%s", a) != EOF) {
 7         int flag = 0;
 8         for (int n = 0; n < strlen(a); n++) {
 9             for (int s = n + 1; s < strlen(a); s++) {
10                 if (a[n] == a[s]) {
11                     flag = 1;
12                     break;
13                 }
14             }
15             if (flag == 1) {
16                 break;
17             }
18         }
19         if (flag == 1) {
20             printf("YES\n\n");
21         }
22         else if (flag == 0) {
23             printf("NO\n\n");
24         }
25     }
26     return 0;
27 }

 

 

 

task8

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 100
 4 #define M 4
 5 void output(int x[][N], int n); // 函数声明
 6 void rotate_to_right(int x[][N], int n); // 函数声明
 7 int main() {
 8     int t[][N] = { {21, 12, 13, 24},
 9                    {25, 16, 47, 38},
10                    {29, 11, 32, 54},
11                    {42, 21, 33, 10} };
12     printf("原始矩阵:\n");
13     output(t, M); // 函数调用
14     rotate_to_right(t, M); // 函数调用
15     printf("变换后矩阵:\n");
16     output(t, M); // 函数调用
17     return 0;
18 }
19 // 函数定义
20 // 功能: 输出一个n*n的矩阵x
21 void output(int x[][N], int n) {
22     int i, j;
23     for (i = 0; i < n; ++i) {
24         for (j = 0; j < n; ++j)
25             printf("%4d", x[i][j]);
26         printf("\n");
27     }
28 }
29 
30 void rotate_to_right(int x[][N], int n) {
31     int mid[M];
32     for (int j = 0; j < n; j++) {
33         mid[j] = x[j][M - 1];
34     }
35     for (int j = 0; j < n; j++) {
36         for (int i = n-1; i >= 1; i--) {
37             x[j][i] = x[j][i - 1];
38         }
39     }
40     for (int i = 0; i < n; i++) {
41         x[i][0] = mid[i];
42     }
43 }

 

 

 

task9

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int a[110][110] = { 0 };
 5     int n;
 6     while (scanf("%d", &n) != EOF) {
 7         int nn = n * n;
 8         a[0][(n - 1) / 2] = 1;
 9         int i, j;
10         int count = 2;
11         i = 0;
12         j = (n - 1) / 2;
13         while (count <= nn) {
14             i--;
15             j++;
16             if (i == -1) {
17                 i += n;
18             }
19             if (j == n) {
20                 j -= n;
21             }
22             if (a[i][j] != 0) {
23                 i++;
24                 j--;
25                 if (i == n) {
26                     i -= n;
27                 }
28                 if (j == -1) {
29                     j += n;
30                 }
31                 i++;
32             }
33 
34             a[i][j] = count;
35             count++;
36         }
37     
38         for (i = 0; i < n; i++) {
39             for (j = 0; j < n; j++) {            
40                     printf("%d\t", a[i][j]);
41             }
42             printf("\n");
43         }
44         int sum = 0;
45         for (i = 0; i < n; i++) {
46             sum += a[0][i];
47         }
48         printf("相同的和为:%d\n", sum);
49         for (i = 0; i < n; i++) {
50             for (j = 0; j < n; j++) {
51                 a[i][j] = 0;
52             }
53         }
54     }
55     return 0;
56 }

 

posted @ 2023-11-12 23:10  VitaminC++  阅读(83)  评论(0编辑  收藏  举报