C语言期末复习,经典练习题+知识点总结+模拟考题三位一体,完胜c语言{考期必备神器}.docx
C 语言期末复习寻常练习答案特别适用于千千万北航学子考试重点:编程题排序,选择与冒泡排序 , 各 种 进 制 转 换 。 printf(“Input a number:“); scanf(“%c“,&c);/*从键盘输入一个字符*/printf(“ %c %c %cn“,c-1,c,c+1);/*第一行依据从小到大的挨次输出这三个字符,并以一个空格隔开*/printf(“ %d %d %d“, c-1,c,c+1);/*其次行依据从小到大的挨次输出三个字符对应的ASCII 值,并以一个空格隔开。*/return 0;1 / 30其次次大作业 前驱、后继字符1. 【问题描述】 从键盘输入一个字符, 求出它的前驱和后继字符依据 ASCII 码值排序,并依据从小到大的挨次输出这三个字符和对应的ASCII 值。 【输入形式】 从键盘输入一个字符 【输出形式】 按两行输出: 第一行依据从小到大的挨次输出这三个字符,并以一个空格隔开; 其次行依据从小到大的挨次输出三个字符对应的ASCII 值,并以一个空格隔开。【输入样例】b【输出样例】 a b c 97 98 99 【样例说明】 输入字符b,b 的前驱字符是a,后继字符是c,第一行依据从小到大的挨次输出a b c;其次行输出对应的ASCII 值 97 98 99 【评分标准】 结果完全正确得 20 分,每个测试点4 分。提交程序名为:c0103.c。/*从键盘输入一个字符,求出它的前驱和后继字符依据 ASCII 码值排序,并依据从小到大的挨次输出这三个字符和对应的ASCII 值。*/#include<stdio.h> int mainchar c=“ “;当前编程题:其次次大作业 -数值变换2. 【问题描述】 编写一程序,从键盘输入输入一个三位正整数,然后反向输出对应的数,假设输入的数不是三位正整数,则输出1。 【输入形式】 从键盘输入三位的正整数。 【输出形式】 输出交换后的正整数值。【输入样例】 356 【输出样例】 653【样例说明】从键盘输入的正整数值为 356, 将该数的个位与百位互换,所得结果为 653. 假设输入的正整数为 300,则输出为 3。【评 分标准】 结果完全正确得 20 分,每个测试点 4 分。提交程序名为:c0102.c。/*编写一程序,从键盘输入输入一个三 位正整数,然后反向输出对应的数,假设输入的数不是三位正整数,则输出1。 */ #include <stdio.h>void maininta,d,e,f,sum;/*定义变量*/printf(“请输入一个三位正整数,n“); scanf(“%d“,&a);/*输入一个数*/ if(a>0)/*对输入的值的正负做推断*/d=a/100;e=(a-d*100)/10; f=a%10;sum=100*f+10*e+d; printf(“%dn“,sum);/*输出交换后的正整数值。*/elseprintf(“-1n“);当前编程题:其次次大作业-正整数的打印4. 【问题描述】给出一个不多于 5 位的正整数,要求:1.求出它是几位数。2.分别打印出每一位数字。3.依据逆序/*假设输入的数不是三位正整数,则输出打印出每一位数字。 【输入形式】把握台1*/输入该正整数。 【输出形式】把握台分行输出输出结果。 【样例输入】1234 【样例输出】 4 1234 4321 【样例说明】1234 位当前编程题:其次次大作业 -计算平均值数为 4,分别为 1,2,3,4,逆序为 4321 【评3. 【问题描述】 从键盘输入三个整数,分别存入 x,y,z 三个整型变量中,计算并输出三个数的和以及平均值。 【输入形式】 从键盘输入三个整数,整数之间以空格隔开。【输出形式】 在屏幕上分两行显示结果: 第一行为三个数的和,整数形式输出; 其次行为三个数的平均值,浮点数形式输出, 小数点后保存两位小数。【输入样例】 3 2 3 【输出样例】 8 2.67 【样例说明】 3、2、3 的和为 8,所以第一行输出 8; 其次行输出 3、2、3 的平均值 2.67保存两位小数。【评分标准】 结果完全正确得 20 分,每个测试点 4 分。提交程序名为:c0101.c。/*从键盘输入三个整数,分别存入 x,y,z 三个整型变量中,计算并输出三个数的和以及平均值*/#include <stdio.h> int mainintx,y,z,sum;/*定义变量*/float average; scanf(“%d%d%d“,&x,&y,&z);/*从键盘输入三个整数,整数之间以空格隔开*/sum=x+y+z;average=(float)sum/3;/*第一行为三个数的和,整数形式输出;*/printf(“%dn“,sum); printf(“%.2fn“,average);/* 其次行为三个数的平均值,浮点数形式输出,小数点后保存两位小数*/return 0;分标准】该题共有三个输出整数,完全正确得 10 分,每答错一个扣掉 4 分,直至得分为0。此题要求上传程序的源文件。所承受语言可以是 C(.c)。主文件名设定为 intprint.c/*给出一个不多于 5 位的正整数,要求: 1.求出它是几位数。2.分别打印出每一 位数字。3.依据逆序打印出每一位数字。*/ #include<stdio.h> void mainlong int a;int n,b,c,d,e,f;printf(“n 请输入一个整数(099999):“); scanf(“%d“,&a);if(a>9999)n=5;elseif(a>999)n=4;elseif(a>99)n=3;elseif(a>9)n=2;elsen=1;printf(“n 这个数的位数=%dn“,n);f=a/10000; e=a%10000/1000; d=a%10000%1000/100;c=a%10000%1000%100/10;b=a%10000%1000%100%10;switch(n)case 5: printf(“%d%d%d%d%dn“,f,e,d,c,b);printf(“%d%d%d%d%dn“,b,c,d,e,f);break;case 4: printf(“%d%d%d%dn“,e,d,c,b);printf(“%d%d%d%dn“,b,c,d,e);break;case 3: printf(“%d%d%dn“,d,c,b);printf(“%d%d%dn“,b,c,d);break;case 2: printf(“%d%dn“,c,b);printf(“%d%dn“,b,c);case 1:printf(“%dn“,b);printf(“%dn“,b);2. 输入一个字符作为运算符op,op 可以是+,-,*,/。 输入时,data1、data2、 op 之间各留有一个空格。具体格式见样例输入。 【输出形式】 把握台输出运算结果。作除法运算时,假设能够整除,则输出为整数,否则输出结果小数点后应保存两位有效数字。 【样例输入】 23 5 *【样例输出】 115【样例说明】 输入中先后输入第一个运算数 23,其次个运算数 5,运算符*,要求对 23 和 5 进展乘法运算。计算结果为 115。 【评分标准】 该题共 20 分,每个测试点 4 分。 此题要求上传程序的源文件。所承受语言可以是 C(.c).即所上传的文件名为 calculator.c/*编程实现简易的计算器:读入两个整数运算数(data1 和 data2)及一个运算符(op), 计算表达式 data1 op data2 的值, 其中 op 可以是+,-,*,/。 */#include <stdio.h> int mainintdata1,data2,c;/定义变量/double d; char op;scanf(“%d%d%c“,&data1,&data2,&op);/输入运算数和运算符/ if(op=”+”)/进展推断/c=data1+data2; printf(“%d“,c);elseif(op=”-”)当前编程题:其次次大作业 -简易计算器5.【问题描述】编程实现简易的计算器: 读入两个整数运算数(data1 和 data2)及一个运算符(op),计算表达式 data1 op data2 的值, 其中 op 可以是+,-,*,/。 【输入形式】elsec=data1-data2; printf(“%d“,c);if(op=”*”)把握台输入运算数和运算符: 1.首先输入以空格分隔的两个整数,分别是 data1 和 data2;c=data1*data2;printf(“%d“,c);else if(op=”/”)d=(double)data1/data2; printf(“%.2f“,d);return 0;平面上有两个矩形A 和B,其位置是任意的。编程求出其相交局部如图中阴影局部的面积。0a,b1000【输入形式】从标准输入读取两行以空格分隔的整数,格式如下:找最大最小整数1. 【问题描述】编写一个程序,用户输入假设干整数,试找出其中的最大数和最小数。【输入形式】用户在第一行待输入数据个数, 在其次行输入数据。【输出形式】程序在下一行输出数据的最大值和最小值【样例输入】589 62 96 74 52【样例输出】96 52【样例说明】用户第一次输入的为数据个数, 在下一行依次输入数据。输出为 5 个数中的最大值和最小值,输出时候两个数之间用空 格分隔。【评分标准】结果完全正确得 20 分,每个测试点 4 分。提交程序名为:getmaxandmin.c矩形相交2. 【问题描述】Ax1 Ay1 Ax2 Ay2 Bx1 By1 Bx2 By2其中x1,y1和x2,y2为矩形对角线上端点的坐标。各坐标值均为整数,取值在0 至 1000 之间。【输出形式】向标准输出打印一个整数,是两矩形相交局部的面积可能为 0。在输出末尾要有一个回车符。【输入样例】0 0 2 21 1 3 4【输出样例】1【评分标准】结果完全正确得 20 分,每个测试点 4 分, 提交程序文件名为 area.c。红色为承受答案#include <stdio.h>#include <stdlib.h>struct point int x;int y;A1,A2,B1,B2;struct rect struct point p1;struct point p2;R1,R2;struct point makepoint(int x,int y);struct rect makerect(struct point p1,structpoint p2);struct rect guifanrect(struct rect R);#define max(A,B) (A)>(B)?(A):(B)#define min(A,B) (A)>(B)?(B):(A)main5 / 30int i,num14,num24,area;for(i=0;i<4;i+)scanf(“%d“,&num1i);for(i=0;i<4;i+)scanf(“%d“,&num2i);R1=makerect(A1=makepoint(num10,num11),A2 = makepoint(num12,num13);R2=makerect(B1=makepoint(num20,num21),B2 = makepoint(num22,num23);R1 = guifanrect(R1);R2 = guifanrect(R2);if( R1.p2.x <= R2.p1.x | R1.p2.y <= R2.p1.y|R1.p1.x >= R2.p2.x | R1.p1.y >= R2.p2.y)area = 0;elsearea=abs(max(R1.p1.x,R2.p1.x)-min(R1.p2.x, R2.p2.x) *abs(max(R1.p1.y, R2.p1.y) - min(R1.p2.y,R2.p2.y);printf(“%dn“,area);struct point makepoint(int x,int y)struct point temp;temp.x = x;temp.y = y;return temp;struct rect makerect(structpoint p2)pointp1,structstruct rect temp;temp.p1 = p1;temp.p2 = p2;return temp;struct rect guifanrect(struct rect r)struct rect temp;temp.p1.x = min (r.p1.x, r.p2.x);temp.p1.y = min (r.p1.y, r.p2.y);temp.p2.x = max (r.p1.x, r.p2.x);temp.p2.y = max (r.p1.y, r.p2.y);return temp;3. 【问题描述】编写一个程序,当在一个字符串中消灭子串时就删除它。【输入形式】用户在第一行输入一个字符串, 用户在其次行输入一个子串。【输出形式】程序在下一行输出删除其中全部子串后的字符串。假设字符串不包含子串则输出原字符串本身。【样例输入】I am a boy! a【样例输出】I mboy!【样例说明】用户首先输入字符串 I am a boy!,然后输出子串 a,程序会查找字符串中的子串删除它,最终 将删除后的结果输出:I#m#boy! #表示空格。【评分标准】结果完全正确得 20 分,每个测试点 4 分。提交程序名为:delsubstring.c。#include <string.h> #include <stdio.h>char source_str1024; char del_str1024; char dest_str1024;int main( void )char *pdest; intresult;fgets(source_str, 1024, stdin);10 / 30fgets(del_str, 1024, stdin);source_strstrlen(source_str)-1 = ”0”;del_strstrlen(del_str)-1 = ”0”;pdest = strstr(source_str, del_str);result = 0;while(pdest != NULL) strncat(dest_str,&source_strresult,(int)(pdest - &source_strresult);result+=(int)(pdest-&source_strresult) + strlen(del_str);pdestdel_str);=strstr(&source_strresult,if(result < strlen(source_str) strncat(dest_str,&source_strresult,strlen(source_str) - result);printf(“%sn“, dest_str);return 0;4.【问题描述】编写一个函数 char * str_bin(char* str1,char* str2), str1、str2 是两个有序字符串其中字符按 ASCII 码从小到大排序,将str2 合并到字符串 str1 中,要求合并后的字符串仍是有序的,允许字符重复。在 main 函数中测试该函数:从键盘输入两个有序字符串,然后调用该函数,最终输出合并后的结果。【输入形式】分行从键盘输入两个有序字符串不超过100 个字符【输出形式】输出合并后的有序字符串【输入样例】acegbdfh【输出样例】abcdefgh【样例说明】输入两个有序字符串 aceg 和 bdfh,输出合并后的有序字符串 abcdefgh【评分标准】结果完全正确得 20 分,每个测试点 4 分,提交程序文件名为 combine.c。#include<stdio.h>char * str_bin(char* str1, char* str2)static char str100;int i = 0;while (*str1 && *str2)if (*str1 < *str2)stri+ = *str1+;elsestri+ = *str2+;if (*str1)while (stri+ = *str1+);elsewhile (stri+ = *str2+);return str;int main char a100;char b100;scanf(“%sn%s“,&a,&b);printf (“%sn“,str_bin(a,b);return 0;作业四(A) int(B) char(C) float(D) double2. 字符串“ta017bc”的长度(不包括完毕符)是C(A) 9(C)6(B) 5(D)73. 设整型变量x 和y 的值均为 7,则表达式“x/(y-4)”的值是 CA. 3C. 2B. 3D. 1填空题# 题目1. : int a=2, b=7;计算以下表达式的值: 5 a=4,b=1,a>b?+a:+b;选择题# 题目1. :char a=a;float b=2.3;double c=41; int d;则执行语句 d=a+b+c;后变量 d 的数据类型为 A4. 题目内容:有 输 入 语 句 :int a,b,c; scanf(“a=%d,b=%d,c=%d“, &a, &b, &c); 为使变量 a 的值为 1,b 的值为 3,c 的值为 2,从键盘输入数据的正确形式应当是 (注:#表示空格)D(A)132<回车> (B)1,3,2<回车>(C)a=1#b=3#c=2<回车> (D)a=1,b=3,c=2<回车>编程题作业四-反弹1. 【问题描述】一球从高空落下时,每次落地后反弹至原高度的四分之一再落下。编写一程序,从键盘输入整数n 和 m,求该球从 n 米的高空落下后,第 m 次落地时共经过的路程以及第 m 次落地后反弹的高度,并输出结果。【输入形式】从键盘输入整数n 和 m,以空格隔开。【输出形式】输出两行:第一行输出总路程,保存小数点后两位; 其次行输出第 m 次落地后反弹的高度,保存小数点后两位。【输入样例】40 3【输出样例】65.000.63【评分标准】结果完全正确得 20 分,每个测试点 4 分, 提交程序文件 high.c。-日期天数转换2. 【问题描述】编写一个程序,用户输入日期,计算该日期是这一年的第几天。【输入形式】用户在第一行输入一个日期年 月 日,中间以空格分割【输出形式】程序在下一行输出一个整数【样例输入】2023 2 21【样例输出】52【样例说明】用户以年月日的格式输入,中间以空格分割,程序计算出该天是输入年份的第几天并输出该天数。另外还需要推断这一年是否为闰年。【评分标准】结果完全正确得 20 分,每个测试点 4 分。提交程序名为:datetoday.c#include<stdio.h> struct tianint year; int month; int day;int days(int year,int month,int day)return s;void mainint k=0; struct tian a;scanf(“%d%d%d“,&a.year,&a.month,&a. day);k=days(a.year,a.month,a.day); printf(“%dn“,k);第五次走也填空题# 题目1. : intk= 4,a=3,b=2,c=1;则表达式“k<a ? k : c<b ?c :a”的值为 12. :char x=A, y=B; 执行“(x= B)|(y=C)”的运算后,变量 x,y 的值分别为答案用逗号隔开”B”,”B”3. :int a=5,b=6,w=1,x=2,y=3,z=4;执行语句“(a=w>x)&&(b=y>z);”后 b 的值为 6int s=0,i,a13=0,31,28,31,30,31,30,31,31,30,31, 30,31;if(year%4=0&&year%100!=0|year%40 0=0)a2=29;for(i=1;i<month;i+)s+=ai; s=s+day;选择题# 题目1. 执行以下程序段后,变量a,b,c 的值分别是Bint x = 10, y = 9;int a, b, c;a = (-x = y+)? -x: +y;b = x+; c = y;(A) a = 9, b = 9, c = 9 (B) a = 8, b= 8, c = 10 (C) a = 9, b = 10, c = 9(D) a = 11, b = 11, c = 10编程题作业五-删数问题1. 【问题描述】输入一个高精度的大正整数SS 最长可达 240 位,去掉其中任意 N 位数字后剩下的数字按原次序组成一个的 正整数S。编程对给定的 N 和 S,查找一种方案使得剩下的数字组成的数S最小。【输入形式】输入有两行:1. 第一行是大整数 S。其中 S 最长可达 240位。2. 其次行是整数N。S、N 均以非0 数字开头。【输出形式】输出有一行,是在S 中删除N位后所得的最小数字S。【样例输入 1】1785434【样例输出 1】13【样例输入 2】10021【样例输出 2】002【算法提示】将整数看作字符串形式读入; 删数时,从前往后查找第一个比后一个数字大的数字,然后删除之,依据这种方法删除 N 个数字即得最小数字。【评分标准】该题要求输出一个大整数的各位数字。结果完全正确得 20 分,每个测试点 4 分。上传C 语言文件名为 delete.c。#include <stdio.h> #include <string.h>/* scan from 0 - 9, test the input, rescan if get the result. */int mainchar integer250, result250;int start = 0, strlength, n, i = 0, j, temp, k= 0;fgets(integer, 249, stdin); strlength = strlen(integer) - 1; integerstrlength = ”0”; scanf(“%d“, &n);for (i = 0; i <= 9; i+) temp = i;for (j = start; j <= n && n < strlength;j+)if (integerj = temp + ”0”) resultk+ = temp + ”0”; n+;start = j + 1; i = -1;break;【样例说明】样例 1 中输入整数 S=178543,N=4,要求在 178543 中删除 4 位,使剩下的for (i = 0; i < k; i+)数字最小。正确答案为S = 13。样例2 中printf(“%c“, resulti);输入整数S1002,N1,删完一位后 S =return 0;002,而不是 2,即 2 之前的 0 也必需输出。【运行时限】程序一次运行的最长时间限制在 15 秒内,超出则认为程序错误。作业五-求公式近似值2. 【问题描述】 ex 的近似值可由下面公式计算得出: ex=1 + x/1! + x2/2! + x3/3! + xn/n!给定x 和n,利用上述公式求得ex 的近似值。【输入形式】从把握台输入小数x,和整数nn>=1,用空格隔开。【输出形式】向把握台输出求得的 ex 的近似值小数点后保存 6 位有效数据。【样例输入】727【样例输出】1096.633156【样例说明】输入的x 为 7,n 的值为 27,即:求 e7 的近似值,利用上述公式求得的近似值为: 1096.633156。【评分标准】该题要求输出 ex 的近似值,共有 5 个测试点。上传C 语言文件名为 formula.c。#include<stdio.h> int mainint n,i; double t;scanf(“%lf%d“,&x,&n); t=1;s=1; y=1;for(i=1;i<=n;i+)t*=i; y*=x; s+=y/t;printf(“%lfn“,s); return 0;作业六: 选择题# 题目1. 假设有变量定义 int a; double b; 要输入数据存放在a 和 b 中,则下面正确的输入数据的语句为:CA. scanf(“%d%f“,a,b);B. scanf(“%d%f“,&a,&b);C. scanf(“%d%lf“,&a,&b);D. scanf(“%d%lf“,a,b);2. 在C 语言程序中,以下正确的描述是(B)函数的定义不行以嵌套,但函数的调用可以嵌套(A) 函数的定义可以嵌套,但函数的调用不行以嵌套B(C) 函数的定义和函数的调用均不行以嵌套(D) 函数的定义和函数的调用均可以嵌套3. 以下正确的函数声明形式是 A(A)double fun(int x, int y)double x,s,y;(B)double fun(int x; int y)(C) double fun(int x, int y);(D) double fun(int x, y);试验六-字符串中字符排序1. 【问题描述】编写一个程序,从键盘接收一个字符串,然后依据字符挨次从小到大进展排序,并删除重复的字符。【输入形式】用户在第一行输入一个字符串。【输出形式】程序依据字符(ASCII)挨次从小到大排序字符串,并删除重复的字符进展输出。【样例输入】badacgegfacb【样例输出】abcdefg【样例说明】用户输入字符串badacgegfacb, 程序对其进展按从小到大(ASCII)挨次排序, 并删除重复的字符,最终输出为 abcdefg【评分标准】结果完全正确得 20 分,每个测试点 4 分。提交源程序名为 stringsort.c#include <stdio.h> int mainchar str500=0,hash256=0; int i;scanf(“%s“,str); for(i=0;stri!=”0”;i+)hashstri=1; for(i=0;i!=256;i+)if(hashi=1)printf(“%c“,i);printf(“n“);scanf(“%d“);作业七: 选择题# 题目1. 假设有说明: char *language = “FORTRAN“, “BASIC“, “PASCAL“, “JAVA“, “C“;则以下不正确的表达是 D(A) language+2 表示字符串 “PASCAL“的首地址(B) *language2的值是字母 P(C) language 是一个字符型指针数组,它包含 5 个元素,每个元素都是一个指向字符串变量的指针(D) language 包含 5 个一样长度的数组2. 设有说明 int (* ptr) M; 其中 ptr 是C(A) M 个指向整型变量的指针(B) 指向M 个整型变量的函数指针(C) 一个指向具有 M 个整型元素的一维数组的指针(D) 具有M 个指针元素的一维指针数组,每个元素都只能指向整型量3. 下面能正确进展字符串赋值,并且能确保字符串以0结尾的操作是C(A)char s5 = “ABCDE“;(B)char s5 = A, B, C, D, E;(C) char *s; s = “ABCDE“;(D) char *s; scanf(“%s“, s);4. 假设有说明: char *language = “FORTRAN“, “BASIC“, “PASCAL“, “JAVA“, “C“; 则表达式*language1 > *language3 比较的是 C(A) 字符F 和字符P(B) 字符串 BASIC 和字符串 JAVA(C) 字符B 和字符J(D) 字符串 FORTRAN 和字符串 PASCAL5. 假设有以下定义,则数值不为 3 的表达式是int x10 = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, *p1;C(A)x3(B)p1 = x + 3, *p1+ (C)p1 = x + 2, *(p1+) (D)p1 = x + 2, *+p16. 以下正确的说明语句是A (A)int *b = 1, 3, 5, 7, 9;(B)int a5, *num5 = &a0, &a1, &a2,if(tmp%b)>=10)&a3, &a4;si=”a”+tmp%b-10;(C)int a = 1, 3, 5, 7, 9; int *num5 = a0,elsea1, a2, a3, a4;si=”0”+tmp%b;(D)inta34,(*num)4;num1=tmp=tmp/b;&a13;i+; si=”0”;当前编程题:试验七-整数的 N 进制字符串表示1. 【问题描述】编写函数itob(n,s,b),用于把整数 n 转换成以b 为基的字符串并存储到s 中.编写程序,使用函数 itob(n,s,b)将输入的整数n,转换成字符串s,将s 输出.转换后的字符串从最高的非零位开头输出。假设 n 为负数,则输出的字符串的第一个字符为-。 b 为大于 1 小于 37 的任意自然数值。当 b=2 时,输出字符只可能是0和1;当 b=16时,输出字符串中可能含有字符为 0- 9,a-f(字母以小写输出)。b 还可以是其它数值。比方输入 n=33,b=17,则输出33 的 17 进制值为“1g“。【输入形式】把握台输入整数n 和 b,其中n 可以为负数。n 和 b 以空格分隔.【输出形式】把握台输出转化后的字符串 s.【样例输入】5 2【样例输出】101【样例说明】5 的二进制就是 101【评分标准】结果完全正确得 20 分,每个测试点 4 分。提交程序名为:itob.c#include<stdio.h> #include <string.h>void itob(int n,char s,int b); void itob(int n,char s,int b)int tmp; int i = 0; tmp=n;while (tmp)int mainint n, b, i; char s100;scanf(“%d%d“,&n,&b);itob(n,s,b);for(i = strlen(s) - 1;i>=0;i-)printf(“%c“,si); return 0;第八次填空题# 题目1. 写出程序的运行结果