diff --git a/万维25届C语言调考试题.md b/万维25届C语言调考试题.md index 7bc875e..db28ae7 100644 --- a/万维25届C语言调考试题.md +++ b/万维25届C语言调考试题.md @@ -163,11 +163,91 @@ main() ### 第三次A ```c +/*----------------------------------------------------------------------- +【程序设计】 +----------------------------------------------------------------------- +编写函数找出能同时满足用3 除余2,用5 除余3,用7 除余2 的所有整数并输出。 +输入输出如下: +【请输入区间的起始值: 】1 +【请输入区间的结束值:】 100 +23 +------------------------------------------------------------------------- +注意:请勿改动主函数main 和其它函数中的任何内容, +仅在函数isMeetCondition 的花括号中填入你编写的若干语句,根据情况可以定义新变量。 +根据情况可以自定义变量 +------------------------------------------------------------------------*/ +#include +int isMeetCondition(int num); +int main() +{ + int start, end; + int i; + printf("【请输入区间的起始值: 】"); + scanf("%d", &start); + printf("【请输入区间的结束值: 】"); + scanf("%d", &end); + for (i = start; i <= end; i++) + { + if (isMeetCondition(i)) + { + printf("%d\n", i); + } + } + return 0; +} +int isMeetCondition(int num) +{ + /**********Program**********/ + + /********** End **********/ +} ``` ```c +/*----------------------------------------------------------------------- +【程序设计】 +----------------------------------------------------------------------- +定义一个函数判断一个字符串是否是另一个字符串的子字符串,要求用指针实现。 +输入输出如下: +【请输入第一个字符串:】abcdefg1234qwert +【请输入第二个字符串:】4q +字符串'4q'是字符串'abcdefg1234qwert'的子字符串 +------------------------------------------------------------------------- +注意:请勿改动程序中的其他内容,请勿重新定义变量名。 +------------------------------------------------------------------------*/ +#include +#include +// 函数声明,用于判断子字符串 +int isSubstring(char *str1, char *str2); +int main() +{ + char str1[100], str2[100]; + printf("【请输入第一个字符串:】"); + gets(str1); + printf("【请输入第二个字符串:】"); + gets(str2); + if (isSubstring(str1, str2)) + { + printf("字符串'%s'是字符串'%s'的子字符串\n", str2, str1); + } + else + { + printf("字符串'%s'不是字符串'%s'的子字符串\n", str2, str1); + } + return 0; +} +int isSubstring(char *str1, char *str2) +{ + int len1 = strlen(str1); + int len2 = strlen(str2); + int i, j; + /**********Program**********/ + + /********** End **********/ + return 0; +} ``` @@ -175,11 +255,72 @@ main() ### 第三次B ```c +/*----------------------------------------------------------------------- +【程序设计】 +------------------------------------------------------------------------- +题目:随机输入一字符串(不包含空格,长度不超过100),删除字符串中的数字 +字符后输出。 +例如 +【请输入字符串:】I will graduate from high school in June 2025 +【去掉数字后的字符串为:】I will graduate from high school in June +------------------------------------------------------------------------- +注意:请勿改动程序中的其他内容,请勿重新定义变量名。 +------------------------------------------------------------------------*/ +#include +#include +int main() +{ + char a[100], b[100]; + int l, i, j; + printf("【请输入字符串:】"); + gets(a); + l = strlen(a); + j = 0; + /**********Program**********/ + + /********** End **********/ + b[j] = '\0'; + printf("【去掉数字后的字符串为:】"); + puts(b); + return 0; +} ``` ```c +/*----------------------------------------------------------------------- +【程序设计】 +------------------------------------------------------------------------- +题目:以下程序的功能是删去一维数组str 中所有相同的数,使之只剩一个。数组 +中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。 +若一维数组中的数据是: +2 3 3 3 4 4 4 4 5 5 5 5 5 6 6 6 6 6 7 7 7 7 7 7 7 7 8 8 9 +结果是:2 3 4 5 6 7 8 9 +------------------------------------------------------------------------- +注意:请勿改动程序中的其他内容,请勿重新定义变量名。 +------------------------------------------------------------------------*/ +#include +int del(int str[], int n) +{ + int i, j = 1; + /**********Program**********/ + + /********** End **********/ +} +int main() +{ + int str[] = {2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9}; + int i, m, n = sizeof(str) / sizeof(int); + for (i = 0; i < n; i++) + printf("%d ", str[i]); + m = del(str, n); + printf("\n"); + for (i = 0; i < m; i++) + printf("%d ", str[i]); + printf("\n"); + return 1; +} ``` @@ -187,25 +328,162 @@ main() ### 第四次 ```c +/*--------------------------------------------------------------------- +程序设计 +--------------------------------------------------------------------- +王老师通过课题专利研发赚到了人生的第一个100 万,他存入银行账户用于理财, +每年可以 +获得4%的收益,在每年的最后一天,他会取出10 万来消费,剩下的继续理财。编 +写程序计算 +过多少年以后,账户上的钱会被取完(使用do....while)。 +--------------------------------------------------------------------- +注意:部分源程序给出如下。请勿改动主函数main 或其它函数中给出的内容,仅 +在 +Program-End 之间填入若干语句。 +不要删除标志否则不得分。 +不要修改或删除Program-End 之外的内容否则不得分。 +---------------------------------------------------------------------*/ +#include +#include +int main() +{ + int money = 100; + int year = 1; + /**********Program**********/ + + /********** End **********/ + printf("%d 年后账户上的钱会被花完", year); + printf("\n"); + return 0; +} ``` ```c +/*--------------------------------------------------------------------- +程序设计 +--------------------------------------------------------------------- +通过指针传递实现将一数组中的数据按相反顺序存放。 +例如:输入20 24 4 13 11 +输出:11 13 4 24 20 +--------------------------------------------------------------------- +注意:部分源程序给出如下。请勿改动主函数main 或其它函数中给出的内容,仅 +在 +Program-End 之间填入若干语句。 +不要删除标志否则不得分。 +不要修改或删除Program-End 之外的内容否则不得分。 +---------------------------------------------------------------------*/ +#include +void sort(int *, int); +void main() +{ + int a[5], i; + for (i = 0; i < 5; i++) + { + scanf("%d,", &a[i]); + } + sort(a, 5); + for (i = 0; i < 5; i++) + { + printf("%d ", a[i]); + } + printf("\n"); +} +void sort(int *p, int n) +{ + int i, j, temp; + /**********Program**********/ + + /********** End **********/ +} ``` - - ### 第五次 ```c +/*----------------------------------------------------------------------- +【程序设计】 +------------------------------------------------------------------------- +题目:编写函数实现输入一串字符串,删除字符串中的重复的字符,然后输出新的 +字符串(重复字符保留第一次出现的字符) +输入输出如下所示 +请输入一串字符串: mn,mn.,mzxcv,nkh021215468796468765465 +去除重复字符后的字符串为: mn,.zxcvkh021546879 +------------------------------------------------------------------------- +注意:请勿改动程序中的其他内容,请勿重新定义变量名。 +------------------------------------------------------------------------*/ +#include +#include +void removeDuplicates(char *str); +int main() +{ + char str[100]; + printf("【请输入一个字符串: 】"); + fgets(str, sizeof(str), stdin); + str[strcspn(str, "\n")] = 0; + removeDuplicates(str); + printf("【去除重复字符后的字符串为:】 %s\n", str); + return 0; +} +void removeDuplicates(char *str) +{ + int seen[256] = {0}; + int writeIdx = 0; + int i; + int len = strlen(str); + if (str == NULL) + return; + if (len <= 1) + return; + /**********Program**********/ + + /********** End **********/ + str[writeIdx] = '\0'; +} ``` ```c +/*----------------------------------------------------------------------- +【程序设计】 +------------------------------------------------------------------------- +题目:编写函数实现用除二取余的方法,把任意一个十进制正数的二进制序列输出 +(不考虑溢出) +程序输入输出如下所示 +Enter a decimal number: 2 +The binary representation is: 10 +------------------------------------------------------------------------- +------------------------------------------------------------------------*/ +#include +#include +void decimalToBinary(int decimal) +{ + int remainder; + int len = 0; + char binary[32]; + int i; + if (decimal == 0) + { + printf("0"); + return; + } + /**********Program**********/ + + /********** End **********/ + printf("%s\n", binary); +} +int main() +{ + int number; + printf("【Enter a decimal number: 】"); + scanf("%d", &number); + printf("【The binary representation is: 】"); + decimalToBinary(number); +} ``` @@ -213,50 +491,544 @@ main() ### 第六次 ```c +/*----------------------------------------------------------------------- +【程序设计】 +------------------------------------------------------------------------- +题目:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第 +二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩 +下的一半零一个。直到最后一天早上想再吃时,见只剩下一个桃子了。通过输入来 +控制吃桃的最后一天,编写函数求第一天共摘了多少桃子。 +输入输出如下所示: +【输入猴子还剩1 个桃子的最后一天: 】10 +猴子第一天摘了1534 个桃子 +------------------------------------------------------------------------- +注意:请勿改动程序中的其他内容,请勿重新定义变量名。 +------------------------------------------------------------------------*/ +#include +int countPeaches(int lastDay) +{ + int peaches = 1; + int day; + /**********Program**********/ + + /********** End **********/ +} +int main() +{ + int lastDay; + int totalPeaches; + printf("【输入猴子还剩1 个桃子的最后一天:】 "); + scanf("%d", &lastDay); + totalPeaches = countPeaches(lastDay); + printf("猴子第一天摘了%d 个桃子\n", totalPeaches); + return 0; +} ``` ```c +/*----------------------------------------------------------------------- +【程序设计】 +------------------------------------------------------------------------- +题目:一瓶汽水一元,两个空瓶子可以换一瓶汽水,输入购买汽水的金额,编写函 +数计算出一共可以喝多少瓶汽水 +输入输出如下所示: +【请输入购买汽水的金额(元):】 3 +总共可以喝 5 瓶汽水 +------------------------------------------------------------------------- +注意:请勿改动程序中的其他内容,请勿重新定义变量名。 +------------------------------------------------------------------------*/ +#include +int totalBottles(int money) +{ + int totalBottlesDrank = 0; + int boughtBottles = money; + int newBottles; + /**********Program**********/ + + /********** End **********/ +} +int main() +{ + int money; + int result; + printf("【请输入购买汽水的金额(元): 】"); + scanf("%d", &money); + result = totalBottles(money); + printf("总共可以喝 %d 瓶汽水\n", result); + return 0; +} ``` ### 第七次 ```c +/*---------------------------------------------------------------------- +【程序设计】 +------------------------------------------------------------------------ +编写函数 fun, 函数 fun 的功能是:求出数组中最大数和次最大数,并把最大数 +和 a[0]中的数对调、次最大数和 a[1]中的数对调,输出对调后的结果。 +例如原数组为{3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5},对调后的结果为9 6 4 1 5 3 2 1 5 3 5 +------------------------------------------------------------------------ +注意:部分源程序给出如下。请勿改动主函数main 或其它函数中给出的内容,仅 +在 +Program-End 之间填入若干语句。 +不要删除标志否则不得分。 +不要修改或删除Program-End 之外的内容否则不得分。 +----------------------------------------------------------------------*/ +#include +void fun(int *a, int n) +{ + int max_index = 0; + int second_max_index = 0; + int i; + /**********Program**********/ + + /********** End **********/ +} +int main() +{ + int arr[] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5}; + int size = sizeof(arr) / sizeof(arr[0]); + int i; + fun(arr, size); + printf("【Modified array: 】"); + for (i = 0; i < size; i++) + { + printf("%d ", arr[i]); + } + printf("\n"); + return 0; +} ``` ```c +/*---------------------------------------------------------------------- +【程序设计】 +------------------------------------------------------------------------ +请编写C 代码,完成计算数组 A 与数组 B 的对称差集(即只属于 A 或者只属 +于 B 的元素)。提示:可以先将数组 A 和 B 变为递增排序,然后可以使用双指 +针法来高效地找到它们的对称差集。 +示例1 +【请输入数组 A 的大小: 】5 +【请输入数组 A 的 5 个元素: 】6 5 4 3 2 +【请输入数组 B 的大小: 】4 +【请输入数组 B 的 4 个元素: 】7 6 3 8 +【数组 A 与数组 B 的对称差集为: 】2 4 5 7 8 +------------------------------------------------------------------------ +注意:部分源程序给出如下。请勿改动主函数main 或其它函数中给出的内容,仅 +在 +Program-End 之间填入若干语句。 +不要删除标志否则不得分。 +不要修改或删除Program-End 之外的内容否则不得分。 +----------------------------------------------------------------------*/ +#include +void bubbleSort(int arr[], int size) +{ + int i, j; + for (i = 0; i < size - 1; i++) + { + for (j = 0; j < size - i - 1; j++) + { + if (arr[j] > arr[j + 1]) + { + // 交换 arr[j] 和 arr[j + 1] + int temp = arr[j]; + arr[j] = arr[j + 1]; + arr[j + 1] = temp; + } + } + } +} +int computeSymmetricDifference(int A[], int sizeA, int B[], int sizeB, int C[]) +{ + int i = 0, j = 0, k = 0; + /**********Program**********/ + + /********** End **********/ +} +int main() +{ + int sizeA, sizeB; + int i; + printf("【请输入数组 A 的大小: 】"); + scanf("%d", &sizeA); + int A[100]; + printf("【请输入数组 A 的 %d 个元素: 】", sizeA); + for (i = 0; i < sizeA; i++) + { + scanf("%d", &A[i]); + } + printf("【请输入数组 B 的大小: 】"); + scanf("%d", &sizeB); + int B[100]; + printf("【请输入数组 B 的 %d 个元素: 】", sizeB); + for (i = 0; i < sizeB; i++) + { + scanf("%d", &B[i]); + } + int C[200]; // 假设结果数组最大长度为 200,为 A 和 B 长度之和 + int diffSize = computeSymmetricDifference(A, sizeA, B, sizeB, C); + printf("【数组 A 与数组 B 的对称差集为: 】"); + for (i = 0; i < diffSize; i++) + { + printf("%d ", C[i]); + } + printf("\n"); + return 0; +} ``` ### 第八次 ```c +/*---------------------------------------------------------------------- +【程序设计】 +------------------------------------------------------------------------ +函数 fun 的功能是: 将 输入的字符串中的字母转换为按字母序列的后续字母(但 +Z 转换为 A, z 转换为 a),其它字符不变,最后输出转换后的字符串。 +示例1: +【请输入一个字符串: 】12345QAZWSXrfvtgb!!@!@@¥ +【转换后的字符串为: 】12345RBAXTYsgwuhc!!@!@@¥ +------------------------------------------------------------------------ +----------------------------------------------------------------------*/ +#include +#include +#include +void fun(char *str) +{ + /**********Program**********/ + + /********** End **********/ +} +int main() +{ + char input[100]; + printf("【请输入一个字符串: 】"); + fgets(input, sizeof(input), stdin); + input[strcspn(input, "\n")] = '\0'; + fun(input); + printf("【转换后的字符串为: 】%s\n", input); + return 0; +} ``` ```c +/*---------------------------------------------------------------------- +【程序设计】 +------------------------------------------------------------------------ +要求编写一个程序来计算给定整数的平方根的整数部分,功能类似于 C 语言标准 +库中的 sqrt 函数,但仅返回整数部分结果。 +示例1: +【请输入一个非负整数: 】12 +【12 的平方根的整数部分是: 】3 +------------------------------------------------------------------------ +----------------------------------------------------------------------*/ +#include +int mySqrt(int x) +{ + /**********Program**********/ + + /********** End **********/ +} +int main() +{ + int num; + while (1) + { + printf("【请输入一个非负整数: 】"); + if (scanf("%d", &num) != 1 || num < 0) + { + while (getchar() != '\n') + ; + printf("输入无效,请输入一个非负整数。\n"); + } + else + { + break; + } + } + int sqrtResult = mySqrt(num); + printf("【%d 的平方根的整数部分是: 】%d\n", num, sqrtResult); + return 0; +} ``` ### 第九次 ```c +/*---------------------------------------------------------------------- +【程序设计】 +------------------------------------------------------------------------ +编写一个 C 语言函数,函数接收一个整数数组 arr 以及数组的长度 size 作为参 +数,使用 bool 类型返回该数组中是否存在重复的元素。在 main 函数中,输入多 +个正整数(输入非数字字符表示输入结束)并调用该函数,根据返回结果输出相应 +的提示信息。 +示例: +【请输入多个整数(输入非数字字符结束输入):】1 2 3 4 5 5 6 a +数组中存在重复元素。 +------------------------------------------------------------------------ +注意:部分源程序给出如下。请勿改动主函数 main 或其它函数中给出的内容,仅 +在 +Program-End 之间填入若干语句。 +不要删除标志否则不得分。 +不要修改或删除Program-End 之外的内容否则不得分。 +----------------------------------------------------------------------*/ +#include +#include +#include +bool hasDuplicates(int arr[], int size) +{ + /**********Program**********/ + + /********** End **********/ +} +int main() +{ + int capacity = 10; + int *arr = (int *)malloc(capacity * sizeof(int)); + if (arr == NULL) + { + printf("内存分配失败!\n"); + return 1; + } + int size = 0; + int num; + printf("【请输入多个整数(输入非数字字符结束输入):】"); + while (scanf("%d", &num) == 1) + { + if (size == capacity) + { + capacity *= 2; + arr = (int *)realloc(arr, capacity * sizeof(int)); + if (arr == NULL) + { + printf("内存分配失败!\n"); + return 1; + } + } + arr[size++] = num; + } + while (getchar() != '\n'); + if (hasDuplicates(arr, size)) + { + printf("数组中存在重复元素。\n"); + } + else + { + printf("数组中不存在重复元素。\n"); + } + free(arr); + return 0; +} ``` ```c +/*---------------------------------------------------------------------- +【程序设计】 +------------------------------------------------------------------------ +现在有一位赛车手要驾驶一台电动摩托车去完成多段赛程。这台电动摩托车的电 +池电量存储 +上限是 100 度电哦,它有一个标称的平均电耗,也就是每行驶 100 公里,就会消 +耗 10 度 +电。这里有个很重要的前提条件要大家牢记呀,每一段赛程的距离都是小于 600 +公里的哦, +并且每次出发的时候,电动摩托车的电池都是充满电的状态呢。还有一个关键的规 +则得注意 +哦,如果电动摩托车到达某个地点之后,赛车手查看发现电池内剩余的电量低于电 +池总电量 +的 10%(也就是 100×10% = 10 度电或者更少啦),那这个时候就必须得在这个 +地方给电 +动摩托车充电了呢,请帮忙计算一下,这名驾驶员在赛程中的哪几段赛程前是需要 +充电的。 +示例1: +【请输入赛程段数:】 +5 +【请输入各段赛程距离,单位公里:】 +380 200 390 400 300 +【需要在以下几段赛程前充电:】 +第 3 段赛程前 +第 5 段赛程前 +示例2: +【请输入赛程段数:】 +4 +【请输入各段赛程距离,单位公里:】 +190 140 110 80 +无需充电。 +------------------------------------------------------------------------ +注意:部分源程序给出如下。请勿改动主函数 main 或其它函数中给出的内容,仅 +在 +Program-End 之间填入若干语句。 +不要删除标志否则不得分。 +不要修改或删除Program-End 之外的内容否则不得分。 +----------------------------------------------------------------------*/ +#include +#include // 引入stdlib.h 用于动态内存分配相关操作 +#define TANK_CAPACITY 100 // 电池总容量(单位:度) +#define LOW_FUEL_LIMIT (0.10 * TANK_CAPACITY) // 低电量阈值(10%) +#define AVG_CONSUMPTION_PER_100KM 10 // 平均电耗(单位:度/百公里) +#define FUEL_CONSUMPTION_PER_KM (AVG_CONSUMPTION_PER_100KM / +100.0) // 每公里电耗(单位:度/公里) +int checkRefuelStops(int trips[], int count, int results[]) +{ + int refuel_count = 0; + double current_fuel = TANK_CAPACITY; + /**********Program**********/ + /********** End **********/ + return refuel_count; +} +int main() +{ + int num_trips; + printf("【请输入赛程段数:】\n"); + scanf("%d", &num_trips); + int *trips = (int *)malloc(num_trips * sizeof(int)); + if (trips == NULL) + { + printf("内存分配失败!\n"); + return 1; + } + printf("【请输入各段赛程距离,单位公里:】\n"); + for (int i = 0; i < num_trips; ++i) + { + scanf("%d", &trips[i]); + } + int *results = (int *)malloc(num_trips * sizeof(int)); + if (results == NULL) + { + printf("内存分配失败!\n"); + free(trips); + return 1; + } + int refuel_count = checkRefuelStops(trips, num_trips, results); + if (refuel_count > 0) + { + printf("【需要在以下几段赛程前充电:】\n"); + for (int i = 0; i < refuel_count; i++) + { + printf("第 %d 段赛程前\n", results[i]); + } + } + else + { + printf("无需充电。\n"); + } + free(trips); + free(results); + return 0; +} ``` ### 第十次 ```c +/*---------------------------------------------------------------------- +【程序设计】 +------------------------------------------------------------------------ +请编写函数 fun, 函数的功能是: 移动一维数组中的内容; 若数组中有 n 个整数, +要求把下标从 0 到 p(含 p,p 小于等于 n-1 )的数组元素平移到数组的最后,最后 +输出移动后的数组。 +示例: +【请输入数组元素的个数: 】10 +【请输入10 个整数:】1 2 3 4 5 6 7 8 9 10 +【请输入p 的值 (p <= 9):】 5 +【移动后的数组为: 】7 8 9 10 1 2 3 4 5 6 +------------------------------------------------------------------------ +注意:部分源程序给出如下。请勿改动主函数 main 或其它函数中给出的内容,仅 +在 +Program-End 之间填入若干语句。 +不要删除标志否则不得分。 +不要修改或删除Program-End 之外的内容否则不得分。 +----------------------------------------------------------------------*/ +#include +void fun(int *w, int p, int n) +{ + int temp[p + 1]; + /**********Program**********/ + + /********** End **********/ +} +int main() +{ + int n, p; + printf("【请输入数组元素的个数: 】"); + scanf("%d", &n); + int a[n]; + printf("【请输入%d 个整数:】", n); + for (int i = 0; i < n; i++) + { + scanf("%d", &a[i]); + } + printf("【请输入p 的值 (p <= %d): 】", n - 1); + scanf("%d", &p); + fun(a, p, n); + printf("【移动后的数组为: 】"); + for (int i = 0; i < n; i++) + { + printf("%d ", a[i]); + } + printf("\n"); + return 0; +} ``` ```c +/*---------------------------------------------------------------------- +【程序设计】 +------------------------------------------------------------------------ +编写一个 C 语言程序,输入由中括号 [数字和小写字母]组成且无中括号嵌套的字 +符串。规则如下:[nx](n 为正整数,x 为小写字母)表示将 x 重复 n 次;[nxy] +(n 为正整数,x、y 为小写字母)表示将 xy 重复 n 次。实现 fun 函数对输入 +字符串解码并生成原始字符串。 +示例1: +【请输入符合规则的字符串:】[5wh] +【原始字符串:】whwhwhwhwh +------------------------------------------------------------------------ +注意:部分源程序给出如下。请勿改动主函数 `main` 或其它函数中给出的内容, +仅在 +Program-End 之间填入若干语句。 +不要删除标志否则不得分。 +不要修改或删除Program-End 之外的内容否则不得分。 +----------------------------------------------------------------------*/ +#include +#include +#include +char *fun(char input[]) +{ + int len = strlen(input); + char *output = (char *)malloc(1000 * sizeof(char)); + if (output == NULL) + { + printf("内存分配失败!\n"); + return NULL; + } + int outputIndex = 0; + /**********Program**********/ + + /********** End **********/ + return output; +} +int main() +{ + char input[1000]; + printf("【请输入符合规则的字符串:】\n"); + scanf("%s", input); + char *result = fun(input); + if (result != NULL) + { + printf("【原始字符串:】%s\n", result); + free(result); + } + return 0; +} ```