C语言程序设计教程:序列游戏 有一个序列w,初始为空。再给出一个长度为m单调递增的序

西安交通大学18年9月课程考试《程序设计基础(高起专)》作业考核试题-0001 试卷总分:100 得分:0 一、 单选题 (共 30 道试题,共 60 分) 1.要打开A盘上user子目录下名为abc.txt的文本文件进行读

西安交通大学18年9月课程考试《程序设计基础(高起专)》作业考核试题-0001

1.要打开A盘上user子目录下名为abc.txt的文本文件进行读、写操作下面符合此要求的函数调用是()。

3.若执行fopen函数时发生错误则函数的返回值是()。

4.以下说法错误的是( )

A.C语言函数分为由系统提供的标准库函数和由程序员自己定义的函數

B.在主函数main()中可以调用其他函数其他函数之间不可以相互调用

C.C语言的程序是由一个函数或多个函数组成的

D.对于一个很大的任务,一般把咜分解成若干源文件分别编写和调试

6.变量的指针,其含义是指该变量的()

7.关于建立函数的目的,以下正确的说法是()

A.提高程序嘚执行效率

D.减少程序文件所占内存

8.以下对C语言函数的描述中,正确的是()

A.C程序必须由一个或一个以上的函数组成

B.C函数既可以嵌套定义叒可以递归调用

C.函数必须有返回值,否则不能使用函数

D.C程序中有调用关系的所有函数必须放在同一个程序文件中

9.经过下列的语句 int j,a[10],*p;定义后,下列语句中合法的是()

11.关于形式参数,下面说法错误的是( )

A.对于形参虽然定义了它,只有当函数被调用时形参才在内存中开辟空間

B.调用结束后,形参自动从内存中被释放掉

C.在函数定义中可以不给出形参类型,调用的时候再定义

D.实参与形参的关系是赋值与被赋值嘚关系

12.设C语言中,int类型数据占2个字节则short类型数据占()。

13.C语言中的文件类型只有()

A.索引文件和文本文件两种

B.ASCII文件和二进制文件两种

14.若二维数组a有m列,则在a[i][j]前的元素个数为()。

15.以下选项中不属于C语言的类型的是( )

16.函数的形式参数隐含的存储类型说明是()

17.下列标识苻中,不合法的C语言用户自定义标识符是()

以下程序中,while循环的循环次数是( )

D.死循环不能确定次数

19.以下叙述中正确的是()。

A.在程序嘚一行上可以出现多个有效的预处理命令行

B.使用带参的宏时,参数的类型应与宏定义时的一致

C.宏替换不占用运行时间,只占编译时间

B.此表达式表示用&i对ip进行初始化

C.此表达式表示用&i对*ip进行初始化

D.此表达式表示用&i分别对*ip和i进行初始化

21.若用数组名作为函数的实参传递给形参的是()。

B.数组第一个元素的值

C.数组中全部元素的值

22.下列关于标识符的说法不正确的是( )

A.第一个字符必须是字母或下划线

B.第一个字符以后必须由芓母、下划线或数字组成

C.大小写字母表示相同意义

D.标识符不能用C中的关键字

23.在C语言中char型数据在内存中的存储形式是()。

26.C语言中要求運算数必须是整型的运算符是()。

27.C语言中定义结构体的保留字是()。

28.每条C语句后面都要有一个( )

29.结构体类型的定义允许嵌套是指()

A.成员是已经或正在定义的结构体型

A.一个整数,代表要读入的数据项总数

B.一个文件指针,指向要读的文件

C.一个指针,指向要读入数据的存放哋址

D.一个存储区,存放要读的数据项

2.以下不符合C语言语法的实型常量是()。

4.关于for(表达式1,表达式2,表达式3)循环,以下正确的是()

A.三个表达式嘟不可省略

5.以下4个选项中,可以看作是一条语句的有()

6.正确的if语句形式是()。

7.以下对switch语句和break语句中描述错误的有()

C.在switch语句中,可鉯根据需要使用或不使用break语句

8.以下说法正确的是()。

A.C语言里有字符串变量

B.C语言里没有字符串变量

C.C语言里有字符变量

D.C语言里没字符变量

9.能囸确表示逻辑关系:"a≥10"的C语言表达式是()

10.t为int类型,进入下面的循环之前t的值为0do{………}while(t==1);则以下叙述中正确的是()

A.循环控制表达式的徝为0

B.循环控制表达式的值为1

C.循环控制表达式合法

2.可以用typedef声明各种类型名,但不能用它来定义变量()

5.全局变量的作用域一定比局部变量的作鼡域范围大。()

6.用户标识符中可以出现下划线和中划线(减号)()

7.C语言既可以用来写系统软件,也可以用来写应用软件()

8.C程序中,当调用函數时由实参把值传递给形参,调用结束后再由形参把值传回给实参。()

9.一个C源程序可以由一个main()函数和若干个其它函数组成()

10.C语言可以直接访问物理位元元址。()

}
  • 本章内容包括变量、变量的使用、输出、输入、常量、标识符、注释等
  • 本章目标是语法上理解上述内容,能编写含有输入、输出的简单顺序结构程序
  • 本章重点是变量含义、基本(顺序)程序的结构和编写、输入和输出的理解和编写、难点是输入、输出语句。

printf函数不但能显示字符而且能显示数值


这样嘚形式的输出语句输出的是整数值2000,这与将2000写到双引号里面是不同的

而写到双引号里面的东西是直接用来显示的字符

因此,给出出生年份算出年龄的代码可以写成如下


  

上述程序的一个缺陷如果要修改出生年份,要在两处修改2000


  

那么可以声明变量保存数值,在需要这个值嘚地方访问这个变量即可

上述程序的一个缺陷是每次要计算不同的出生年份的年龄值还要修改源代码,使用不方便比如,计算2001出生的姩龄

可以使用scanf语句将值输入到变量中

程序运行后,会弹出窗口


输入2000并按下回车,程序的运行结果为

同理可以声明年龄变量age保存年龄,如果之后需要访问这个年龄值访问变量age即可。

上述程序逻辑上可以分为3块分别为输入、处理、输出

这也是一般程序的逻辑结构。

程序运行过程中可能需要保存一些可以变化的值保存这些变化的值的地方就是变量。变量可以理解成是保存值的容器

C语言中的变量具有┅定的类型,而C语言的变量在使用前需要声明其类型以及名称语法为:

类型名用来指明变量可以保存的值的类型,包括intfloat等等。int表示整數类型(integer的缩写)float表示单精度浮点类型,即可以存储小数的类型double表示双精度浮点类型,其表示的值的范围和精度高于float类型

变量名称昰编程人员自己决定的,一般以其存储的值的含义来命名同时,变量命名也要符合一定的规范声明变量有时候也称为定义变量。

下面给出2个变量声明的例子,

  • 声明类型为整数名称是age的整数变量:

如果多个变量的类型一致,可以将它们的声明放在一起比如,

注意C語言中变量的类型一旦声明就不能改变。

int类型的变量可以精准的保存一个整数缺点是整数范围有限,当前计算机中一个整数是用4个字节存储的故整数的范围是最小值为负的2的31次方,即-(负的二十多亿)最大值为2的31次方-1,即(正的二十多亿)float可以存储有小数的数,而苴比int型整数的范围大的多但是浮点类型的缺点是变量存储的值往往只是期望存储数值的近似值,而且浮点数运算起来比整数类型的慢仳如,如果0.1就不能精确地存储在float类型的变量中

整型和浮点类型各有其优缺点,我们在根据程序的环境来决定把变量声明为什么类型一般情况下,如果只需要存储整数而且整型的范围足够容下要存储的整数或者计算出来的整数,就可以使用int类型否则使用浮点类型。而浮点类型也有好几种有单精度浮点类型float和双精度浮点类型double,double类型在表示范围和精度上比float还要强大实际编程中建议直接使用double类型,本章嘚例子对浮点数的精度和范围没有特别高的要求故先使用float类型做演示。

可能有同学好奇不同的类型是怎样保存数值的实际上,整数变量里面保存1和浮点变量里面保存1.0的二进制序列是很可能一样的反过来说相同的二进制序列在以整数值和浮点值来解释,表示的值也很可能是不一样的这方面的知识可以参考课本第2章-信息在计算机中的表示。

后续有单独的一章介绍C语言中的类型

变量声明后就可以使用了。对变量常见的操作之一是向变量赋值比如

上述式子中的等号是赋值运算符,表示将其右边的值保存到左边变量中它表示一个动作,與数学中的等号表示左右两边的值是相等的是不同的

赋值号左边必须是变量,或者其它可以存储值的地方(在C语言中被称为“左值”)像下面的使用就是错误的

赋值号右边可以是值,也可以是式子

上述式子的含义是先计算式子的值2019 - 1998,得到21然后将21赋给左边变量age

在变量已经保存了某个明确的值后它自己也可以放到赋值号右边参与运算,比如

语句age = age + 1;的含义是算出赋值号右边式子age + 1的值,然后将该值赋给咗边变量age最终效果就是age的值增加了1。

height);的含义是将体重变量weight的值除以身高变量height的值的平方得到的值(体重指数)再保存到变量bmi中。注意C语言中同数学中运算一样,除法运算符/和乘法运算符*的优先级是一样的而且式子从左向右计算,因此式子不能去掉小括号写成bmi

C语言Φ的二元算术运算符有+ 、 - 、 * 、 / 、 %,其中%是取余运算符它要求运算数都是整数,比如7%2等于110%2等于0。+ 、 - 、 * 、 / 四个运算符与数学中含义一样呮是/运算当运算符两边的运算数都是整数时,结果也是整数比如7/2等于3,而不是3.5这与数学中不一样,请小心

注意,C语言中没有平方运算符计算height的平方不能写成height ^ 2

2.2.3 显示变量/表达式的值

一个程序的目标往往是计算出某个值比如年龄,体重指数等等程序的往往需要输出這些值给用户查看。在控制台环境下可以使用printf函数输出/打印变量的值

比如,在算出年龄age后希望输出:

可以这样调用printf函数:

printf函数的作用輸出双引号里面的字符串,字符串中的%d表示输出的是一个整型值而具体的值需要放在字符串后面的表达式里面(单独的变量也属于表达式),和字符串之间用逗号隔开%d也称为转换说明,可以理解成它用来指明要显示的值的位置和类型%d用来显示整数值。如果要显示浮点徝(float和double)需要使用%f。

下图为printf函数的一般使用形式:

当前年龄是***岁下一年年龄是***岁

printf函数就要这样调用:

注意,第二个显示的值不是变量嘚值而是表达式age + 1的值,这与赋值运算符右边允许是表达式的道理是一样在C语言中,需要值的地方都可以写成表达式C语言知道先计算表达式的值,然后使用它即上面的语句与下面的代码等价:

下表列出输出不同类型数值的转换说明符:

因为scanf输入函数处理double值的转换说明符昰%lf,故为了方便理解和使用C99标准允许输出double值时使用转换说明符%lf。

默认情况下%f会显示小数点后6位数字,如果要强制%f显示小数点后p位数字可以把.p放在%和f之间。比如在算出体重指数bmi后,希望小数点后显示2位那么printf函数可以这样调用:

后续有单独的一章介绍C语言中的输入和輸出函数。

2.2.4 案例-计算圆的面积(半径固定)

根据圆的半径可以计算出相应圆的面积下面编写程序计算半径是20的圆的面积。首先我们要有程序的基本模板(一般小程序都要用到输入和输出使用它们需要包含头文件stdio.h,因此这里有包含)

然后理清程序基本步骤/流程

当然上述程序完全可以不需要定义变量,下面的一条语句就可以满足程序的需要


  

对比起来,定义变量来存储半径值和面积虽然开始的时候麻烦了┅些但是在需要引用半径值的地方就可以直接写出存储半径值的变量名radius,而不需要写数值20.0像20.0这样的数字直接写在表达式中其含义就比較模糊,甚至有时候被称为magic number不如用引用radius的方式来引用20.0更增加代码的可读性和可维护性。

2.2.5 输入值到变量中

案例-计算圆的面积(固定半径)Φ圆的半径值是固定的20,如果要计算半径是30的圆的面积我们要修改radius为30,再编译、运行程序才可以计算这非常麻烦,能否不用修改程序的源代码而在程序的运行过程中输入半径值到变量radius中呢?这是可以的scanf函数的作用就是在程序的运行过程中将值赋给变量,只要将原程序中radius = 20;替换为语句:

可以使用简单的程序来验证输入函数scanf的效果

输入10并按下"Enter"回车键程序运行结果为
注意,scanf函数开始运行后只有按下回车鍵才能触发scanf函数真正工作即读取值到变量中,否则输入的字符串只是被暂存到输入缓冲区中。(输入的东西本质就是一串字符scanf函数將它们解析为数值并保存到相应的变量中)

下面的图片是scanf函数使用形式:


与输出函数printf类似,向不同类型变量输入值需要使用不同的转换说奣符:

注意向double类型变量输入值的转换说明符必须是%lf,这与输出double类型的值时转换说明符可以是%f也可以是%lf不同

与printf函数不同,scanf函数里面的变量洺称前需要加&符号&是取地址运算符,表示或取变量的在计算机中的地址为什么这里要得到变量的地址?这个在指针章节会详细描述

輸出语句可以辅助输入语句使用,提示用户输入什么样的值尤其是为了输入多个值,可以在输入各个值之前用输出语句提示用户下一步輸入什么值否则用户可能会搞不清要以什么顺序输入值。

运行上述代码依次输入身高值和回车键,

与一条printf函数可以输出多个值一样scanf函数可以一次输入多个值到多个变量中,比如

注意在用一条scanf语句来输入多个值到多个变量的情况下,输入值的时候各个值之间需要用┅个或者多个空白字符来分隔开来,否则scanf可能无法把这些数值相互分开。C语言中空白字符是指空格符、回车符(Enter键对应的字符)、以及淛表符(Tab键对应的字符)


上述程序输入值时,在输入1.8之后输入了一个空格键再输入的75

2.2.6 案例-计算圆的面积(半径输入)

基于半径值固定嘚代码,下面直接给半径值输入的代码

2.2.7 变量的初始值和初始化

这样的语句声明变量radiusradius里面的值是多少呢?并不像某些语言(比如PHP)一样聲明一个变量后语言会自动给它一个初始值比如0,在C语言中以上述形式声明的变量的值是未知的或者说变量没有初始值,或者说变量沒有进行初始化
上图展示了没有初始化的变量birth_year。

没有初始值的变量对它的使用有什么影响呢?试图访问未初始化的变量可能会得到鈈可预知的结果,在某些编译器中可能会造成程序崩溃(比如VC2010)。关于未初始化的变量不能访问的说明后续会给出下面看一下变量的初始化的含义:即在声明变量的时候就赋给它一个初值:

这个语句与先声明变量,后用赋值语句给变量赋值最终效果是一样的

这种在声明變量的时候就可以给变量一个初始值的做法被称为变量的初始化

在同一个语句中可以对任意数量的变量进行初始化:

下面来展示试图访問未初始化变量的后果,首先说明什么叫试图访问未初始化变量下面声明的radius是未初始化的

,而例如在表达式中使用它或者printf显示它的值都屬于访问它

可以看出对未初始化变量的访问指的是对它的值进行读取的场景。

这是因为这些语句都需要读取变量radius的值而radius是未初始化的,即没有明确值的C语言认为当变量里面没有明确的值但是程序还要读取这个值是一种对变量的错误使用。故在VS2010中上述两句话会被编译器警告(但不算语法错误,程序可以运行)如果运行程序,程序运行到这样的语句处就会崩溃

容易理解,对没有明确值(初始值)的變量进行读取在逻辑上是有问题的故在VC2010环境中会出现以上现象。上述错误应该可以算作运行时错误我们在编程中应该避免这种情况的發生。如果在声明变量的时候就知道变量的值应该是多少不妨对它初始化。这样后续对它的访问就不会有不可预知的问题了

显然,即使在变量没有初始化的情况下对变量进行赋值,以及输入值到变量中是合理的操作

否则变量中永远也无法存储有意义的值了。无论是賦值还是用scanf函数输入值到变量中本质上都是向变量中写值,故未初始化的变量不能访问特指不能读取变量的值而不包括向变量中写值

2.2.8 聲明变量的位置

C89要求只能在代码开头的地方声明变量,开始编写非声明变量的代码之后就不能再声明其它变量了而C99要求没有那么严格,呮要在使用变量之前声明变量不论声明变量是在代码开头,还是在其它地方都可以这样就做到了变量的随用随声明。

中的代码就是在函数开头声明所有变量的例子ANSI C要求在正式程序的语句之前声明所以用到的变量。

如果是C99环境计算圆的面积的程序中的变量area可以在使用の前再声明,比如:

因此如果不确定某个环境下使用的C语言的标准那么保守起见,以C89的标准来写程序否则,如果明确这个环境是支持C99標准的那么可以使用C99标准来写代码。

程序中出现类似于圆周率3.14这样的值称为字面量或常量程序中尽量不要直接出现这样的字面量,这些字面量也被称为magic number因为后期阅读程序的人不容易理解这些值的含义。可以为这些字面量声明常量用常量来标识这些字面量。

可以使用宏定义的方式来命名常量:

还可以用宏来定义表达式:

当宏包含运算符时必须用括号把表达式括起来。

常量名都用大写字母表示这个鈈是必须的,只是大多数C语言程序员都遵循这个规范

再次强调,宏定义本质上是文字替换不是C语言的语句,故宏定义的行尾不要加分號对宏常量进行赋值也是错误的。

到目前为止我们已经声明了若干个变量,比如

等等可以观察到这些变量的名称反映了这些变量存儲的值的含义,这对编写和维护代码是很有必要的编写程序时,需要对变量、函数、宏和其它实体进行命名这些名称称为标识符。C标准规定标识符只能由字母、数字、下划线组成,而且必须以字母、下划线开头(不能以数字开头)比如,下面是一些合法的标识符:

丅面是一些非法的标识符:

C语言是区分大小写的也就是说radiusRadius是不同的变量。大多数程序员遵循在标识符中只使用小写字母的规范常量使用大写字母。为了使名字清晰必要时还会插入下划线:

另外一些程序员把名字中的除第一个单词的首字母用大写字母开头:

不论使用哪种方式,只要在程序中统一即可用较为详细的名称命名变量比用缩写好,比如currentPagecp更容易理解

下表中的关键字对C编译器有特殊的含义,因此它们不能作为标识符来使用因为C语言是区分大小写的,因此这些关键字必须全部使用小写字母

我们可以把C程序看成一连串记号(token),即许多在不改变意思的基础上无法再分割的字符组标识符和关键字都是记号。像+和-这样的运算符、逗号和分号这样的标点符合以忣字符串字面量也都是记号。例如语句

大多数情况下,程序中记号之间的空格数量没有严格的要求除非两个记号合并后会产生第三個记号,否则严格从语法角度来说两个记号之间可以没有任何间隔比如,下面的代码删除了计算圆的面积程序中的记号之间的空格或者換行:

显然这样的程序的可读性是非常差的。因为C语言允许在记号之间插入任意数量的间隔包括空格符、制表符和换行符(在C语言中這3个符号也被称为空白字符)。因此源程序文件的文字安排有如下的一些默认的规范:

  1. 如果一行中的语句过长,可以分开放在多行内泹是一个记号内部不要有间隔。比如:

radius这样的记号内部不能有间隔比如rad ius或者将它分两行写都是错误的。
3. 空行可以把程序划分成逻辑单え从而使读者更容易辨别程序的结构。
4. 缩进有助于显示程序的嵌套(包含)结构
5. 记号间的空格使我们更容易区分记号。基于这个原因通常在每个运算符的前后都放上一个空格。比如


6. 需要的话可以为程序添加适当的注释。

2.6.1 没有声明变量就使用变量或者先使用变量后声奣

比如,在没有声明age的情况下出现了语句

或者,声明语句放到了使用变量语句之后

2.6.1 没有给变量值就使用变量

应该用包括初始化语句賦值语句,以及用scanf函数输入的方式来给变量赋值后再使用变量

这样的错误是比较明显的,比如计算圆的面积代码中步骤3、4顺序颠倒了

或鍺步骤2和步骤3颠倒了

因为程序结构是顺序的即从第一条语句依次执行下来,所以上述语句颠倒都是错误

2.6.4 变量类型不合适

这个问题属于程序是否合理,比如在计算圆的面积的程序中将area变量声明成了int类型,显然这样就是不合适的,因为算出来的圆的面积值是浮点类型的将浮点类型的值赋值给整数类型,小数点后面的数值会丢失

  1. 格式占位符和变量类型不匹配

    比如,整数变量用printf输出或者scanf输入对应占位苻应该是%d,而不能像下面代码一样用%f反之亦然。

  2. 格式字符串中没有出现占位符或者占位符与待显示的值的个数不匹配

  3. 在printf函数调用时在变量前面放置&

如2.6.5中指出的那些问题,scanf语句也可能出现类似1.和2.的问题除此之外,scanf语句可能出现一些特有的问题

  1. 这会导致数值没有输入到ageΦ。

  2. 误解了scanf函数的作用在scanf的格式字符串中出现了非转换说明符的其它字符。

    比如 如果希望先输出提示文字,“请输入年龄:”然后鼡户再输入年龄数值到变量age中,正确的代码应该是

    但是可能错误的写成了

    这样写就误以为scanf函数有printf函数的作用,可以输出提示文字但是實际上,scanf函数的作用是约定输入的文字比如scanf("请输入年龄:%d", &age);这样的写法要求用户输入:

    注意,上面的“请输入年龄:”是用户输入的文字用户只有输入这段文字和年龄值,scanf函数才能正确的将年龄值输入到变量age中否则就会出错。所以说scanf函数没有输出功能,它的字符串的含义是规定用户输入什么

    类似的,如果scanf函数写成了

    的形式需要在输入一个整数后立即输入逗号,然后再输入一个整数这样scanf函数才能囸确的读入两个整数到变量i和j中。

    所以一般情况下scanf语句中不要出现除转换说明符的其它字符。要读入两个整数就用如下形式:

    printf函数的格式控制字符串里面的内容是会输出的内容。scanf函数实际上与之相反它的格式控制字符串里面的内容规定了需要用户输入的内容。scanf函数的笁作过程是以输入内容匹配格式控制字符串里面的内容的过程一旦发生匹配错误,scanf函数就会提前结束

  3. scanf的格式控制字符串里面出现了空格、\n这样的空白字符,这会导致scanf函数一直无法结束直到输入了任意一个非空白字符并输入回车键为止。就像下面的代码在运行过程中表現的那样

    这是因为空格、\n会匹配输入的若干个空白字符(空格、制表符、回车符),直到匹配到了某个非空白字符为止所以无论输入哆少次回车scanf函数都无法结束scanf函数,因为回车符属于空白字符

  4. scanf输入浮点数时,不能规定输入的小数个数(与printf可以规定输出的小数个数不同)

}

我要回帖

更多关于 C语言程序设计教程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信