[新]C语言期末复习,经典练习题+知识点总结+模拟考题。三位一体,完胜c语言!!!!{考期必备神器}_c语言期末复习卷习题

2020-02-28 其他工作总结 下载本文

[新]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

《[新]C语言期末复习,经典练习题+知识点总结+模拟考题。三位一体,完胜c语言!!!!{考期必备神器}.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
[新]C语言期末复习,经典练习题+知识点总结+模拟考题。三位一体,完胜c语言!!!!{考期必备神器}
点击下载文档
相关专题 c语言期末复习卷习题 三位一体 考期 语言 c语言期末复习卷习题 三位一体 考期 语言
[其他工作总结]相关推荐
    [其他工作总结]热门文章
      下载全文