单元1 程序设计基础
一、知识要点
通过本单元的学习使学生初步认识C语言程序的结构和函数的结构,掌握C语言程序的开发过程和上机步骤,掌握如何对数据进行描述、如何对数据进行操作,即常量、变量的定义和使用及用C语言的表达式表达实际问题,主要内容包括:
1.C语言程序的开发过程
包括:编辑、编译、连接、执行四个步骤。 2.C语言程序的结构和执行过程
一个C语言程序是由一个或多个具有独立功能的模块组成,这些模块称为函数。在这些函数中,必须有一个函数名为main的函数,该函数称为主函数,函数是组成程序的基本单位。
C语言程序总是从主函数开始执行。 3.语句
C语言规定每个语句必须由分号“;”结束,语句是组成函数的基本单位。语句按在程序中所起的作用可分为:说明语句和可执行语句两大类,说明语句用来完成对数据的描述,可执行语句用来完成对数据的操作。
C语言的可执行语句包括:表达式语句;函数调用语句;空语句;复合语句;流程控制语句五种。
4.函数的结构
每一个函数的函数体通常由数据描述和数据操作两部分组成;主函数通常由数据定义、数据输入、函数调用、数据输出四部分组成。
5.用户标识符
程序中用到的各种实体,包括常量名、变量名、数组名、函数名等等,称为用户标识符,用户标识符必须符合标识符的命名规则,即以字母或下划线开头,由字母、数字、下划线组成;用户标识符区分大小写,不能与系统关键字同名。
6.函数调用
如果在一个程序中除主函数外,还有其它函数,要完成其它函数的功能,必
须由主函数或另一个函数来调用其它函数,我们把调用其它函数的函数称为主调函数,相应的其它函数称为被调函数。
函数调用时,把实参值传递给对应的形参,传递方式是值传递。 7.常量
在程序运行过程中,其值保持不变的量称为常量。在C语言中,按数据类型来分类常量有四种:整型常量、实型常量、字符常量和字符串常量;按表现形态来分类常量主要有两种:直接常量和符号常量。
在学习常量时要弄清楚各种常量的表示方法。
(1)整型常量有三种:十进制整型常量(用数码0~9表示的十进制整数)、八进制整型常量(以数字0开头用数码0~7表示的整数,开头的数字0代表所表示的数为八进制数)、十六进制整型常量(以数字0和小写字母x或大写字母X开头,用数码0~9或小写字母a~f或大写字母A~F表示的十六进制整数,0x代表所表示的数为十六进制数);在每一种常量后加小写字母l或大写字母L又得到十进制长整型常量、八进制长整型常量、十六进制长整型常量。
(2)实型常量有十进制小数形式(由数码0~9、正负号和小数点(必须有小数点)组成的十进制小数表示的实数)或指数形式(由尾数、字母e或E、阶码三部分组成,其中尾数为十进制小数或整数,阶码为1位或2位的十进制(有符号)整数)两种。
(3)字符型常量是用单引号括起来的单一字符(包括转义字符)。 转义字符有以下四种形式:
①以反斜杠“\\”开头后跟一个规定的字母(n、t、b、r、f等),代表一个控制字符;
②\\\\代表反斜杠字符“\\”, \\'代表单撇号字符“'”;
③以反斜杠开头后跟1~3位八进制数代表ASCII码值为该八进制数的字符(此方法可表示ASCII字符集中的任一字符);
④以反斜杠和小写字母x开头,即以\\x开头,后跟1~2位十六进制数代表ASCII码值为该十六进制数的字符(也可表示ASCII字符集中的任一字符)。
(4)字符串常量是用双撇号括起来的字符序列,简称字符串。字符串中含字符的个数称为该字符串的长度,字符串在存储时自动加上字符串结束标志“\\0”。
(5)符号常量是在程序的开头,使用编译预处理命令“#define 符号常量 常量”定义的,符号常量在程序设计中经常使用。
8.变量
变量是在程序运行过程中,其值可以改变的量。C语言规定:程序中所使用
每一个变量在使用之前都要进行类型定义,即“先定义,后使用”。
C语言中的变量有两种属性:操作属性和存储属性。
在学习变量时要弄清楚各种变量的存储空间的分配和变化情况、变量的值、存储长度生存期和作用域。
(1)变量操作属性的定义
数据类型标识符 变量名表;
操作属性由数据类型来决定,它规定了变量的存储空间的大小(即存储长度)、取值范围和所允许的操作。
使用类型标识符 int 定义的变量为基本整型变量,在VC++系统中基本整型变量的存储长度为4个字节,取值范围为-2147483648~2147483647 (-231~231-1)。
使用类型标识符 long 定义的变量为长整型变量,在VC++系统中长整型变量的存储长度为4个字节,取值范围为-2147483648~2147483647 (-231~231-1)。
使用类型标识符 short 定义的变量为短整型变量,在VC++系统中短整型变量的存储长度为2个字节,取值范围为-32768~32767 (-215~215-1)。
使用类型标识符 float 定义的变量为单精度实型变量,在VC++系统中单精度实型变量的存储长度为4个字节,取值范围为±(3.4×10-38~ 3.4×1038)。
使用类型标识符 double 定义的变量为双精度实型变量,在VC++系统中双精度实型变量的存储长度为8个字节,取值范围为±(1.7×10-308~ 1.7×10308)。
使用类型标识符 char 定义的变量为字符型变量,在VC++系统中字符型变量的存储长度为1个字节,取值范围为-128~127。
(2)变量的赋值
变量=表达式;
(3)变量的初始化
在定义变量时,给变量赋值称为变量的初始化。 (4)变量存储属性的定义
存储类别标识符 数据类型标识符 变量名表;
变量的存储属性决定了所定义变量的存储机构、生存期和作用域,变量的生存期分为动态存储和永久存储;按变量作用域,可以把变量分为全局变量和局部变量。
使用存储类别标识符 auto (或缺省存储类别标识符)定义的变量是自动变量,自动变量的存储空间是在程序运行时分配的,分配和释放由系统自动完成。自动变量的生存期为动态存储,作用域是只在定义它的那个局部范围内起作用,是局部变量。
使用存储类别标识符 static 定义的变量是静态变量,静态变量的存储空间是在编译时分配的,分配和释放由系统自动完成。静态变量的生存期为永久存储,
作用域是只在定义它的那个局部范围内起作用,属于局部变量。
在函数体之外的变量称为外部变量,外部变量是在编译时为其分配存储空间的,在静态存储区中存储,生存周期是永久存储,作用域是从定义点到本文件结束。
9.运算符和表达式
C语言的运算符共有45个,利用这些运算符可以表达各种复杂的实际问题,每一个运算符都有其运算规则、优先级别和结合方向,在学习过程中必须掌握好。
C语言的表达式主要有算术表达式、关系表达式、逻辑表达式、赋值表达式、条件表达式和逗号表达式。在学习表达式时要注意掌握好每种表达式的运算过程、表达式的值和能用表达式表达实际问题。
(1)双目算术运算
运算符包括:+(加),-(减),*(乘),/(除),%(求余或模)。 对于除法运算“/”,有两方面的含义:
当运算符两侧的运算量都是整型数据时,结果也是整型数据,此时称为整除; 当运算符两侧的运算量至少有一个是实型数据时,结果是double类型数据,此时称为除法。
对于模运算%,要求参加运算的两个运算量必须都是整型数据,运算所得的结果也是整型数据。
对一个正整数求模运算,不论除数是正数还是负数,所得的结果都是非负数;对一个负整数求模运算,不论除数是正数还是负数,所得的结果都是非正数,对0求模运算的结果还是0,即结果的符号与被除数的符号相同。
(2)赋值类运算和赋值表达式
赋值类运算符包括:=(赋值),+=(自反加赋值),-=(自反减赋值),*=(自反乘赋值),/=(自反除赋值),%=(自反模赋值),++(自加),--(自减)。
a+=b等价于a=a+b;a-=b等价于a=a-b;a*=b等价于a=a*b;a/=b等价于a=a/b;a%=b等价于a=a%b。
对于++和--有前缀和后缀形式。 ++a等价于a=a+1;--a等价于a=a-1。
对于++和--可以用一句话概括为:后缀形式先引用后“增值”,前缀形式先“增值”后引用。这里说的引用是指表达式引用,而“增值”是指变量“增值”。
赋值表达式的值为赋值后赋值号左边变量的值。 (3)逗号运算和逗号表达式 逗号运算符:,(逗号)
逗号表达式的一般形式是:表达式1,表达式2
逗号表达式运算过程及表达式的值:先求解表达式1,再计算表达式2,表达
式2的值为整个逗号表达式的值。
利用逗号运算可以一次计算多个表达式的值。 (4)强制类型转换 运算符: (类型标识符)
强制类型转换一般形式: (类型标识符)(表达式) 作用:把表达式值的类型转化为类型标识符说明的类型。 利用强制类型转换运算可以某一种类型转换为所需要的类型。 (5)长度运算
长度运算的运算符是: sizeof
长度运算的一般形式:sizeof(类型标识符或表达式)
利用长度运算可以求出指定数据(对表达式并不进行计算)或指定数据类型在内存中的存储长度。
二、知识拓展
1.标识符命名规则的例外
在VC++6.0开发环境中,除字母、数字、下划线是用户标识符的组成要素外,符号“$”可出现在用户标识符的任何位置,甚至单独一个“$”也可作为用户标识符,而其它符号就只能供系统使用了。
2.C程序的“紧缩对齐”书写格式
C语言程序的书写自由,灵活性强,一个语句可以占任意多行,一行可以写多个语句。为了避免程序书写时混乱不清,便于阅读和理解,我们提倡采用“紧缩对齐”方式书写。
“紧缩对齐”格式的书写要点是: (1)每个语句(包括花括号)占用一行;
(2)不同结构层次的语句,从不同的起始位置开始书写,同一结构层次的语句,都缩进相同的字数;
(3)表示结构层次的花括号,应写在该结构化语句的第一或第二个字母的下方,这对花括号在竖直方向上应对齐;
(4)语句中的不同单词之间要加空格,程序中不同部分的行之间可以加空行。
在VC++6.0开发环境中,如果已编辑的程序不是“紧缩对齐”格式,但只要符合“紧缩对齐”格式的书写要点的第⑴条,便可使用下面两个简单操作使其符合“紧缩对齐”格式的第⑵、⑶条:
①按Ctrl+A,即全选所编辑的代码;
②按Alt+F8,便可将所编辑的代码成为“紧缩对齐”格式。 3.const常量
程序中用到的数据往往是共享的,可被多个程序或用户使用,为避免误操作,导致数据被无意中修改,可将程序中不需要修改的常量定义为const常量。
const常量定义的一般形式:const 类型标识符 常量名=数值;
其中const 是系统提供的定义const常量用的关键字,const也可以写在类型标识符的后面。该定义使程序中的“常量名”代表给定的数值,“常量名”便是一个const常量。
const常量在定义时必须进行初始化,且const常量一旦定义其值不可以再修改。
【示例】
const int a;//未初始化 是错误的。
const int a=5; a=3; 也是错误的。 而 const int n=10;
int a[n]={1,2,3};//关于数组请参考教程单元五 是正确的,但在TC中是错误的。 4.左值和右值
在C语言中,常量、变量和表达式都有左值和右值的概念。
一个量的左值是这个量的存储空间的地址,且该地址空间的内容是可以改变的;而右值是一个量的存储空间的内容,也就是这个量的值。
所以,常量都有右值,而没有左值(虽然常量也有地址,但常量的值不能改变);变量既有右值又有左值;每个表达式都有右值,但不一定有左值(有的表达式有左值,有的表达式没有左值)。
如++i,因为表达式++i执行后,表达式++i的值与变量i的值相同,所以,可认为变量i的地址就是表达式++i的地址,因此,表达式++i既有左值又有右值;
而i++,因为表达式i++执行后,表达式i++的值与变量i的值不同,所以,不能认为变量i的地址就是表达式i++的地址,因此,表达式i++只有右值没有左值。
(1)关于赋值表达式
在教程中,介绍赋值表达式时,曾经说过“赋值号的左边通常只能是变量,而不能是表达式”,这里说“通常”就是因为有例外,准确的说应该是“赋值号的左边必须是有左值的表达式”。所以,赋值表达式的作用应该说成“把赋值号
右端表达式的值写入有左值的表达式的存储空间。
【示例】程序段 int b=2, a=5; (a*=b)+=8;
是否有语法错误?如果没有,执行后a,b的值分别是多少?
解析:因为表达式a*=b的值与变量a的值相同,所以表达式a*=b有左值,无语法错误。
执行时,先计算表达式(a*=b),把计算结果赋给a,再计算a+=8,所以,执行后a,b的值分别是18和2。
(2)关于条件表达式
对于条件表达式“表达式1?表达式2 :表达式3”,如果表达式2和表达式3都有左值,那么,该条件表达式有左值,否则,该条件表达式没有左值。
【示例】条件表达式a>b?--a:--b,由于--a和--b都有左值,所以该条件表达式有左值;而对于条件表达式a>b?--a: b --,由于b --无左值,所以该条件表达式无左值。
(3)关于逗号表达式
对于逗号表达式“表达式1,表达式2”,如果表达式2有左值,那么,该逗号表达式有左值,否则,该逗号表达式没有左值。
【示例】int a=2;a+1,a+2;因为表达式a+2无左值,所以,逗号表达式a+1,a+2无左值,而逗号表达式a+1,a有左值。
注:只有有左值的量才能放在赋值号的左边。 5.自加、自减的混合运算
在VC++系统中,表达式求值运算的规则是:对表达式从左到右进行扫描,当扫描到两个运输量便开始计算(如果其中一个运算量是表达式,按此规则计算该表达式,所得结果与另一个运算量进行计算),再继续向后扫描,将扫描到的一个运算量与前面的计算结果进行计算,如此进行,直到表达式扫描完毕,表达式计算完毕,最后再对表达式中所有的自加、自减的后缀进行“增值”操作。
【示例1】若有如下说明和语句 int i=3,j;
j=(i++)+(++i)+(++i); 执行后i,j的值分别是多少?
解析:先计算(i++)+(++i),由于(i++)是后缀形式,增值运算需要到最后才完成,而(++i)是前缀形式,所以i先增值,i由3变为4,(i++)与(++i)都用值4进行计算,得结果为8,再与(++i)进行计算,由于(++i)是前缀形式,i先增值,由4变为5,与8求和得13,再将13赋给j,最后对后缀形式进行“增值”,i的值由5变成6。因
此,程序段执行后i,j的值分别是6和13。
【示例2】若有如下说明和语句 int i=3,j;
j=++i+((i++)+i+(++i))+i++; 执行后i,j的值分别是多少?
解析:先计算++i+((i++)+i+(++i)),由于++i是前缀形式,所以i先增值,i由3变为4,而((i++)+i+(++i))又是表达式,按以上规则计算所得结果为13,且此时i的值已经是5,再与前面的++i计算,结果为18,再与i++进行计算,结果为23,再将23赋给j,最后对后缀形式连续进行两次“增值”,i的值由5变成7。因此,程序段执行后i,j的值分别是7和23。
6.关于对i+++j的理解
VC++编译系统总是从左到右尽量多的将若干个字符组成一个运算符,所以,k=i+++j 应理解为k= (i++)+j,而不是k= i+(++j)。
7.关于长度运算sizeof
长度运算的一般形式:sizeof(类型标识符或表达式)
(1)当求某一表达式的存储长度时,sizeof后的一对圆括号可以省略不写,即可写成 sizeof 表达式,此时,因为只要知道表达式的类型便可求出存储长度,所以实际并不对表达式进行计算。
【示例】程序段 int a=1; sizeof ++a;
执行后变量a的值仍为1(而不是2)。
(2)当求某种类型的存储长度时,sizeof后的一对圆括号必须写,即应写成sizeof(类型标识符),如sizeof(int),而不能写成sizeof int。
8.系统隐式转换
C语言在对表达式进行运算时,为使表达式中各运算量具有相同的类型,先把不同类型的数据转换为同一个类型,然后再进行计算,这些转换是由系统自动进行的,具体转换原则是:
(1)表达式中char,short型数据都自动转换为int型;unsigned char和unsigned short型数据都自动转换为unsigned int型。
这样,表达式值的类型有六种,由低到高分别是:int、unsigned int、long int、unsigned long、float、double。
(2)当一个运算符两端的运算量的类型不一致时,按“向高看齐”的原则
对“较低”的类型进行提升。
【示例】有如下说明语句 int i; float a; long k;
则表达式 10+'D'+i*a-1/k的类型为float型,而表达式10+'D'+i*a-1.0/k的类型为double型。
三、常见问题
1.把scanf、printf等误认为是系统关键字
解析:对于初学者往往将scanf、printf等系统库函数的名字误认为是系统关键字,在VC++环境中编辑代码时,系统关键字将呈蓝色(系统默认为蓝色,可在tools(工具)->options(选项)->Format(格式)选项卡中的colors(颜色)中选择keyword项,确定前景色来修改)。既然scanf、printf等系统库函数的名字不是系统关键字,就可以作为用户定义标识符使用,但建议不要作为户定义标识符使用。
2.书写标识符时,忽略了大小写字母的区别
解析:C语言的标识符区分大小写字母,而在编辑程序时初学者往往容易把小写字母输入成大写字母或把大写字母输入成小写字母,而且有些字母的大小写之间又很难区分。这就要求在输入时,注意大小写字母的切换,养成一个好的习惯。
【示例】程序段 int p=3; printf(\
编译程序把p和P认为是两个不同的标识符,而显示出错信息'P' : undeclared identifier('P':未说明的标识符)。
3.在编辑程序时,遗漏空格或分号
解析:C语言中关键字与关键字之间,关键字与用户标识符之间等都要有空格,如果不加空格就将出现语法错误。
【示例】inta,b;//int与a之间无空格,有语法错误
C语言中分号是C语句中不可缺少的组成部分,语句结尾必须有分号,如果语句结尾没有分号,就将出现语法错误。
【示例】 a=1
b=2
编译时,编译程序在“a=1”后面没发现分号,就把下一行“b=2”也作为上一行语句的一部分,这就会出现语法错误。改错时,有时在被指出有错的一行中未发现错误,就需要看上一行是否漏掉了分号。
4.将西文符号输入成中文符号
解析:在编辑程序时,经常出现将西文符号输入成中文符号的错误。产生错误的原因是,当需要输入中文时,将西文状态切换为中文状态,中文输入结束后,忘记切换回西文状态,结果输入了中文符号。
int a;
printf(\请输入一个整数”);//右引号、右括号、分号都是中文符号 scanf(\
printf(\是整数%d的平方。”,a*a,a);// 右引号、逗号都是中文符号 5.将解决某一问题的程序代码都写在主函数中
解析:将解决某一问题的程序代码都写在主函数中来实现是可以的,但建议不要这样做,养成良好的编程习惯。因为,这样不能体现C语言的模块化程序设计的思想,特别当一个问题比较大时,所有代码都放在主函数中将给人们阅读、理解和调试程序带来困难,造成不必要的麻烦,程序的结构也不够清晰。
模块化程序设计的思想是将一个大的应用问题按功能分解成若干个小的模块,每一个小的模块具有结构清晰、功能单一、接口简单(一个入口一个出口)的特点,在C语言中,每一个小的模块就是一个函数。
6.函数定义、声明、调用相混淆
解析:函数定义应包含函数头和用一对花括号括起来的函数体,且在函数头的结尾不能有分号,函数定义用来给出如何实现该函数所要完成功能的具体算法;
函数声明与函数定义中的函数头相同,只是需在结尾加一个分号,所以函数声明是一个语句,用来通知编译系统所定义函数的一些必要信息,包括函数名、返回值类型、参数个数及每个参数的类型,一般应放在主调函数的说明语句部分;
函数调用在书写时应包含被调函数名、一对圆括号、圆括号里面写对应实参,函数调用应写在主调函数中,通过函数调用具体完成被调函数的功能。
【示例】在本单元的【例1-1】求两个整数和的程序中, 1. #include
2. int Sum(int x,int y);//函数声明 3. int main()
4. { 5. 6. 7. 8. 9. 10. 11. }
12. int Sum(int x,int y)//以下是函数定义 13. { 14. 15. 16. 17. }
第12至17行是函数Sum的定义;第2行是函数声明;第8行中的Sum(a,b)是函数调用,求变量a,b中存放的两个整数的和。
7.字符的表示与八进制整型常量的表示方法混淆
解析:八进制整型常量必须以数字0开头,由8进制数码组成;而字符的三位八进制数表示是用单撇号括起来的以反斜杠“\\”开头,后跟1到3位8进制数码,这1到3位8进制数码不必以数字0开头,这一点初学者往往容易混淆。
【示例】程序段 char ch1,ch2,ch3;
ch1='\\65'; //不必以数字0开头,?\\65?代表的是字符?5? ch2=065; //065为八进制整型常量,ch2的值是字符?5? ch3=65; //65为十进制整型常量,ch3的值是字符?A? 8.斜杠“/”与反斜杠“\\”混淆
解析:初学者容易把斜杠“/”与反斜杠“\\”混淆,斜杠“/”在C语言中是除法运算符,而反斜杠“\\” 在C语言中用于转义字符的开头。
【示例】程序段 int a=5,b=2,c;
c=a\\b; //将除法运算符/写成了\\,编译出错
printf(\将转义字符\\n写成了/n,编译无错也无警告 9.变量未定义就开始使用
int z; z=x+y; return z; int a,b,s;
printf(\请输入两个整数:\scanf(\
s=Sum(a,b);// Sum(a,b)是函数调用 printf(\两个整数和是:%d\\n\return 0;
解析:初学者在编写程序时,经常出现变量未定义就开始使用的现象,导致编译不能通过。切记,程序中用到的每一个变量必须“先定义,后使用”。
【示例】程序段 int a=2,b=3;
c=a+b; //变量c未定义 printf(\
10.参加求余运算%的运算量的数据类型错误
解析:求余运算%要求参加运算的两个运输量必须都是整型数据,其他类型的数据要想进行求余运算需要进行强制类型转换。
【示例】程序段 int a,b=5; float c=3;
a=b%c; //变量c的类型错误 11.将字符串常量赋给字符变量
解析:字符常量是用一对单撇号括起来的单一字符,在内存中占一个字节,可以赋给字符变量;字符串常量是用一对双撇号括起来的字符序列,每个字符在内存中占有一个字节,包括字符串结束标志,一个字符串在内存中需要占有多个(大于等于2)字节,而字符变量只有一个字节的存储空间,所以,不能将一个字符串赋给字符变量。
即字符变量只能存放一个字符,而不能存放字符串。 【示例】程序段 char ch;
ch=\将字符串赋给字符变量是错误的 12.误认为自增自减运算不能用于实型变量
解析:在自增(++)、自减(--)运算符的一侧可以是整型变量,也可以是有左值的表达式,还可以是实型变量(实型变量是由左值的表达式)。
【示例】下面程序的输出结果是:3.600000。 int main() {
double x=2.6;
++x;//实型变量作自增运算 printf(\return 0;
}
13.函数调用时的实参带参数类型
解析:函数调用中,函数名后的一对圆括号里面应写具体实参,实参可以是具体数据,也可以是已赋值的变量,还可以是有确定值的表达式,在实参的前面不能再带参数类型。
【示例】 int Sum(int a,int b) { } int main() { }
此例中,如果要把求整数3和5的和赋给变量s,函数调用应写成s=Sum(3,5);;如果要把求变量a和b中两个整数的和赋给变量s,函数调用就应写成s=Sum(a,b);,而不能写成s=Sum(int a,int b);。
四、同步训练 (一)单项选择题
1.C语言程序的基本单位是( )。
A.程序 A.main函数
B.语句
C.字符
D.函数
2.一个C语言程序总是从( )开始执行的。
B.文件中的第一个函数 D.文件中的第一条语句 B.是一个源程序
D.经过编译解释才能执行
C.文件中的第一个子函数调用 A.可立即执行 C.经过编译即可执行 4.以下叙述正确的是( )。
A.C程序中注释部分可以出现在程序中的任意合适的地方 int a,b,s;
scanf(\
s=Sum(int a,int b); //实参a和b前都多了类型标识符int,编译出错 printf(\return 0; return a+b;
3.用C语言编写的源代码程序( )。
B.花括号“{”和“}”只能作为函数体的定界符
C.构成C程序的基本单位是函数,所有函数名都可以由用户命名 D.分号是C语句之间的分隔符,不是语句的一部分 5.在一个C语言程序中( )。
A.main函数必须出现在所有函数之前
B.main函数可以出现在其它函数之外的任何位置 C.main函数必须出现在所有函数之后 D.main函数必须出在固定位置
6.要把高级语言编写的源程序转换为目标程序,需要使用( )。
A.编辑程序
B.驱动程序
C.诊断程序
D.编译程序
7.一个C语言程序的执行是从( )。
A.main函数开始,直到main函数结束 B.第一个函数开始,直到最后一个函数结束 C.第一个语句开始,直到最后一个语句结束 D.main函数开始,直到最后一个函数结束 8.以下叙述中正确的是( )。
A.C语言的源程序不必通过编译就可以直接运行
B.C语言中的每条可执行语句最终都将被转换成二进制的机器指令 C.C源程序经编译形成的二进制代码可以直接运行 D.C语言中的函数不可以单独进行编译
9.下列四组选项中,均不是C语言关键字的是( )。
A.define,IF ,Type C.include,scanf ,case A.A,P_0,Do C.b-a,goto,int A.int,define,WORD C.For,-abc,Case A.auto,Enum,Include C.signed,union,scanf A.256
B.int
B.gect,char ,printf D.while,go ,pow B.float,lao,_A, D._123,temp,INT B.a3_b3,_xyz,IF D.2a,DO,sizeof
B.switch,typedef,continue D.if ,struct,type C.scanf
D.struct
10.下面四个选项中,均是不合法的用户标识符的是( )。
11.可用作用户标识符的一组标识符是( )。
12.下列四个选项中,均是C语言关键字的是( )。
13.以下符号中能用作用户标识符的是( )。 14.以下选项中,C语言合法的关键字是( )。
A.Switch A.if A.abc.c A.-123
B.cher B.Switch B.file B.Print#
C.Case C.gets C.Main C.A$
D.default D.Case D.printf D.Dim@
15.以下符号中不能用作用户标识符的是( )。 16.以下选项中不合法的用户标识符是( )。 17.以下选项中合法的用户标识符是( )。
18.下列标识符组中,均不合法的用户标识符为( )。
A._0123与ssiped C.list与*jer
B.del-word与signed D.keep%与wind
19.有以下定义:int fun(int n,double x) {??}若以下选项中的变量都已正确定义并赋值,则对函数fun的正确调用语句是( )
A.fun(int x,double n ); C.fun(x,n); A.变量 C.语句
20.函数的实参不能是( )。
B.常量
D.函数调用表达式 B.m=fun(10,12.5); D.int fun(n,x);
21.有以下定义:void fun(int n,double x) {??}若以下选项中的变量都已正确定义并赋值,则对函数fun的正确调用语句是( )
A.fun(int x,double n ); C.fun(x,n);
B.m=fun(10,12.5); D.void fun(n,x);
22.定义为void类型的函数,其含义是( )
A.调用函数后,被调用的函数没有返回值 B.调用函数后,被调用的函数不返回值
C.调用函数后,被调用的函数的返回值为任意的类型 D.以上三种说法都是错误的
23.C语言中,函数返回值的类型是由( )决定的。
A.调用函数时临时
C.调用该函数的主调函数类型 24.以下说法中正确的是( )
A.实参可以是常量、变量或表达式 B.形参可以是常量、变量或表达式 C.实参可以为任意类型
D.形参应与其对应的实参类型一致
25.以下选项中不属于C语言类型标识符的是( )
B.return语句的表达式类型 D.定义函数时,所指定的函数类型
A.signed short int C.unsigned int
B.unsigned long int D.long shot B.-0xcdf,0la,0xe D.-0x48a,2e5,0x B.123,2e4.2,.0e5 D.-e3,.234,1e3 B.”\\”, ?\\017?, ?\\=? D.?\\0?, ?\\101?, ?xlf? B.?\\1011?, ?\\?, ?\\A? D.?\\abc?, ?\\101?, ?xlf? B.0adc,017,0xa D.0a12,7ff,-123
B.”a”, 3.9E-2.5,1e1,?\\=? D.+01,0xabcd,2e2,50 C.原码 C.c+f B.int _abc_=2; D.short do =15; C.?074?
D.?\\0? D.ASCII码 D.i+c+f
26.下面四个选项中,均是合法整型常量的是( )
A.160,0xffff,011 C.-01,986.012,0668 A.160,0.12,E3 C.-018,123e4,0.0 A.?\\??, ?\\\\?, ?\\n? C.?\\018?, ?\\f?, ?xab? A.?\\=?, ?\\\\?, ?xf? C.?\\011? ,?\\f?, ?\\1? A.016,0x8f,018 C.010,-0x11,0x16 A.0.0,0f,8.9e,?&? C.?3?, 011,0xff00,0a A.补码 A.i+f
B.反码 B.i+c
27.下面四个选项中,均是不合法浮点数的是( )
28.下面四个选项中,均是合法转义字符的是( )
29.下面四个选项中,均不是不合法的转义字符的是( )
30.下面四个选项中,均是不正确的八进制数或十六进制数的是( )
31.下面四个选项中,均是正确的数值常量或字符常量的是( )
32.在C 语言中,char型数据在内存中的存储形式是( ) 33.设有int i;char c;float f;以下结果为整型表达式的是( ) 34.以下的变量定义中,合法的是( )
A.float 3_four =3.4 C.double a=1+4e2.0;
35.下列不正确的转义字符是( )
A.?\\\\?
B.?\\”
36.若有以下说明语句:char s=”\\\\\\\\092” ; 则下面正确的是( )
A.使s.的值包含2个字符 C.使s的值包含6个字符 A.5
B.10
B.说明语句不合法 D.使s的值包含4个字符 C.15
D.20
37.在执行了a=5;a+=a=5;之后,a的结果为( )
38.设int x=8, y,z;执行y=z=x++;x=y=z;后,变量x的值是( )
A.0
则输出结果是( )
A.2,M
B.1 C.8 D.9
39.有以下定义和语句char c1=?a?,c2=?f?;printf(“%d,%c\\n”,c2-c1,c2-?a?+?B?);
B.5,1
C.2,E
D.5,G
40.已知各变量的类型说明如下:int k,a,b;unsigned long w=5;double x=1.42;则以下不符合C语言语法的表达式是( )
A.x%(-3)
B.w+=-2
D.a+=a- =(b=4)*(a=3) B.d=(9+e,f=d+9) D.d=9+e++=d+7
C.k=(a=2,b=3,a+b) A.d=9+c+f=d+9 C.d=9+e,e++,d+9 A.a=a+7; A.0 A.0 A.k=n,n=n+1 C.k=++n A.1.4
41.以下符合C语言语法的赋值表达式是( )
42.若变量已正确定义并赋值,下面不符合C语言语法的表达式是( )
B.a=7+b+c,a++ C.(int) 12.3%4 D.a=a+7=a+b B.3 B.3 B.1
C.11 C.2 B.n=n+1,k=n D.k+=n+1 C.2.0
D.2 D.12 D.1
43.若有int k=11 ; 则表达式(k++*1/3)的值是( )
44.设n=10,i=4则执行赋值运算n%=i+1 后,n的值是( ) 45.以下选项中,与k=n++完全等价的表达式是( )
46.若有定义:int a=8,b=5 ,c;执行语句c=a/b+0.4;后,c的值为( ) 47.下列关于单目运算符++,--的叙述中正确的是( )
A.它们的运算对象可以是任何变量和常量
B.它们的运算对象可以是char型和int型变量,但不能是float型变量 C.它们的运算对象可以是int型变量,但不能是double型和float型变量
D.它们的运算对象可以是char型,int型,float型和double型变量 48.下列算术运算符中,只能用于整型数据的是( )
A.-
B.+
C./
D.%
49.有以下定义语句double a,b;int w;若各变量已正确赋值,则下列选项中正确的表达式是( )
A.a=a+b=b++
( )
B.w%a+b
C.w=a++=b
D.w=++a=b
50.若有如下说明和语句int i=3,j;j= (++i)+(++i) + --i;执行后i,j的值分别是
A.4,13 (二)填空题
B.4,14 C.4,12 D.4,15
1.用C语言编写的程序,不能被计算机直接识别、理解和执行,需要一种担任翻译工作的程序,称为________。
2.C语言源程序文件的扩展名是________,经过编译后,生成文件的扩展名是________,经过连接后,生成文件的扩展名是________。
3.一个C语言程序是由一个或多个具有独立功能的模块组成,这些模块称为________。
4.C语言程序的基本单位是________。 5.组成函数的基本单位是________。
6.C语言的语句按在程序中所起的作用可分为________和________两大类。 7.C语言的可执行语句包括:表达式语句;函数调用语句;空语句;________和________五种。
8.C语言中的标识符只能由三种字符组成它们是________、________、和________。
9.C语言中标识符的首字符必须是________。
10.函数调用的作用是使________转向被调用的函数,执行被调函数,完成被调函数的功能。
11.return语句的作用是使程序流程从被调函数返回到主调函数的________,并将被调函数的返回值带回到函数调用处。
12.一个C语言程序总是从________开始执行。
13.C语言中的多行注释以________符号开始,以________符号结束。 14.设char w; int x; float y;则表达式w*x+5-y的值的数据类型为________。 15.若变量a是int类型,并执行了语句:a =‘A’+3.6;则a的值是________。 16.字符串“w\\x53\\\\\\np\\103q”的长度是________。
17.若有以下定义:char c=?\\010?;变量c中包含的字符个数为________。 18.经过如下定义和赋值后int x=2;double y;y=(float)x;,变量x的数据类型是________。
19.已知字母a的ASCII码值为97(十进制),且设ch为字符型变量,则表达式ch=?a?+?8?-?3? 的值为________。
20.若k为int整型变量且赋值7,x为double型变量且赋值8.4,赋值表达式x=k的运算结果是________。
21.若k为int整型变量,则表达式k=10,k++,k++,k+3执行后,表达式的值是________,变量k的值是________。
22.若有语句int i=-19,j=i%4;printf(“%d\\n”,j);,则输出的结果是________。
23.在vc++系统中,一个char型数据在内存中所占的字节数为________;一个int型数据在内存中所占的字节数为________。
24.在vc++系统中,一个float型数据在内存中所占的字节数为________;一个double型数据在内存中所占的字节数为________。
25.设有如下定义:int x=10,y=3,z;,则语句printf(\的输出结果是________;
26.表达式5%6的值是________。 27.表达式5/6的值是________。 28.表达式5/6.0的值是________。
29.设以下变量均为int类型,则表达式(x=y=6,x+y,x+1)的值是________。 30.若x和n均为整型变量,且x的初值为12,n的初值为5,则执行表达式x%=(n%=6)后,x的值为________。
31.若有以下定义:int x=3,y=2;float a=2.5,b=3.5;则表达式(x+y)%2+(int) a / (int)b的值为________。
32.若a是int型变量,且a的初值为6,则执行表达式a+=a-=a*a后,a的值为________。
33.若a是int型变量,则执行表达式a=25/3%3后,a的值为________。 34.若x和n均是int型变量,且x和n的初值为5,则执行表达式x+=n++后,x的值为________,n的值为________。
35.表达式1/3*3的计算结果是________。 36.表达式1.0/2*3的计算结果是________。
37.若k和j为int整型变量,则表达式k=(j=3,j=2,++j,j++)执行后,表达式的值是________,变量k的值是________,变量j的值是________。
38.若x为double型变量,则表达式x=3.2,++x执行后,表达式的值是________,变量x的值是________。
39.若a为float类型变量,且a=4.6785,则表达式 (a*100+0.5)/100.0的值为________,(int) (a*100+0.5)/100.0的值为________。
(三)判断题
( )1.C语言程序的开发过程是编辑、编译、连接、执行。 ( )2.语句是构成C语言程序的基本单位。 ( )3.函数是构成C语言程序的基本单位。 ( )4.只由一个分号组成的语句是空语句。
( )5.一个函数的函数体必须有数据定义、数据操作两部分。 ( )6.C语言的标识符不区分大小写字母。
( )7.可以在一个函数的函数体内定义另一个函数。
( )8.可以在一个函数的函数体内调用另一个函数。
( )9.C语言程序执行过程是从第一个函数开始一直执行到最后一个函数。
( )10.注释可出现在程序的任何位置。
( )11.已定义c为字符型变量,则语句c=97;是正确。
( )12.C语言中整型常量按进制划分,有十六进制常量、十进制常量、八进制常量、二进制常量。
( )13.在C语言程序中,要求对所有用到的变量先定义,然后才能使用。
( )14.字符型变量用来存放字符常量,注意只能放2个字符。 ( )15.一个字符变量在内存中占一个字节。
( )16.C语言中可以把一个字符串赋给一个字符变量。 ( )17.C语言规定,可以在定义变量时,同时使变量初始化。 ( )18.把k1,k2定义成基本整型变量,并赋初值0的定义语句是int k1=k2=0;。
( )19.C语言中字符型数据和整型数据之间可以通用。一个字符数据即可以以字符形式输出,也可以以整型数据形式输出。
( )20.将a1,a2定义成单精度实型变量,并赋初值为1的定义语句是float a1=1;a2=1;。
( )21.设x,y都是int类型,且x=100,y=200,则printf(\的输出结果是200。
( )22.若变量已正确定义,以下程序段的输出的结果是5.169000。 x=5.16894;printf(\ ( )23.表达式(int)(11.0/3+0.5)的值为4。 ( )24.表达式11/3的值为3.666667。
( )25.C语言中,操作对象必须是整型数据的运算符是%。 ( )26.在C语言中,++(i+1)是一个合法的表达式。 ( )27.在C语言中,n=(i=2,++i)是一个合法的赋值表达式。 ( )28.在C语言中,x=j=0是一个合法的赋值表达式。
( )29.已知int x,y,z;执行语句x=(y=(z=10)=5)-5;后x,y,z 的值是10,15,10。 ( )30.若t为double类型,表达式t=1,t+5,t++的值6.0。 ( )31.设int n=3;,则表达式n++的值是4。
( )32.设int n=3;,则表达式n++执行后,n的值是4。 ( )33.设int a=2,b,c;则执行c=b=a--;语句后,a的结果是2。 ( )34.设int n=2,b,c;则执行c=b=a--;语句后,b的结果是2。
( )35.凡是表达式都有一个值。
( )36.若有以下定义int m=5 ,y=2;则执行下面表达式y+=y-=m*=y后,y的值为-16。
( )37.在main函数中,变量一定义,系统将自动赋予初始值。 ( )38.已有a =3,b=5;当执行了表达式a=b,b=a之后,使a中的值为5,b中的值为3。
( )39.在C程序中,逗号运算的优先级最低。
( )40.若a和b类型相同,执行赋值表达式a = b后,将b的值放入a中,而b中的值不变。
(四)程序阅读题
1.以下程序的运行结果是( ) int main() { }
2.以下程序的运行结果是( ) int main() { }
3.以下程序的输出结果是( ) int main() { }
4.以下程序运行后的输出结果是( ) int main() {
int a=1,b=2; a=a+b;b=a-b;a=a-b; printf(\return 0; int a=3;
printf(\ return 0; int x=2,y=3,z=1;
printf(\return 0;
char a='a',b; printf(\ printf(\ return 0;
}
5.下列程序执行后的结果是( ) int main() { int x='f';
printf(\ return 0;
}
6.下列程序执行后的输出的结果是(int main() { char x=(char)0xff; printf(\ return 0; }
7.以下程序执行后输出结果是( )int main() { char a; a='H'-'A'+'2'; printf(\ return 0; }
8.以下程序执行后输出结果是( )int main() { int m=3,n=4,x; x=-m++;x=x+8/++n; printf(\ return 0; }
) 9.以下程序执行后输出结果是( ) int main() { int a,c=1; double f=10.0,x; a=f+=c*=(x=6.5);
printf(\ return 0;
}
10.以下程序执行后输出结果是( int main() { int k=2,i=2,m; m=(k+=i*=k); printf(\ return 0; }
11.以下程序执行后输出结果是( int main() { int x=6,y,z; x*=18+1; printf(\ x+=y=z=11; printf(\ x=y==z;
printf(\ return 0; }
12.以下程序执行后输出结果是( int main() { int a=1,b=4,c=2;
a=(a+b)/c; printf(\ ) ) ) }
return 0;
(五)程序设计题
1.键盘输入一个三位正整数,求该整数各位上的数字及它们的和。 2.将China 译成Glmre。方法是:用原来字母后便的第四个字母代替原来的字母。
3.设圆半径为r,圆柱高为h,求圆球表面积、圆球体积、圆柱体积。要求圆半径r和圆柱高h由用户通过键盘输入。
五、同步训练参考答案 (一)单项选择题参考答案
1. D 6. D 11.B 16.A 21.C 26.A 31.D 36.B 41.B 46.B 2. A 7. A 12.B 17.C 22.A 27.A 32.A 37.B 42.D 47.D 3. B 8. B 13.C 18.B 23.D 28.A 33.B 38.C 43.B 48.D 4. A 9. A 14.D 19.B 24.A 29.C 34.B 39.D 44.A 49.D 5. B 10.C 15.A 20.C 25.D 30.D 35.C 40.A 45.A 50.B (二)填空题参考答案
1.编译程序 3.函数 5.语句
2..cpp(.c),.obj,.exe 4.函数
6.说明语句,可执行语句 8.字母、数字、下划线 10.程序流程 12.main函数 14.float 16.7 18.int 20.7.0
7.复合语句,流程控制语句 9.字母或下划线 11.函数调用处 13./*,*/ 15.68 17.1 19.‘f’
21.15,12 23.1,4 25.1 27.0 29.7 31.1 33.2 35.0
37.3, 3, 4
22.-3 24.4,8 26.5 28.0.833333 30.2 32.-60 34.10,6 36.1.5 38.4.2,4.2
39.4.683500,4.680000 (三)判断题参考答案
1.√ 6.× 11.√ 16.× 21.√ 26.× 31.× 36.√ 2.× 7.× 12.× 17.√ 22.√ 27.√ 32.√ 37.× 3.√ 8.√ 13.√ 18.× 23.√ 28.√ 33.× 38.× 4.√ 9.× 14.× 19.√ 24.× 29.× 34.√ 39.√ 5.× 10.√ 15.√ 20.× 25.√ 30.× 35.√ 40.√ (四)程序阅读题参考答案
1.4,3 3.2,1 5.g 7.9
11.114,124,-1
2.-12 4.b,b 6.-1 8.-2 10.6,4 12.1
9.16,6,16.0,6.50
(五)程序设计题参考答案
1.键盘输入一个三位正整数,求该整数各位上的数字及它们的和。 参考代码 #include \int main()
{ }
int Ones(int n) {//求n的个位函数 }
int Tens(int n) {//求n的十位函数 }
int Hundreds(int n) {//求n的百位函数 }
int ThreeSum(int a,int b,int c) { }
2.将China 译成Glmre。方法是:用原来字母后便的第四个字母代替原来的字母。
参考代码 #include \
return a+b+c; return n/10/10; return n/10; return n;
int ThreeDN,ones,tens,hundreds,sum; int Ones(int n),Tens(int n),Hundreds(int n); int ThreeSum(int a,int b,int c); printf(\请输入一个三位整数:\scanf(\ones=Ones(ThreeDN); tens=Tens(ThreeDN);
hundreds=Hundreds(ThreeDN);
printf(\三位整数%d的\\n个位是%d,\\n十位是%d,\\n百位是%d。sum=ThreeSum(ones,tens,hundreds);
printf(\三位整数%d的各位数码的和是%d。\\n\return 0;
\\n\
void Encrypt(char c1,char c2,char c3,char c4,char c5); int main() { }
void Encrypt(char c1,char c2,char c3,char c4,char c5) {
c1+=4; c2+=4; c3+=4; c4+=4; 5+=4;
printf(\密码是:%c%c%c%c%c\\n\}
3.设圆半径为r,圆柱高为h,求圆球表面积、圆球体积、圆柱体积。要求圆半径r和圆柱高h由用户通过键盘输入。
参考代码 #include \#define PI 3.14
double BallArea(double r); double BallVol(double r);
double ColumnVol(double r,double h); int main() {
double r,h,ballarea,ballvol,columnvol; printf(\请输入园的半径和圆柱的高:\scanf(\ballarea=BallArea(r); ballvol=BallVol(r); columnvol=ColumnVol(r,h);
printf(\圆球表面积为:%f\\n\
printf(\圆球体积为:%f\\n\char c1='C',c2='h',c3='i',c4='n',c5='a'; Encrypt(c1,c2,c3,c4,c5); return 0;
}
printf(\圆柱体积为:%f\\n\return 0;
double BallArea(double r) { }
double BallVol(double r) { }
double ColumnVol(double r,double h) { }
六、课外实践
1.编写一个求平行四边形面积的c语言程序。求平行四边形面积函数命名为Area,某一边长及该边上的高由用户通过键盘输入。
2.读程序回答问题 #include
char ch1=65,ch2=?B?; ch1=ch1+32; ch2=ch1+1;
printf(“%c,%d\\n”,ch1,ch1); printf(“%c,%d\\n”,ch2,ch2); }
①填写下列表格
f1(); return 0; return PI*r*r*h; return 3.0/4*PI*r*r*r; return 4*PI*r*r;
分析结果 运行结果 ②指出程序中第10行语句的作用。
③将程序的第10行改写为int ch1=65,ch2=?B?;分析程序运行的结果有无变化。
3.读程序回答问题 #include \void f2(); int main() { } void f2() { }
①观察直接运行程序与将程序中的注释去掉再运行程序,运行结果的区别; ②说明将程序中的注释去掉后得到的语句在程序中的作用; 4.读程序回答问题 #include
f3(); return 0;
char ch; int i;
/*printf(\请输入一个字符\scanf(\i=ch;
printf(\字母%c的ASCII码值为%d\\n\f2(); return 0;
}
float x=9,y,z; int a=3,b=5,c=7,d; y=x/a; z=x/b; d=x%c;
printf(\
①阅读分析下列程序,指出程序中存在的错误,在不改变程序原意的情况下,修改程序,使之没有语法错误,填入下表;
错误所在行 错误 修改错误 ②给出您分析的程序运行结果,再通过计算机执行程序,比较您分析的程序运行结果与机器的执行结果有什么不同?如果不完全相同,找出自己没有阅读正确的原因。
分析结果 运行结果 阅读错误原因 5.编写程序求short、int、long、char、float、double类型数据在内存中的存储长度。
七、课外实践参考答案 1.代码如下: #include
float Area(float x , float y);//函数声明 int main() {
float length, high,area;
printf(\请输入平行四边形的边长和该边上的高:\scanf(\
}
area= Area(length, high); //函数调用 printf(\平行四边形的面积是:%f\\n\return 0;
//以下是函数Area的定义 float Area(float x , float y) {
float z; z=x*y; return z;
}
2.①填写下列表格 分析结果 运行结果 a,97 b,98
②程序中第10行语句的作用:定义并初始化变量。 ③无变化。因为,整型数据和字符型数据之间具有通用性。
3.①注释不去掉,程序执行后没有相应的提示,用户不知道该做什么;去掉注释,程序执行后有相应的提示。
②起到提示的作用,能帮助用户与程序交互。 4.① 错误所在行 14 ②
分析结果 运行结果 阅读错误原因 y=3.000000 z=1.800000 d=2 错误 参加%运算的运输量是实型 修改错误 d=(int)x%c; 5.参考程序如下: #include \void f4(); int main() { } void f4() { );
}
f4(); return 0;
printf(\短整型、基本整型、长整型、字符型数据的存储长度分别为:\\n\printf(\printf(\单精度实型和双精度实型数据的存储长度分别为:\\n\printf(\