[新]C语言期末复习,经典练习题+知识点总结+模拟考题。三位一体,完胜c语言!!!!{考期必备神器}_c语言期末复习卷习题
[新]C语言期末复习,经典练习题+知识点总结+模拟考题。三位一体,完胜c语言!!!!{考期必备神器}由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“c语言期末复习卷习题”。
C语言期末复习(平时练习答案)
[特别适用于千千万北航学子] 考试重点:(编程题)排序,选择与冒泡排序,各种进制转换。。]
第二次大作业— 前驱、后继字符
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 int main(){ char c=“ ”;1 / 30
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;}
当前编程题:第二次大作业---数值变换
2.【问题描述】编写一程序,从键盘输入输入一个三位正整数,然后反向输出对应的数,如果输入的数不是三位正整数,则输出-1。【输入形式】从键盘输入三位的正整数。【输出形式】输出交换后的正整数值。【输入样例】 356 【输出样例】 653 【样例说明】从键盘输入的正整数值为356,将该数的个位与百位互换,所得结果为653.如果输入的正整数为300,则输出为3。【评分标准】结果完全正确得20分,每个测试点4分。提交程序名为:c0102.c。
//*编写一程序,从键盘输入输入一个三位正整数,然后反向输出对应的数,如果输入的数不是三位正整数,则输出-1。*// #include void main(){
int a,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);
//*输出交换后的正整数值。*//
} 当前编程题:第二次大作业---正整数的打印
else 4.【问题描述】给出一个不多于5位的正
printf(“-1n”);
整数,要求:
1.求出它是几位数。
//*如果输入的数不是三位正整数,则输出2.分别打印出每一位数字。
3.按照逆序-1*// 打印出每一位数字。【输入形式】控制台输}
入该正整数。【输出形式】控制台分行输出 输出结果。【样例输入】1234 【样例输出】 当前编程题:第二次大作业---计算平均值1234 4321 【样例说明】1234位数为4,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 int main(){
int x,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;}/ 30
分别为1,2,3,4,逆序为4321 【评分标准】该题共有三个输出整数,完全正确得10分,每答错一个扣掉4分,直至得分为0。本题要求上传程序的源文件。所采用语言可以是C(.c)。主文件名设定为intprint.c
//*给出一个不多于5位的正整数,要求:
1.求出它是几位数。
2.分别打印出每一位数字。
3.按照逆序打印出每一位数字。
*// #include void main(){
long int a;int n,b,c,d,e,f;printf(“n请输入一个整数(0~99999):”);scanf(“%d”,&a);if(a>9999)
n=5;
else
if(a>999)
n=4;
else
if(a>99)
n=3;
else
if(a>9)
n=2;
else
n=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);
} }
当前编程题:第二次大作业---简易计算器5.【问题描述】编程实现简易的计算器:读入两个整数运算数(data1和data2)及一个运算符(op),计算表达式data1 op data2的值,其中op可以是+,-,*,/。【输入形式】控制台输入运算数和运算符: 1.首先输入以空格分隔的两个整数,分别是data1和data2;2.3 / 30
输入一个字符作为运算符op,op可以是’+’,’-’,’*’,’/’。输入时,data1、data2、op之间各留有一个空格。具体格式见样例输入。【输出形式】控制台输出运算结果。作除法运算时,若能够整除,则输出为整数,否则输出结果小数点后应保留两位有效数字。【样例输入】5 * 【样例输出】
【样例说明】输入中先后输入第一个运算数23,第二个运算数5,运算符’*’,要求对23和5进行乘法运算。计算结果为115。【评分标准】该题共20分,每个测试点4分。本题要求上传程序的源文件。所采用语言可以是C(.c).即所上传的文件名为calculator.c
//*编程实现简易的计算器:读入两个整数运算数(data1和data2)及一个运算符(op),计算表达式data1 op data2的值,其中op可以是+,-,*,/。*// #include int main(){
int data1,data2,c;//定义变量// double d;char op;scanf(“%d%d %c”,&data1,&data2,&op);//输入运算数和运算符// if(op=='+')
//进行判断// {
c=data1+data2;
printf(“%d”,c);}
else
if(op=='-')
{
c=data1-data2;
printf(“%d”,c);
} else
if(op=='*')
{
c=data1*data2;
printf(“%d”,c);
}
else if(op=='/'){
d=(double)data1/data2;printf(“%.2f”,d);} return 0;}
找最大最小整数
1.【问题描述】编写一个程序,用户输入若干整数,试找出其中的最大数和最小数。【输入形式】用户在第一行待输入数据个数,在第二行输入数据。
【输出形式】程序在下一行输出数据的最大值和最小值 【样例输入】 89 62 96 74 52
【样例输出】96 52 【样例说明】用户第一次输入的为数据个数,在下一行依次输入数据。输出为5个数中的最大值和最小值,输出时候两个数之间用空格分隔。
【评分标准】结果完全正确得20分,每个测试点4分。提交程序名为:getmaxandmin.c 矩形相交 2.【问题描述】/ 30
平面上有两个矩形A和B,其位置是任意的。
编程求出其相交部分(如图中阴影部分)的面积。(0≤a,b≤1000)
【输
入形式】
从标准输入读取两行以空格分隔的整数,格式如下: Ax1 Ay1 Ax2 Ay2 Bx1 By1 Bx2 By2
其中(x1,y1)和(x2,y2)为矩形对角线上端点的坐标。各坐标值均为整数,取值在0至1000之间。
【输出形式】
向标准输出打印一个整数,是两矩形相交部分的面积(可能为0)。在输出末尾要有一个回车符。【输入样例】 0 0 2 2 1 1 3 4
【输出样例】 1
【评分标准】
结果完全正确得20分,每个测试点4分,提交程序文件名为area.c。[红色为采用答案
#include #include
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,struct point p2);struct rect guifanrect(struct rect R);
#define max(A,B)((A)>(B)?(A):(B))#define min(A,B)((A)>(B)?(B):(A))main(){ 5 / 30
int i,num1[4],num2[4],area;
for(i=0;i
scanf(“%d”,&num1[i]);for(i=0;i
scanf(“%d”,&num2[i]);
R1 = makerect(A1 =
makepoint(num1[0],num1[1]),A2 = makepoint(num1[2],num1[3]));
R2 = makerect(B1 =
makepoint(num2[0],num2[1]),B2 = makepoint(num2[2],num2[3]));
R1 = guifanrect(R1);R2 = guifanrect(R2);
if(R1.p2.x
R1.p1.x >= R2.p2.x || R1.p1.y >= R2.p2.y)
area = 0;else
area = abs(max(R1.p1.x, R2.p1.x)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(struct point p1,struct point p2){ struct 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;} 6 / 30
3.【问题描述】编写一个程序,当在一个字符串中出现子串时就删除它。
【输入形式】用户在第一行输入一个字符串,用户在第二行输入一个子串。
【输出形式】程序在下一行输出删除其中所有子串后的字符串。如果字符串不包含子串则输出原字符串本身。【样例输入】
I am a boy!a
【样例输出】
I m boy!
【样例说明】用户首先输入字符串I am a boy!,然后输出子串a,程序会寻找字符串中的子串删除它,最后将删除后的结果输出:I#m##boy!
#表示空格。
【评分标准】结果完全正确得20分,每个测试点4分。提交程序名为:delsubstring.c。#include #include char source_str[1024];char del_str[1024];char dest_str[1024];
int main(void){
char *pdest;
int result;
fgets(source_str, 1024, stdin);
fgets(del_str, 1024, stdin);
source_str[strlen(source_str)-1] = ' ';
del_str[strlen(del_str)-1] = ' ';
pdest = strstr(source_str, del_str);
result = 0;
while(pdest!= NULL){
strncat(dest_str, &source_str[result],(int)(pdest&source_str[result])+ strlen(del_str);
pdest = strstr(&source_str[result], del_str);
}
if(result
strncat(dest_str, &source_str[result], strlen(source_str)9, test the input, rescan if get the result.*/ int main(){
char integer[250], result[250];
int start = 0, strlength, n, i = 0, j, temp, k = 0;
fgets(integer, 249, stdin);
strlength = strlen(integer)1;i>=0;i--)
printf(“%c”,s[i]);
return 0;}
第八次 填空题 # 题目
1.写出程序的运行结果1,2,3,3,5,4 #include main(){
int a[] = {1,2,3,4,5,6};int *p;p=a;
printf(“%d,”,*p);printf(“%d,”,*(++p));printf(“%d,”,*++p);printf(“%d,”,*(p--));p+=3;
printf(“%d,%d”,*p, *(a+3));}
2.以下程序的运行结果是10 x #include struct n {
int x;
char c;};void func(struct n b){
b.x = 20;
b.c= ’y’;} main(){
struct n a = ,10, ’x’-;
func(a);
printf(“%d,%c”, a.x,a.c);}
3.以下程序的运行结果是6,9
#include void main(){
int i;
for(i=4;i
{
if(i%3==0)
continue;
printf(“%d”,i);
} }
选择题
# 题目
1.若有以下程序段 struct dent { int n;int *m;};int a=1, b=2, c=3;struct dent s[3]={{101,&a},{102,&b},{103,&c}};strcut dent *p =s;则以下表达式值为2的是A A.(p++)->m B.*(p++)->m 14 / 30
C.(*p).m D.*(++p)->m
2.下面程序是求数组中的最小的元素,请选择填空。D
findmin(int *s, int t, int *k){
int p;
for(p = 0;p
if(s[p]
_________;} }
main(){
int a[10],i,*k=&i;for(i=0;i
scanf(“%d”,&a[i]);} i=0;
findmin(a, 10,k);
printf(“%d, %d”, *k,a[*k]);}
A.k=p B.*k=p-s C.k=p-s D.*k=p
3.有如下定义: struct {
int x;
char *y;
} tab[2] = {{1, “ab”}, {2, “cd”}}, *p = tab;
语句 printf(“%c”, *(++p)->y);的输出结果是b
4.已知学生记录的定义为: struct student { int no;char name[20];char sex;struct {
int year;
int month;
int day;}birth;};struct student s;假设变量s中的“生日”应是“1988年5月10日”,对“生日”的正确赋值语句是D(A)year=1988;month=5;day=10;(B)brith.year=1988;birth.month=5;birth.day=10;(C)s.year=1988;s.month=5;s.day=10;(D)s.birth.year=1988;s.birth.month=5;s.birth.day=10;
5.若有以下说明和语句,则下面表达式中值为1002的是D struct student {
int age;
int num;};struct student stu[3] = {{1001, 20}, {1002, 19}, {1003, 21}};struct student *p;p = stu;
(A)(p++)->num(B)(p++)->age(C)(*p).num(D)(*++p).age
当前编程题:实验八---统计整数 / 30
1.【问题描述】 输入若干个整数,统计出现次数最多的那个整数。如果出现最多的整数有两个以上,打印最早输入的那个整数。【输入形式】
从标准输入读取输入。第一行只有一个数字N(1≤N≤10000),代表整数的个数。以后的N行每行有一个整数。【输出形式】
向标准输出打印出现次数最多的那个数字。【输入样例】 6 11 0-1 20 0 300
【输出样例】 0
【样例说明】
输入6个整数,其中出现次数最多的是0,共出现两次。【评分标准】
本题不准使用数学库函数。运行时限1秒,正确得20分,每个测试点4分,提交程序名为count.c。{{建电脑桌面}}
C 语言总复习C六月,奋战CC语言,大家一起加油啦~~~~~~~~~~~!总体上必须清楚的:¬
1)程序结构是三种: 顺序结构 , 循环结构(三个循环结构), 选择结构(if 和 switch)¬ 2)读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选
择)。¬ 3)计算机的数据在电脑中保存是以二进制的形式.数据存放的位置就是他的地址.¬ 4)bit是位是指为0 或者1。byte 是指字节, 一个字节 = 八个位.¬ 5)一定要记住二进制如何划成十进制。¬ 概念常考到的:¬ 1、编译预处理不是C语言的一部分,不再运行时间。C语言编译的程序称为源程序,它以ASCII数值存放在文本文件中。¬ 2、每个C语言程序中main函数是有且只有一个。¬ 3、在函数中不可以再定义函数。¬ 4、算法的是一定要有输出的,他可以没有输入。¬ 5、break可用于循环结构和switch语句。¬ 6、逗号运算符的级别最低。¬ 第一章¬ 1)合法的用户标识符考查:¬ 合法的要求是由字母,数字,下划线组成。有其它元素就错了。¬ 并且第一个必须为字母或则是下划线。第一个为数字就错了。¬ 关键字不可以作为用户标识符号。main define scanf printf 都不是关键字。迷惑你的地方If是可以做为用户标识符。因为If中的第一个字母大写了,所以不是关键字。¬ 2)实型数据的合法形式:¬ 2.333e-1 就是合法的,且数据是2.333×10-1。¬ 考试口诀:e前e后必有数,e后必为整数。.¬ 3)字符数据的合法形式::¬ '1' 是字符占一个字节,“1”是字符串占两个字节(含有一个结束符号)。¬
'0' 的ASCII数值表示为48,'a' 的ASCII数值是97,'A'的ASCII数值是65。¬ 4)整型一般是两个字节, 字符型是一个字节,双精度一般是4个字节:¬
考试时候一般会说,在16位编译系统,或者是32位系统。碰到这种情况,不要去管,一样做题。掌握整型一般是两个字节, 字符型是一个字节,双精度一般是4个字节就可以了。¬ 5)转义字符的考查:¬ 16 / 30
在程序中 int a = 0x6d,是把一个十六进制的数给变量a 注意这里的0x必须存在。¬
在程序中 int a = 06d, 是一个八进制的形式。¬
在转义字符中,’x6d’才是合法的,0不能写,并且x是小写。¬
‘141’是合法的,0是不能写的。¬ ‘108’是非法的,因为不可以出现8。¬ 6)算术运算符号的优先级别:¬ 同级别的有的是从左到右,有的是从右到左。¬
7)强制类型转换:¬
一定是(int)a 不是 int(a),注意类型上一定有括号的。¬ 注意(int)(a+b)和(int)a+b 的区别。前是把a+b转型,后是把a转型再加b。¬ 8)表达式的考查:¬
是表达式就一定有数值。¬
赋值表达式:表达式数值是最左边的数值,a=b=5;该表达式为5,常量不可以赋值。¬ 自加、自减表达式:假设a=5,++a(是为6),a++(为5);¬ 运行的机理:++a 是先把变量的数值加上1,然后把得到的数值放到变量a中,然后再用这¬
个++a表达式的数值为6,而a++是先用该表达式的数值为5,然后再把a的数值加上1为6,¬
再放到变量a中。进行了++a和a++后在下面的程序中再用到a的话都是变量a中的6了。¬
考试口诀:++在前先加后用,++在后先用后加。¬
逗号表达式:优先级别最低;表达式的数值逗号最右边的那个表达式的数值。¬(2,3,4)的表达式的数值就是4。¬ 9)位运算的考查:¬
会有一到二题考试题目。¬ 总的处理方法:几乎所有的位运算的题目都要按这个流程来处理(先把十进制变成二进制再变成十进制)。¬ 例1: char a = 6, b;¬
b = a>右移一位表示除以2。¬ 10)018的数值是非法的,八进制是没有8的,逢8进1。¬ 11)%符号两边要求是整数。不是整数就错了。¬ 12)三种取整丢小数的情况:¬
1、int a =1.6;¬ 2、(int)a;
¬ 3、¬ ¬ 第二章¬ 1)printf函数的格式考查:¬ %d对应整型;%c对应字符;%f对应单精度等等。宽度的,左对齐等修饰。¬ %ld对应 long int;%lf 对应double。¬ 2)scanf函数的格式考察:¬ 注意该函数的第二个部分是&a 这样的地址,不是a; ¬ Scanf(“%d%d%*d%d”,&a,&b,&c);跳过输入的第三个数据。¬ 3)putchar ,getchar 函数的考查:¬ char a = getchar()是没有参数的,从键盘得到你输入的一个字符给变量a。-putchar(‘y’)把字符y输出到屏幕中。¬ 4)如何实现两个变量x,y中数值的互换(要求背下来)¬ 不可以把 x=y ,y=x;要用中间变量 t=x;x=y;y=t。¬ 5)如何实现保留三位小数,第四位四舍五入的程序,(要求背下来)¬ 这个有推广的意义,注意 x =(int)x 这样是把小数部分去掉。¬ ¬ 第三章¬ 特别要注意:c语言中是用非0表示逻辑真的,用0表示逻辑假的。¬ 1)关系表达式:¬ 表达式的数值只能为1(表示为真),或0(表示假)¬ 当关系的表达是为真的时候得到1。如 9>8这个是真的,所以表达式的数值就是1;¬ 17 / 30
2)逻辑表达式:¬ 只能为1(表示为真),或0(表示假)¬ a)共有&& ||!三种逻辑运算符号。¬ b)!>&&>|| 优先的级别。¬
c)注意短路现象。考试比较喜欢考到。¬ d)要表示 x 是比0大,比10小的方法。0
else 是与最接近的if且没有else的相组合的。¬
4)条件表达式:¬
表达式1 ?表达式2 :表达式3¬
注意是当非0时候是表达式2的数值,当为0是就是表达式2的数值。¬ 考试口诀:真前假后。¬ 5)switch语句:¬
a)一定要注意有break 和没有break的差别,书上(34页)的两个例子,没有break时候,只要有一个case匹配了,剩下的都要执行,有break则是直接跳出了swiche语句。¬
b)switch只可以和break一起用,不可以和continue用。¬ ¬
第四章¬
1)三种循环结构:¬ a)for(); while();do-while()三种。¬ b)for循环当中必须是两个分号,千万不要忘记。¬
c)写程序的时候一定要注意,循环一定要有结束的条件,否则成了死循环。-
d)do-while()循环的最后一个while();的分号一定不能够丢。(当心上机改错)¬ 2)break 和 continue的差别¬ 记忆方法:¬
break:是打破的意思,(破了整个循环)所以看见break就退出真个一层循环。¬ continue:是继续的意思,(继续循环运算),但是要结束本次循环,就是循环体内剩下的语句不再执行,跳到循环开始,然后判断循环条件,进行新一轮的循环。¬ 3)嵌套循环¬ 就是有循环里面还有循环,这种比较复杂,要一层一层一步一步耐心的计算,一般记住两层是处理二维数组的。¬ 4)while((c=getchar())!=’n’)和 while(c=getchar()!=’n’)的差别¬ 先看a = 3!= 2 和(a=3)!=2 的区别:¬(!=号的级别高于=号所以第一个先计算 3!=2)第一个a的数值是得到的1;第二个a的数值是3。¬ 考试注意点: 括号在这里的重要性。¬ ¬ 第五章¬ 函数:是具有一定功能的一个程序块;¬ 1)函数的参数,返回数值(示意图):¬ main()¬ {¬ int a = 5,b=6,c;¬ c = add(a,b);¬ printf(“%d”,c);¬ }¬ ¬ 调用函数¬ a,b是实参¬ 整个函数得到一个数值就是¬ Add函数的返回数值。¬ int add(int x, int y)¬ {¬ int z;¬ z=x+y;¬ return z;¬ }¬ 被调用函数¬ x,y是形式参数¬ 函数返回数值是整型¬ ¬ z就是这个add函数计算后得到的结果,就是函数返回给主程序的返回数值。-程序是在从上往下顺序执行,当碰到了函数add后,把a,b的数值穿给调用函数,程序暂时中断等待返回数值。当得到了返回数值后,再顺序的往下执行¬ 2)一定要注意参数之间的传递¬ 实参和形参之间传数值,和传地址的差别。18 / 30
(考试的重点)¬ 传数值的话,形参的变化不会改变实参的变化。¬
传地址的话,形参的变化就会有可能改变实参的变化。¬
3)函数声明的考查:¬
一定要有:函数名,函数的返回类型,函数的参数类型。¬
不一定要有:形参的名称。¬ ¬
第六章¬
指针变量的本质是用来放地址,而一般的变量是放数值的。¬
int *p 中 *p和p的差别:¬
*p可以当做变量来用;*的作用是取后面地址p里面的数值¬
p是当作地址来使用。¬
*p++ 和(*p)++的之间的差别:改错题目中很重要¬
*p++是地址会变化。¬
(*p)++ 是数值会要变化。¬ 三名主义:(考试的重点)¬
数组名:表示第一个元素的地址。数组名不可以自加,他是地址常量名。(考了很多次)¬
函数名:表示该函数的入口地址。¬
字符串常量名:表示第一个字符的地址。¬ ¬
第七章¬
1一维数组的重要概念:¬ 对a[10]这个数组的讨论。¬
1、a表示数组名,是第一个元素的地址,也就是元素a[10]的地址。¬
2、a是地址常量,所以只要出现a++,或者是a=a+2赋值的都是错误的。¬
3、a是一维数组名,所以它是列指针,也就是说a+1是跳一列。¬ 对a[3][3]的讨论。¬
1、a表示数组名,是第一个元素的地址,也就是元素a[10]的地址。¬
2、a是地址常量,所以只要出现a++,或者是a=a+2赋值的都是错误的。¬
3、a是二维数组名,所以它是行指针,也就是说a+1是跳一行。¬ 4、a[0]、a[1]、a[2]也都是地址常量,不可以对它进行赋值操作,同时它们都是列指针,a[0]+1,a[1]+1,a[2]+1都是跳一列。¬ 5、注意a和a[0]、a[1]、a[2]是不同的,它们的基类型是不同的。前者是一行元素,后三者是一列元素。¬ 二维数组做题目的技巧:¬ 如果有a[3][3]={1,2,3,4,5,6,7,8,9}这样的题目。¬ 步骤一:把他们写成:
第一列 第二列 第三列
¬ a[0]à->第一行¬ a[1]à 4—>第二行¬ a[2]à 7->第三行¬ 步骤二:这样作题目间很简单:
¬ *(a[0]+1)我们就知道是第一行的第一个元素往后面跳一列,那么这里就是a[0][1]元素,所以是1。¬ *(a[1]+2)我们就知道是第二行的第一个元素往后面跳二列。那么这里就是a[1][2]元素,所以是6。¬ 一定记住:只要是二维数组的题目,一定是写成如上的格式,再去做题目,这样会比较简单。¬ 数组的初始化,一维和二维的,一维可以不写,二维第二个一定要写¬ int a[]={1,2} 合法。int a[][4]={2,3,4}合法。但int a[4][]={2,3,4}非法。¬ 二维数组中的行指针¬ int a[1][2]; ¬ 其中a现在就是一个行指针,a+1跳一行数组元素。搭配(*)p[2]指针¬ a[0],a[1]现在就是一个列指针。a[0]+1 跳一个数组元素。搭配*p[2]指针数组使用¬ 还有记住脱衣服法则:¬ a[2] 变成 *(a+2)a[2][3]变成 *(a+2)[3]再可以变成 *(*(a+2)+3)-这个思想很重要!¬ 学习
模拟试题::::
一、选择题
1、字符串“'efg'”的长度是:().19 / 30
A、3 B、11 C、7 D、52、设变量a是整型,f是实型,i是双精度型,则表达式10+'a'+i*f值的 数据类型为()。A、double B、不确定 C、int D、float3、下列语句的结果是()。main(){ int j;
j=3;
printf(“%d,”,++j);printf(“%d”,j++);}
A、3,3 B、4,4 C、3,4 D、4,34、逻辑表达式!(2-1)&&x||0的值是()A、1 B、0 C、3 D、25、int a=1,b=2,c=3;if(a>b)a=b;if(a>c)a=c;则a的值为()。A、3 B、2 C、1
D、不一定
6、执行语句 for(i=1;i++
7、以下正确的描述是().A、只能用continue语句来终止本次循环 B、switch语句中不能出现continue语句 C、在循环中break语句不能独立出现 D、goto语句只能用于退出多层循环
8、下面合法的语句定义是().A、char a[ ]={'0','1','2','3','4','5'};B、int a[ ]=“string”;C、int a[5]={0,1,2,3,4,5};D、char a=“string”;
9、char a[10];不能将字符串“abc”存储在数组中的是()。
A、int i;for(i=0;i
10、在C语言中,一维数组的定义方式为:类型说明符数组名()。
A、[整型常量]或[整型表达式] B、[正整型常量表达式] C、[整型表达式] D、[常量表达式]
11、在定义全局变量和局部静态变量的同时赋值,变量的初始化在()时确定的.A、运行 B、编辑 C、编译 D、调试
12、关于建立函数的目的,以下正确的说法是()。
A、提高程序的可读性 B、减少程序文件所占内存 C、减少程序的篇幅
D、提高程序的执行效率
13、以下函数调用语句中实参的个数是()。func((e1,e2),(e3,e4,e5));A、3 B、5 C、语法错误 D、214、设有宏定义#define SUB(x,y)(x)*y,且a=3,b=4,则 SUB(a++,b++)的值为().A、13 B、16 C、20 D、1215、变量p为指针变量,若p=&a,下列写法不正确的是()。A、*(p++)==a++ 20 / 30
B、&*p==&a C、(*p)++==a++ D、*&a==a16、下列程序正确的运行结果为().#include main(){
union u
{char *name;int age;int income;} s;
s.name=“WANGLING”;s.age=28;
s.income=1000;
printf(“%dn”, s.age);}
A、8 B、28 C、1000 D、不确定
17、定义my_file 为文件型指针变量,使用fopen只读方式打开一个已存在的二进制文件,以下正
确的调用形式为().A、my_file=fopen(“my.dat”, “r”);B、my_file=fopen(“my.dat”, “rb+”);C、my_file=fopen(“my.dat”, “rb”);D、my_file=fopen(“my.dat”, “r+”);
答案:CABBC BAABB CADDA CC
二、判断
1、若i =3,则printf(“%d”,-i++);输出的值为-4。
2、格式字符%x用来以八进制形式输出整数.3、设u=1,v=2,w=3,则逻辑表达式u||v-w&&v+w的值为0.4、已知a=4,b=2,c=3,d=5,表达式a>b?a:c
5、break语句能够终止当前进行的多层循环.6、break语句不能终止正在进行的多层循环.7、若有定义和语句:
int a[3][3]={{3,5},{8,9},{12,35}},i,sum=0;
for(i=0;i
8、二维数组在内存中存贮时,是按行的顺序进行存储的。
9、C语言中引用数组元素的方括号可以用花括号代替.10、每次调用函数时,都要对静态局部变量重新进行初始化.11、在程序中的第二个函数之后定义了某全局变量,则该程序的所有函数均可使用它.12、在C程序中 , 函数既可以嵌套定义 , 也可以嵌套调用
13、在定义宏时,在宏名与带参数的括弧之间不应加空格.14、数组名与指针变量是相互等价的.15、两个类型相同的结构体变量,可以互相赋值.16、C语言中,在打开文件时,必须说明文件的使用方式,“r+”用于打开一个不存在的文件.答案:错错错错错对对对错错错错对错对错
三、填空
1、设x和y均为int型变量,且x=1,y=2,则表达式1.0+x/y的值为____1.0_.2、在C语言中,long类型数据占___4__个字节, short类型数据占_2____个字节.3、int x=2,y=3,z=4;则表达式x+y>z&&y==z的值为
0_____.4、int x=2,y=3,z=4;则表达式x+y&&(x=y)的值为____1_.5、C语言中,二维数组在内存中的存放方式为按___行__优先存放.6、函数调用时的实参和形参之间的数据是单向的_值____传递.7、结构体是不同数据类型的数据集合,作为数据类型, 必须先说明结构体___类型__,再说明结构体变量.8、调用 fopen 函数打开一文本文件,在“使用方式”这一项中, 为输入而打开需填入_r____.答案:(1)1 1.0
1.(2)4(3)0
(4)(5)行(6)值(7)类型(8)21 / 30
r+ r
四、程序设计
1、功能:求出二维数组外围元素之和,作为函数值返回。二
维数组的值在主函数中赋予。------#define M 4 #define N 5
#include “stdio.h”
int fun(int a[M][N]){
/*********Begin**********/
/********** End **********/ }
main(){
int
a[M][N]={{1,3,5,7,9},{2,4,6,8,10},{2,3,4,5,6},{4,5,6,7,8}};
void TestFunc();
int y;
y=fun(a);
printf(“s=%dn”,y);
TestFunc();}
void TestFunc(){
FILE *IN,*OUT;int iIN[M][N],iOUT;int i,j,k;
IN=fopen(“14.in”,“r”);if(IN==NULL)
{printf(“Please Verify The Currernt Dir..It May Be Changed”);}
OUT=fopen(“14.out”,“w”);if(OUT==NULL){printf(“Please Verify The Current Dir..It May Be Changed”);} for(k=0;k
for(j=0;j
fscanf(IN,“%d”,&iIN[i][j]);
iOUT=fun(iIN);fprintf(OUT,“%dn”,iOUT);} fclose(IN);fclose(OUT);} 【参考代码】
int s=0;
int i,j;
for(i=0;i
s=s+a[i][0]+a[i][N-1];
for(j=1;j
s=s+a[0][j]+a[M-1][j];
return s;===============
2、功能:找出一个大于给定整数且紧随这个整数的素数,并 作为函数值返回。
-----------------*/
#include “stdio.h” #include“conio.h”
int fun(int n){
/*********Begin**********/
/********** End **********/ } void TestFunc(){
FILE *IN,*OUT;
int s;
int t;22 / 30
int o;
IN=fopen(“in.dat”,“r”);
if(IN==NULL)
{
printf(“Read File Error”);
}
OUT=fopen(“out.dat”,“w”);
if(OUT==NULL)
{
printf(“Write File Error”);
}
for(s=1;s
{
fscanf(IN,“%d”,&t);
o=fun(t);
fprintf(OUT,“%dn”,o);
}
fclose(IN);
fclose(OUT);}
main()
{
int m;
printf(“Enter m: ”);
scanf(“%d”, &m);
printf(“nThe result is %dn”, fun(m));
TestFunc();}
【参考代码】
int i,k;
for(i=n+1;;i++){ for(k=2;k
五、程序改错
1、功能:一个5位数,判断它是不是回文数。即12321是回文数,个
位与万位相同,十位与千位相同。------#include “stdio.h” main(){
/**********ERROR**********/
long ge,shi,qian;wan,x;
scanf(“%ld”,&x);
/**********ERROR**********/
wan=x%10000;
qian=x%10000/1000;
shi=x%100/10;
ge=x%10;
/**********ERROR**********/
if(ge==wan||shi==qian)
printf(“this number is a huiwenn”);
else
printf(“this number is not a huiwenn”);} 【改错1】 【参考答案】
long ge,shi,qian,wan,x;=========================================== 【改错2】
【参考答案】 wan=x/10000;=========================================== 【改错3】
【参考答案】
if(ge==wan&&shi==qian)if(shi==qian&&ge==wan)===========================================
2、功能:一个5位数,判断它是不是回文数。即12321是回文数,个 位与万位相同,十位与千位相同。------#include “stdio.h” main(){
/**********ERROR**********/
long ge,shi,qian;wan,x;
scanf(“%ld”,&x);
/**********ERROR**********/ 23 / 30
wan=x%10000;
qian=x%10000/1000;
shi=x%100/10;
ge=x%10;
/**********ERROR**********/
if(ge==wan||shi==qian)
printf(“this number is a huiwenn”);
else
printf(“this number is not a huiwenn”);}
【参考答案】 #include “math.h” #include
===========================================【参考答案】 float s=0,t=1,p=1;float s=0,p=1,t=1;float p=1,s=0,t=1;float p=1,t=1,s=0;float t=1,p=1,s=0;float t=1,s=0,p=1;double s=0,t=1,p=1;float s=0.0,t=1.0,p=1.0;double s=0.0,t=1.0,p=1.0;
===========================================
【参考答案】 while(fabs(t)>1e-4)while(0.00010.0001)
===========================================
【参考答案】
printf(“pi=%fn”,s*4);printf(“pi=%lfn”,s*4);
===========================================
六、程序填空
1、功能:计算并输出500以内最大的10个能被13或17整除的自然数之和。------#include “stdio.h”
/***********FILL***********/ int fun(_____){
int m=0, mc=0, j, n;
/***********FILL***********/
while(k >= 2 && _____)
{
/***********FILL***********/
if(k%13 == 0 || _____)
{
m=m+k;
mc++;
}
k--;
}
/***********FILL***********/
_____;} main(){
printf(“%dn”, fun(500));} 【空1】
【参考答案】 int k =========================================== 【空2】
【参考答案】 mc mc mc = mc ===========================================【空3】 【参考答案】 k%17 == 0!(k%17)k/17*17==k =========================================== 【空4】
【参考答案】 return m return(m)24 / 30
===========================================
2、功能:以下程序中,函数fun的功能是计算x^2-2x+6,主函数中将调用fun函数计算:
y1=(x+8)^2-2(x+8)+6 y2=(sin(x))^2-2sin(x)+6 请填空。
------#include
#include double fun(double x){
return(x*x-2*x+6);}
main(){
/***********FILL***********/ double x, __________;
printf(“Enter x:”);
scanf(“%lf”,&x);
/***********FILL***********/
y1=fun(_________);
/***********FILL***********/
y2=fun(_________);
printf(“y1=%lf,y2=%lfn”, y1, y2);}
【空1】
【参考答案】
y1,y2 y2,y1
=========================================== 【空2】
【参考答案】(x+8)(8+x)x+8 8+x
=========================================== 【空3】
【参考答案】 sin(x)
C语言必背18个经典程序
1、/*输出9*9口诀。共9行9列,i控制行,j控制列。*/ #include “stdio.h” main(){int i,j,result;for(i=1;i
{ for(j=1;j
{
result=i*j;
printf(“%d*%d=%-3d”,i,j,result);/*-3d表示左对齐,占3位*/
}
printf(“n”);/*每一行后换行*/
} }
2、/*古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 兔子的规律为数列1,1,2,3,5,8,13,21....*/ main(){ long f1,f2;int i;f1=f2=1;for(i=1;i
{ printf(“%12ld %12ld”,f1,f2);
if(i%2==0)printf(“n”);/*控制输出,每行四个*/
f1=f1+f2;/*前两个月加起来赋值给第三个月*/
f2=f1+f2;/*前两个月加起来赋值给第三个月*/
} }
3、/*判断101-200之间有多少个素数,并输出所有素数及素数的个数。
程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素25 / 30
数。*/
#include “math.h” main(){
int m,i,k,h=0,leap=1;
printf(“n”);
for(m=101;m
{ k=sqrt(m+1);
for(i=2;i
if(m%i==0)
{leap=0;break;}
if(leap)
/*内循环结束后,leap依然为1,则m是素数*/
{printf(“%-4d”,m);h++;
if(h%10==0)
printf(“n”);
}
leap=1;
}
printf(“nThe total is %d”,h);}
4、/*一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程
找出1000以内的所有完数。*/ main(){
static int k[10];
int i,j,n,s;
for(j=2;j
{
n=-1;
s=j;
for(i=1;i
{if((j%i)==0)
{ n++;
s=s-i;
k[n]=i;
}
}
if(s==0)
{printf(“%d is a wanshu: ”,j);
for(i=0;i
printf(“%d,”,k[i]);
printf(“%dn”,k[n]);
} } }
5、/*下面程序的功能是将一个4×4的数组进行逆时针旋转90度后输出,要求原始数组的数据随机输入,新数组以4行4列的方式输出,请在空白处完善程序。*/ main(){ int a[4][4],b[4][4],i,j;
/*a存放原始数组数据,b存放旋转后数组数据*/
printf(“input 16 numbers: ”);/*输入一组数据存放到数组a中,然后旋转存放到b数组中*/
for(i=0;i
for(j=0;j
{ scanf(“%d”,&a[i][j]);
b[3-j][i]=a[i][j];
}
printf(“array b:n”);
for(i=0;i
{ for(j=0;j
printf(“%6d”,b[i][j]);
printf(“n”);
} }
6、/*编程打印直角杨辉三角形*/ main(){int i,j,a[6][6];for(i=0;i
{a[i][i]=1;a[i][0]=1;} for(i=2;i
for(j=1;j
a[i][j]=a[i-1][j]+a[i-1][j-1];for(i=0;i
{for(j=0;j
printf(“%4d”,a[i][j]);
printf(“n”);} }
7、/*通过键盘输入3名学生4门课程的成绩,分别求每个学生的平均成绩和每门课程的平均成绩。/ 30
要求所有成绩均放入一个4行5列的数组中,输入时同一人数据间用空格,不同人用回车 其中最后一列和最后一行分别放每个学生的平均成绩、每门课程的平均成绩及班级总平均分。*/
#include #include main()
{ float a[4][5],sum1,sum2;
int i,j;
for(i=0;i
for(j=0;j
scanf(“%f”,&a[i][j]);
for(i=0;i
{ sum1=0;
for(j=0;j
sum1+=a[i][j];
a[i][4]=sum1/4;
}
for(j=0;j
{ sum2=0;
for(i=0;i
sum2+=a[i][j];
a[3][j]=sum2/3;
}
for(i=0;i
{ for(j=0;j
printf(“%6.2f”,a[i][j]);
printf(“n”);
} }
8、/*完善程序,实现将输入的字符串反序输出,如输入windows 输出swodniw。*/ #include main()
{ char c[200],c1;
int i,j,k;
printf(“Enter a string: ”);
scanf(“%s”,c);
k=strlen(c);
for(i=0,j=k-1;i
{ c1=c[i];c[i]=c[j];c[j]=c1;}
printf(“%sn”,c);
}
指针法:
void invert(char *s){int i,j,k;char t;k=strlen(s);for(i=0,j=k-1;i
{ printf(“cannot open the filen”);
exit(0);
}
printf(“input str:n”);gets(str);
printf(“n%s”,str);fprintf(fp,“%s”,str);invert(str);
printf(“n%s”,str);fprintf(fp,“n%s”,str);
fclose(fp);}
9、/*下面程序的功能是从字符数组s中删除存放在c中的字符。*/ #include main(){ char s[80],c;
int j,k;
printf(“nEnter a string: ”);
gets(s);
printf(“nEnter a character: ”);
c=getchar();
for(j=k=0;s[j]!= ' ';j++)
if(s[j]!=c)
s[k++]=s[j];
s[k]= ' ';
printf(“n%s”,s);}
10、/*编写一个void sort(int *x,int n)实现将27 / 30
x数组中的n个数据从大到小
排序。n及数组元素在主函数中输入。将结果显示在屏幕上并输出到文件p9_1.out中*/
#include void sort(int *x,int n){
int i,j,k,t;
for(i=0;i
for(j=i+1;j
if(x[j]>x[k])k=j;
if(k!=i)
{
t=x[i];
x[i]=x[k];
x[k]=t;
} } }
void main(){FILE *fp;
int *p,i,a[10];
fp=fopen(“p9_1.out”,“w”);
p=a;
printf(“Input 10 numbers:”);for(i=0;i
scanf(“%d”,p++);p=a;
sort(p,10);
for(;p
fprintf(fp,“%d ”,*p);}
system(“pause”);
fclose(fp);}
11、已知数组a中的元素已按由小到大顺序排列,以下程序的功能是将输入的一个数插入数组a中,插入后,数组a中的元素仍然由小到大顺序排列*/
main()
{ int a[10]={0,12,17,20,25,28,30};/*a[0]为工作单元,从a[1]开始存放数据*/
int
j=6;
fprintf(fp,“The new string is----%sn”,str);
fclose(fp);/*j为元素个数*/
printf(“Enter a number: ”);
}
scanf(“%d”,&x);
13、/*在一个字串s1中查找一子串s2,若
a[0]=x;存在则返回子串在主串中的起始位置
i=j;,不存在则返回-1。*/ x , i, /*从最后一个单元开始*/
while(a[i]>x)
{ a[i+1]=a[i];i--;
}
/*将比x大的数往后移动一个位置*/
a[++i]=x;
j++;
/*插入x后元素总个数增加*/
for(i=1;i
printf(“n”);}
12、/*编写函数replace(char *s,char c1,char c2)实现将s所指向的字符串中所有字符c1用c2替换,字符串、字符c1和c2均在主函数中输入,将原始字符串和替换后的字符串显示在屏幕上,并输出到文件p10_2.out中*/ #include replace(char *s,char c1,char c2){ while(*s!=' ')
{ if(*s==c1)
*s=c2;
s++;
} } main(){ FILE *fp;
char str[100],a,b;
if((fp=fopen(“p10_2.out”,“w”))==NULL)
{ printf(“cannot open the filen”);
exit(0);
}
printf(“Enter a string:n”);
gets(str);
printf(“Enter a&&b:n”);
scanf(“%c,%c”,&a,&b);printf(“%sn”,str);fprintf(fp,“%sn”,str);replace(str,a,b);printf(“The new string is----%sn”,str);28 / 30
main(){char s1[6]=“thisis”;char s2[5]=“is”;
printf(“%dn”,search(s1,s2));system(“pause”);}
int search(char s1[],char s2[]){int i=0,j,len=strlen(s2);while(s1[i]){ for(j=0;j
if(j>=len)return i;else i++;} return-1;}
14、/*用指针变量输出结构体数组元素。*/ struct student { int num;char *name;char sex;int age;}stu[5]={{1001,“lihua”,'F',18},{1002,“liuxing”,'M',19},{1003,“huangke”,'F',19},{1004,“fengshou”,'F',19},{1005,“Wangming”,'M',18}};main(){int i;struct student *ps;printf(“Num tNametttSextAgetn”);
/*用指针变量输出结构体数组元素。*/ for(ps=stu;psnum,ps->name,ps->sex,ps->age);/*用数组下标法输出结构体数组元素学号和年龄。*/ for(i=0;i
15、/*建立一个有三个结点的简单链表:*/ #define NULL 0 struct student {
int num;char *name;int age;struct student *next;};void main(){ struct student a,b,c,*head,*p;a.num=1001;a.name=“lihua”;a.age=18;/* 对结点成员进行赋值
*/ b.num=1002;b.name=“liuxing”;b.age=19;c.num=1003;c.name=“huangke”;c.age=18;head=&a;
/* 建立链表,a为头结点
*/ a.next=&b;b.next=&c;c.next=NULL;p=head;
/* 输出链表
*/ do{ printf(“%5d,%s,%3dn”,p->num,p->name,p->age);p=p->next;}while(p!=NULL);}
16、/*输入一个字符串,判断其是否为回文。回文字符串是指从左到右读和从右到左读完全相同的字符串。*/ #include #include #include main(){ char s[100];
int i,j,n;
printf(“输入字符串:n”);
gets(s);
n=strlen(s);
for(i=0,j=n-1;i
if(s[i]!=s[j])
break;
if(i>=j)printf(“是回文串n”);29 / 30
else
printf(“不是回文串n”);}
17、/*冒泡排序,从小到大,排序后结果输出到屏幕及文件myf2.out*/ #include void fun(int a[],int n){int i,j,t;
for(i=0;i
for(j=0;j
if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;} }
main()
{int a[10]={12,45,7,8,96,4,10,48,2,46},n=10,i;FILE *f;
if((f=fopen(“myf2.out”,“w”))==NULL)
printf(“open file myf2.out failed!n”);fun(a,10);
for(i=0;i
{printf(“%4d”,a[i]);
fprintf(f,“%4d”,a[i]);
} fclose(f);}
18、编写函数countpi,利用公式
计算π的近似值,当某一项的值小于10-5时,认为达到精度要求,请完善函数。将结果显示在屏幕上并输出到文件p7_3.out中。#include double countpi(double eps)/*eps为允许误差*/
{
int m=1;
double temp=1.0,s=0;
while(temp>=eps)
{ s+=temp;
temp=temp*m/(2*m+1);
m++;
}
return(2*s);
} main(){FILE *fp;
double eps=1e-5,pi;
if((fp=fopen(“p7_3.out”,“w”))==NULL)
{ printf(“cannot open the filen”);
exit(0);
}
pi= countpi(eps);
printf(“pi=%lfn”,pi);fprintf(fp,“pi=%lfn”,pi);fclose(fp);} 30 / 30