实验文档5
实验文档5
关于第五次实践课作业
实验结论
task1.c
验证指针变量作为函数参数、指针变量作为函数返回值。
task1_1.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #define N 5 4 5 void input(int x[], int n); 6 void output(int x[], int n); 7 void find_min_max(int x[], int n, int* pmin, int* pmax); 8 9 int main() { 10 int a[N]; 11 int min, max; 12 13 printf("录入%d个数据:\n", N); 14 input(a, N); 15 16 printf("数据是: \n"); 17 output(a, N); 18 19 printf("数据处理...\n"); 20 find_min_max(a, N, &min, &max); 21 22 printf("输出结果:\n"); 23 printf("min = %d, max = %d\n", min, max); 24 25 return 0; 26 } 27 28 void input(int x[], int n) { 29 int i; 30 31 for (i = 0; i < n; ++i) 32 scanf("%d", &x[i]); 33 } 34 35 void output(int x[], int n) { 36 int i; 37 38 for (i = 0; i < n; ++i) 39 printf("%d ", x[i]); 40 printf("\n"); 41 } 42 43 void find_min_max(int x[], int n, int* pmin, int* pmax) { 44 int i; 45 46 *pmin = *pmax = x[0]; 47 48 for (i = 0; i < n; ++i) 49 if (x[i] < *pmin) 50 *pmin = x[i]; 51 else if (x[i] > *pmax) 52 *pmax = x[i]; 53 }
question1:函数 find_min_max 实现的功能是?
answer1:找到录入数据中的最大值与最小值
question2:"指针变量在使用之前必须指向确定的地址"。执行到line46时,指针变量pmin、pmax 分别指向什么?
answer2:指向x[0];
task1_2.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #define N 5 4 5 void input(int x[], int n); 6 void output(int x[], int n); 7 int* find_max(int x[], int n); 8 9 int main() { 10 int a[N]; 11 int* pmax; 12 13 printf("录入%d个数据:\n", N); 14 input(a, N); 15 16 printf("数据是: \n"); 17 output(a, N); 18 19 printf("数据处理...\n"); 20 pmax = find_max(a, N); 21 22 printf("输出结果:\n"); 23 printf("max = %d\n", *pmax); 24 25 return 0; 26 } 27 28 void input(int x[], int n) { 29 int i; 30 31 for (i = 0; i < n; ++i) 32 scanf("%d", &x[i]); 33 } 34 35 void output(int x[], int n) { 36 int i; 37 38 for (i = 0; i < n; ++i) 39 printf("%d ", x[i]); 40 printf("\n"); 41 } 42 43 int* find_max(int x[], int n) { 44 int max_index = 0; 45 int i; 46 47 for (i = 0; i < n; ++i) 48 if (x[i] > x[max_index]) 49 max_index = i; 50 51 return &x[max_index]; 52 }
question1:函数 find_max 的功能是(返回的是什么)?
answer1:返回录入数据中最大数据的地址
question2:把函数 find_max 的实现写成以下代码,可以吗?如果不可以,请给出你的理由。
1 int *find_max(int x[], int n) { 2 int *ptr = &x[0]; 3 int i; 4 for(i = 0; i < n; ++i) 5 if(x[i] > *ptr) 6 ptr = &x[i]; 7 8 return ptr; 9 }
answer2:可以
task2.c
对比使用字符数组、字符指针变量处理字符串的区别
task2_1.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<string.h> 4 #define N 80 5 int main() 6 { 7 char x1[N] = "Learning makes me happy"; 8 char x2[N] = "Learning makes me sleepy"; 9 char tmp[N]; 10 11 printf("sizeof(x1) vs. strlen(x1):\n"); 12 printf("sizeof(x1) = %d\n", sizeof(x1)); 13 printf("strlen(x1) = %d\n", strlen(x1)); 14 15 printf("\nbefore swap:\n"); 16 printf("x1:%s\n", x1); 17 printf("x2:%s\n", x2); 18 19 printf("\nswaping...\n"); 20 strcpy(tmp, x1); 21 strcpy(x1, x2); 22 strcpy(x2, tmp); 23 24 printf("\nafter swap:\n"); 25 printf("x1:%s\n", x1); 26 printf("x2:%s\n", x2); 27 28 return 0; 29 }
question1:数组s1的大小是多少? sizeof(s1) 计算的是什么? strlen(s1) 统计的是什么?
answer1:数组s1的大小是80个字节;
sizeof(s1)计算的是数组s1所占的字节数;
strlen(s1)统计的是字符串的实际长度(不包括‘\0');
question2:line7代码,能否替换成以下写法?如果不能,写出原因。
1 char s1[]; 2 s1 = "Learning makes me happy";
answer2:不能,数组与字符串之间不能相互赋值
question3:line20-22执行后,字符数组s1和s2中的内容是否交换?
answer3:交换
task2_2.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<string.h> 4 #define N 80 5 int main() 6 { 7 char *x1 = "Learning makes me happy"; 8 char *x2 = "Learning makes me sleepy"; 9 char* tmp; 10 11 printf("sizeof(x1) vs. strlen(x1):\n"); 12 printf("sizeof(x1) = %d\n", sizeof(x1)); 13 printf("strlen(x1) = %d\n", strlen(x1)); 14 15 printf("\nbefore swap:\n"); 16 printf("x1:%s\n", x1); 17 printf("x2:%s\n", x2); 18 19 printf("\nswaping...\n"); 20 tmp = x1; 21 x1 = x2; 22 x2 = tmp; 23 24 printf("\nafter swap:\n"); 25 printf("x1:%s\n", x1); 26 printf("x2:%s\n", x2); 27 28 return 0; 29 }
question1:指针变量s1中存放的是什么? sizeof(s1) 计算的是什么? strlen(s1) 统计的是什么?
answer1:指针变量s1中存放的字符串的首地址;
sizeof(s1)计算的是s1的地址所占用的字节数;
strlen(s1)统计的是字符串的实际长度(不包括’\0‘);
question2:line7代码能否替换成下面的写法?对比task2_1.c中的line6, 用文字说明二者的语义区别
1 char *s1; 2 s1 = "Learning makes me happy";
answer2:可以;
task2_1.c中试图将字符串赋值给数组s1的地址,这是不被允许的
task2_2.c中试图将字符串的首地址交给s1指针变量,这是被允许的
question3:line20-line22,交换的是什么?字符串常量"Learning makes me happy"和字符串常量"Learning makes me sleepy"在内存中有没有交换?
answer3:交换的是地址;没有
task3.c
使用指针变量输出二维数组元素:指向数组元素的指针变量,和指向一维数组的指针变量
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 int main() 4 { 5 int x[2][4] = { {1,9,8,4},{2,0,4,9} }; 6 int* ptr1; // 指针变量,存放int类型数据的地址 7 int(*ptr2)[4]; // 指针变量,指向包含4个int元素的一维数组 8 int i, j; 9 printf("输出1: 使用数组名、下标直接访问二维数组元素\n"); 10 for (int i = 0; i < 2; ++i) { 11 for (int j = 0; j < 4; ++j) { 12 printf("%d ", x[i][j]); 13 } 14 printf("\n"); 15 } 16 17 printf("\n输出2: 使用指针变量ptr1(指向元素)间接访问\n"); 18 for (ptr1 = &x[0][0], i = 0; ptr1 < &x[0][0] + 2 * 4; ++ptr1, ++i) { 19 printf("%d ", *ptr1); 20 if ((i + 1) % 4 == 0) { 21 printf("\n"); 22 } 23 } 24 25 printf("\n输出3: 使用指针变量ptr2(指向一维数组)间接访问\n"); 26 for (ptr2 = x; ptr2 < x + 2; ++ptr2) { 27 for (j = 0; j < 4; ++j) { 28 printf("%d ", *(*ptr2 + j)); 29 } 30 printf("\n"); 31 } 32 return 0; 33 }
question1:int (*ptr)[4]; 中,标识符ptr表示的语义是什么?
answer1:ptr是指针,指向的是一个包含4个int型元素的一维数组
question2:int *ptr[4]; 中,标识符ptr表示的语义是什么?
answer2:ptr是一个含有4个指针变量的数组
task4.c
用指针变量处理字符串应用
1 #include <stdio.h> 2 #define N 80 3 4 void replace(char* str, char old_char, char new_char); // 函数声明 5 6 int main() { 7 char text[N] = "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* str, char old_char, char new_char) { 22 int i; 23 24 while (*str) { 25 if (*str == old_char) 26 *str = new_char; 27 str++; 28 } 29 }
question1:函数 replace 的功能是?
answer1:用new_char替换text中old_char中的内容
question2:line24, 圆括号里循环条件可以改写成 *str != '\0' 吗?
answer2:可以
task5.c
用指针变量处理字符串应用
1 #include <stdio.h> 2 #define N 80 3 4 char* str_trunc(char* str, char x); 5 6 int main() { 7 char str[N]; 8 char ch; 9 10 while (printf("输入字符串: "), gets(str) != NULL) { 11 printf("输入一个字符: "); 12 ch = getchar(); 13 14 printf("截断处理...\n"); 15 str_trunc(str, ch); // 函数调用 16 17 printf("截断处理后的字符串: %s\n\n", str); 18 getchar(); 19 } 20 21 return 0; 22 } 23 char* str_trunc(char* str, char x) { 24 for (; *str != '\0'; str++) { 25 if (*str == x) { 26 *str = '\0'; 27 } 28 } 29 for (; *str != '\0'; str++) { 30 *str = ' '; 31 } 32 33 }
question:去掉main函数line18 getchar(); ,重新编译、运行,此时多组输入时,结果有什么不同? line18在这里起到的作用是什么?
answer:
结果:多组输入无法正确执行;
作用:getchar()读取回车键
task6.c
用指针作为函数参数
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 if (strlen(str) != 18) { 22 return 0; 23 } 24 for (int i = 0; i<17 ; i++) { 25 if (str[i] > '9' || str[i] < '0') { 26 return 0; 27 } 28 } 29 if ((str[17] < '9' && str[17]>'0') || str[17] == 'X') { 30 return 1; 31 } 32 return 0; 33 }
task7.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #define N 80 4 void encoder(char* str, int n); // 函数声明 5 void decoder(char* str, int n); // 函数声明 6 7 int main() { 8 char words[N]; 9 int n; 10 11 while (printf("输入英文文本: "), gets(words) != NULL) { 12 printf("输入n: "); 13 scanf("%d", &n); 14 15 printf("编码后的英文文本: "); 16 encoder(words, n); // 函数调用 17 printf("%s\n", words); 18 19 printf("对编码后的英文文本解码: "); 20 decoder(words, n); // 函数调用 21 printf("%s\n", words); 22 getchar(); 23 } 24 return 0; 25 } 26 27 void encoder(char* str, int n) { 28 for (; *str != '\0'; str++) { 29 if (*str <= 'z' && *str >= 'a') { 30 if (*str + n > 'z') { 31 int t = 'z' - *str; 32 int a = n - t - 1; 33 *str = 'a' + a; 34 } 35 else { 36 *str += n; 37 } 38 } 39 if (*str <= 'Z' && *str>='A') { 40 if (*str + n > 'Z') { 41 int t = 'Z' - *str; 42 int a = n - t - 1; 43 *str = 'A' + a; 44 } 45 else { 46 *str += n; 47 } 48 49 } 50 } 51 } 52 void decoder(char* str, int n) { 53 for (; *str != '\0'; str++) { 54 if (*str <= 'z' && *str >= 'a') { 55 if (*str - n < 'a') { 56 int t = *str - 'a'; 57 int a = n - t - 1; 58 *str = 'z' - a; 59 } 60 else { 61 *str -= n; 62 } 63 } 64 if (*str <= 'Z' && *str >= 'A') { 65 if (*str - n < 'A') { 66 int t = *str - 'A'; 67 int a = n - t - 1; 68 *str = 'Z' - a; 69 } 70 else { 71 *str -= n; 72 } 73 } 74 75 } 76 }
task8.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include<string.h> 4 int main(int argc, char* argv[]) { 5 6 for (int i = 1; i < argc - 1 ; ++i) { 7 for (int j = 1; j < argc - i; ++j) { 8 if (strcmp(argv[j], argv[j + 1]) > 0) { 9 char *temp; 10 temp=argv[j]; 11 argv[j] = argv[j + 1]; 12 argv[j + 1] = temp; 13 } 14 } 15 } 16 for (int i = 1; i < argc; ++i) 17 printf("hello, %s\n", argv[i]); 18 return 0; 19 }