C的基础和复试

 

 

 

一、C和C++

C语言面向过程,重点在于算法和数据结构。C程序的设计首先考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控 制)。 C++语言是面向对象语言,首先考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的 问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 它在C的基础上添加了面向对象、模板等现在程序设计语言的特性。拓展了面向对象设计的内容,如类、继承、虚函数、模板和容器类等等,使之更加符合现代程序设计的需要。 C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计(泛型编程),还可以进行以继承和多态为特点的面向对象的程序设计(面向对象编程),支持类、封装、继承、多态等特性。

面向对象编程:面向对象是一种对现实世界理解和抽象的方法、思想,通过将需求要素转化为对象进行问题处理的一种思想。

:类定义了事物的属性和它可以做到的(它的行为)。一个类的方法和属性被称为“成员”。一个类所包含的方法和数据描述一组对象的共同属性和行为。类是在对象之上的抽象,对象则是类的具体化,是类的实例。

封装性:封装使数据和加工该数据的方法(函数)封装为一个整体,把对象的设计者和对象的使用者分开,使用者不必知晓行为实现的细节,可以增加安全性。

继承性:继承性是子类共享父类之间数据和方法的机制。一个类直接继承其它类的全部描述,同时可修改和扩充。可以增强代码的复用性。

多态性:对象根据所接收的消息而做出动作。同一消息为不同的对象接受时可产生完全不同的行动,这种现象称为多态性。使具有不同内部结构的对象共享相同的外部接口。可以增加扩展性。

1、指针和变量的自增自减有什么不同?

答:变量的自增自减是改变变量的值,指针的自增自减是改变指针的指向地址。

2、宏定义与操作符的区别?

答:宏定义是C++的预处理命令之一,它是一个替换操作,不做计算和表达式求解,不占内存和编译时间。

3、虚函数与纯虚函数的特点?

答:虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public;纯虚函数是虚函数的一个子集,含有纯虚函数的类就是抽象类,它不能生成对象。

4、如何使用纯虚函数?

答:纯虚函数用来定义没有意义的实现,用于抽象类中需要交给派生类具体实现的方法。

5、引用与值传递的区别?

答:值传递传递的是一个值的副本,函数对形参的操作不会影响实参的值;引用传递传递的是引用对象的内存地址,函数对形参的操作会影响实参的值,实参的值会随着形参的值得改变而改变。

6、指针与引用的区别?

答:(1)引用无需解引用,指针需要解引用;(2)引用在定义时被初始化一次,之后不可变,指针可变;(3)引用不能为空,指针可以为空;(4)程序为指针变量分配内存区域,而引用不需要分配内存区域,所以指针自增操作是指针变量的自增,引用自增操作是变量值的自增。

7、面向对象与面向过程的区别?

答:面向过程是一种以过程为中心的编程思想,以算法进行驱动;面向对象是一种以对象为中心的编程思想,以消息进行驱动。面向过程编程语言的组成:程序=算法+数据;面向对象编程语言的组成:程序=对象+消息。

8、面向对象的特征是什么?

答:面对对象的3个要素:封装,继承,多态。面向对象中所有对象都可以归属为一个类。

9、类与结构体有什么区别?

答:(1)结构体存储在栈中,类的实例化可以存储在栈中,也可以存储在堆中;(2)结构体的执行效率比类要高;(3)结构体没有析构函数,类有析构函数;(4)结构体不可以继承,类可以继承。

10、C++覆盖与隐藏概述?

答:(1)覆盖指的是在子类和父类中,存在函数名、参数均相同的函数,并且父类的该函数为虚函数;(2)隐藏指的是在子类与父类中,存在函数名相同、参数不同的函数,此时无论父类函数是否为虚函数,父类函数都会被被隐藏,或者存在函数名、参数均相同的函数,此时只有当父类函数不为虚函数时,父类函数才会被隐藏。

11、C++支持参数个数不确定的函数吗?

答:C++可以通过隐藏参数机制支持参数不确定的函数。

12、什么是内联函数?

答:在类声明的内部声明或定义的成员函数叫做内联(inline)函数,在内联函数内不允许有循环语句和switch语句。

13、什么是静态函数?如何使用静态函数?

答:静态函数是用static修饰符修饰的函数,静态函数没有this指针,只能访问静态变量。类中如果函数调用的结果不会访问或者修改任何对象数据成员,这样的成员声明为静态成员函数比较好。

14、函数重载及作用域?

答:函数重载是指在相同作用域下,具有相同名称而不同参数列表的多个函数。

15、什么是函数模板?

答:函数模板技术是指使用了模板技术定义了参数化类型的非成员函数,这使得程序能够使用不同的参数类型调用相同的函数。

16、什么是类模板?

答:类模板是使用模板技术的类,描述了能够管理其他数据类型的通用数据类型。类模板技术通常用于建立包含其他类型的容器类(队列、链表、堆栈等)。

17、什么是泛型编程?

答:泛型编程就是以独立于特定类实现的方式编写代码,针对不同的类型提供通用的实现。

18、C++如何实现泛型编程?

答:C++中泛型编程的实现是使用C++中的模板技术来实现的,主要是设计函数模板和类模板。

二、c复试

1、什么是程序?

所谓程序,就是一组计算机能够识别和执行的指令,每一条指令使计算机执行特定的操作。

 

2、什么是程序设计?一般包括哪些步骤?

程序设计是指从确定任务到得到结果、写出文档的全过程。

一般包括:

1)问题分析

2)设计算法

3)编写程序

4)对源程序进行编辑、编译和连接

5)运行程序,分析结果

6)编写程序文档

 

3、什么是算法?

为解决一个问题而采取的方法和步骤,就称为算法。

 

4、程序设计中的三种基本结构是什么?

顺序结构、选择结构、循环结构

 

5、常变量与符号常量有什么区别?

常变量用const定义,要占用存储单元,有变量值,只是该值不改变而已。

符号常量用#define定义,是预编译指令,只是用符号常量代表一个字符串,在预编译时仅进行字符替换。

 

6、加减乘除四则运算中,两个数中的一个数为float或double型,结果是什么型?

结果是double型。系统将所有的数都先转换为double型,然后进行运算。

 

7、字符型数据与整型数据是如何进行运算的?

把字符的ASCII代码与整型数据进行运算。

 

8、将浮点型数据赋给整型变量时,如何转换?

会对浮点数进行取整,舍弃小数部分。(如3.56->3,并不是四舍五入噢)

 

9、将整型数据赋给浮点型变量时,如何转换?

数值不变,但以浮点数形式存储到变量中。

 

10、将double型数据赋给float型变量时,如何转换?

先将双精度数转换为单精度,即只取6~7位有效数字,存储到float变量的4个字节中。

 

11、将占字节多的数据赋给占字节少的数据时,如何转换?

截断,即只将其低字节原封不动地送到被赋值的变量。

 

12、运算符之间的优先级排序是怎样的?(从上往下依次降低)

1)“!”

2)算术运算符

3)关系运算符

4)“&&” 和 “||”

5)赋值运算符

 

13、break语句和continue语句的区别?

continue语句只结束本次循环,break语句是终止整个循环过程。

 

14、输入两个正整数m和n,求其最大公约数和最小公倍数。

辗转相除法:

img

 

15、输出所有水仙花数。(3位数,其各位数字立方和等于该数本身)

img

 

16、找出1000之内的所有完数。(一个数恰好等于它的因子之和)

img

 

17、一个球从100m告诉自由落下,每次落地后反弹回原高度的一半,再落下,再反弹,求它在第10次落地时共经过多少米,第10次反弹多高。

img

18、猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第十天早上时,准备吃的时候发现只剩下一个桃子了。求第一天共摘了多少个桃子。

img

 

19、二维数组在逻辑上和物理上有什么区别?

一般用矩阵形式表示二维数组,是逻辑上的概念,能形象地表达出行列关系。而在内存中,各元素是连续存放的,不是二维的,是线性的。

 

20、有哪些常用的字符串处理函数?

puts函数:将一个字符串输出到终端

gets函数:从终端输入一个字符串到字符数组,并得到字符数组的起始地址

strcat函数:把字符串2接到字符串1的后面,结果放在字符数组1中

strcpy函数:将字符串2复制到字符数组1中去

strcmp函数:比较字符串1、2,相同返回0,字符串1比较大返回1,字符串2比较大返回-1

strlen函数:测字符串长度的函数

strlwr函数:转换小写

strupr函数:转换大写

 

21、什么是函数的递归调用?

在调用一个函数的过程中又出现直接或间接调用函数本身,称为递归

 

22、写一个函数,使输入的一个字符串按反序存放。

img

 

23、写一个函数,输入一个4位数字,要求输出这4个数字字符,但每两个数字间空一格。如输入1990,应输出“1 9 9 0”。

img

 

24、给出年、月、日,计算该日是该年的第几天

img

img

 

25、什么是指针?

某变量所占用的内存空间的起始地址称为该变量的地址,C语言称其为指针

 

26、指针变量是什么?

指针变量就是地址变量,用来存放地址,指针变量的值是地址。

 

27、指针变量作为函数参数有什么意义?

指针变量作函数参数可以将一个变量的地址传送到另一个函数中。

 

28、假设有数组a[],为什么不能通过a++改变指向的元素?

因为数组名a代表数组首元素的地址,它是一个指针型常量,它的值在程序运行期间是固定不变的,所以a++是无法实现的。

 

29、写一函数,实现strcmp()函数。

img

img

 

30、全局变量和静态全局变量的区别?

全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件都是有效的。

静态全局变量限制了其作用域,使得变量只在定义它的源文件内有效。

 

31、如何不使用第三个变量,将两个变量的值进行交换?

#include<stdio.h>

void main() {

int a = 2, b = 3;

//以下运算为b=a^b^b,a=a^b^a

a = a ^ b;

b = a ^ b;

a = a ^ b;

printf("a = %d, b = %d\n", a, b);

}

 

32、关键字static有哪些作用?

1)在函数体内,一个被声明为静态的变量,将在这一函数被调用过程中维持其值不变

2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有函数访问

3)在模块内,一个被声明为静态的函数只可被这一模块内的其他函数调用

 

33、引用和指针有什么区别?

1)引用必须被初始化,指针不必

2)引用初始化之后值不能改变,指针可以改变所指的对象

3)不存在指向空值的引用,但存在指向空值的指针

 

34、a++和++a的区别?

前者是先取值后自增,后者是先自增后取值。

 

35、什么是指针的指针?

指针的指针,意为指向 指针所在地址 的指针。

 

36、extern关键字的作用?

用于修饰变量或函数,表明该变量或函数都是在别的文件定义的,提示编译器在其他文件中寻找定义。

 

37、sizeof关键字的作用?

返回对象或类型所占的字节数

 

38、什么是野指针?

野指针就是指向一个已销毁的对象或者访问受限内存区域的指针。

 

39、全局变量和局部变量有什么区别?

1)生存周期不同。全局变量的生命周期和整个程序相同,只有程序运行结束全局变量才会被撤销其内存空间才会被释放;而局部变量在程序运行期间不是一直存在,而是只在其所在函数执行期间存在,函数的一次调用执行结束后,局部变量就会被撤销,其所占的内存也被释放。

2)作用范围不同。全局变量具有全局作用域,全局变量只需在一个源文件中定义,就可以作用于所有的源文件;局部变量只有局部作用域,其作用范围只是在它所在的函数或者循环内。

3)在内存中的位置不同。全局变量存放在内存中的全局区(静态区);而局部变量是在内存中的栈区。

 

40、函数的嵌套调用和递归调用有什么联系与区别?

函数嵌套允许在一个函数中调用另一个函数,递归调用是函数调用本身,是函数嵌套的一个特例。

 

41、描述一下变量的命名规则?

变量名必须以字母或者下划线开始,其余部分为字母、数字或下划线组成,并且不可以与系统规定的关键字等保留字段重名。

 

42、数组有什么特点?

一个数组内的所有成员都是相同的数据类型,同时所有的成员在内存中地址是连续的。

 

43、内存的最小存储单位和最小计量单位是什么?

最小存储单位是比特,最小计量单位是字节。

 

44、写一个函数,使输入的一个字符串按反序存放。

img

 

45、如何求一个数的补码?

正数的补码是自己。

负数的补码是除了符号位(最高位,0正1负)之外,各位取反,总体+1。

 

46、break语句有什么作用?

1)当break语句出现在一个循环内,循环会立即终止

2)可用于终止switch中的一个case

 

47、谈一下C与C++的区别

① C是面向过程的,C++是面向对象的。

② 面向过程:面向过程编程就是分析出解决问题的步骤,然后把这些步骤一步一步的实现,使用的时候一个一个的依次调用就可以了; 面向对象:面向对象编程就是把问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。

③ 面向过程的优缺点:

优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;

缺点:没有面向对象易维护、易复用、易扩展。

④ 面向对象的优缺点:

优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护;

缺点:性能比面向过程低

 

48、谈一下C语言程序运行的编译和链接过程。

① 编译程序:编译是将编辑好的C语言源程序翻译成二进制目标代码的过程。编译时,要对源程序中的每一个语句检查语法错误,直至排除所有的语法错误后在磁盘上生成目标文件。

② 链接程序:链接是把目标文件和其他分别进行编译生成的目标程序模块以及系统提供的标准库函数“合成” 在一起,生成可以运行的可执行文件(后缀名为.exe)的过程。

编写一个实现某种功能的C语言程序,必须经历编辑-编译-链接-运行四个步骤。每个步骤将完成不同的功能并生成不同类型的文件,如果其中某一步出错必须返回编辑重新进行调试。

 

49、 谈一下什么是内联函数(inline函数)

① 内联函数是指那些定义在类体内的成员函数,即该函数的函数体放在类体内。

② 内联函数具有通用函数的特点,只有在函数调用的处理上不同于通用函数。调用一般函数时,程序的执行权应转移到被调用函数,然后返回到调用它的函数;调用内联函数时,调用表达式由内联函数的主体替换。

③ 当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置。这样做的好处是省去了调用的过程,加快程序运行速度。

但是,由于每当代码调用到内联函数,就需要在调用处直接插入一段该函数的代码,所以程序的体积将增大。

 

50、解释一下模块化编程?

将系统的各个功能进行封装,变成一个个独立的模块,其他人只需要使用你所提供的函数和变量等,就可以完成相对应的功能。

 

51、C语言数据类型有哪几类?基本数据类型包括哪几类?

C语言提供了丰富的数据类型,可以根据这些数据类型构造出不同的结构。 C中的数据类型包括:基本类型、构造类型、指针类型、空类型等。 其中基本类型包括:整型、字符型、实型(浮点型)等。 C语言中十进制、八进制和十六进制整常量是如何表示的? 整型常量即整常数。C整常数可用以下三种形式表示: ①十进制整数; ②八进制整数:以数字0开头的数是八进制数,如0123表示八进制数123; 十六进制整数:以0x开头的数是十六进制数。如0x123,代表十六进制数123;

52、C语言中为什么规定对所用到的变量“先定义,后使用”,这样做有什么好处?

(1)便于纠错; (2)便于编译系统为变量分配存储空间; (3)运算合法性检查; 函数的作用 (1)提高代码的复用率 (2)提高程序模块化组织性。

53、C语言中的语句有几类?控制语句有哪些?

C语句可以分为以下五类: (1)控制语句。完成一定的控制功能。 (2)函数调用语句; (3)表达式语句; (4)空语句; (5)可以用{ }把一些语句括起来成为复合语句。 C只有9种控制语句,它们是: (1)if()else(条件语句) (2)for()~(转向语句) (3)while()~(循环语句) (4)do~while()(循环语句) (5)continue(结束本次循环语句) (6)break(中止执行switch或循环语句) (7)switch(多分支选择语句) (8)goto(转向语句) (9)return(从函数返回语句)

54、怎样区分表达式和表达式语句?为什么有人称C为表达式语言?

表达式不是独立存在的,它存在于其它表达式、语句、函数参数里,表达式后面加上一个分号,就变成表达式语句,如: i=i+1(是表达式,不是语句) i=i+1;(是语句) 表达式能构成语句是C语言的一个特色。其实“函数调用语句”也属于表达式语句,因为函数调用也属于表达式的一种,只是为了便于理解和使用,我们把“函数调用语句”和“表达式语句”分开来说明。由于C程序中大多数语句是表达式语句(包括函数调用语句),所以有人把C语言称作“表达式语言”。

55、字符常量与字符串常量有什么区别?

字符常量就是一个字符,用单引号括起来,占一个字节;而字符串常量是由若干个字符组合而成,用双引号括起来,存储时自动在后面加“\0”,即使同样是一个字符,字符串常量后面还要加一个“\0”。 下面各数用八进制和十六进制数表示: (1)10 : 12,A (2)32 : 40, 20 (3)75: 113,4B 如691求八进制为1263 691/8=86……3 86/8=10……6 10/8=1……2 1/8=0……1

56、什么是算法?算法有哪些特性?从日常生活中举出几个算法的例子。

算法:程序解决问题是按指定的次序执行一系列操作的结果,按照次序执行操作的过程描述称为算法。 算法的特性:(1)有穷性;(2)确定性;(3)有零个或多个输入;(4)有一个或多个输出;(5)有效性。 举例:菜谱操作步骤、乐谱、施工图纸等等。 算法有哪些描述方法?各有什么优缺点? (1)自然语言(2)伪代码(3)流程图(4)计算机语言 优缺点: 自然语言通俗易懂,但有歧义性; 伪代码方便实用,但没有流程图明晰,容易犯逻辑错误; 流程图明晰但绘制和修改时比较繁琐; 计算机语言表示算法严谨,但无法做到算法设计的第一步就使用计算机语言,读程序比看流程图要费神很多。

57、结构化的算法有哪几种结构?试分别描述。

顺序结构:由顺序执行的一组语句或结构组成。 分支结构:根据判断条件,做出取舍,要么执行A分支要么执行B分支,必须执行其中的一个,不可全执行也不可全不执行。 循环结构:由需要反复执行的一段代码或者结构组成。 任何算法功能都可以通过以上三种基本程序结构的组合来实现。

58、选择语句和循环语句对条件的判断的标准是什么?(即何值为真、何值为假)

非0为真,0位假。 举例说明文本文件和二进制文件的适用场合。 能存储的数据类型不同: 文本文件只能存储char型字符变量。 二进制文件可以存储char/int/short/long/float/…各种变量值。 每条数据的长度 文本文件每条数据通常是固定长度的。 二进制文件每条数据不固定。 读取的软件不同。 文本文件编辑器就可以读写。 二进制文件需要特别的解码器。 操作系统对换行符(‘\n’)的处理不同(不重要)。 文本文件,操作系统对‘\n’进行一些隐式变换,因此文本文件直接跨平台使用会出问题。 二进制文件,操作系统不会对‘\n’进行隐式变换,很多二进制文件(如电影、图片等)可以跨平台使用。

59、什么是文件?C语言中的文件如何分类?

文件:是指存储在外部介质上一组相关数据的集合。 分类:根据文件的组织形式,文件可以分为ASCII文件和二进制文件。 写出在C程序中使用文件的操作步骤 对文件的操作的步骤:先打开,后读写,最后关闭。

60、struct和typedef struct的区别

\1. 首先:在C中定义一个结构体类型要用typedef:

typedef struct Student { int a; }Stu; 于是在声明变量的时候就可:Stu stu1; 如果没有typedef就必须用struct Student stu1;来声明 这里的Stu实际上就是struct Student的别名。 另外这里也可以不写Student(于是也不能struct Student stu1;了) typedef struct { int a; }Stu; 但在c++里很简单,直接 struct Student { int a; }; 于是就定义了结构体类型Student,声明变量时直接Student stu2;

61、c语言的变量?

局部变量、全局变量。

全局变量是整个程序都可访问的变量,谁都可以访问,生存期在整个程序从运行到结束(在程序结束时所占内存释放); 而局部变量存在于模块(子程序,函数)中,只有所在模块可以访问,其他模块不可直接访问,模块结束(函数调用完毕),局部变量消失,所占据的内存释放。 操作系统和编译器,可能是通过内存分配的位置来知道的,全局变量分配在全局数据段并且在程序开始运行的时候被加载.局部变量则分配在堆栈里面。

还有一个小考点就是如果没有初始化的情况下,局部变量的值是随机的,而全局变量的值为零。

静态变量、动态变量。

一般情况下就是静态变量会加static关键字,表明这是一个静态变量。动态变量就比如说int a这种。下面要说一下四个关键的知识点:

(1) 动态全局变量: 作用域为整个项目,即最终编译成可执行文件的所有文件中均可以使用动态全局变量。跨文件的全局变量一般都会加一个extern。 生命周期为从程序运行到程序退出,即贯穿整个运行时间。 无显式初始化时默认初始化值为0。 (2 )静态全局变量: 作用域为当前文件,从定义/声明位置到文件结尾。 生命周期为从程序运行到程序退出,即贯穿整个运行时间。 无显式初始化时默认初始化值为0。

(3) 动态局部变量: 作用域为当前函数,从定义位置,到其所在的{}的结束位置。 生命周期为从函数调用到函数退出。 无显式初始化时默认初始化值为随机值。 (4) 静态局部变量: 作用域为当前函数,从定义位置,到其所在的{}的结束位置。 生命周期为从程序运行到程序退出,即贯穿整个运行时间,当下次函数调用时,静态局部变量不会被再次初始化,而是沿用上次函数退出时的值。 无显式初始化时默认初始化值为0。

62、c语言的指针?

指针是一种内存地址,而指针变量是一种表示内存地址的变量。我们如果要想使用这个地址里面所存的数据,那么我们可以加入来实现,这个我查到了叫做间接寻址运算符。还有就是以下几个知识点要清楚,指针常量、常量指针、指针数组、数组指针。

指针常量的本质是一个常量,并且使用指针来修饰它,那么说明这个常量的值应该是一个指针,其格式应为:int * const p。

常量指针本质是指针,常量修饰它,表示这个指针是一个指向常量的指针(变量)。指针指向的对象是常量,那么这个对象不能被更改。

指针数组在本质上是一个数组,只不过我们的数组里面全部存的都是指针变量。

数组指针本质上一个指针,它是指向数组首地址的一个指针。

 

posted @ 2023-03-11 19:47  paopaocha  阅读(91)  评论(0)    收藏  举报