第一篇:C语言总结复习参考2013-5
C语言程序设计考试要求(2012-1013学年第2学期)
一、教学内容
第1章 程序设计概述 1.1 程序设计语言 1.2 算法
1.3 程序设计与实现
1.4C语言程序的基本结构 第2章 简单程序设计
2.1 printf()函数输出数据
%d、%c、%f、%s 2.2 scanf()函数输入数据
%d、%c、%f、%s 2.3字符输入输出函数getchar()和putchar()2.4 数据类型、常量、简单变量、算术运算、赋值运算、define(不带参数的宏)和include 2.5程序设计举例
第3章 分支结构程序设计 3.1 简单条件分支结构 3.2 复合条件分支结构
3.3 用switch语句实现分支 3.5 条件运算 3.6分支结构举例
判断等边三角形、闰年、求解一元二次方程 第4章 循环结构程序设计 4.1-4.4 循环结构程序
循环控制while、do-while、for、break命令、continue命令
4.5 多重循环程序
4.6循环结构程序设计举例
字符统计、Fibonacci数列、乘法表、找素数 第5章 数组程序设计 5.1一维数组程序设计 5.2字符串操作
5.2.1 字符串的输入输出 5.3二维数组
二维数组的定义、二维数组的初始化 5.4 数组应用 5.4.1排序
第6章 函数程序设计
6.1函数概述
6.2 自定义函数示例 6.3函数定义及调用 函数定义、函数值和return命令、函数调用 6.4函数的嵌套和递归函数 6.4.1函数的嵌套
6.4.2递归函数
6.5 数组作为函数的参数 6.5.1数组元素作为函数参数 6.6 函数应用举例
6.6.1计算长方体的面积
第7章 指针(本章不考程序)7.1 指针概述 7.1.1指针变量
7.1.2变量的直接访问和间接访问 7.2指针变量的定义和使用 7.2.2定义指针变量 7.2.3使用指针变量
第8章 结构体(本章不考程序)8.1结构体类型
8.1.1结构体类型概述
8.1.2结构体类型定义(第1种定义方式)8.2结构体变量
8.2.1定义结构体变量
8.2.2引用结构体成员
8.2.3结构体变量初始化
二、重点例题
例1-3 例2-
19、2-20 例3-
1、3-
2、3-
3、3-
4、3-
5、3-
6、3-
8、3-
9、3-
13、3-
14、3-
16、3-
17、3-
18、3-
19、3-20 例4-
1、4-
2、4-
3、4-
4、4-
5、4-
6、4-
7、4-
8、4-
9、4-
10、4-
14、4-
15、4-17 例5-
1、5-
2、5-
3、5-
4、5-
5、5-
6、5-13 例6-1(e6-1.c)、6-
2、6-
3、6-
4、6-
5、6-
6、6-
7、6-
8、6-
9、6-
10、6-
11、6-
12、6-
13、6-15
三、重点习题
1、教学内容要求的选择题、简答题、分析程序题
2、编程题
习题二 1、3、5习题三1、2、3、4、7习题四1、2、4、5习题五1、2习题六1、2
第二篇:期末复习-语言各章总结
汇编语言学习笔记 《汇编语言》--王爽 前言
学习汇编目的:充分获得底层编程体验;深刻理解机器运行程序的机理。原则:没有通过监测点不要向下学习;没有完成当前实验不要向下学习。第一章 基础知识
有三类指令组成汇编语言:汇编指令;伪指令;其他符号。8bit = 1byte = 一个存储单元有n根地址线,则可以寻址2的n次方个内存单元。1.1节--1.10节 小结
(1)汇编指令是机器指令的助记符,同机器指令一一对应。(2)每一种cpu都有自己的汇编指令集。(3)cpu可以直接使用的信息在存储器中存放。
(4)在存储器中指令和数据没有任何区别,都是二进制信息。(5)存储单元从零开始顺序编号。
(6)一个存储单元可以存储8个bit,即八位二进制数。
(7)每一个cpu芯片都有许多管脚,这些管脚和总线相连。也可以说,这些管脚引出总线。一个cpu可以引出的三种总线的宽度标志了这个cpu不同方面的性能。地址总线的宽度决定了cpu的寻址能力;数据总线的宽度决定了cpu与其他器件进行数据传送时的一次数据传送量;控制总线的宽度决定了cpu对系统中其他器件的控制能力。监测点:1KB的存储器有1024个存储单元?存储单元的编号从0到1023.内存地址空间:
最终运行程序的是cpu,我们用汇编编程时,必须要从cpu的角度思考问题。对cpu来讲,系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受cpu寻址能力的限制。这个逻辑存储器即是我们所说的内存地址空间。第二章 寄存器(cpu的工作原理)mov ax, 2 add ax, ax add ax, ax add ax, ax(1)cpu中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;(2)段地址和偏移地址通过内部总线送人一个称为地址加法器的部件;(3)地址加法器将两个16位地址合成为一个20位的物理地址;(4)地址加法器通过内部总线将20位物理地址送人输入输出控制电路;(5)输入输出控制电路将20位物理地址送上地址总线;(6)20位物理地址被地址总线传送到存储器; 段地址*16+偏移地址 = 物理地址 的本质含义 内存并没有分段,段的划分来自cpu。
以后编程时可以根据需要,将若干地址连续的内存单元看做一个段,用段地址*16定位段的起始地址,用偏移地址定位段的内存单元。
一个段的起始地址一定是16的倍数,一个段的最大长度为64kB。当然也没有办法定义一个起始地址不是16的倍数的段。
cpu可以用不同的段地址和偏移地址形成同一物理地址。
在8086cpu加电启动或复位后cs和ip被设置为cs = f000h,ip = ffffh,即ffff0h单元中的指令是8086pc机开机后执行的第一条指令。(??应该是fffffh吧??)cpu将cs:ip指向的内存单元看做指令。
在cpu中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对cpu的控制。
mov指令称为传送指令,cpu中大部分寄存器的值都可以通过mov指令改变。除了cs:ip 8086没给他这样的功能。cs:ip可以用转移指令来改变。jmp jmp cs:ip 用指令给出的段地址修改cs,偏移地址修改ip jmp 某一寄存器 的功能为:用寄存器中的值修改ip jmp ax 含义类似于mov ip,ax 段地址在8086pc机的段寄存器存放。当8086cpu要访问内存时,由段寄存器提供内存单元的段地址。8086cpu有四个段寄存器,其中cs用来存放指令的段地址。cs存放指令的段地址,ip存放指令的偏移地址。
8086机中,任意时刻,cpu将cs:ip指向的内容当作指令执行。8086cpu的工作过程:
1.从cs:ip指向内存单元读取指令,读取的指令进入指令缓冲器; 2.ip指向下一条指令 3.执行
8086提供转移指令修改cs:ip的内容 debug的使用
查看,修改cpu中寄存器的内容:r命令 查看内存中的命令:d命令
修改内存中的内容:e命令(可以写入数据,指令,在内存中,它们实际上没有区别)将内存中的命令解释为机器指令和相应的汇编指令:u命令 执行cs:ip指向的内存单元处的命令:t命令 以汇编指令的形式向内存中写入指令:a命令 第三章 寄存器(内存访问)3.1内存中字的存储
高八位存放在高字节中,低八位存放在低字节中 3.2DS和【address】 3.3字传送 3.4MOV ADD SUB 3.5数据段 3.6栈
栈是一种具有特殊的访问方式的存储空间。它的特殊性就在于,最后进入这个空间的数据,最先出去。
栈有两个基本的操作:入栈和出栈。
栈的这种操作规则被称为:lifo(last in first out,后进先出)。cpu如何知道10000H--1000fH这段空间被当作栈使用?
push pop指令在执行时必须知道哪个单元是栈顶单元,可是如何知道呢?
栈顶的段地址存放在ss中,偏移地址存放在sp中。任意时刻,ss:sp指向栈顶单元。push和pop指令执行时,cpu从ss和sp中得到栈顶的地址。入栈时,栈顶从高地址向低地址方向增长。如何定义一个栈的大小? mov ax, 1000h mov ss, ax mov sp, 0010h;则栈顶为1000f 栈底为 10000 ****************************************** mov ax, 1000h mov ds, ax mov ax, 2266h mov [0], ax ************************ mov ax,1000h mov ss, ax mov sp, 0002h mov ax, 2266h push ax 栈顶的变化范围最大为:0--ffffh 栈的综述
(1)8086cpu提供了栈操作机制,方案如下: 在ss、sp中存放栈顶的段地址和偏移地址;
提供入栈和出栈指令,他们根据ss、sp指示的地址,按照栈的方式访问内存单元。(2)push指令的执行步骤:1)sp=sp-2;2)向ss:sp指向的字单元送人数据;(3)pop指令的执行步骤:1)从ss:sp指向的字单元中读取数据;2)sp=sp+2(4)任意时刻,ss:sp指向栈顶元素。
(5)8086cpu只记录栈顶,栈空间的大小我们要自己管理。
(6)用栈来暂存以后需要恢复的寄存器的内容时,寄存器出栈的顺序要和入栈的顺序相反。(7)push、pop指令实质上是一种内存传送指令,注意他们的灵活运用。一个栈段最大可以设为64k 段的综述
我们可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元。这完全是我们的安排。用一个段存放代码,即代码段 用一个段存放数据,即数据段 用一个段当栈,即栈段
对于数据段,把段地址放在ds中,用mov,add,sub等访问内存单元的指令时,cpu就将我们定义的数据段内容当做数据来访问;
对于代码段,把段地址放在cs:ip中,用mov,add,sub等访问内存单元的指令时,cpu就将执行我们定义的代码段的指令;
对于栈段,把段地址放在ss:sp中,用push pop 等访问内存单元的指令时,cpu就将其当作堆栈来访问;
debug的t命令在执行修改器ss的指令时,下一条指令也紧接着被执行了。3.7栈超界问题
8086cpu不保证我们对栈的操作不会超界。也就是说,8086cpu只知道栈顶在何处而不知道我们安排的栈空间有多大,这点就好像,cpu只知道当前要执行的指令在何处,而不知道要执行的指令有多少。从这两点我们可以看出cpu的工作机理,它只考虑当前情况:当前的栈在何处,当前要执行的指令是哪一条。对于超界问题我们可以做到就是小心。第五章【bx】和loop指令
我们完整的描述一个内存单元,需要两种信息:(1)内存单元的地址;(2)内存单元存放数据的类型; inc bx的含义是bx中的内容加一
[bx]寄存器bx中所包含的地址中存放的内容 [bx]表示一个内存单元,他的偏移地址在bx中。loop指令执行的时候,要进行两步操作: 1;(cx)=(cx)-1;
2;判断cx中的值,不为零则转至标号处执行。
“通常”我们用loop实现循环功能,cx中存放循环次数。用cx和loop指令相配合实现循环功能的三个要点:(1)再cx中存放循环次数;
(2)loop指令中的标号所标识地址要在前面;
(3)要循环执行的程序段,要写在标号和loop指令的中间。在汇编源程序中,数据不能以字母开头。所以对于大于9fffh的数,均在前面加上0。mov cx,11 s: add ax,ax loop s assume cs:code code segment..mov ax,4c00h int 21h code ends end ffff:6单元是一个字节单元,ax是一个十六位寄存器,数据长度不一样,如何赋值? 注意我们说的是“赋值”,就是说,让ax中的数据的值(数据的大小)和ffff:0006单元中的数据的值(数据的大小)相等。八位数据01h和16位数据0001h的数据长度不一样,但他们的值是相等的。
设ffff:0006单元中的的数据是xxh,若要ax中的值和ffff:0006单元中的值相等,ax中的数据应为00xxh。所以,若实现ffff:0006单元向ax赋值,我们应该令(ah)=0,(al)=(ffff6H).若希望程序能从cs:0012处执行,可以用g命令。“g 0012”。他表示程序执行到0012处。
若希望程序能跳出循环,用p命令
5.4 debug和汇编编译器masm对指令的不同处理。
在汇编源程序中,mov al,[0]会被编译器解释成为:mov al,0 所以要这样表达:mov bx,0 mov al,[bx] 或者 mov al,ds:[0] 第一,我们在汇编源程序中,如果用指令访问一个内存单元,则在指令中必须用[...]来表示内存单元,如果在[]里用一个常量idata直接给出内存单元的偏移地址,就要在[]的前面显示地给出段地址所在的段寄存器。
第二,如果在[]里用寄存器,比如bx,间接给出内存单元的偏移地址,则段寄存器默认在ds中。
第六章 包含多个段的程序 程序取得所需段的方法有两种:
一是在加载程序的时候为程序分配,再就是程序在执行的过程中向系统申请。dw的含义是定义字型数据即define word 字型数据间以逗号隔开。
程序运行的时候cs存放代码段的段地址,所以我们可以从cs中得到它们的段地址。dw定义的数据处于代码段的最开始,所以偏移地址为零。dw 0123h,5604h,1234h start :指令 end start 我们在程序的第一条指令的前面加了一个标号start:并在end的后面再次加入。end除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方。在单任务系统中,可执行文件中的程序执行如下:
(1)由其他的程序(debug、command或其他程序)将可执行文件中的程序加载入内存;(2)设置cs:ip指向程序的第一条要执行的指令(即程序的入口),从而使程序得以运行;(3)程序运行结束后,返回到加载者; 描述信息
可执行文件由描述信息和程序组成,程序来源于源程序中的汇编指令和定义的数据;描述信息则主要是编译连接程序对原程序中相关伪指令进行处理所得到的信息。6.2 在代码中使用栈
在程序中通过定义数据来取得一段空间,然后将这段空间当作栈空间来使用。
例如将cs:16--cs:31的内存空间当作栈来用,初始状态下栈为空,所以ss:sp要指向栈底,则设置ss:sp指向cs:32.6.3将数据代码栈放入不同的段
用assume将定义的具有一定用途的段跟寄存器联系起来 第七章 更灵活的定位内存地址的方法 7.1 and 和 or 指令(1)and指令:逻辑与指令,按位进行与运算。mov al ,01100011B and al ,00111011B 执行后:al=00100011B 通过该运算可将操作对象的相应位设为0,其他位不变。(2)or指令:逻辑或指令,按位进行或运算。
通过该运算可将操作对象的相应位设为1,其他位不变。7.2 关于ASCII码
所谓编码方案,就是一套规则,它约定了用什么样的信息来表示现实对象。小写字母的ASCII码值,比大写字母的ASCII码值大20H。
就ASCII码的二进制形式来看,除第五位外,大写字母和小写字母的ASCII码值都一样。大写字母第五位为0,小写字母第五位为1.运用and和or指令的给特定位赋值功能即可实现大小写字母之间的转换。7.5 [bx+idata] 类似于[bx]的一种更灵活的指明内存单元的方式。
[bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata(bx中的数值加上idata。也可以写成 mov ax,[200+bx] mov ax,200[bx] mov ax,[bx].200 7.6 用[bx+idata]的方式进行数组的处理 7.7 SI和DI SI和DI是8086cpu中和bx功能相近的寄存器。区别是SI和DI不能够分成两个八位寄存器来使用。codesg segment start: mov ax,datasg mov ds,ax mov si,0 mov di,16 mov cx,8;di si 为16位寄存器只需循环 s: mov ax,[si] mov [di],ax;八次即可将16个字节传送完毕 add si,2 add di,2 loop s
mov ax,4c00h int 21h codesg ends end start si = dijmp指令后的第一个字节的地址(2)short指明此处的位移为八位位移。(3)八位位移的范围为-128 127,用补码表示;(4)八位位移由编译程序在编译时算出。
还有一种jmp near ptr 标号 实现段内近转移(ip)=(ip)+16位位移(1)16位位移 = “标号”处的地址1(DI)=(DI)-1 MOVSW 可以传送一个字
MOVSB和MOVSW进行的是串传送操作中的一个步骤,一般都要和rep配合使用,格式如下: rep movsb 相当于: s:movsb loop s rep的作用是根据cx的值,重复执行后面的串传送指令。8086cpu提供了下面两条指令对DF位进行设置: CLD:将DF位置0 STD:将DF位置1 1.传送的原始地址 2.传送的目的地址 3.传送的长度 4.传送的方向 11.11 pushf和popf 压入/弹出标志寄存器中的数据 为访问标志寄存器提供了一种方法。11.12 标志寄存器在DEBUG中的表示 第十二章 内中断 12.1 内中断的产生
cpu内部发生下面情况时,将产生相应的中断信息:
(1)除法错误(2)单步执行(3)执行int0命令(4)执行int命令 中断类型码0 1 4 n 为一个字节型数据 12.2 中断处理程序
cpu如何通过八位的中断类型码得到中断处理程序的段地址和偏移地址? 12.3 中断向量表 答:通过中断向量表
中断向量表就是中断处理程序入口地址的列表。保存在内存中。cpu如何找到中断向量表?
对于8086中断向量表指定存在内存地址0处。从0000:0000到0000:03e8单元。共1000个字节。中断向量表中一个表项存放一个中断向量,占两个字。分别存放段地址和偏移地址。12.4 中断过程
(1)从中断信息中取得中断类型码(2)标志寄存器的值入栈
(3)设置标志寄存器的第八位TF和第九位IF的值为0(4)CS的内容入栈(5)IP的值入栈
(6)从内存地址为中断类型码*4和中断类型码*4 + 2 的两个字单元中读取中断处理程序的入口地址设置IP和CS 12.5 中断处理程序(1)保存用到的寄存器(2)处理中断。(3)恢复用到的寄存器(4)用IRET指令返回。12.6 除法错误中断的处理 12.7 编程处理0号中断 12.8 安装 第十三章 int指令 13.1 int指令
int指令的最终功能和call指令相似,都是调用一段程序。13.2 编写供应用程序调用的中断例程
编写、安装中断7ch的中断例程,功能:求一word型数据的平方。(AX)= 要计算的数据。
DX,AX存放结果的高十六位和低十六位。MOV WORD PTR ES:[7CH*4],200H MOV WORD PTR ES:[7CH*4+2],0 MOV CX,OFFSET SQREND-OFFSET SQR CLD REP MOVSB int指令和iret指令配合使用与call指令和ret指令配合使用具有相似的思路。13.3 对int、iret和栈的深入理解 ********************************* 13.4 BIOS和DOS所提供的中断例程 BIOS主要包含以下内容:
1、硬件系统的检测和初始化程序
2、外部中断和内部中断的中断例程
3、用于对硬件设备进行I/O操作的中断例程
4、其他和硬件系统相关的中断例程 13.5 BIOS和DOS中断例程的安装过程
1.开机后,cpu一加点,初始化(cs)= 0FFFFH,(IP)= 0,自动从FFFF:0单元开始执行程序。FFFF:0处有一条跳转指令,cpu执行该程序后,转去执行BIOS中的硬件检测和初始化程序。
2.初始化程序将建立BIOS所支持的中断向量,即将BIOS提供的中断例程的入口登记在中断向量表中。注意,对于BIOS所提供的中断例程,只需将入口地址登记在中断向量表中即可,因为它们是固化到ROM中的内容,一直在内存中存在。
3.硬件系统检测和初始化完成后,调用int 19h进行操作系统的引导。从此将计算机交给操作系统控制。
4.DOS启动后,除完成其他工作外,还将它提供的中断例程装入内存,并建立相应的中断向量。
13.6 BIOS中断例程应用
int 10h 中断例程是BIOS提供的中断例程,其中包含多个和屏幕输出有关的子程序。一个供程序员调用的中断例程往往包含多个子程序,中断例程内部用传递进来的参数来决定执行那一个子程序。BIOS和DOS提供的中断例程,都用AH来传递内部参数 13.7 DOS中断例程应用
例如 我们一直在使用的4ch号子程序,即程序返回功能。mov ah 4ch mov al 0 int 21h ========================== DOS功能调用 int 21h(1)键盘输入 1)1号调用——从键盘输入单个字符 调用格式: MOV AH,1 INT 21H 功能: 等待从键盘输入一个字符并送入AL。
执行时系统将扫描键盘,等待有健按下,一旦有健按下,就将其字符的ASCII码读
入,先检查是否Ctrl-Break,若是,退出命令执行;否则将ASCII码送AL,同时将
该字符送显示器显示。2)10号调用——从键盘输入字符串
功能: 从键盘接收字符串送入内存的输入缓冲区,同时送显示器显示。调用前要求: 先定义一个输入缓冲区
MAXLEN DB 100 ;第1个字节指出缓冲区能容纳的字符个数,即缓冲区长度,不能为0 ACLEN DB ? ;第2个字节保留,以存放实际输入的字符个数 STRING DB 100 DUP(?);第3个字节开始存放从键盘输入的字符串。
调用格式: LEA DX,MAXLEN(缓冲区首偏移地址)MOV AH,10 INT 21H(2)显示输出
1)2号调用——在显示器上显示输出单个字符 调用格式: MOV DL,待显示字符的ASCII码 MOV AH,2 INT 21H 功能:将DL中的字符送显示器显示。【例】显示输出大写字母A MOV DL,41H ;或写为 MOV DL,'A' MOV AH,2 INT 21H 2)9号调用——在显示器上显示输出字符串 调用格式: LEA DX,字符串首偏移地址 MOV AH,9 INT 21H 功能:将当前数据区中DS:DX所指向的以'$'结尾的字符串送显示器显示。【例】在显示器上显示字符串“YOU ARE SUCESSFUL!” DATA SEGMENT STRING DB ' YOU ARE SUCESSFUL!$ ' DATA ENDS CODE SEGMENT „ „ MOV AX,DATA MOV DS,AX LEA DX,STRING MOV AH,9 INT 21H „ „ CODE ENDS 说明:若希望显示字符串后,光标可自动回车换行,可在定义字符串时作如下更改: STRING DB ' YOU ARE SUCESSFUL!',0AH,0DH,' $ ' ;在字符串结束前加回车换行的ASCII码0AH,0DH
第三篇:大自然的语言复习
《大自然的语言》的阅读题
(一)立春过后,大地渐渐从沉睡中(A.清醒B.苏醒;C.醒悟;D.复苏)
过来。冰雪融化,草木萌发,各种花(A.次第;B.连续;C.陆续;D.全部)开放。再过两个月,燕子翩然归来。不久,布谷鸟也来了。于是转入炎热的夏季,这是植物孕育果实的时期。到了秋天,果实成熟,植物的叶子渐渐变黄,在秋风中(A.纷纷;B.刷刷;C.簌簌)地落下来。北雁南飞,活跃在田间草际的昆虫也都销声匿迹。到处呈现一片衰草连天的景象,准备迎接风雪载途的寒冬。在地球上温带和亚热带区域里,年年如是,周而复始。
1.在语段中横线上填上恰当的词语。
2.根据拼音写汉字并解释词语:
销声nì()迹:
Piān()然:
3.这段文字的说明对象是()
A.物候现象; B.气候变化; C.物候规律; D.四季景色变化。
4.这两段文字的说明顺序是顺序,主要的说明方法是。
5.去掉“温带和亚热带区域里”这几个词语行不行,为什么?
6.本段主要表达方式是:
7.本题目是“大自然的语言”,实际指什么?这样命题好不好?为什么?
8.揣摩本文两个重要句子的含义。
(1)立春过后,大地渐渐从沉睡中苏醒过来。冰雪融化,草木萌发,各种花次第开放。
“次第”是什么意思?
(2)杏花开了,就好像大自然在传语要赶快耕地;桃花开了,又好像在暗示要赶快种谷子。布谷鸟开始唱歌,劳动人民懂得它在唱什么:“阿公阿婆,割麦插禾。”这三个例子说明什么道理?
(二)几千年来,劳动人民注意了草木荣枯、候鸟去来等自然现象同气候的关系,据以安排农事。杏花开了,就好像大自然在传语要赶快耕地;桃花开了,又好像在暗示要赶快种谷子。布谷鸟开始唱歌,劳动人民懂得它在唱什么:“阿公阿婆,割麦插禾。”这样看来,花
香鸟语,草长莺飞,都是大自然的语言。
(1)解释“据以安排农事”这句话的意思。
(2)找出两组反义词语写在下边。
(3)用“||”将这段文字分为三层。
(4)这段文字中有三处运用拟人的修辞方法。将表示拟人的三个词语写在下面横线上
并分析其作用。
(5)是否能将“赶快种谷子”后边的句号改为分号?判断下列说法的正误,对的画“√”,错的画“×”。
A.能,因为这三句都是拟人句式,内容上没有什么区别。()
B.不能。因为杏花、桃花是植物,而布谷鸟是动物,两种不同类型的物候现象不宜合在一个句子里说。()
C.不能。因为前者说的是春天的物候现象,后者说的是夏季的物候现象。()
D.能。因为三句都是在说明物候现象与农事的关系,杏花、桃花和布谷鸟又是同一类事物。()
(6)本段说明的内容是:
(7)本段扣住“草木荣枯、候鸟去来”举了哪三个例子说明自然现象与气候的关系?
(8)本段的说明顺序是顺序。
(三)经度差异是影响物候的第二个因素。凡是近海的地方,比同纬度的内陆,冬天温
和,春天反而寒冷。所以沿海地区的春天的来临比内陆要迟若干天。如大连纬度在北京以南约1 °,但是在大连,连翘和榆叶梅的盛开都比北京要迟一个星期。又如济南苹果开花在四月中或谷雨节,烟台要到立夏。两地纬度相差无几,但烟台靠海,春天便来得迟了。
(1)这段文字说明的内容是
(2)这段文字的中心句是第解说事理的。
(3)用大连和北京、济南和烟台相比有什么作用?此处为什么要连举两个例子?
(4)文中运用了
(5)“凡是”“都”在文中有什么表达作用?
第四篇:C语言复习大纲
1、C语言程序常见的书写格式;
2、printf()和scanf()函数常用的方法,主要包括格式控制符;
3、常见的基本类型(现学过3种)以及表示数据的范围(大致的)。
4、熟练掌握以下几类运算符的运算规律:算术运算符、关系运算符、逻辑运算符、条件运
算符、自增自减运算符、逗号运算符、简单赋值运算符以及复合的赋值运算符。
5、C程序三种结构。
6、数组(主要是字符和一维)定义、初始化以及引用和函数的定义、以及引用。
7、常见的数组字符串处理函数(包括stccpy()和strcmp())。
8、常见的转义字符的表示及含义作用(如nrtb 等)。
9、C语言标识符规则(主要有3条)。
10、break语句和continue语句的功能和使用。
11、逻辑值“真”“假”的判定。
12、if和else配对原则。
13、数组长度与有效下标的关系。
14、熟练掌握三种结构语句的执行流程,特别是循环语句。
15、熟练掌握求最大(小)值、判断素数以及排序等基本算法和程序实现。
建议:除了上述的知识点之外,老师上课用的PPT过一遍,平时实验作业再做一遍。
第五篇:c语言程序设计复习
第一章C语言概述
一、选择题:
1、一个C程序的执行是从(A)。A本程序的main函数开始,到main函数结束
B本程序文件的第一个函数开始,到本程序文件的最后一个函数结束 C本程序的main函数开始,到本程序文件的最后一个函数结束 D本程序文件的第一个函数开始,到本程序main函数结束
2、在 C 语言中,每个语句必须以(D)结束。A.回车符 B.冒号 C.逗号 D.分号
3、C 语言规定:在一个源程序中,main函数的位置(C)。A.必须在最开始 B.必须在系统调用的库函数的后面 C.可以任意 D.必须在最后
4、一个C 语言程序是由(B)。
A.一个主程序和若干子程序组成 B.函数组成 C.若干过程组成 D.若干子程序组成
5、下列说法中错误的是(D)。
A.主函数可以分为两个部分:主函数说明部分和主函数体 B.主函数可以调用任何非主函数的其他函数 C.任何非主函数可以调用其他任何非主函数 D.程序可以从任何非主函数开始执行
6、用 C 语言编写的源文件经过编译,若没有产生编译错误,则系统将(C)。A.生成可执行目标文件 B.生成目标文件 C.输出运行结果 D.自动保存源文件
二、填空题:
1、C 语言只有 32 个关键字和 9 种控制语句。
2、每个源程序有且只有一个 main 函数,系统总是从该函数开始执行C语言程序。
3、C 语言程序的注释可以出现在程序中的任何地方,它总是以 * 符号作为开始标记,以 */ 符号作为结束标记。
4、C 语言中,输入操作是由库函数 scanf 完成的,输出操作是由库函 数 printf 完成的。
5、系统默认的C 语言源程序文件的扩展名是.c,经过编译后生成的目标文件的扩展名是.obj,经过连接后生成的可执行文件的扩展名是.exe。
6、C 语言的标识符只能由字母、数字和 下划线 三种字符组成。
第三章数据类型、运算符和表达式
一、选择题:
1、以下选项中,不正确的 C 语言浮点型常量是(C)。A.160.B.0.12 C.2e4.2 D.0.0
2、以下选项中,(D)是不正确的 C 语言字符型常量。A.'a' B.'x41' C.'101' D.“a”
3、在 C 语言中,字符型数据在计算机内存中,以字符的(C)形式存储。A.原码 B.反码 C.ASCII 码 D.BCD码
4、若x、i、j和k都是int型变量,则计算下面表达式后,x的值是(C)。x=(i=4,j=16,k=32)A.4 B.16 C.32 D.52
5、算术运算符、赋值运算符和关系运算符的运算优先级按从高到低依次为(B)。A.算术运算、赋值运算、关系运算 B.算术运算、关系运算、赋值运算 C.关系运算、赋值运算、算术运算 D.关系运算、算术运算、赋值运算
6、若有代数式,则不正确的C语言表达式是(C)。A.a/b/c*e*3 B.3*a*e/b/c C.3*a*e/b*c D.a*e/c/b*3
7、表达式!x||a==b 等效于(D)。
A.!((x||a)==b)B.!(x||y)==b C.!(x||(a==b))D.(!x)||(a==b)
8、设整型变量 m,n,a,b,c,d 均为1,执行(m=a>b)&&(n=c>d)后, m,n 的值是(A)。A.0,0 B.0,1 C.1,0 D.1,1
9、设有语句 int a=3;,则执行了语句 a+=a-=a*=a;后,变量 a 的值是(B)。A.3 B.0 C.9 D.-12
10、在以下一组运算符中,优先级最低的运算符是(D)。A.* B.!= C.+ D.=
11、设整型变量 i 值为2,表达式(++i)+(++i)+(++i)的结果是(B)。A.6 B.12 C.15 D.表达式出错
12、若已定义 x 和 y为double 类型,则表达式 x=1,y=x+3/2 的值是(C)。A.1 B.2 C.2.0 D.2.5
13、sizeof(double)的结果值是(A)。A.8 B.4 C.2 D.出错
14、设a=1,b=2,c=3,d=4,则表达式:a
15、设a 为整型变量,不能正确表达数学关系:1010 && a<15 D.!(a<=10)&&!(a>=15)
16、设 f是实型变量,下列表达式中不是逗号表达式的是(D)。A.f= 3.2, 1.0 B.f>0, f<10 C.f=2.0, f>0 D.f=(3.2, 1.0)
17、表达式18/4*sqrt(4.0)/8值的数据类型是(C)。A.int B.float C.double D.不确定
18、已知字母A的ASCII码为十进制数65,且c2为字符型,则执行语句 C2=’A’+’6’-‘3’;后c2中的值是(A)。A.D B.68 C.不确定的值 D.C
19、以下用户标识符中,合法的是(B)。A.int B.nit C.123 D.a+b 20、C 语言中,要求运算对象只能为整数的运算符是(A)。A.% B./ C.> D.*
21、若有说明语句:char c='72';则变量c在内存占用的字节数是(A)。A.1 B.2 C.3 D.4
22、字符串“ABC”在内存占用的字节数是(B)。A.3 B.4 C.6 D.8
23、要为字符型变量 a赋初值,下列语句中哪一个是正确的(B)。A.char a=“3”;B.char a=’3’;C.char a=%;D.char a=*;
24、下列不正确的转义字符是(C)。A.B.' C.074 D.
二、填空题:
1、C 语言中的逻辑值“真”是用 1 表示的,逻辑值“假”是用 0 表示的。
2、若x和n都是int型变量,且x的初值为12,n的初值为5,则计算表达式x%=(n%=2)后x的值为 0。
3、设 c='w',a=1,b=2,d=-5, 则表达式 'x'+1>c, 'y'!=c+2,-a-5*b<=d+1, b==a=2的值分别为 1、0、1、1。
4、设 float x=2.5,y=4.7;int a=7;,表达式 x+a%3*(int)(x+y)%2/4的值为 2.5。
5、判断变量 a、b 的值均不为 0 的逻辑表达式为a!=0&&b!=0。
6、求解赋值表达式 a=(b=10)%(c=6),表达式值、a、b、c 的值依次为 4,4,10,6。
7、求解逗号表达式 x=a=3,6*a 后,表达式值、x、a 的值依次为18,3,3。
8、数学式a/(b*c)的 C 语言表达式 a/b/c。
三、编程题:
1、设长方形的高为 1.5,宽为 2.3,编程求该长方形的周长和面积。
2、编写一个程序,将大写字母 A转换为小写字母 a。1. main(){float x=1.5,y=2.3;printf(“area is %6.2fn”,x*y);} 2.main(){char c=’A’;printf(“%d”,c+32);}
顺序结构答案
一、单项选择题 AADAB CCBBD
二、程序改错题 1.正确的程序为 # include “stdio.h” main(){ char c ; getchar(c);putchar(' 07');/*鸣笛*/ putchar();} 2. 正确的程序为 main(){ int a,b,s,l;scanf(“%d,%d”,&a,&b);s=a*b;l=2*(a+b);printf(“l=%d,s=%dn”, l ,s);}
三、写出程序运行结果 1. 68 2.x=4 y=11
四、编程题 1.main(){ int a,b,c,sum;float ave;scanf(“%d%d%d”,&a,&b,&c);sum=a+b+c;ave=sum/3.0;printf(“sum=%d,ave=%.2fn”,sum,ave);}
五、选做题 1.void main(){ float a,b,temp;printf(“input a and b:”);scanf(“%d,%d”,&a ,&b);temp = a;a = b;b = temp;printf(“a=%d , b=%dn”, a , b);} 选择结构答案
一、单项选择题
1.B 2.A 3.D 4.C 5.D 6.B 7.C
二、填空题 1.5 5 4 5 5 4 3 3 4 2.4 0 3.VeryGood Good VeryGood Fail Pass Pass
三、阅读程序,写出运行结果 1.10, 4, 3;-1 3 6 1
四、程序设计题 1.main(){ int a,b,x,y;scanf(“%d %d”,&a,&b);x=a*a+b*b;if(x>100){y=x/100;printf(“%d”,y);} else printf(“%d”,a+b);}
2.if结构 main(){ float t;char c;printf(“input score,max as 100:n”);scanf(“%f”,&t);if(t>=90)ch=’A’;else if(t>=80)ch=’B’;else if(t>=70)ch=’C’;else if(t>=60)ch=’D’;else ch=’E’;
printf(“Grade=%dn”,ch);} switch结构 main(){float t;char c;printf(“input score,max as 100:n”);scanf(“%f”,&t);switch(t/10){ case 10: case 9: ch=’A’;break;case 8: ch=’B’;break;case 7: ch=’C’;break;case 6: ch=’D’;break;case 5: ch=’E’;} printf(“Grade=%dn”,ch);}
五、选做题 1.main(){ int a,b,c,t;scanf(“%d%d%d”,&a,&b,&c);if(a
2.switch((s>0)&&(s<=10)){case 1: switch((s>=3)&&(s<=6)){ case 1: x=2;break;case 0: switch(s>1)||(s>8)){ case 1: x=3;break;case 0: x=1;break;} } break;case 0: x=0;break;}
循环结构答案
一、选择题
1.B 2.A 3.A 4.C 5.A 6.B 7.A 8.C 9.D 10.D
二、填空题 1.x1 x1/2-2 2.ch=getchar()ch>=’A’&&ch<=’Z’ 3.s=s+t*i t=-t
三、阅读下列程序,写出程序运行的输出结果 1.852 2.8921 3.5 4.SUM=2468
四、程序改错 1.main(){ int i=200,n=0;/*n用来记录每行已打印数的个数*/ while(i<=300){if(i%7==0){ //break;printf(“%5d”,i);n=n+1;if(n==5)/*满5个换行*/ { printf(“n”);n=0;} } i++;} }
2).main(){ int i,s=0,t=1;for(i=1;i<=7;i++){ t=t*i;s=s+t;} printf(“sum=%dn”,s);}
五、程序设计题 1.main(){int x,g,s,b;for(x=100;x<1000;x++){ b=x/100;s=x%100/10;g=x%10;if((g*g*g+s*s*s+b*b*b)==x)printf(“%dn”,x);} }
2.main(){ int i,s=0,f=1;for(i=2;i<80;i++){s=s+f*(i-1)/i;f=-f;} printf(s=%fn”,s);}
六、选做题 1.main(){ float s=0,m=2.0,n=1.0,p;int i;for(i=1;i<=20;i++){s=s+m/n;p=m;m=m+n;n=p;} printf(s=%fn”,s);}
2.#include
第7章 数组习题 A卷
1.单项选择题(1)int a[4]={5,3,8,9};其中 a[3]的值为()。D A.5 B.3 C.8 D.9(2)以下 4 个字符串函数中,()所在的头文件与其他 3 个不同。A A.gets B.strcpy C.strlen D.strcmp(3)以下 4 个数组定义中,()是错误的。D A.int a[7];B.#define N 5 long b[N];C.char c[5];D.int n,d[n];(4)对字符数组进行初始化,()形式是错误。B A.char c1[ ]={'1', '2', '3'};B.char c2[ ]=123;C.char c3[ ]={ '1', '2', '3', ' '};D.char c4[ ]=“123”;(5)在数组中,数组名表示()。A A.数组第 1 个元素的首地址 B.数组第 2 个元素的首地址 C.数组所有元素的首地址 D.数组最后 1 个元素的首地址
(6)若有以下数组说明,则数值最小的和最大的元素下标分别是()。B int a[12] ={1,2,3,4,5,6,7,8,9,10,11,12};A.1,12 B.0,11 C.1,11 D.0,12(7)若有以下说明,则数值为 4 的表达式是()。D int a[12] ={1,2,3,4,5,6,7,8,9,10,11,12};char c=’a’, d, g;A.a[g-c] B.a[4] C.a['d'-'c'] D.a['d'-c](8)设有定义:char s[12] = “string”;则printf(“%dn”,strlen(s));的输出是()。A A.6 B.7 C.11 D.12(9)设有定义:char s[12] = “string”;则printf(“%dn ”, sizeof(s));的输出是()。D A.6 B.7 C.11 D.12(10)合法的数组定义是()。A A.char a[ ]= “string ”;B.int a[5] ={0,1,2,3,4,5};C.char a= “string ”;D.char a[ ]={0,1,2,3,4,5}(11)合法的数组定义是()。D A.int a[3][ ]={0,1,2,3,4,5};B.int a[ ][3] ={0,1,2,3,4};C.int a[2][3]={0,1,2,3,4,5,6};D.int a[2][3]={0,1,2,3,4,5,};(12)下列语句中,正确的是()。D A.char a[3][ ]={'abc', '1'};B.char a[ ][3] ={'abc', '1'};C.char a[3][ ]={'a', “1”};D.char a[ ][3] ={ “a”, “1”};(13)下列定义的字符数组中,输出 printf(“%sn”, str[2]);的输出是()。C static str[3][20] ={ “basic”, “foxpro”, “windows”};A.basic B.foxpro C.windows D.输出语句出错
(14)下列各语句定义了数组,其中哪一个是不正确的()。C A.char a[3][10]={“China”,“American”,“Asia”};B.int x[2][2]={1,2,3,4};C.float x[2][ ]={1,2,4,6,8,10};D.int m[][3]={1,2,3,4,5,6};(15)数组定义为 int a[3][2]={1,2,3,4,5,6},值为6的数组元素是()。B A.a[3][2] B.a[2][1] C.a[1][2] D.a[2][3](16)下面的程序中哪一行有错误()。D #include
(17)下面哪一项是不正确的字符串赋值或赋初值的方式()。A.char *str;str=“string”;B.char str[7]={'s','t','r','i','n','g'};C.char str1[10];str1=“string”;D.char str1[]=“string”,str2[]=“12345678”;(18)若有以下说明和语句,则输出结果是哪一项()。C(strlen(s)为求字符串s的长度的函数)char s[12]=“a book!”;printf(“%d”,strlen(s));A.12 B.8 C.7 D.11(19)若有以下说明和语句,则输出结果是()。B(strlen(s)为求字符串s的长度的函数)char sp[]=“tv0willn”;printf(“%d”,strlen(sp));A.14 B.3 C.9 D.字符串中有非法字符(20)若有以下说明和语句,则输出结果是()。C char str[]=“"c:abc.dat”“;
C printf(”%s“,str);A.字符串中有非法字符 B.”c:abc.dat“ C.”c:abc.dat“ D.”c:abc.dat“
2.填空题
(1)C 语言中,数组的各元素必须具有相同的,元素的下标下限为,下标必须是正整数、0、或者。但在程序执行过程中,不检查元素下标是否。数据类型,0,符号常量,越界
(2)C 语言中,数组在内存中占一片 的存储区,由 代表它的首地址。数组名是一个 常量,不能对它进行赋值运算。连续,数组名,地址
(3)执行 static int b[5], a[ ][3] ={1,2,3,4,5,6};后,b[4] =,a[1][2] =。0,6(4)设有定义语句 static int a[3][4] ={{1},{2},{3}};则 a[1][0]值为,a[1][1] 值为,a[2][1]的值为。2,0,0(5)如定义语句为 char a[ ]= ”windows“,b[ ]= ”95“;,语句 printf(”%s“,strcat(a,b));的输出结果为。Windows95(6)根据以下说明,写出正确的说明语句:men是一个有10个整型元素的数组。step是一个有4个实型元素的数组,元素值分别为1.9,-2.33, 0, 20.6。grid是一个二维数组,共有4行,10列整型元素。
int mesh[10];float step[4] = {1.9,-2.33, 0, 20.6};int grid[4][10];(7)array是一个一维整形数组,有10个元素,前6个元素的初值是9,4,7,49,32,-5,正确的说明语句为:
。该数组下标的取值范围是从___到___(从小到大)。用scanf函数输入数组的第二个元素表示为:。用赋值语句把39存入第一个元素表示为:。把第六个和第四个元素之和存入第一个元素表示为:。
int array[10] = {9,4,7,49,32,-5};0 9 scanf(”%d“,&array[1]);array[0] = 39;array[0]= array[5]+array[3];(8)写出以下初始化数组的长度:①int chn[3];数组chn的长度为___。②float isa[]={1.0,2.0,3.0,4.0,5.0};数组isa的长度为___。③int doom[8];数组doom的长度为___。④float pci[4][2];数组pci的长度为___。
⑤int ast[3][3];数组ast的长度为___。⑥int att[3][4];数组att的长度为___。⑦float dell[][3]={{1,4,7},{2,5},{3,6,9}};数组dell的长度为___。6 20 16 32 18 24 36(9)若有以下整型的a数组,数组元素和它们得值如下所示: 数组元素: a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 元素的值: 9 4 12 8 2 10 7 5 1 3 ①请写出对该数组的说明,并赋以上初值。②该数组的最小下标值为___,最大下标值为___。
③写出下面各式的值:a[a[9]]的值为___ ;a[a[4]+a[8]]的值为___。int a[10]={9,4,12,8,2,10,7,5,1,3};0 9 8 8(10)字符串”abn 12/“"的长度为___。10
3.判断题
(×)(1)C允许对数组的大小作动态定义,即可用变量定义数组的大小。(×)(2)字符数组不要求它的最后一个字符为‘ ’,甚至可以不包含‘ ’。(×)(3)数组定义 int a[10];也可以写成 int a(10)。(√)(4)在对全部数组元素赋初值时,可以不指定数组长度。(×)(5)定义s为5×6(5行6列)的数组可写成 float a[5,6];(√)(6)数组定义 int a[10];表示数组名为a,此数组有10个元素。
(×)(7)数组定义 int a[10];表示数组名为a,此数组有10个元素,第10个元素为a[10]。
(√)(8)static char c[]={“a book”};与static char c[]=“a book”;等价。(×)(9)static char c[]={'a' ,' ','b','o','o','k',' '};与 static char c[]={'a' ,' ' ,'b','o','o','k'};等价。(×)(10)设已有说明:static char c1[10],c2[10];下面程序片段是合法的。c1={“book”};c2=c1;
4.程序填空题
(1)输入 20 个数,输出它们的平均值,输出与平均值之差的绝对值为最小的数组元素。请填空。
#include (2)以下程序以每行 10个数据的形式输出 a 数组,请填空。void main(){ int a[50],i;printf(”输入50个整数:“);for(i=0;i<50;i++)scanf(”%d“,);for(i=1;i<=50;i++){ if()printf(”%3dn“ ,);printf(”%3d“,a[i-1]);} } &a[i] i%10==0 a[i-1] (3)下面程序的功能是输出数组 s 中最大元素的下标,请填空。void main(){ int k, p;int s[ ]={1,-9,7,2,-10,3};for(p=0,k=p;p<6;p++)if(s[p]>s[k]);printf(”%dn“ ,k);} k=p (4)这个程序输入了20个数存放在一个数组中,并且输出其中最大者与最小者、20个数的和及它们的平均值。请填空。void main(){ char array;int max,min,average,sum;int i;for(i=0;i<;i++){ printf(”请输入第%d个数:“,i+1);scanf(”%d“,);} max=array[0];min=array[0];for(i=0;i<=;i++){ if(max 5.阅读程序,分析程序的功能。(1)#include (2)#include (3)#include (4)阅读程序,写出运行结果 #include (5)阅读程序,写出运行结果。#include (6)阅读下列程序,写出程序运行的输出结果。#include (7)该程序的运行结果是: min= ,m= ,n=。void main(){ float array[4][3]={ {3.4,-5.6,56.7}, {56.8,999.,-.0123}, {0.45,-5.77,123.5}, {43.4,0,111.2} };int i,j;int min;int m,n;min = array[0][0];m=0;n=0;for(i=0;i<3;i++)for(j=0;j<4;j++)if(min > array[i][j]){ min = array[i][j];m=i;n=j;} printf(”min=%d,m=%d,n=%dn“,min,m,n);}-5.77 2 1 (8)写出下面这个程序的输出结果: void main(){ char str[]=”ABCDEFGHIJKL“;printf(”%sn“,str);屏幕上显示 printf(”%sn“,&str[4]);屏幕上显示 str[2]=str[5];printf(”%sn“,str);屏幕上显示 str[9]=' ';printf(”%sn“,str);屏幕上显示 } ABCDEFGHIJKL EFGHIJKL ABFDEFGHIJKL ABFDEFGHI (9)读懂下面的程序并填空。void main(){ char str[80];int i=0;gets(str);while(str[i]!=0){ if(str[i]>='a'&&str<='z')str[i]-=32;i++;} puts(str);} 程序运行时如果输入 upcase, 屏幕显示 程序运行时如果输入 Aa1Bb2Cc3, 屏幕显示 UPCASE AA1BB2CC 第8章 函数习题 A卷 1.单项选择题 (1)C 语言总是从 函数开始执行。A A.main B.处于最前的 C.处于最后的 D.随机选一个 (2)函数在定义时,省略函数类型说明符,则该函数值的类型为。A A.int B.float C.long D.double(2)以下 函数,真正地没有返回值。B A.int a(){int a=2;return(a);} B.void b(){printf(”c“);} C.int a(){int a=2;return a;} D.以上都是(3)在 C 语言中,有关函数的说法,以下正确的是。A A.函数可嵌套定义,也可嵌套调用 B.函数可嵌套定义,但不可嵌套调用 C.函数不可嵌套定义,但可嵌套调用 D.函数不可嵌套定义,也不可嵌套调用(4)以下函数调用语句中,含有实参的个数为。C fun((2,3),(4,5+6,7));A.1 B.2 C.5 D.6(5)函数调用可以在。D A.函数表达式中 B.函数语句中 C.函数参数中 D.以上都是(6)被调函数返回给主调函数的值称为。C A.形参 B.实参 C.返回值 D.参数(7),可以不进行函数类型说明。D A.被调函数的返回值是整型或字符型时 B.被调函数的定义在主调函数定义之前时 C.在所有函数定义前,已在函数外预先说明了被调函数类型 D.以上都是(8)被调函数通过 语句,将值返回给主调函数。D A.if B.for C.while D.return(9)被调函数调用结束后,返回到。D A.主调函数中该被调函数调用语句处 B.主函数中该被调函数调用语句处 C.主调函数中该被调函数调用语句的前一语句 D.主调函数中该被调函数调用语句的后一语句(10)以下对 C语言函数的有关描述中,正确的是。A A.在 C 中,调用函数时,只能把实参的值传送给形参,形参的值不能传送给实参 B.C函数既可以嵌套定义又可递归调用 C.函数必须有返回值,否则不能使用函数 D.C程序中有调用关系的所有函数必须放在同一个源程序文件中(11)C 语言中函数的隐含存储类型是。C A.auto B.static C.extern D.无存储类型 (12)能把函数处理结果的两个数据返回给主调函数,在下面的方法中不正确的是。A A.return 这两个数 B.形参用两个元素的数组 C.形参用两个这种数据类型的指针 D.用两个全局变量(13)C语言可执行程序从什么地方开始执行()。C A.程序中第一条可执行语句 B.程序中第一个函数 C.程序中的main函数 D.包含文件中的第一个函数 (14)有一个函数原型如下所示,则该函数的返回类型为()。C abc(float x,float y);A.void B.double C.int D.float 2.填空题 (1)变量的作用域主要取决于变量,变量的生存期既取决于变量,又取决于变量。所处的位置,所处的位置,存储类型 (2)说明变量时,若省略存储类型符,系统默认其为 存储类别,该存储类别的类型符为:。动态,auto(3)静态型局部变量的作用域是 ,生存期是。它所在的局部,整个程序 (4)函数中的形参和调用时的实参都是数组名时,传递方式为,都是变量时,传递方式为。址传递,值传递 (5)函数的形式参数的作用域为,全局的外部变量和函数体内定义的局部变量重名时,_________变量优先。该函数中,局部 (6)若自定义函数要求返回一个值,则应在该函数体中有一条 语句,若自定义函数要求不返回一个值,则应在该函数说明时加一个类型说明符。return,void(7)若函数的形式参数是指针类型,则实参可以是 或。指针,数组名(8)函数的参数为 char *类型时,形参与实参结合的传递方式为。址传递(9)函数的实参为常量时,形参与实参结合的传递方式为。值传递 (10)下面这个函数的功能是求两个整数的积,并通过形参传回结果,请填空。int int int* *result void mul(___x,___y,___result){ ___=x*y;} 3.判断题 (×)(1)函数说明指的是在程序中设定一个函数模块。(√)(2)形参只有在被调用时才分配存储空间。(×)(3)在C的函数中,最好使用全局变量。 (×)(4)在调用函数时,实参传值给形参,调用结束时,形参值传给实参。(√)(5)所有函数定义都是并行的,相互独立的。(×)(6)函数的隐含存储类型是extern。(×)(7)形参可以是常量、变量或表达式。(×)(8)函数调用可以作为一个函数的形参。 (√)(9)C语言规定,实参应与其对应的形参类型一致。(×)(10)定义函数时,形参的类型说明可以放在函数体内。 4.程序填空题 (1)对数组按值从大到小的顺序排序后输出,请填空。#include (2)下列函数在 n 个元素的一维数组中,找出最大值、最小值并传送到调用函数,请填空。#include 5.写出下列程序运行结果(1)main(){ int i=1,p;p=fun(i,i+1);printf(”%dn“,p);} int fun(int a,int b){ int f;if(a>b)f=1;else if(a==b)f=0;else f=-1;return f;}-1 (2)键盘输入 abcdef (9)以下程序的输出结果是a=___,b=___,c=___。#include A部分(本、专科必做) 一、选择题 以下不正确的叙述是(D) A、宏替换不占用运行时间。B、宏名无类型。 C、宏替换只是字符替换。D、宏名必须用大写字母表示。C语言的编译系统对宏命令的处理(D) A、在程序运行时进行的。B、在程序连接时进行。C、和C程序中的其它语句同时进行编译的。D、在对源程序中其它语句正式编译之前进行的。 3、以下程序的输出结果是(C)。A、15 B、100 C、10 D、150 #define MIN(x,y)(x)<(y)?(x):(y)void main(){ int I,j,k;i=10;j=15;k=10*MIN(i,j);printf(“%dn”,k);} 4、以下叙述中正确的是(D) 用#include包含的文件的后缀必须是“.h”。 若一些源程序中包含某个头文件;当该文件有错时,只需对该头文件进行修改,包含此头文件的所有源程序不必重新进行编译。宏命令行可以看作是一行C语句。预处理是在编译之前进行的。 5、以下叙述中正确的是(C)A、源程序中所有的行都参加编译。B、宏定义常量与const定义常量是一样的。 C、宏定义可以嵌套定义,即在宏定义中的字符串可以引用另一个宏定义的标识符。D、以上都不正确。 二、填空题 以下程序中for 循环执行的次数是 6。#define N 2 #define M N+1 #define NUM(M+1)*M/2 void main(){ int i;for(i=1;i<=NUM;i++);printf(“%dn”,i);} 2、以下程序的输出结果是 x=93。#define A 3 #define B(a)((A+1)*a)void main(){ int x;x=3*(A+B(7));printf(“x=%dn”,x);} B部分(本科必做) 编程:请写出一个宏定义MYALPHA(c),用以判断c是否是字母字符,若是,得1,否则,得0。 解:#define MYALPHA(c)((c>=’A’&&c<=’Z’)||(c>=’a’&&c<=’z’)?1:0)第十章 指针 A部分(本、专科必做) 一、选择题 1、若有定义:int x,*pb;则以下正确的表达式是(A)A、pb=&x B、pb=x C、*pb=&x D、*pb=*x 2、以下程序的输出结果是(B) A、因变量无定义输出不定值 B、0 C、-1 D、1 #include 3、以下程序的输出结果是(B) A、5,2,3 B、-5,-12,-7 C、-5,-12,-17 D、5,-2,-7 #include 4、以下程序的输出结果是(C)A、4 B、6 C、8 D、10 #include 5、已知指针p的指向(图一)的a[1],则执行语句*p++;后,*p的值是(B)。A、20 B、30 C、21 D、31 a[0] a[1] a[2] a[3] a[4] 10 20 30 40 50(图一) 6、已知指针p的指向(图一)的a[1],则表达式*++p的值是(B)。A、20 B、30 C、21 D、31 7、已知指针p的指向(图一)的a[1],则表达式++*p的值是(C)。A、20 B、30 C、21 D、31 8、以下程序的输出结果是(D)。A、23 B、24 C、25 D、26 #include 9、以下程序的输出结果是(B)。 A、运行出错 B、100 C、a的地址 D、b的地址 #include 10、以下程序运行后,输出结果是(D)。A)8 B)7 C)6 D)5 #include 二、填空题 1、若有定义:char ch;(1)使指针p指向变量ch的定义语句是 char *p=&ch。 (2)若已定义char *p;,使指针p指向变量ch的赋值语句是 p=&ch。(3)在(1)的基础上,通过指针p给变量ch读入字符的scanf调用语句是 scanf(“%c”,p)。 (4)在(1)的基础上,通过指针p给变量ch赋字符’a’的语句是*p=’a’。(5)在(1)的基础上,通过指针p用格式输出函数输出ch中字符的语句是printf(“%c”,*p)。 2、以下程序输出的是 C。void main(){ int i=3, j=2;char *a=”DCBA“;printf(”%c%cn“,a[i],a[j]);} 3、以下函数的功能是,把两个整数指针所指的存储单元中的内容进行交换。请填空。void exchange(int *x, int *y){ int t;t=*y;*y= *x;*x= t;} B部分(本科必做)程序填空: 1、下面程序的输出结果是 A B C D B C D C D D。char b[]=”ABCD“;void main(){ char *chp;for(chp=b;*chp: chp+=2)printf(”%s“,chp);printf(”n“);} 下面是一个字符串连接函数,请补充完整。void mystrcat(char *s1,char *s2){ char *p,*q;for(p=s1;*p;p++);for(q=s2;*q;q++)*p++=*q;*p=’ ’;} 第十一章 结构体与共用体 A部分(本、专科必做) 一、选择题 1、设有如下定义: struct sk {int a;float b;}data,*p;若有p=&data;,则对data中的a域的正确引用是(B)。A)(*p).data.a B)(*p).a C)p->data.a D)p.data.a 2、根据以下定义,能输出字母M的语句是(D)。 A、printf(“%cn”,class[3].name);B、printf(“%cn”,class[3].name[1]);C、printf(“%cn”,class[2].name[1]);D、printf(“%cn”,class[2].name[0]);struct person{char name[9];int age;};struct person class[10]={“John”,17,”Paul”,19,”Mary”,18,”Adam”,16,}; 3、以下程序的输出结果是(D)。A、0 B、1 C、3 D、6 #include 4、若有以下说明及语句,则值为6的表达式是(D)。A、p++->n B、p->n++ C、(*p).n++ D、++p->n struct st{int n;struct st *next;};struct st a[3],*p;a[0].n=5;a[0].next=&a[1];a[1].n=7;a[1].next=&a[2];a[2].n=9;a[2].next=’ ’;p=&a[0]; 5、已知字符0的ASCII码的十进制的值是48,且数组的第0个元素在低位,以下程序的输出结果是(B)。A、39 B、9 C、38 D、8 void main(){ union{int i[2];long k;char c[4];}r,*s=&r;s->i[0]=0x39;s->i[1]=0x38;printf(“%xn”,s->c[0]);} 6、以下程序输出的结果是(C)。A、32 B、16 C、8 D、24 typedef union{long x[2];int y[4];char z[8];}MYTYPE;MYTYPE them;void main(){ printf(“%dn”,sizeof(them));} 7、设有以下语句 typedef struct S { int g;char h;} T;则下面叙述中正确的是(B)。 A)可用S定义结构体变量 B)可以用T定义结构体变量 C)S是struct类型的变量 D)T是struct S类型的变量 8、有以下说明和定义语句 struct student { int age;char num[8];};struct student stu[3]={{20,”200401“},{21,”200402“},{109,”200403"}};struct student *p=stu;以下选项中引用结构体变量成员的表达式错误的是(D)。A)(p++)->num B)p->num C)(*p).num D)stu[3].age 二、填空题 1、为了建立结构体(含有两个成员,data是数据成员,next是指向自身结构体的指针成员),请填空: Struct link { char data;struct link *next;} 2、把类型int另取一个类型名称INT,则以下应填: