任务一
验证性实验
源码一
| #include <stdio.h> |
| #define N 5 |
| |
| void input(int x[], int n); |
| void output(int x[], int n); |
| void find_min_max(int x[], int n, int *pmin, int *pmax); |
| |
| int main() { |
| int a[N]; |
| int min, max; |
| |
| printf("录入%d个数据:\n", N); |
| input(a, N); |
| |
| printf("数据是: \n"); |
| output(a, N); |
| |
| printf("数据处理...\n"); |
| find_min_max(a, N, &min, &max); |
| |
| printf("输出结果:\n"); |
| printf("min = %d, max = %d\n", min, max); |
| |
| return 0; |
| } |
| |
| void input(int x[], int n) { |
| int i; |
| |
| for(i = 0; i < n; ++i) |
| scanf("%d", &x[i]); |
| } |
| |
| void output(int x[], int n) { |
| int i; |
| |
| for(i = 0; i < n; ++i) |
| printf("%d ", x[i]); |
| printf("\n"); |
| } |
| |
| void find_min_max(int x[], int n, int *pmin, int *pmax) { |
| int i; |
| |
| *pmin = *pmax = x[0]; |
| |
| for(i = 0; i < n; ++i) |
| if(x[i] < *pmin) |
| *pmin = x[i]; |
| else if(x[i] > *pmax) |
| *pmax = x[i]; |
| } |
结果一

回答一
find_min_max()
函数的作用是找到给定数组 x
中的最小值和最大值
- 指针都指向数组
x
的起始位置
源码二
| #include <stdio.h> |
| #define N 5 |
| |
| void input(int x[], int n); |
| void output(int x[], int n); |
| int *find_max(int x[], int n); |
| |
| int main() { |
| int a[N]; |
| int *pmax; |
| |
| printf("录入%d个数据:\n", N); |
| input(a, N); |
| |
| printf("数据是: \n"); |
| output(a, N); |
| |
| printf("数据处理...\n"); |
| pmax = find_max(a, N); |
| |
| printf("输出结果:\n"); |
| printf("max = %d\n", *pmax); |
| |
| return 0; |
| } |
| |
| void input(int x[], int n) { |
| int i; |
| |
| for(i = 0; i < n; ++i) |
| scanf("%d", &x[i]); |
| } |
| |
| void output(int x[], int n) { |
| int i; |
| |
| for(i = 0; i < n; ++i) |
| printf("%d ", x[i]); |
| printf("\n"); |
| } |
| |
| int *find_max(int x[], int n) { |
| int max_index = 0; |
| int i; |
| |
| for(i = 0; i < n; ++i) |
| if(x[i] > x[max_index]) |
| max_index = i; |
| |
| return &x[max_index]; |
| } |
结果二

回答二
find_max()
函数的作用是找到给定数组 x
中的最大值,返回一个地址
- 看上去是可以的
任务二
验证性实验
源码一
| #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(tmp, s1); |
| strcpy(s1, s2); |
| strcpy(s2, tmp); |
| |
| printf("\nafter swap: \n"); |
| printf("s1: %s\n", s1); |
| printf("s2: %s\n", s2); |
| |
| return 0; |
| } |
结果一

回答一
- 数组
s1
的大小是80个字节,sizeof(s1)
计算的是数组s1
占用的内存大小,strlen(s1)
统计的是数组s1
的有效字符长度
- 不能。数组
s1
存放地址而非字符串
- 换了
源码二
| #include <stdio.h> |
| #include <string.h> |
| #define N 80 |
| |
| int main() { |
| char *s1 = "Learning makes me happy"; |
| char *s2 = "Learning makes me sleepy"; |
| char *tmp; |
| |
| 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"); |
| tmp = s1; |
| s1 = s2; |
| s2 = tmp; |
| |
| printf("\nafter swap: \n"); |
| printf("s1: %s\n", s1); |
| printf("s2: %s\n", s2); |
| |
| return 0; |
| } |
结果二

回答二
- 指针变量
s1
中存放了个字符串起始地址,sizeof(s1)
计算的是指针变量占用的内存大小,strlen(s1)
统计的是字符串的有效字符长度
- 能。上面的
s1
是地址常量,不能被赋值,下面的s1
是指针变量,可以被赋值
- 交换了指针变量的值,内存中的字符串并未交换
任务三
验证性实验
源码
| #include <stdio.h> |
| |
| int main() { |
| int x[2][4] = {{1, 9, 8, 4}, {2, 0, 4, 9}}; |
| int i, j; |
| int *ptr1; |
| int(*ptr2)[4]; |
| |
| printf("输出1: 使用数组名、下标直接访问二维数组元素\n"); |
| for (i = 0; i < 2; ++i) { |
| for (j = 0; j < 4; ++j) |
| printf("%d ", x[i][j]); |
| printf("\n"); |
| } |
| |
| printf("\n输出2: 使用指针变量ptr1(指向元素)间接访问\n"); |
| for (ptr1 = &x[0][0], i = 0; ptr1 < &x[0][0] + 8; ++ptr1, ++i) { |
| printf("%d ", *ptr1); |
| |
| if ((i + 1) % 4 == 0) |
| printf("\n"); |
| } |
| |
| printf("\n输出3: 使用指针变量ptr2(指向一维数组)间接访问\n"); |
| for (ptr2 = x; ptr2 < x + 2; ++ptr2) { |
| for (j = 0; j < 4; ++j) |
| printf("%d ", *(*ptr2 + j)); |
| printf("\n"); |
| } |
| |
| return 0; |
| } |
结果

回答
- 是一个指向包含四个
int
类型元素的数组的指针
- 是一个长度为四的
int
类型指针数组的标识符
任务四
验证性实验
源码
| #include <stdio.h> |
| #define N 80 |
| |
| void replace(char *str, char old_char, char new_char); |
| |
| int main() { |
| char text[N] = "Programming is difficult or not, it is a question."; |
| |
| printf("原始文本: \n"); |
| printf("%s\n", text); |
| |
| replace(text, 'i', '*'); |
| |
| printf("处理后文本: \n"); |
| printf("%s\n", text); |
| |
| return 0; |
| } |
| |
| |
| void replace(char *str, char old_char, char new_char) { |
| int i; |
| |
| while(*str) { |
| if(*str == old_char) |
| *str = new_char; |
| str++; |
| } |
| } |
结果

回答
replace()
函数的功能是把文本中所有的"i"
替换为"*"
- 是可以的
任务五
用指针变量处理字符串应用
源码
| #include <stdio.h> |
| #define N 80 |
| |
| char *str_trunc(char *str, char x); |
| |
| int main() |
| { |
| char str[N]; |
| char ch; |
| |
| while (printf("输入字符串: "), gets(str) != NULL) |
| { |
| printf("输入一个字符: "); |
| ch = getchar(); |
| |
| printf("截断处理...\n"); |
| str_trunc(str, ch); |
| |
| printf("截断处理后的字符串: %s\n\n", str); |
| getchar(); |
| } |
| |
| return 0; |
| } |
| |
| |
| |
| |
| char *str_trunc(char *str, char ch) |
| { |
| char *ptr = str; |
| while (*ptr) |
| { |
| if (*ptr == ch) |
| { |
| *ptr = '\0'; |
| break; |
| } |
| ptr++; |
| } |
| return str; |
| } |
| |
结果

任务六
判断身份证号码形式合法性
源码
| #include <stdio.h> |
| #include <string.h> |
| #define N 5 |
| |
| int check_id(char *str); |
| |
| int main() |
| { |
| char *pid[N] = {"31010120000721656X", |
| "3301061996X0203301", |
| "53010220051126571", |
| "510104199211197977", |
| "53010220051126133Y"}; |
| int i; |
| |
| for (i = 0; i < N; ++i) |
| if (check_id(pid[i])) |
| printf("%s\tTrue\n", pid[i]); |
| else |
| printf("%s\tFalse\n", pid[i]); |
| |
| return 0; |
| } |
| |
| |
| |
| |
| |
| int check_id(char *str) |
| { |
| if (strlen(str) != 18) |
| return 0; |
| |
| for (int i = 0; i < 17; i++) |
| if (str[i] > '9') |
| return 0; |
| |
| if ((str[17] <= '9' && str[17] >= '0') || str[17] == 'X') |
| return 1; |
| else |
| return 0; |
| } |
结果

任务七
实现对一段英文文本进行加密和解密
源码
| #include <stdio.h> |
| #define N 80 |
| void encoder(char *str, int n); |
| void decoder(char *str, int n); |
| |
| int main() |
| { |
| char words[N]; |
| int n; |
| |
| printf("输入英文文本: "); |
| gets(words); |
| |
| printf("输入n: "); |
| scanf("%d", &n); |
| |
| printf("编码后的英文文本: "); |
| encoder(words, n); |
| printf("%s\n", words); |
| |
| printf("对编码后的英文文本解码: "); |
| decoder(words, n); |
| printf("%s\n", words); |
| |
| return 0; |
| } |
| |
| |
| |
| |
| |
| |
| void encoder(char *str, int n) |
| { |
| while (*str) |
| { |
| if (*str >= 'a' && *str <= 'z') |
| { |
| *str = (*str - 'a' + n + 26) % 26 + 'a'; |
| } |
| if (*str >= 'A' && *str <= 'Z') |
| { |
| *str = (*str - 'A' + n + 26) % 26 + 'A'; |
| } |
| str++; |
| } |
| } |
| |
| |
| |
| |
| |
| |
| void decoder(char *str, int n) |
| { |
| while (*str) |
| { |
| if (*str >= 'a' && *str <= 'z') |
| { |
| *str = (*str - 'a' - n + 26) % 26 + 'a'; |
| } |
| if (*str >= 'A' && *str <= 'Z') |
| { |
| *str = (*str - 'A' - n + 26) % 26 + 'A'; |
| } |
| str++; |
| } |
| } |
结果


任务八
实现按命令行输入的姓名字典升序打印问候
源码
| #include <stdio.h> |
| #include <string.h> |
| #define N 100 |
| |
| void sortText(char *str[], int n) |
| { |
| for (int i = 0; i < n - 1; i++) |
| { |
| for (int j = 0; j < n - i - 1; j++) |
| { |
| if (strcmp(str[j], str[j + 1]) > 0) |
| { |
| char temp[100]; |
| strcpy(temp, str[j]); |
| strcpy(str[j], str[j + 1]); |
| strcpy(str[j + 1], temp); |
| } |
| } |
| } |
| } |
| |
| int main(int argc, char *argv[]) |
| { |
| char *str[N]; |
| int n = argc - 1; |
| for (int i = 1; i < argc; i++) |
| { |
| str[i - 1] = argv[i]; |
| } |
| sortText(str, n); |
| for (int i = 0; i < n; i++) |
| { |
| printf("hello, %s\n", str[i]); |
| } |
| |
| return 0; |
| } |
结果


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端