实验5 C语言指针应用编程

 

 实验任务1:

task1.1源代码:

 1 #include <stdio.h>
 2 #define N 5
 3 void input(int x[], int n);
 4 void output(int x[], int n);
 5 void find_min_max(int x[], int n, int* pmin, int* pmax);
 6 int main() {
 7     int a[N];
 8     int min, max;
 9     printf("录入%d个数据:\n", N);
10     input(a, N);
11     printf("数据是: \n");
12     output(a, N);
13     printf("数据处理...\n");
14     find_min_max(a, N, &min, &max);
15     printf("输出结果:\n");
16     printf("min = %d, max = %d\n", min, max);
17     return 0;
18 }
19 void input(int x[], int n) {
20     int i;
21     for (i = 0; i < n; ++i)
22         scanf("%d", &x[i]);
23 }
24 void output(int x[], int n) {
25     int i;
26     for (i = 0; i < n; ++i)
27         printf("%d ", x[i]);
28     printf("\n");
29 }
30 void find_min_max(int x[], int n, int* pmin, int* pmax) {
31     int i;
32     *pmin = *pmax = x[0];
33     for (i = 0; i < n; ++i)
34         if (x[i] < *pmin)
35             *pmin = x[i];
36         else if (x[i] > *pmax)
37             *pmax = x[i];
38 }

运行截图:

1111

1.find_min_max功能:遍历数组,找出数组中的最小值和最大值,通过指针参数带回主函数。

2. line45时pmin、pmax指向:pmin指向main函数中变量min的地址;pmax指向main函数中变量max的地址。

 

task2.2源代码:

 1 #include <stdio.h>
 2 #define N 5
 3 void input(int x[], int n);
 4 void output(int x[], int n);
 5 int* find_max(int x[], int n);
 6 int main() {
 7     int a[N];
 8     int* pmax;
 9     printf("录入%d个数据:\n", N);
10     input(a, N);
11     printf("数据是: \n");
12     output(a, N);
13     printf("数据处理...\n");
14     pmax = find_max(a, N);
15     printf("输出结果:\n");
16     printf("max = %d\n", *pmax);
17     return 0;
18 }
19 void input(int x[], int n) {
20     int i;
21     for (i = 0; i < n; ++i)
22         scanf_s("%d", &x[i]);
23 }
24 void output(int x[], int n) {
25     int i;
26     for (i = 0; i < n; ++i)
27         printf("%d ", x[i]);
28     printf("\n");
29 }
30 int* find_max(int x[], int n) {
31     int max_index = 0;
32     int i;
33     for (i = 0; i < n; ++i)
34         if (x[i] > x[max_index])
35             max_index = i;
36     return &x[max_index];
37 }

运行截图:

111112

1. find_max功能:找到数组中最大值元素,返回该元素的地址。

2. 改写后可以实现同样功能,逻辑等价,都是用指针遍历找到最大值地址并返回。

 

 

实验任务2:

task2.1源代码:

#include <stdio.h>
#include <string.h>
#define N 80
int main() {
    char s1[N] = "Learning makes me happy";
    char s2[N] = "Learning makes me sleepy";
    char tmp[N];
    printf("sizeof(s1) vs. strlen(s1): \n");
    printf("sizeof(s1) = %d\n", sizeof(s1));
    printf("strlen(s1) = %d\n", strlen(s1));
    printf("\nbefore swap: \n");
    printf("s1: %s\n", s1);
    printf("s2: %s\n", s2);
    printf("\nswapping...\n");
    strcpy_s(tmp, N,s1);
    strcpy_s(s1, N,s2);
    strcpy_s(s2,N, tmp);
    printf("\nafter swap: \n");
    printf("s1: %s\n", s1);
    printf("s2: %s\n", s2);
    return 0;
}

运行截图:

222221

1. s1大小80字节;sizeof算数组总空间;strlen算有效字符长度。

2. 不能替换:数组名是地址常量,不能直接赋值。

3. 内容交换成功。

task2.1源代码:

 

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 80
 5 int main() {
 6     char* s1 = "Learning makes me happy";
 7     char* s2 = "Learning makes me sleepy";
 8     char* tmp;
10     printf("sizeof(s1) vs. strlen(s1): \n");
11     printf("sizeof(s1) = %d\n", sizeof(s1));
12     printf("strlen(s1) = %d\n", strlen(s1));
14     printf("\nbefore swap: \n");
15     printf("s1: %s\n", s1);
16     printf("s2: %s\n", s2);
18     printf("\nswapping...\n");
19     tmp = s1;
20     s1 = s2;
21     s2 = tmp;
23     printf("\nafter swap: \n");
24     printf("s1: %s\n", s1);
25     printf("s2: %s\n", s2);
27     return 0;
28 }

运行截图:

222222

1. s1存字符串首地址;sizeof是指针大小;strlen同数组。

2. 可以替换,语义等价:指针指向常量串。

3. 交换指针指向,常量串本身不交换。

 

实验任务3:

源代码:

 1 #include <stdio.h>
 2 int main() {
 3     int x[2][4] = { {1, 9, 8, 4}, {2, 0, 4, 9} };
 4     int i, j;
 5     int* ptr1;     
 6     int(*ptr2)[4]; 
 7     printf("输出1: 使用数组名、下标直接访问二维数组元素\n");
 8     for (i = 0; i < 2; ++i) {
 9         for (j = 0; j < 4; ++j)
10             printf("%d ", x[i][j]);
11         printf("\n");
12     }
13     printf("\n输出2: 使用指针变量ptr1(指向元素)访问\n");
14     for (ptr1 = &x[0][0], i = 0; ptr1 < &x[0][0] + 8; ++ptr1, ++i) {
15         printf("%d ", *ptr1);
16         if ((i + 1) % 4 == 0)
17             printf("\n");
18     }
19     printf("\n输出3: 使用指针变量ptr2(指向一维数组)访问\n");
20     for (ptr2 = x; ptr2 < x + 2; ++ptr2) {
21         for (j = 0; j < 4; ++j)
22             printf("%d ", *(*ptr2 + j));
23         printf("\n");
24     }
25     return 0;
26 }

运行截图:

333

1.int (*ptr)[4]:指向含4个int的一维数组。

2.int *ptr[4]:指针数组,存放4个int*。

 

实验任务4:

源代码:

 1 #include <stdio.h>
 2 #define N 80
 3 void replace(char* str, char old_char, char new_char); 
 4 int main() {
 5     char text[N] = "Programming is difficult or not, it is a question.";
 6     printf("原始文本: \n");
 7     printf("%s\n", text);
 8     replace(text, 'i', '*'); 
 9     printf("处理后文本: \n");
10     printf("%s\n", text);
11     return 0;
12 }
13 void replace(char* str, char old_char, char new_char) {
14     int i;
15     while (*str) {
16         if (*str == old_char)
17             *str = new_char;
18         str++;
19     }
20 }

运行截图:

4444

1. 功能:将字符串中指定字符替换为新字符。

2. 可以。

 

实验任务5:‘

源代码:

 1 #include <stdio.h>
 2 #define N 80
 3 char* str_trunc(char* str, char x);
 4 int main() {
 5     char str[N];
 6     char ch;
 7     while (printf("输入字符串: "), gets(str) != NULL) {
 8         printf("输入一个字符: ");
 9         ch = getchar();
10         printf("截断处理...\n");
11         str_trunc(str, ch);         // 函数调用
12         printf("截断处理后的字符串: %s\n\n", str);
13         getchar();
14     }
15     return 0;
16 }
17 char* str_trunc(char* str, char x) {
18     char* p = str;
19     while (*p && *p != x) p++;
20     *p = '\0';
21     return str;
22 }

运行截图:

55555

去掉getchar()会吞掉换行,导致字符输入异常,作用是当缓冲区防止多余换行。

 

实验任务6:

源代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 5
 4 int check_id(char* str); 
 5 int main()
 6 {
 7     char* pid[N] = { "31010120000721656X",
 8                     "3301061996X0203301",
 9                     "53010220051126571",
10                     "510104199211197977",
11                     "53010220051126133Y" };
12     int i;
13     for (i = 0; i < N; ++i)
14         if (check_id(pid[i])) /
15             printf("%s\tTrue\n", pid[i]);
16         else
17             printf("%s\tFalse\n", pid[i]);
18     return 0;
19 }
20 int check_id(char* str) {
21     int len = strlen(str);
22     if (len != 18) return 0;
23     for (int i = 0; i < 17; i++) {
24         if (!(str[i] >= '0' && str[i] <= '9')) return 0;
25     }
26     char last = str[17];
27     if (!((last >= '0' && last <= '9') || last == 'X')) return 0;
28     return 1;
29 }

运行截图:

66666

 

实验任务7:

源代码:

 1 #include <stdio.h>
 2 #define N 80
 3 void encoder(char* str, int n); 
 4 void decoder(char* str, int n); 
 5 int main() {
 6     char words[N];
 7     int n;
 8     printf("输入英文文本: ");
 9     gets(words);
10     printf("输入n: ");
11     scanf_s("%d", &n);
12     printf("编码后的英文文本: ");
13     encoder(words, n);      
14     printf("%s\n", words);
15     printf("对编码后的英文文本解码: ");
16     decoder(words, n);
17     printf("%s\n", words);
18     return 0;
19 }
20 void encoder(char* str, int n) {
21     while (*str) {
22         if (*str >= 'a' && *str <= 'z') {
23             *str = (*str - 'a' + n) % 26 + 'a';
24         }
25         else if (*str >= 'A' && *str <= 'Z') {
26             *str = (*str - 'A' + n) % 26 + 'A';
27         }
28         str++;
29     }
30 }
31 void decoder(char* str, int n) {
32     while (*str) {
33         if (*str >= 'a' && *str <= 'z') {
34             *str = (*str - 'a' - n + 26) % 26 + 'a';
35         }
36         else if (*str >= 'A' && *str <= 'Z') {
37             *str = (*str - 'A' - n + 26) % 26 + 'A';
38         }
39         str++;
40     }
41 }

运行截图:

7777

77772

77773

 

 

实验任务8:

源代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int main(int argc, char* argv[]) {
 5     int i, j;
 6     char* tmp;
 7     for (i = 1; i < argc - 1; i++) {
 8         for (j = i + 1; j < argc; j++) {
 9             if (strcmp(argv[i], argv[j]) > 0) {
10                 tmp = argv[i];
11                 argv[i] = argv[j];
12                 argv[j] = tmp;
13             }
14         }
15     }
16     for (i = 1; i < argc; i++)
17         printf("hello, %s\n", argv[i]);
18     return 0;
19 }

运行截图:

888888888888

 

posted @ 2026-06-02 18:09  rjyyy  阅读(8)  评论(0)    收藏  举报