0098《高级程序设计(C语言)》2019年6月期末考试指导
一、考试说明
(一)说明
考试为闭卷,试卷满分为100分,考试时间90分钟。
(二)题型及各题型所占分数和相应的答题技巧
1.单选题(每题4分,共10题,共40分)
答题技巧:选择与题干相匹配的答案。可以考虑排除法等选择技巧。
2.填空题(每题4分,共10题,共40分)
答题技巧:模拟计算机程序,按照题目要求填写结果或代码。
3. 编程题(每题10分,共2题,共20分)
答题技巧:按照题目要求,编写对应的程序代码。
二、重点内容
第一章 C语言程序设计基础
1.C语言标识符
数据类型名、变量名、函数名都必须是合法标识符。标识符就是一个名字,C语言规定标识符只能由字母、数字和下划线3种字符组成,并且第一个字符必须是字母或下划线。
一个C语言程序是由若干函数组成。
2.二进制转换为八进制、十六进制数
将二进制数从右向左每3位分一组,然后将每一组的二进制数
转换为八进制数的一个数位的值,就可以得到相应的八进制数。将二进制数从右向左每4位分一组,然后将每一组的二进制数转换为十六进制数的一个数位的值,就可以得到相应的十六进制数。
3. 八进制、十六进制数转换为二进制数
将每一位八进制数或十六进制数转换为二进制数即可。这个过程是将二进制数转换为八进制数或十六进制数的逆过程。
第二章 基本数据类型、运算符和表达式
1.C语言规定,符号常量和变量必须“先定义,后使用”。
2.C语言的基本数据类型及各自的定义方式
C语言中存在着两种表征数据的形式:常量和变量。常量用来表示数据的值,变量不但可以用来表示数据的值,也可以用来存放数据。
(1)整型数据:十进制、八进制、十六进制。
整型变量的定义
格式:“数据类型名标识符 变量名”即“int 变量名;”,整型类型名int与变量名之间要用空格分开,最后还要以分号结尾。
(2)实型数据
实型常量有两种表示方法:十进制小数形式和指数形式。
(3)字符型数据
C语言中,用单引号括起来的是字符常量,用双引号括起来的被称为字符串常量。
char,有符号字符,取值范围是−128~127,最高位(第8位)是符号位。
(4)空类型:void
3.Printf函数输出各种类型数据的方法
(1)格式:printf(参数列表)
(2)Printf函数可以带多个参数,例如:printf(“variable a=%d”,a)
4.C语言的各种运算符和表达式
(1)赋值运算符和赋值表达式:“=”/“=”;
c语言中,“=”被称为赋值运算符,它的作用是设置变量的值。
(2)强制类型转换符
当等号左右两边的数据类型不一致时,c语言将首先将=右边的表达式的值转化为=左边的数据类型,然后再赋值给=左边的变量。
(3)算术运算符和算术表达式:+、-、*、/和%
(4)自增自减运算符和符号运算符:++、--和-
-既是一个算术运算符,又是一个负号运算符,它是一个单目运算符。
++的作用是使变量自己增1,--的作用是使变量自己减1。与负号运算符优先级相同。
++和--位于变量左边和右边的结果是不同的。(在变量左边,先增减后计算;在变量右边,先计算,后增减)
(5)位运算符:按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)和右移(>>)
(6)逗号运算符和逗号表达式
用逗号连接起来的表达式称为逗号表达式。
一般形式:表达式1,表达式2,……,表达式k,例如:a+5,b=6,b++
逗号表达式的求值顺序是从左向右依次计算用逗号分隔的各表达式的值,最后一个表达式的值就是整个逗号表达式的值。
(7)sizeof运算符:计算字符个数,因此牢记各类型数据的长度
作用:能获取变量和数据类型所占内存大小的运算符。
第三章 基本输入输出和顺序程序设计
1.数据输出函数——Printf函数
(1)各种格式转换符:%d,%x,%o,%u,%c,%s,%f,%e,%g
(2)调用printf函数的基本格式是
printf(“格式控制字符串”,表达式1,表达式2,…,表达式n);
(3)printf函数的功能就是按照“格式控制字符串”的要求,将表达式1,表达式2,…,表达式n的值显示在屏幕上。
字符和字符串的输出,除了可以利用printf函数以外,还可以利用putchar和puts函数。
2.各种数据类型的输出:整型、实数、字符和字符串、格式化输出等。比如下边列出格式化输出时,通过格式控制字符控制的格式要素主要有:
(1)数据类型及其长度,比如用%d输出int型数据,用%ld输出long型数据,用%f输出double型数据,用%lf输出long double型数据。
(2)输出数据所占的宽度(域宽),比如,%4d表示输出至少占4格。
(3)输出数据的精度,比如%4.2f表示输出2位小数,%.3s表示要输出字符串的前3个字符,%6.4u表示至少要输出4位数。
(4)对齐特征,比如%-16d表示输出的数据左对齐。缺省情况下,输出将右对齐。
(5)数制形式,比如,%x要求以十六进制形式输出数据。
(6)数值符号,比如,%+d要求输出整数的正负号。
3.数据输入函数——Scanf函数
(1)调用scanf函数的基本格式是
scanf(“格式控制字符串”,变量1的地址,变量2的地址,…,变量n的地址);
(2)与上面printf函数同样的格式控制符
(3)scanf函数的功能是在第一个参数格式控制字符串的控制下,接受用户的键盘输入,并将用户输入的数据依次存放在变量1、变量2,……和变量n中。
(4)&是取地址符。功能是取地址。要获得变量的地址,需要在变量名前加&。因此&又被称为取地址运算符。
4. 字符数据的非格式化输入
(1)getchar函数
函数原型:int getchar(void);
getchar函数没有参数,有一个int型的返回值。getchar函数的功能是读取用户按键信息,它的返回值是用户所按字符的ASCII码。当程序调用getchar时,程序就进入等待状态,等待用户按键。用户输入的字符将被存放到内部的缓冲区内中,直到用户按回车键为止。其返回值是用户输入的第一个字符。
(2)getche函数
函数原型:int getche(void);
getche函数的功能与getchar相同。唯一的差别是:getche直接从键盘获取键值,不
等待用户按回车键。只要用户按下一个键,getche就立刻返回,返回值就是用户所按键的ASCII码。
(3)getch函数
函数原型:int getch(void);
getch函数的功能与getche函数基本相同。唯一的差别是:getche回显所输入的字符,getch不回显所输入的字符。
第四章 程序控制
1. 关系运算符、逻辑运算符和条件运算符
(1)关系运算符和关系表达式
关系运算符又称比较运算符,C语言提供了6种关系运算符,它们的含义及优先级关系见下表:
关系运算符 | 含义 | 优先级 |
< | 小于 | 这些关系运算符等优先级,但比下面高 |
<=(注意,<和=之间没有空格) | 小于等于 | |
> | 大于 | |
>=(注意,>和=之间没有空格) | 大于等于 | |
==(注意,两个=之间没有空格) | 等于 | 这些关系运算符等优先级,但比上面低 |
!= (注意,!和=之间没有空格) | 不等于 |
关系运算符的优先级要比与、或以及赋值运算符高,但比算术运算符和移位运算符低。
(2)逻辑运算符和逻辑表达式
C语言提供了3个逻辑运算符,其中一个是单目运算符,其他两个是双目运算符。
逻辑运算符 | 含义 | 优先级关系 |
||(两个|之间没有空格) | 双目运算符,逻辑或,表示或者 | 低 ↓ 高 |
&&(两个&之间没有空格) | 双目运算符,逻辑与,表示并且 | |
! | 单目运算符,逻辑非,表示相反 |
用逻辑运算符连接起来的式子称为逻辑表达式。逻辑表达式的值也是“真”或“假”。
(3)条件运算符和条件表达式
条件运算符(?:)是C语言提供的唯一一个三目运算符。用条件运算符连接的式子称为条件表达式。条件表达式的格式是:
表达式1?表达式2:表达式3
条件表达式求值的规则如下:如果表达式1的值是真,那么整个条件表达式的值就是表达式2的值,否则整个条件表达式的值是表达式3的值。比如,如果a的值是5,表达式a>4?10:11的值就是10。
优先级的记忆规则:
总体上讲,单目运算符都是同优先级的,具有右结合性,并且优先级比双目运算符和三目运算符都高。
三目运算符的优先级比双目运算符要低,但比赋值运算符和逗号运算符高。
逗号运算符的优先级最低,其次是赋值运算符。
只有单目运算符、赋值运算符和条件运算符具有右结合性,其他运算符是左结合的。
双目运算符中,算术运算符的优先级最高,逻辑运算符最低。算术运算符>移位运算符>关系运算符>位运算符>逻辑运算符
2.选择结构的程序设计
(1)简单的if语句
if(表达式)
{程序段}
if…else语句:
if(表达式p)
{程序段s1}
else
{程序段s2}
(2)Switch语句
switch(变量或表达式p)
{
case常量表达式c1:程序段s1
break;
case常量表达式c2:程序段s2
break;
……
case常量表达式cn:程序段sn
break;
default:程序段s(n+1)
break;}
2.循环结构的程序设计
(1)While和do while语句
while(表达式p)
{
程序段s
}
do
{
程序段s
}while(表达式p);
功能:首先执行程序段s ,然后再判断表达式p的值是否为真,如果为真,则循环执行程序段s ,直到p为假为止。
(2)For语句
for(表达式1;表达式2;表达式3)
{
程序段s
}
3.Break和continue语句
break语句和continue语句大大增强了c语言实现选择控制和循环控制的灵活性。
第五章 数组
1.一维数组的定义与引用
(1)定义形式:
数据类型符 数组变量名[变量表达式];
在定义时可以直接赋初值:未指定的值被赋值为0。
2.二维数组
当构成一维数组的元素也是一维数组时,就构成了二维数组。二维数组是一维数组的数组。以此类推,三维数组是二维数组的数组,四维数组是三维数组的数组……
C语言中,二维数组的定义格式是在一维数组的定义格式基础上增加了一维:
数据类型符 数组变量名[整型常量表达式1][整型常量表达式2]; |
3.字符串与数组
(1)字符串的输入:scanf函数和gets函数。
能输入完整句子的函数是gets函数。gets的调用格式是:gets(数组变量名);
gets的主要功能是接受键盘输入,将输入的字符串存放在参数数组中,当遇到回车时返回。gets函数会自动在字符串后面添加结尾字符‘\0’。
(2)字符串的输出:printf函数,cprintf函数或puts函数。
(3)字符串的比较:strcmp函数。
格式为:strcmp(字符串1,字符串2);
(4)字符串的复制:strcpy函数
格式为:strcpy(字符数组1,字符串2);
(5)字符串的连接:strcat函数
格式为:strcat(字符数组1,字符串2);
(6)求字符串的长度:strlen函数
格式为:strlen(字符串);
第六章 函数
(1)不带参数没有返回值的函数
1)定义格式:
void函数名(void)
{
变量声明部分
执行部分
}
(2)不带参数有返回值的函数
1)定义格式
返回值类型 函数名(void)
{
变量声明部分
执行部分
}
2)原型声明格式和调用格式
返回值类型符 函数名(void);
函数名();或者变量=函数名();
(3)带参数没有返回值的函数
1)定义格式
void函数名(形式参数列表)
{
变量声明部分
执行部分
}
2)声明和调用格式
void函数名(形参列表);
函数名(表达式列表);/*这些表达式称作函数的实际参数,即实参列表*/
(4)带参数有返回值的函数
1)定义格式
返回值类型符 函数名(形式参数列表)
{
变量声明部分
执行部分
}
2.常用的数学函数
(1)abs
原型:extern int abs(int x);
功能:求整数x的绝对值
说明:计算|x|, 当x不为负时返回x,否则返回-x
(2)fabs
原型:extern float fabs(float x);
功能:求浮点数x的绝对值
说明:计算|x|, 当x不为负时返回x,否则返回-x
(3)sin(float x), asin(float x), cos(float x), acos(float x), tan(float x), atan(float x), atan2(float y, float x), sinh(float x), cosh(float x), tanh(float x)
(4) ceil
原型:extern float ceil(float x);
功能:求不小于x的最小整数
说明:返回x的上限,如74.12的上限为75,-74.12的上限为-74。返回值为float类型。
(5)floor
原型:extern float floor(float x);
功能:求不大于x的最达整数
说明:返回x的下限,如74.12的下限为74,-74.12的下限为-75。返回值为float类型。
(6) exp
原型:extern float exp(float x);
功能:求e的x次幂
说明:e=2.718281828...
(7)log
原型:extern float log(float x);
功能:计算x的自然对数。
说明:x的值应大于零。
(8) log10
原型:extern float log10(float x);
功能:计算x的常用对数。
说明:x的值应大于零。
(9) pow
原型:extern float pow(float x, float y);
功能:计算x的y次幂。
说明:x应大于零,返回幂指数的结果。
(10)pow10
原型:extern float pow10(float x);
功能:计算10的x次幂。
说明:相当于pow(10.0,x)。
(11)sqrt
原型:extern float sqrt(float x);
功能:计算x的平方根。
说明:x应大于等于零。
第七章 指针
1.指针的定义和使用
(1)定义
数据类型符 * 变量名(* 号表明后面的变量是指针变量)
例如:int *p;
代表p是指针变量,并且p所指向的单元式int型数据
2.指针的指针:数据类型符 ** 变量名
3.指针与字符串
我们可以用字符串为char型的指针变量赋初值。但是将字符串常量作为初值赋值给字符数组与将字符串常量作为初值赋值给指针变量的含义是不同的。
例如:
char str[10]=“abc”;
char *pstr=“abcd”;
上面,字符串数组str被赋初值为“abc”,因此str的前三个单元分别是“a”、“b”、“c”,其他单元都是“\0”.
字符串指针pstr被赋初值为“abcd”,意味着pstr的值是字符串常量“abcd”的首字符“a”在内存中的地址。
4.指针与数组作为函数的参数
指针的本质是地址,指针可以做参数,而数组名也就可以做参数。一维数组名作参数时,数组名后面要跟着[],[]中间可以有整型常量,也可以没有。
5. 函数指针的定义与引用
当一个指针指向了函数的第一条指令时,这个指针被称为函数指针。函数指针变量的定义格式是:
数据类型符 (*变量名)(参数列表); |
第八章 预处理命令
1. 文件包含
文件包含是指一个C源程序通过#include命令将另一个文件(通常是.c或.h文件)的全部内容包含进来。文件包含命令的一般格式是:
#include “文件名” |
或者
#include <文件名> |
第九章 复杂数据类型
1. 结构体类型的定义格式
struct 结构体类型名 { 数据类型名1 成员名1; 数据类型名2 成员名2; 数据类型名3 成员名3; … … 数据类型名n 成员名n; }; //必须以分号结尾 |
结构体类型变量的定义格式是:
struct 结构体类型名 变量名; |
其中,关键字struct必不可少,结构体类型名必须在定义变量之前定义。
第十章 文件操作
1. 文件指针
在操作文件过程中,程序员只能获取FILE型的指针,这个指针所指向的FILE型变量存放着所操作文件的基本信息。这个FILE指针又称为文件类型指针。每个文件类型指针代表唯一一个文件。
2. 文件的打开、读写和关闭
(1)文件的打开与关闭
打开文件需要调用fopen函数,关闭文件需要调用fclose函数。这两个函数的原型如下:
FILE *fopen(char * filename, char *mode);
int fclose(FILE *stream)
(2)文件的读写
文件的读写需要调用fscanf、fprintf、fgets、fputs、fgetc、fputc、fread、fwrite等标准库函数。
fscanf和fprintf函数
fgetc和fputc函数
这两个函数的原型是:
int fgetc(FILE * stream);
int fputc(int c, FILE * stream);
fgetc函数的功能是从stream所代表的文件中读取一个字节,返回值是读取的字节值,如果遇到文件尾或出错,它返回EOF。
fputc函数的功能是将一字符c输出到stream所代表的文件中,返回值是c的值,如果出错,则返回EOF。
fgets和fputs函数
fgets和fputs函数的原型是:
char * fgets(char *s, int n, FILE * stream);
int fputs(char *s, FILE *stream);
fgets函数的功能是从stream所代表的文件中读取长度最大为n-1的字符串,并将字符串存放到s中。
三、重点习题
(一)单选题
1.下面四个选项中,均是合法整型常量的选项是 。
A)160 B)-0xcdf C)-01 D)-0x48a
-0xffff 01a 986,012 2e5
011 0xe 0668 0x
2.设变量n为float,m为int类型,则以下能实现将n中的数值保留小数点后两位,第三位进行四舍五入的表达式是 。
A)n=(n*100+0.5)/100.0 B)m=n*100+0.5,n=m/100.0
C)n=n*100+0.5/100.0 D)n=(n/100+0.5)*100.0
3.若x,y均定义为int型,z定义为double型,以下不合法的scanf函数调用语句是 。
A)scanf("%d%lx,%le",&x,&y,&z);
B)scanf("%2d*%d%lf",&x,&y,&z);
C)scanf("%x%*d%o",&x,&y);
D)scanf("%x%o%6.2f",&x,&y,&z);
4.已知x=43,ch='A',y=0;则表达式(x>=y&&ch<'B'&&!y)的值是 。
A)0 B)语法错误 C)1 D)"假"
5.以下if语句语法正确的是 。
A)if (x>0) printf("%f",x) else printf("%f",-x);
B)if(x>0){x=x+y;printf("%f",x);} else printf("%f",-x);
C)if(x>0){x=x+y;printf("%f",x);};else printf("%f",-x);
D)if(x>0){x=x+y;printf("%f",x)} else printf("%f",-x);
6.下面四个选项中,均是正确的数值常量或字符常量的选项是 。
A)0.0 B)"a" C)'3' D)+001
0f 3.9e-2.5 011 0xabcd
8.9e 1e1 0xFF00 2e2
'&' '\"' 0a 50.
7.在C语言中,要求运算数必须是整型(数)的运算符是 。
A)/ B)++ C)!= D)%
8.当运行以下程序时,从键盘输入:aa bb<CR>cc dd<CR> 则下面程序的运行结果是 。
#include<stdio.h>
main()
{char a1[5],a2[5],a3[5],a4[5];
scanf("%s%s",a1,a2);
gets(a3);gets(a4);
puts(a1);puts(a2);puts(a3);puts(a4);}
A)aa B)aa C)aa D)aa bb
bb bb bb cc
cc cc dd dd
cc dd dd ee
9.请阅读以下程序:
#include <stdio.h>
main()
{float a,b;
scanf("%f",&a);
if(a<0.0) b=0.0;
else if((a<0.5)&&(a!=2.0)) b=1.0/(a+2.0);
else if(a<10.0) b=1.0/a;
else b=10.0;
printf("%f\n",b);
}
若运行时输入2.0<CR>,则上面程序的输出结果是 。
A)0.000000 B)0.500000 C)1.000000 D)0.250000
10.设有程序段
t=0;
while(printf("*"))
{t++;
if(t<3) break;
}
下面描述正确的是 。
A)其中循环控制表达式与0等价 B)其中循环控制表达式与'0'等价
C)其中循环控制表达式是不合法的 1 D)以上说法都不对
(二)填空题
1.以下程序的输出结果是 。
#include <stdio.h>
main()
{int a=325;double x=3.1415926;
printf("a=%+06d x=%+e\n",a,x);
}
2.以下程序的运行结果是 。
main()
{int x=1,y=1,z=1;
y=y+z;
x=x+y;
printf("%d,",x<y?y:x);
printf("%d,",x<y?x++:y++);
printf("%d,%d",x,y);
}
3.下面程序段是从键盘输入的字符中统计数字字符的个数,当输入换行符时结束循环。请分析程序填空。
int n=0,c;
c=gethar();
while(【 】)
{if(c>='0'&&c<='9') n++;
c=getchar();
}
4.下面程序的运行结果是 。
#include<stdio.h>
main()
{char a[2][6]={"Sun","Moon"};
int i,j,len[2];
for(i=0;i<2;i++)
{for(j=0;j<6;j++)
if(a[i][j]=='\0')
{len[i]=j;break;}
printf("%6s:%d\n",a[i],len[i]);
}
}
5.函数gongyue的作用是求整数num1和num2的最大公约数。请填空。
int gongyue(int num1,int num2)
{int temp,a,b;
if(num1【 】num2)
{temp=num1;num1=num2;num2=temp;}
a=num1;b=num2;
while(b)
{temp=a%b;a=b;b=temp;}
return(a);
}
6.以下程序的输出结果为 。
main()
{char c='x';
printf("c:dec=%d, oct=%o, hex=%x, ASCII=%c\n",c,c,c,c);
}
7.请阅读下面的程序,为使输出s=1,t=5的结果,输入量a和b应满足的条件是 。
main()
{int s,t,a,b;
scanf("%d,%d",&a,&b);
s=1;t=1;
if(a>0) s=s+1;
if(a>b) t=s+t;
else if(a==b) t=5;
else t=2*s;
printf("s=%d,t=%d",s,t);}
8.以下程序的运行结果是 。
main()
{int a=2,b=3,c;
c=a;
if(a>b) c=1;
else if(a==b) c=0;
else c=-1
printf("%d\n",c);
}
9.下面程序段的运行结果是 。
for(a=1,i=-1;-1<=i<1;i++)
{a++;printf("%d,",a);}
printf("%2d",i);
10.以下程序的功能是 。
main()
{int num[20]={2,-3,51,-72,86,4,0,-23,3,-65,-1,0,5,8,2,-4,-7,-9,4,-8};
int sum=0,i;
for(i=0;i<20;i++)
{if(num[i]>0)
sum+=num[i];
}
printf("sum=%d\n",sum);
}
(三)编程题
1.定义一个含有30个整型元素的数组,按顺序分别赋予从2开始的偶数;然后按顺序每五个数求出一个平均值,放在另一个数组中并输出。试编程。
2.编程实现以下功能:读入两个运算数(data1和data2)及一个运算符(op),计算表达式data1 op data2的值,其中op可为+,-,*,/(用switch语句实现)。
四、重点习题答案(答案仅供参考)
(一)单选题
1. A 2. B 3. D 4. C 5. B
6. D 7. D 8. A 9. B 10. B
(二)填空题
1.参考答案:a=+00325 x=+3.14159e+00 2.参考答案: 3,2,3,3
3.参考答案:c!='\n' 4.参考答案: Sun:3 Moon:4
5.参考答案:运行结果是 < 6.参考答案:c:dec=120, oct=170, hex=78, ASCII=x
7.参考答案: a=b<=0 8.参考答案: -1
9.参考答案: -1 10.参考答案:求取num数组中大于0的所有数据之和。
(三)编程题
参考程序:
1. #define SIZE 30
main()
{float b[SIZE/5],sum;
int a[SIZE],i,k;
for(k=2,i=0;i<SIZE;i++,k+=2)
a[i]=k;
sum=0;
for(k=0,i=0;i<SIZE;i++)
{sum=sum+a[i];
if((i+1)%5==0)
{b[k++]=sum/5;
sum=0;
}
}
printf("The result is:\n");
for(i=0;i<SIZE/5;i++) printf("%6.2f ",b[i]);
}
参考程序:
2. #include<stdio.h>
#include<stdlib.h>
main()
{float data1,data2,result;
char op;
printf("Type in your expression:");
scanf("%f %c %f",&data1,&op,&data2);
switch(op)
{case '+':result=data1+data2;break;
case '-':result=data1-data2;break;
case '*':result=data1*data2;break;
case '/':if(data2==0){printf("\nDivision by zero!");exit(1);}
result=data1/data2;break;
}
printf("This is %6.2f %c %6.2f=%6.2f\n",data1,op,data2,result);
}
说明:本考试指导只适用于201903学期6月期末考试使用,包括正考和重修。指导中的章节知识点涵盖考试所有内容,给出的习题为考试类型题,习题答案要点只作为参考,详见课程讲义或课程ppt。在复习中有任何问题请到课程答疑区咨询。祝大家考试顺利!
微信扫码添加好友
如二维码无法识别,可拨打 13662661040 咨询。