diff --git a/2207/C语言练习题合集.md b/2207/C语言练习题合集.md
new file mode 100644
index 0000000..9aee567
--- /dev/null
+++ b/2207/C语言练习题合集.md
@@ -0,0 +1,879 @@
+## 一、顺序结构
+
+1. 将华氏温度转换为摄氏温度和绝对温度的公式分别为:
+c= (f-32) (摄氏温度)
+k=273.16+c (绝对温度)
+请编程序:当给出f 时,求其相应摄氏温度和绝对温度。
+测试数据:① f=34
+② f=100
+
+2. 写一个程序把极坐标(r,θ) (θ之单位为度)转换为直角坐标( X,Y)。转换公式是:
+x=r.cosθ
+y=r.sinθ
+测试数据:① r=10 θ=45°
+② r=20 θ=90°
+
+3. 写一个程序,按如下格式输出数据。
+name number math english computer
+zhanghua 9901 80.50 87.0 80
+lina 9902 70.00 80.0 90
+wanggang 9903 87.00 76.0 78
+
+4. 输入3 个双精度实数,分别求出它们的和、平均值、平方和以及平方和的开方,并输
+出所求出各个值。
+
+5. 输入一个3 位整数,求出该数每个位上的数字之和。如123,每个位上的数字和就是
+1+2+3=6。
+
+## 二、分支结构
+
+1. 输入一个字符,判断它如果是小写字母输出其对应大写字母;如果是大写字母输出其
+对应小写字母;如果是数字输出数字本身;如果是空格,输出“space”;如果不是
+上述情况,输出“other”。
+
+2. 有三个数a、b、c,由键盘输入,输出其中最大的数。
+
+3. 输入一个数,判断它能否被 3 或者被 5 整除, 如至少能被这两个数中的一个整除则将
+此数打印出来,否则不打印,编出程序。
+
+4. 读入1 到7 之间的某个数,输出表示一星期中相应的某一天的单词:Monday、 Tuesday
+等等,用switch 语句做。
+
+5. 给出一百分制成绩,要求输出成绩等级‘A’,‘B’,‘C’,‘D’,‘E’,90 分以上为
+‘A’,80~89 分为‘B’,70~79 分为‘C’,60~69 分为‘D’,60 分以下为‘E’。
+
+6. 有一函数,请编程序计算y 的值(x 的值由键盘输入)。
+
+
+
+
+## 三、循环结构
+
+1. 计算n 的阶乘
+
+2. 求 1 到 100 之间的奇数之和、偶数之积。
+
+3. 输入一行字符,统计其中的英文字母、数字、空格和其他字符个数。
+
+4. 用循环语句编写求下列表达式值的程序。
+
+
+5.求1!+2!+3!+...+20!
+
+6.求下列分数序列的前20项之和。
+
+
+7. 任意十个数,打印出它们中的最大数、最小数。
+测试数据:① 1,-12,20,30,-5,-23,33,125,200,-100
+ ② 0,10,3,1,5,6,-10,90,9,-4
+ ③ 12,13,14,15,10,-10,-11,-12,-9,9
+
+8. 判断一个数是否是素数
+
+9. 打印1-100 之间所有素数
+
+10. 求1-100 之间所有非素数的和
+
+11. 输入两个正整数 m 和 n,求其最大公约数和最小公倍数
+提示:
+求 m,n的最大公约数:首先将 m除以 n(m>n)得余数 R,再用余数 R 去除原来的除数,得新的余数,重复此过程直到余数为 0 时停止,此时的除数就是m 和 n的最大公约数。
+求 m和 n的最小公倍数: m和 n的积除以 m和 n 的最大公约数。
+测试数据: m=12, n=24
+ m=100, n=300
+
+12. 打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数, 其各位数字立方
+和等于该数本身。例如 153 是一个水仙花数,因为 153=1\*1\*1+5\*5\*5+3\*3\*3(要求分别用一重循环和三重循环实现)。
+
+13. 一个数恰好等于它的平方数的右端,这个数称为同构数。如 5 的平方是25, 5 是25 中的右端的数, 5 就是同构数。找出1~1000 之间的全部同构数。
+
+14. 3025 这个数具有一种独特的性质:将它平分为两段,即30 和25,使之相加后求平方,即(30+25),恰好等于3025 本身。请求出具有这样性质的全部四位数。
+
+15. 两位数13 和62 具有很有趣的性质:把它们个位数字和十位数字对调,其乘积不变,即13*62=31*26。 编程序求共有多少对这种性质的两位数(个位与十位相同的不在此列,如11、22,重复出现的不在此列,如 13*62 与62*13)。
+
+16. 一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6 的因子为1、2、3,而6=1+2+3,因此6 是“完数”。编程序找出1000 之内的所有完数,并按下面格式输出其因子:
+ 6 its factors are 1,2,3
+
+17. 有一个四位正整数,组成这个四位数的四个数字各不相同,如果把它们的首尾互换,第二位与第三位互换,组成一个新的四位数。原四位数为新四位数的4 倍,请找出一个这样的四位数。
+
+18. 给出一个不多于4 位的正整数,要求:① 求出它是几位数 ② 分别打印出每一位数字 ③ 按逆序打印出各位数字。
+
+19. 在一个程序中计算出给定误差小于0.1,0.01,0.001,0.0001,0.00001 时,下式的值:
+
+提示:本题中误差指前 n+1项之积与前 n项积之差。
+
+20. 用泰勒展开式求sinx 的近似值
+
+
+测试数据:① x=0.3 , n=8
+ ② x=0.5 , n=20
+
+21. 验证歌德巴赫猜想。一个充分大的偶数(大于或等于6)可以分解为两个素数之和。试编程序,将 6 至50 之间全部偶数表示为两个素数之和。
+
+22. 用牛顿迭代法求方程在 1.5 附近的根(精度为
)。
+
+
+23. 两个乒乓球队进行比赛,各出三人,甲队为A、B、C 三人,乙队为X、Y 、Z 三人,已知抽签决定比赛名单。有人向队员打听比赛的名单, A 说他不和 X 比,C 说他不和X、Z 比,请编程序找出三对赛手的名单。
+
+
+
+## 四、数组
+
+1. 有一个正整数数组,包含N 个元素,要求编程求出其中的素数之和以及所有素数的平均值。
+
+2. 有一个数组,内放10 个整数。要求找出最小的数和它的下标,然后把它和数组中最前面的元素对换位置。
+
+3. 有 N 个数已按由小到大的顺序排好,要求输入一个数, 把它插入到原有序列中,而且仍然保持有序。
+
+4. 输入N 个数到数组中,输出所有大于N 个数平均值的数。
+
+5. 输入N 个数到数组中,选出其中最大的数和最小的数,并分别将它们与最前面和最后面的数互换。
+
+6. 用选择法对10 个整数由大到小排序。
+
+7. 用筛选法求 2 到 100 之间的素数。方法如下:首先 2 是素数,凡 2 的倍数都不是素数,于是把这些数从数表中筛去, 2 以后没有被筛去的第一个数是 3, 然后把 3的倍数都从数表中筛去, 3 以后没被筛去的第一个数是 5,然后把 5 的倍数都从数表中筛去。如此下去,直到遇到某数 K(≤ N),其后没有数可筛选为止, 这时保留下的未被筛去的数就是 2 到 N 的素数。
+
+8. 求一个 3×3 矩阵两条对角线上元素之和(每个元素只加一次)。
+
+9. 打印如下形式的杨辉三角形
+1
+1 1
+1 2 1
+1 3 3 1
+1 4 6 4 1
+1 5 10 10 5 1
+输出前10行,从 0行开始,分别用一维数组和二维数组实现。
+
+10.有一个二维数组整型数组中,每一行都有一个最大值,编程求出这些最大值以及它们的和。
+
+11.把一个二维实型数组a 按照第0 列的元素进行排序(由小到大排序,用起泡法)。例如:如果a[i][0]大于a[i+1][0],则i 行与i+1 行中所有元素都要进行对换。
+
+12.编程序将一个字符串的前 N 个子字符送到一个字符型数组中去, 然后再加上一个'\0'(不允许使用strcpy(str1,str2,n)函数)。
+
+13.将字符数组 A 中下标为双号(0,2,4,6,8...) 的元素值传给另一个字符数组 B,然后将 B 数组的元素按逆序输出。
+
+14.有一行字符,统计其中的单词个数(单词之间以空格分隔),并将每一个单词的第一个字母改为大写。
+
+15.有 N 个国家名,要求按字母先后顺序排列(用起泡排序法)后输出。
+
+16.有17 个人围成一圈(编号为0~16),从第 0 号的人开始从 1 报数, 凡报到 3 的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止。 问此人原来的位置是多少号?
+
+17.编程产生如下形式的方阵。
+1 2 2 2 2 2 1
+3 1 2 2 2 1 4
+3 3 1 2 1 4 4
+3 3 3 1 4 4 4
+3 3 1 5 1 4 4
+3 1 5 5 5 1 4
+1 5 5 5 5 5 1
+要求:不允许使用键盘输入语句和静态赋值语句,尽量少用循环。
+
+18.打印所有不超过 n( n<256)的其平方具有对称性的数(也称回文数)。
+
+19.求N 个数中的最大值,最大值出现的次数,然后求出次大值(次大值一定存在)。
+
+20.找出 M×N 数组中所有不相邻元素,并求出它们的和(相邻的数:前一个是偶数,后一个是素数)。
+
+21.已知 100 个自然数 1~100,我们取 1, 2, 3, 4 时, 我们可将其排成一圈使每两个数之和都是素数,即→1→2→3→4→,问 1~100 内连续取 n 个数,即 1~ n(≤ 100)能满足上述要求的最大的 n 是多少?
+
+22.打印魔方阵。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。
+例如:三阶魔方阵为
+8 1 6
+3 5 7
+4 9 2
+
+要求打印由 1到N\* N的自然数构成的魔方阵。
+提示:魔方阵中各数的排列规律如下:
+⑴ 将“1”放在第一行中间一列;
+⑵ 从“2”开始直到n×n为止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1;
+⑶ 如果上一个数的行数为1,则下一个数的行数为 n(指最下一行);
+⑷ 当一个数的列数为 n,下一个数的列数应为1,行数减1;
+⑸ 如果按上面规则确定的位置已有数,或上一个数是第 1行第 n列时, 则把下一个数放在上一个数的下面。
+
+23.统计一个单位职工的年龄,要求把相同年龄最多的那个年龄找出来(可能有几个这样的年龄),并统计出现的次数。
+
+24.n×n 的拉丁方阵的每行、每列均为自然数的一个全排列, 每行(列)上均无重复数。
+如 n=5 时, 5×5 的一种拉丁方阵可以为:
+1 5 2 4 3
+2 3 4 5 1
+4 1 5 3 2
+5 2 3 1 4
+3 4 1 2 5
+该数组的第一行 1,5,2,4,3 用程序自动生成,但产生的第一行不一定非得是 1,5,2,4,3,第一行填写完毕后,即以第一行作为全方阵索引, 即若第一行中的第 i 列的元素值为 j ,则 j在各行中的列号即为从第一行中元素值为 i的那一列开始读出的 n个自然数(到行末则从行头接着读),例如第一行第2列的元素值为5, 则从元素值为2的那一列(第3列)开始读出2,4,3,1,5,这就是元素5在各行中的列标号。
+测试数据:① n=5 ② n=8
+
+## 五、函数
+
+1.编写一函数判断某数是否素数。
+
+2.编写一函数求三个整数的最大值。
+
+3.打印出3 到1100 之间的全部素数(判素数由函数实现)。
+
+4.写一函数,使给定的一个二维数组(3×3)转置,即行列互换。
+
+5.写一函数,将两个字符串连接,即编写一strcat 函数。
+
+6.写一函数,求一字符串长度,即编写一strlen 函数。
+
+7.写一函数将字符数组s1 中的全部字符复制到字符数组s2 中,不用strcpy 函数。
+
+8.写一函数判断某数是否“水仙花数”,所谓“水仙花数”是指一个三位数, 其各位数字立方和等于该数本身。
+
+9.在主函数内任意输入一个5×6 矩阵,编写一函数求出每一行的和放到一个一维数组中,输出此矩阵及其每一行的和。
+
+10.写一主函数输入一数组,写一子函数实现对该数组的冒泡排序并输出。
+
+11.任意输入20 个正整数,找出其中的素数,并将这些素数按由小到大排序。要求:判断一
+个数是否为素数用函数实现;排序用函数实现。
+
+12.编写计算m 的n 次方的递归函数。
+
+13.编一个程序,读入具有5 个元素的整型数组,然后调用一个函数,递归计算这些元素的积。
+
+14.编一个程序,读入具有5 个元素的实型数组,然后调用一个函数,递归地找出其中的最大元素,并指出它位置。
+
+## 六、指针
+
+1、 输入三个整数,按由小到大的顺序输出。
+
+```c
+#include
+//定义一个函数 传入两个整型指针 交换 两个指针所指向的值
+void swap(int *x, int *y){
+ int temp;
+ temp = *x;
+ *x = *y;
+ *y = temp;
+}
+
+int main(void){
+ int a, b, c;
+ printf("请输入三个数字(以空格间隔):");
+ scanf("%d %d %d", &a, &b, &c);
+ //由小到大 升序
+ if(a > b){//b为 a、b两个变量中 最大值
+ swap(&a, &b);
+ }
+ if(b > c){//c 为 a、b、c中最大值
+ swap(&b, &c);
+ }
+ if(a > b){//b为 a、b两个变量中 最大值
+ swap(&a, &b);
+ }
+ printf("%d %d %d\n", a, b, c);
+ return 0;
+}
+```
+
+
+
+2、 输入10 个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数:①输入10 个数;②进行处理;③输出10 个数。
+
+```c
+#include
+void swap(int *x, int *y){
+ int temp;
+ temp = *x;
+ *x = *y;
+ *y = temp;
+}
+//输入数组元素
+void input(int *arr, int n){
+ int i;
+ for(i=0;i *max){
+ max = arr+i;
+ }
+ if(*(arr+i) < *min){
+ min = arr+i;
+ }
+ }
+ //如果最大值的地址为数组的首地址 则最小值和首地址交换后 最大值地址为最小值地址
+ if(max == arr){
+ max = min;
+ }
+ swap(min, arr);//最小值和数组首元素交换
+ swap(max, arr+9);//最大值和数组最后一个元素交换
+}
+//输出数组元素
+void output(int *arr, int n){
+ int i;
+ for(i=0;i
+#include
+
+void move(int *arr, int n){
+ int i, temp;
+ temp = *(arr+n-1);
+ //1 2 3 4 5
+ // 1 2 3 4
+ for(i=n-1;i>0;i--){
+ arr[i] = arr[i-1];
+ }
+ arr[0] = temp;
+}
+
+void output(int *arr, int n){
+ int i;
+ for(i=0;i
+
+int getStrLen(char *str){
+ int n=0;
+ while(*str != '\0'){
+ str++;
+ n++;
+ }
+ return n;
+}
+
+int main(void){
+
+ char str[100];
+ gets(str);
+
+ printf("len=%d\n", getStrLen(str));
+
+ return 0;
+}
+```
+
+
+
+5、 写一函数,将一个3×3 的矩阵转置。
+
+```c
+#include
+
+void revse(int (*num)[3]){
+ int *start, *end;
+ int temp;
+ start = *num;//第一个数组的首个元素地址
+ end = *(num+2)+2;//第三个数组的最后一个元素地址
+
+ while(start < end){
+ temp = *start;
+ *start = *end;
+ *end = temp;
+ start++;
+ end--;
+ }
+}
+
+
+int main(void){
+
+ int num[3][3];
+ int i, j;
+ for(i=0;i<3;i++){
+ for(j=0;j<3;j++){
+ scanf("%d", *(num+i)+j);
+ }
+ }
+ printf("\n");
+
+ revse(num);
+
+
+ for(i=0;i<3;i++){
+ for(j=0;j<3;j++){
+ printf("%d ", *(*(num+i)+j));
+ }
+ printf("\n");
+ }
+
+ return 0;
+}
+```
+
+
+
+6、 在主函数中输入10 个等长的字符串。用另一函数对它们排序。然后在主函数输出这10 个已排好序的字符串。
+
+```c
+#include
+#include
+
+/*
+strcmp(字符串1, 字符串2); 比较两个字符串的大小 大于返回1 小于返回-1 等于返回0
+strcpy(字符串1, 字符串2); 复制两个字符串 字符串2->字符串1
+*/
+void sort(char (*strs)[100]){
+ int i, j;
+ char temp[100];
+ for(i=0;i<10-1;i++){
+ for(j=0;j<10-i-1;j++){
+ if(strcmp(strs[j],strs[j+1]) > 0){
+ strcpy(temp ,strs[j]);
+ strcpy(strs[j], strs[j+1]);
+ strcpy(strs[j+1], temp);
+ }
+ }
+ }
+}
+
+int main(void){
+ char strs[10][100];
+ int i;
+
+ for(i=0;i<10;i++){
+ gets(*(strs+i));
+ }
+ sort(strs);
+ printf("\n");
+ for(i=0;i<10;i++){
+ puts(*(strs + i));
+ }
+
+
+ return 0;
+}
+```
+
+
+
+7、 编一程序,打入月份号,输出该月的英文月名。例如,输入"3",则输出"March",要求用指针数组处理。
+1: January, 2: February, 3: March, 4: April, 5: May, 6: June, 7: July, 8: August, 9: September, 10: October, 11: November, 12: December
+
+```c
+#include
+#include
+
+int main(void){
+
+ //存着地址的数组 存储字符串的首地址的数组
+ char *month[12] = {"January", "February", "March", "April",
+ "May", "June", "July", "August", "September", "October",
+ "November", "December"};
+ int num;
+
+ printf("请输入月份数字形式:");
+ scanf("%d", &num);
+ printf("%s\n", *(month+num-1));
+
+ return 0;
+}
+```
+
+8、 写一函数完成查找串s2 在串s1 中第一次出现的位置。
+
+```c
+#include
+#include
+
+int instr(char *dest, char *substr){
+ int i=0, j;
+ while(*(dest+i) != '\0'){
+ j=0;//对子串匹配从首个开始
+ while(*(substr+j)!='\0' && *(dest+i) == *(substr+j)){
+ i++;
+ j++;
+ }//暴力查找主串中和子串相等的字符 到子串结尾或遇到不相同元素时退出循环
+ if(j==0){//当前主串中没有和子串首元素相同的元素时 主串下标后移
+ i++;
+ }
+ //匹配到子串结尾标记时代表找到首个子串
+ if(*(substr+j) == '\0'){
+ return i-strlen(substr)+1;
+ }
+ }
+ return -1;//没有找到子串
+}
+
+int main(void){
+ char str[100];
+ char substr[100];
+
+ gets(str);
+ gets(substr);
+ printf("%d\n", instr(str, substr));
+
+
+ return 0;
+}
+```
+
+9、 写一函数完成将无符号十进制整数转换成十六进制字符表示并存于字符串数组中。
+
+```c
+#include
+
+void decimalToHex(int dec, char *hex){
+ int i, j, temp, count=0;
+ //i, j, temp 用来数组倒置
+ //count 用来统计元素的个数
+ while(dec){
+ //模除十进制数字得余数后判断是否为数字 如果为 使用'0'加上该数之后存储为字符
+ if(dec%16 < 10){
+ *(hex+count++) = dec%16 + 48;
+ }else{
+ //得到A~F时,使用大写字符ASCALL值将其转换为字符
+ *(hex+count++) = dec%16-10 + 65;
+ }
+ dec /= 16;
+ }
+ //数组元素的倒置
+ i = 0;
+ j = count - 1;
+ while(i < j){
+ temp = *(hex + i);
+ *(hex + i) = *(hex + j);
+ *(hex + j) = temp;
+ i++;
+ j--;
+ }
+ *(hex+count) = '\0';//标记结束符
+}
+
+int main(void){
+ int dec;//用来存储需要转换的十进制数字
+ char hex[1000];//用来存储转换后的数字的
+ printf("请输入一个数字:");
+ scanf("%d", &dec);
+
+ decimalToHex(dec, hex);
+ puts(hex);
+
+ return 0;
+}
+```
+
+10、 用指向指针的指针的方法对N 个整数排序并输出。要求排序单独写成一个函数。N 个整数和N 在主程序中输入,最后在主函数中输出。
+
+```c
+#include
+
+void sort(int (*arr)[10]){
+ int i, j, temp;
+ for(i=0;i<10-1;i++){
+ for(j=0;j<10-1-i;j++){
+ if((*arr)[j]> (*arr)[j+1]){
+ temp = (*arr)[j];
+ (*arr)[j] = (*arr)[j+1];
+ (*arr)[j+1] = temp;
+ }
+ }
+ }
+}
+
+int main(){
+
+ //指针->数组 int (*变量名)[数组的元素个数]
+ //数组指针 指向数组的指针
+ int num[10];
+ int i;
+
+ printf("请输入10个整数:");
+ for(i = 0;i<10;i++){
+ scanf("%d", num+i);
+ }
+
+ sort(&num);
+ for(i = 0;i<10;i++){
+ printf("%d ", num[i]);
+ }
+ printf("\n");
+
+ return 0;
+}
+```
+
+
+
+## 七、结构体与共用体
+
+1.定义一个结构体其中包括: 职工号、职工名、性别、年龄、工资、地址。按结构体类型定义一个结构体数组, 从键盘输入每个结构体元素所需的数据,然后逐个输出这些元素的数据(可设数组只有三个元素)。
+
+2.有一批图书,每本书有:书名(name),作者(author) , 编号(num),出版日期(date)四个数据,希望输入后按书名的字母顺序将各书的记录排列好,供以后查询。今输入一本书的书名,如果查询到库中有此书,打印出此书的书名,作者,编号和出版日期。如果查不到此书,则打印出“无此书”。
+
+3.13 个人围成一圈,从第一个人开始顺序报号1、2、3。 凡报到“3”者退出圈子。找出最后留在圈子里的人原来的序号。
+
+4.编写一个程序,输入n 个(少于10 个)学生的姓名、性别、 成绩、出生年月日及入学年月日,输出成绩在80 分以上的学生的姓名、性别、成绩、出生和入学的年份。
+
+5.将上题改为“输出成绩在80 分以上的18 岁以下的女生的姓名、成绩、出生和入学的年份”,试编写程序实现之。
+
+6.有10 个学生,每个学生的数据包括学号、姓名、三门课的成绩,从键盘输入10 个学生数据,要求打印出三门课总平均成绩,以及最高分的学生的数据(包括学号、 姓名、三门课成绩、平均分数)。
+
+7.设链表中每个结点包括学号、成绩、和指针三个字段, 试编程序打印出链表中第1,3,5,7...结点。
+
+8.设链表中每个结点包括学号、成绩、和指针三个字段, 试编程序将大于平均成绩的各个结点打印出来。
+
+9.设链表中每个结点包括学号、成绩、和指针三个字段, 试编程序将成绩最高的结点作为链表的第一个结点,成绩最低的结点作为尾结点。
+
+10.建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。
+
+## 八、文件
+
+1.将10 个整数写入数据文件f3.dat 中,再读出f3.dat 中的数据并求其和。
+
+2.一个以%5d 格式存放20 个整数的文件f4.dat,顺序号定为0~19。输入某一顺序号之后,读出相应的数据并显示在屏幕上。
+
+3.将10 名职工的数据从键盘输入, 然后送入磁盘文件worker1. rec 中保存。设职工数据包括:职工号、职工名、性别、年龄、工资,再从磁盘调入这些数据,依次打印出来(用 fread 和fwrite 函数)。
+
+4.将存放在worker1.rec 中的职工数据按工资高低排序,将排好序的各记录存放在worker2.rec 中(用 fread 和fwrite 函数)。
+
+5.用scanf 函数从键盘读入 5 个学生数据(包括:学生名、学号、三门课程的分数),然后求出平均分数。用 fprintf 函数输出所有信息到磁盘文件stud.rec 中,再用fscanf 函数从 stud.rec 中读入这些数据并在显示屏上显示出来。
+
+6.在文件 worker2.rec 中插入一个新职工的数据,并使插入后仍保持原来的顺序(按工资高低顺序插入到原有文件中),然后写入worker3.rec 中。
+
+7.删除worker2.rec 中某个序号的职工记录,再存入原文件中(用fread 和fwrite 函数)。
+
+8.有两个磁盘文件,各自存放已排好序的若干个字符(如a1. dat 中放"abort", a2.dat中放 "boy")要求将两个文件合并,合并后仍保持有序,存放在a3.dat 文件中。
+提示:可先将两个文件中的字符存入一个字符型数组中,而后对数组重新排序,再将该数组写入a3.dat文件中。
+如果不引入一个中间数组进行重新排序,该如何编程?
+
+## 附加题
+
+1.编程序求 5X+2Y+Z=50 的所有非负整数解。
+
+2.有一长度不大于40 的字符串,已知其中包含两个字符“A”,求处于这两个字符“A”中间的字符个数,并把这些字符依次打印出来。
+
+3.把25 个字母A、B 、C、··· 、X、Y 按如下要求打印出来:从最中间的字母M开始打印,然后一左一右依次打印出其它字母,即M,L,N,K,O,...。要求:初始化时按字母表顺序赋值。
+
+4.编一个程序,把一批非零整数中的偶数、奇数的平均值分别计算出来。用零作为终止标记。
+
+5.某单位排队形,开始排成3 路纵队,末尾多出了2 人。后改成5 路纵队,末尾又多出了3 人,最后改成7 路纵队,正好没有余数。编程序求出该单位至少有多少人。
+
+6.将一个6×6 数组的第一行、第六行、主对角线和副对角线上的元素都存入1,其余的元素都存入-1。请编程序实现。
+要求:1)不许对数组初始化。
+ 2)尽量少用循环。
+
+7.个位数是6,且能被3 整除的五位数共有多少个。
+
+8.求100 至200 之间能同时被6 和8 整除的数,把这些数打印出来,并且打印这些数的和。
+
+9.雨淋湿了一道算术题,9 个数字现在只能认清4 个(第一个数字虽模糊不清但肯定不是1):
+
+请编程序找出那些看不清的数字。
+
+10.编程序计算下述函数在X=-7,-1,0,7 时的值。
+
+11.判断一个给定的5×5 方阵是否以第3 列为轴线对称?
+
+12.编写一个函数JOIN,让它实现字符串连接运算功能。
+
+13.编写函数IND,让它判断一个字符串是否为另一个字符串的子串的功能,若是则返回第一次出现的起始位置,否则返回0。
+
+14.编写一个函数,由参数传来一个字符串,分别求出此字符串中字母、数字和其它字符(不包括空格)的个数,输入和输出均由主函数实现。
+
+15.已知某年不是闰年,给定该年某一天的月份和日期,求这一天是该年的第几天。
+
+16.找规律,编程序打印6×6 的矩阵:
+1 2 3 5 8 13
+1 4 9 17 30 51
+1 6 19 45 92 173
+. . .
+
+17.有人说在400,401,402,...499 这些数中4 这个数字共出现112 次,请编程序判定这种说法是否正确。若正确请打印出'YES',否则打印出'NO'及4 的出现次数。
+
+18.设有8×8 的二维数组a,其中每个元素取值如下:
+当 i=j 时 a\[i\]\[j\]=M (M 是你的学号)
+当 ij 时 a\[i\]\[j\]=i×j
+编程序求所有的数组元素之和。
+
+19.找3 个数字,填在下面式子中,使等式成立。
+
+① 若答案有多个,则打印一组即可;
+② 若无满足条件的数字,则显示'NO DIGITALS'。
+
+20.某航空公司规定:在旅游旺季7─9 月份,若订票超过20 张,优惠票价的15%,20 张以下,优惠5%;在旅游淡季1─5 月、10 月、11 月份订票超过20 张,优惠30%,20 张以下,优惠20%;其余月份不优惠。请编程序能根据月份和旅客订票张数决定优惠率。
+
+21.请编程序按如下格式打印一个直角三角形的九九乘法表:
+1 2 3 4 5 6 7 8 9
+4 6 8 10 12 14 16 18
+9 12 15 18 21 24 27
+16 20 24 28 32 36
+25 30 35 40 45
+36 42 48 54
+49 56 63
+64 72
+81
+
+22.有一批实数,用零作终止标记。请编程序找出这批数中的最大值及最小值,并输出该最大值数是这批数中的第几个数(若最大值数多次出现,只打印出第一个的位置)。
+
+23.有10 个两位整数,把这些数作以下变化,如果它是素数,则把它乘以2,若它是偶数则除以2,其余的数减1,请将变化后的10 个数按从小到大的次序打印出来。
+
+24.已知有N 个无规律的正整数,请编程序求出其中的素数并打印出能被5 整除的数之积。
+
+25.把一个偶数位的数从当中分开成为两个数,这两个数的和的平方等于原数。如(8+1)2=81,(20+25)2=2025。求10 至9999 之间满足这样条件的数是哪些? 共有多少个?
+
+26.已知有9 个数,请求出这些数中的最大值、最小值及平均值,以及有多少个数等于平均值?
+
+27.求二维数组中每行元素的平均值,不许引入其它的数组。
+
+28.编程序计算函数
+
+的值。要求先将X 的各项系数先输入到数组B 中,然后再用循环结构求P(X)的值。
+
+29.猜号码∶由随机函数产生一个1 至1000 之间的整数,让人猜之。计算机仅回答人猜的数大、小还是相等,当人猜对时,由计算机打印出人一共猜了几次。
+
+30.编程序将一个正整数写成其它两个正整数的平方和,若不能成立时输出“NO”。
+例如
+
+
+31.将一个一维数组中的偶数依次交换。例如有8 个元素, 若其中第1、4、5 三元素是偶数时应按下图交换。
+
+
+32.编程序将一个6×6 的二维数组左下三角部分全赋值为-1,右上三角全赋值为1,主对角线(行,列下标相同)上的元素送入2。把数组中的值按列对齐方式输出。
+要求: 不允许使用scanf 函数。
+
+33.用随机函数求出10 组三位正整数,每组十个数,调用一函数打印出每组数,并编一函数求出每组中的最大数。
+
+34.已知有三个数组A,B,C,A 为5 行5 列的二维数组,B、C 为只有5 个元素的一维数组,键盘输入数据的顺序如下:
+23,45,6,1,-3,4,5,233,456,0,3,56,78,-56,5,6,77,8,89,9,3,6,8,9,90
+请编写程序,求出A 的各行之和放至数组B 的相应元素中,求出数组A 的各列之和放至数组C 的相应元素之中。程序的输出部分要按下边形式显示:
+
+
+35.假设a-1 和a+1 是大于10 的素数,验证
可被120 整除。编程序输入a 的值,判a-1 和a+1 是否为素数。若不是输出“NOTPRIME!”;若都是素数,再验证
是否可被120 整除。
+
+36.有n 个整数,编程序将前面的各个数依次向后移动k 个位置,最后k 个数移到最前边的k 个位置(见下图,其中n=8,k=3)。
+
+思考: 程序中不许引入其它数组。
+
+37.将一个数M 分解为质因数(M≠0)。
+
+38.将一个整数(最多是10 位数)从低位到高位打印出来,如该数是12345 时,输出应是54321(只占一行)。
+
+39.写一个函数比较两个字符串,如果s1=s2,则返回值0;如果s1>s2,则返回值1;如果s1k, n=>m;
+3)若m<5,转第5 步,否则执行第4 步;
+4)m/5(取整)=>m, k+m=>k, 转第3 步;
+5)输出k(n!末尾零的个数)。
+
+41.分别输入N 和M 个数到数组A 和数组B 中。把只在其中一个数组中出现的那些数送入到数组C 中,并指出它们在A 或B 数组中的位置。
+
+42.用记录来描述一个学生的成绩情况,内容包括:姓名、学号、数学成绩和PASCAL成绩。要求对一个小组的10 个学生的成绩进行统计处理:
+1)计算学生的总平均分,并按平均分高低排出名次,打印出姓名。
+2)打印出90 分以上和不及格者的名字。
+要求用子程序来完成。
+
+43.已知M1 是3×5 的矩阵, M2 是5×2 的矩阵, 编程序求出M1 与M2 之积。
+
+44.百马百瓦问题。有100 匹马,100 块瓦,大马驮3 块,小马驮2 块,两个马驹驮1块。问大马、小马、马驹各多少?
+要求:① 不许用for 循环; ② 循环次数尽量少。
+
+45.找规律填写N×N 方阵。如N=8 时, 其方阵为:
+
+
+46.插入排序。许多玩牌的人是以这样的方式来对他们手中的牌进行排序的:设手中原有3张牌已排好序,抓1 张新牌,若这张新牌的次序在原来的第2 张牌之后,第3 张牌之前,那么就把这张新牌放在第3 张牌的位置上,原来的第3 张改为第4 张, 然后再抓新牌。按着这个算法,编写一个排序程序。
+注:开始一张牌也没有,从第一张牌开始抓起。
+
+47.求N 阶方阵(即N×N 数组)中各条反斜线上的元素之和。如4×4 数组共有7 条反斜线:
+
+
+48.自然数N 一般写成如下形式:
+
+如果
>di (i=k-1,k-2,...,1),则称N 是严格降序数;如果
=di (i=k-1,k-2,...,1),则称N 是等序数;此外,则称N是无序数。例如, 4321 是严格降序数,1234 是严格升序数,2222 是等序数,1243 是无序数。从键盘上输入一个大于9 的整数N,判它属于上述哪一类。
+
+49.用简单迭代法解方程
它有两个根(如图),其迭代公式为:
+
+注:本程序中选取初值
不同时,要分别使用公式1 或公式2 迭代,得原方程<0 或>0
+的解。(公式由来略)
+
+50.洗扑克牌。将54 张牌分别编号为1,2,…,54 号,并放在数组M 中。洗牌方法如下:产生[1,54]区间内的一个随机数K,将M[1]与M[K]交换;然后产生[2,54]之间的随机整数K,让M[2]与M[K]交换;…,直到剩下最后一张牌为止。请编写实现上述洗牌的程序。
+
+51.有N 张牌,计算机和你轮流取牌,每次只能取 1─2 张,谁最后取完谁胜利。编写完成此功能的程序。
+要求:
+1)让计算机先取。
+2)你取的张数由键盘输入。
+3)计算机第一次取牌时由键盘输入来确定是取1 还是取2,以后它再取牌时由程序
+判断来决定取几张牌。
+
+52.已知A 是有30 个元素的整型数组,编写一个对A[I1]到A[I2](I1≤I2)之间的元素排序的函数(从大到小排序)。请调用上述函数先将A[5]至A[20]之间的元素排序,然后将A中的所有元素值输出。再调用上述函数对A[15]至A[30]之间的元素排序,最后再将A 中30 个元素值输出。
+要求:1) 输入输出均由主函数实现。
+ 2)输出时每10 个元素占1 行。
+
+53.编程序求3 至39 之间满足下列条件的各组素数:每组有3 个素数,第2 个比第一个大2,第3 个比第2 个大4。例如 5,7,11 就是满足条件的一组。
+要求:1) 不许使用数组。
+ 2)打印满足条件的各组素数。
+ 3)求出满足条件的素数共有多少组。
+
+54.已知N 是正整数, 它可拆写成三个正整数N1、N2和N3 之和的形式N=N1+N2+N3。请编程序打印出满足上式的全部组合,并当N1、N2 和N3 中至少有两个是素数时打印“YES”否则打印“NO”。
+
+
+55.编写程序,按照 1,2, ... , 28 的顺序填一个7×7 数组的左上角,程序的输出结果为:
+
+
+56.二维数组排序。设有4×5 的数组M,通过排序使M\[1]\[1]≤M\[1]\[2]≤...≤M\[1]\[5]≤M\[2]\[1]≤M\[2]\[2]≤...≤M\[2]\[5]≤...≤M\[4]\[1]≤M\[4]\[2]≤...≤M\[4]\[5]。排序时不允许引入其它数组。
+
+57.编写将一个十进制数M 转化成N 进制数(2≤N≤16)的程序。提示:转化成N 进制数的各位数可以分别放在数组的各个元素中。
+注意:进制N 超过10 时, 用A 表示10,B 表示11,…,F 表示15。
+
+58.在主函数中输入10 个不等长的字符串,用另一函数对它们排序。然后在主函数中输出这10 个已排好序的字符串,用指针数组完成。
+
+59.建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,将此结点删除,输出最后的链表。
+
+60.有两个链表a和b。设结点中包含学号、姓名。从a链表中删除与b链表中有相同学号的那些结点。