当前位置:首页 » 编程语言 » 位置类对象的复制操作c语言
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

位置类对象的复制操作c语言

发布时间: 2023-02-08 01:12:20

1. c语言基础知识

  •1 C语言程序的结构认识

用一个简单的c程序例子,介绍c语言的基本构成、格式、以及良好的书写风格,使读者对c语言有个初步认识。

例1 计算两个整数之和的c程序:

1、任何一个c语言程序都必须包括以下格式:

这是c语言的基本结构,任何一个程序都必须包含这个机构。括号内可以不写任何内容,那么该程序将不执行任何结果。

2、main()----在c语言中称之为“主函数”,一个c程序有且仅有一个main函数,任何一个c程序总是从main函数开始执行,main函数后面的一对圆括号不能省略。

3、被大括号{ }括起来的内容称为main函数的函数体,这部分内容就是计算机要执行的内容。

4、在{  }里面每一句话后面都有一个分号(;),在c语言中,我们把以一个分号结尾的一句话叫做一个c语言的语句,分号是语句结束的标志。

5、printf(“a=%d,b=%d,sum=%d\n”,a,b,sum); ----通过执行这条c语言系统提供给我们直接使用的屏幕输出函数,用户即可看到运行结果,本程序运行后,将在显示器上显示如下结果:

6、#include

7、程序中以 /*开头并且以*/结尾的部分表示程序的注释部分,注释可以添加在程序的任何位置,为了提高程序的可读性而添加,但计算机在执行主函数内容时完全忽略注释部分,换而言之就是计算机当做注释部分不存在于主函数中。

   •  2 C程序的生成过程

C程序是先由源文件经编译生成目标文件,然后经过连接生成可执行文件,如图所示。

                              编译过程

 • 3 标识符

在编写程序时,必须为函数、变量等命名,这个名字称为标识符。C语言中标识符的命名规则如下:

标识符不能与程序中具有特殊意义的关键字相同,不能与用户编制的函数名、C语言库函数相同,在程序中各种标识符尽量不要重复,以便区分。选择变量名和其他标识符时,应注意做到 “见名知义”。

标识符分为如下三类:

1、关键字

3、用户标识符

用户根据需要自己定义的标识符称为用户标识符。无论如何自定义标识符,都必须符合标识符的三条命名规则。

 • 4 常量

在程序运行中,其值不能被改变的量称为常量。常量有5种类型:整型常量、实型常量、字符常量、字符串常量和符号常量。

(一)数值转换

数字的四种表现形式:

在计算机内部,数字均以二进制形式表示和存放,用户输入的普通十进制数字都要被计算机转换成二进制才能在计算机内部存储,同样计算机的运算结果也为二进制,一般要将其转换成十进制数再输出给用户阅读,这种转换通常由计算机自动实现。

(1)将十进制转换二进制、八进制和十六进制

除法:将十进制数除以2,记录余数,得到的商继续除以2,直到商为0,然后将各次相处所得的余数从后往前逆序排列,所得余数数字序列就是该十进制数对应的二进制数。八进制和十六进制转换方法同上。

例:十进制数13转换成二进制数的值为1101,转换八进制为015,转换成十六进制为D.

(2)将二进制、八进制和十六进制转换成十进制

乘积求和:将二进制的每一位从低位到高位(右边为低位,左边为高位)分别乘以20,21,22。。。。,然后将这些积求和。

例如:(1101)2=(13)10     (317)8=(207)10     (23E)16=(574)10

(3)二进制与八进制、十六进制数之间的相互转换

(二)整型常量

整型常量有3种形式:十进制整型常量、八进制整型常量和十六进制整型常量。

书写方式如下:

(三)实型常量

实型常量有两种表示形式:小数形式和指数形式。

(四)字符常量

(2)由一对单引号括起来,以反斜杠\开头,后跟若干数字或者字母,比如‘\n’,其中“\“是转义的意思,后面跟不同的字符表示不同的意思,这类字符常量叫转义字符。具体如图所示 。

(五)字符串常量

C语言中,以双引号括起来的,由若干个字符组成的序列即为字符串常量。

例:“ni hao”   “happy”等等。

(六)符号常量

例:计算圆的面积的c程序。

说明:

• 5 变量

变量就是其值可以改变的量。变量要有变量名,在内存中占据一定的存储单元,存储单元里存放的是该变量的值。不同类型的变量其存储单元的大小不同,变量在使用前必须定义。

(一)整型变量

不同的编译系统对上述四种整型数据所占用的位数和数值范围有不同的规定。

类型说明符

说明:

(二)实型变量

C语言中,实型变量分为单精度类型( float )和双精度类型( double )两种。如:

在vc中,float 型数据在内存中占4个字节(32位),double型数据占8个字节。单精度实数提供7位有效数字,双精度实数提供15~16位有效数字。实型常量不分float型和double型,一个实型常量可以赋给一个float 型或double型变量,但变量根据其类型截取实型常量中相应的有效数字。

注意:实型变量只能存放实型值,不能用整型变量存放实型值,也不能用实型变量存放整型值。

(三)字符变量

字符变量用来存放字符常量,定义形式:

char  变量名;

其中关键字char定义字符型数据类型,占用一个字节的存储单元。

将一个字符赋给一个字符变量时,并不是将该字符本身存储到内存中,而是将该字符对应的ASCII码存储到内存单元中。例如,字符 ′A′ 的ASCII码为65,在内存中的存放形式如下:01000001

由于在内存中字符以ASCII码存放,它的存储形式和整数的存储形式类似,所以C语言中字符型数据与整型数据之间可以通用,一个字符能用字符的形式输出,也能用整数的形式输出,字符数据也能进行算术运算,此时相当于对它们的ASCII码进行运算。

     •6 类型的自动转换和强制转换

当同一表达式中各数据的类型不同时,编译程序会自动把它们转变成同一类型后再进行计算。转换优先级为:

即左边级别“低“的类型向右边转换。具体地说,若在表达式中优先级最高的数据是double型,则此表达式中的其他数据均被转换成double型,且计算结果也是double型;若在表达式中优先级最高的数据是float型,则此表达式中的其他数据均被转换成float型,且计算结果也是float型。

在做赋值运算时,若赋值号左右两边的类型不同,则赋值号右边的类型向左边的类型转换;当右边的类型高于左边的类型时,则在转换时对右边的数据进行截取。

除自动转换外,还有强制转换,表示形式是:

讨论:当a值赋值为3.4,b值赋值为2.7,(int)(a+b)和(int)a+b的值分别为多少?

   • 7  C运算符认识

C语言的运算符范围很广,可分为以下几类:

1、算术运算符:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(%)、自增(++)、自减(--)共七种。

2、赋值运算符:用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。

3、逗号运算符:用于把若干表达式组合成一个表达式(,)。

4、关系运算符:用于比较运算。包括大于(>)、小于(<)、等于(==)、 大于等于(>=)、小于等于(<=)和不等于(!=)六种。

5、逻辑运算符:用于逻辑运算。包括与(&&)、或(||)、非(!)三种。

6、条件运算符:这是一个三目运算符,用于条件求值(?:)。

7、位操作运算符:参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。

8、指针运算符:用于取内容(*)和取地址(&)二种运算。

9.、求字节数运算符:用于计算数据类型所占的字节数(sizeof)。

10、特殊运算符:有括号(),下标[],成员(→,.)等几种。

另外,按参与运算的对象个数,C语言运算符可分为:单目运算符 (如 !)、双目运算符 (如+,- )和三目运算符 (如 ?  : )。

一、   基本的算术运算符

(1)+(加法运算符或正值运算符,如2+5)。

(2)-(减法运算符或负值运算符,如4-2)。

(3)*(乘法运算符,如3*8)。

(4)/(除法运算符,如11/5)。

/的运算分为两种情况:

(5)%(模运算符或称求余运算符,%两侧均应为整型数据,如9%7的值为2)。

需要说明的是:当运算对象为负数时,所得结果随编译器不同而不同,在vc中,结果的符号与被除数相同,比如:13%-2值为1,而-15%2值为-1.

二、   算术表达式和运算符的优先级与结合性

算术表达式是用算术运算符和括号将运算量(也称操作数)连接起来的、符合C语言语法规则的表达式。运算对象包括函数、常量和变量等。

在计算机语言中,算术表达式的求值规律与数学中的四则运算的规律类似,其运算规则和要求如下。

(1)在算术表达式中,可使用多层圆括号,但括号必须配对。运算时从内层圆括号开始,由内向外依次计算各表达式的值。

(2)在算术表达式中,对于不同优先级的运算符,可按运算符的优先级由高到低进行运算,若表达式中运算符的优先级相同,则按运算符的结合方向进行运算。

(3)如果一个运算符两侧的操作数类型不同,则先利用自动转换或强制类型转换,使两者具有相同类型,然后进行运算。

三、   自增自减运算符

作用:使变量的值增1或减1。

(1)只有变量才能用自增运算符 (++)和自减运算符(--),而常量或表达式不能用,如10++或(x+y)++都是不合法的。

(2)++和--的结合方向是“自右向左“,如 -i++ ,i的左边是负号运算符,右边是自增运算符,负号运算和自增运算都是 “自右向左“结合的,相当于 -(i++)。

在循环语句中常用到自增(减)运算符,在指针中也常用到该运算符,考生要弄清楚“i++”和“++i”及“i--”和“--i”的区别,特别弄清楚表达式的值和变量的值。

例:变量n的初始值为2,则

例:有以下程序

程序运行后的输出结果是_____

A.12  35  13  35  14  36     B. 12  35  14  35  14  36

C.12  35  14  36  14  36     D. 12  35  14  35  14  35

解析:自增自减运算需要注意区分表达式的值和变量的值,表达式运算后,变量会自增自减运算,表达式和变量变化如下:

     •9 赋值运算符与赋值表达式

一、赋值运算符与赋值表达式

赋值符号 “=“就是赋值运算符,作用是将一个数据赋给一个变量或将一个变量的值赋给另一个变量,由赋值运算符组成的表达式称为赋值表达式。一般形式为:

变量名 = 表达式

在程序中可以多次给一个变量赋值,每赋一次值,与它相应的存储单元中的数据就被更新一次,内存中当前的数据就是最后一次所赋值的那个数据。

说明:

a、如果赋值号两边的运算对象类型不一致,系统会自动进行类型转换,转换的规则:将赋值号右边表达式的值的类型转换成赋值号左边变量的类型,

b、 可以将复制表达式的值再赋值给变量,形成连续赋值。

二、复合的赋值运算符

在赋值运算符之前加上其他运算符可以构成复合赋值运算符。其中与算术运算有关的复合运算符是:+=,-=,*=,/=,%= 。

两个符号之间不可以有空格,复合赋值运算符的优先级与赋值运算符的相同。表达式n+=1等价于n=n+1,作用是取变量n中的值增1再赋给变量n,其他复合的赋值运算符的运算规则依次类推。

如求表达a+=a-=a*a 的值,其中a的初值为12 。

步骤:

   •10  逗号运算符和逗号表达式

在c语言中,逗号除了作为分隔符,还可以用作一种运算符----逗号运算符,用逗号运算符将几个表达式连接起来,例如a=b+c,a=b*c等称为逗号表达式。

一般形式为:

表达式1 ,表达式2 ,表达式3 , …,表达式n

例:x=2,y=3,z=4

逗号表达式具有从左至右的结合性,即先求解表达式1,然后依次求解表达式2,直到表达式n的值。表达式n的值就是整个逗号表达式的值。上述的逗号表达式的值就是表达式z=4的值4.需要注意的是,逗号运算符是所有运算符中级别最低的。

例:有如下程序段:

程序显示结果为:y=6,x=6

讨论:将y=(x=a+b),(b+c);改为y=((x=a+b),b+c) 的程序结果?

  • 11 关系运算符和关系表达式

一、   C语言中的逻辑值

C语言中的逻辑值只有两个:真(true)和假(flase)。用非零代表真,用零代表假。因此,对于任意一个表达式,如果它的值为零,就代表一个假值,如果它的值为非零,就代表一个真值。只要值不是零,不管是正数,负数,整数,实数,都代表一个真值。例如-5的逻辑值为真。

二、   关系运算符及其优先次序

C语言提供了6种关系运算符,见表

由两个字符组成的运算符之间不可以加空格,关系运算符都是双目运算符。

(1)结合性:自左向右。

(2)优先次序:前4种关系运算符( <,<=,>=,> )的优先级别相同,后两种 (==,!=)优先级相同,且前4种优先级高于后两种;关系运算符的优先级低于算术运算符,高于赋值运算符。

三、   关系表达式

由关系运算符连接而成的表达式称为关系表达式。

例如:a>b,(a=7)>(b=10)等都是合法的关系表达式。

关系表达式的结果有两个:0和1,。其中0表示假,1表示真。如果关系表达式成立,则值为真,如果关系表达式不成立,则值为假。

例:变量a的值为5,b的值为6,那么关系表达式a>b的值为假,即为0.而关系表达式

(a=13)>(b=10)的值为真,即为1。

当关系运算符两边值的类型不一致时,若一边是整型,一边是实型,系统将自动把整型数转化为实型数,然后再进行比较。

    •12 逻辑运算符和逻辑表达式

一、   逻辑运算符及其优先级

C语言提供了3种逻辑运算符,如下表。

二、   逻辑表达式

“&&”和“||”的运算对象有两个,故它们都是双目运算符,而!的运算对象只有一个,因此它是单目运算符。逻辑运算举例如下:

(1)a&&b: 当&&两边都为“真”时,表达式a&&b的值才是真。

值得注意的是:在数学中,关系式0

(2)a||b: 当||两边有一个为“真”时,表达式a||b的值就是真。

(3)!a:   表示取反,如果a为真,则!A为假,反之亦然。例如!-5的值就为0.

在C语言中,由&&或||组成的逻辑表达式,在某些特定情况下会产生“短路“现象。

(1)x && y && z ,只有当x为真(非0)时,才需要判别y的值;只有x和y都为真时,才需要去判别z的值;只要x为假就不必判别y和z,整个表达式的值为0。口诀:“一假必假”。

例:(!5==1)&&(++i==0)  (!5==1)表达式的值为0,所以计算机运行中就跳过(++i==0)此表达式,(!5==1)&&(++i==0)表达式的值为0.

(2)x||y||z ,只要x的值为真(非零),就不必判别y和z的值,整个表达式的值为1,只有x的值为假,才需要判别y的值,只有x和y的值同时为假才需要判别z的值,口诀:“一真必真”。

   •13 位运算

一、   位运算符

在计算机中,数据都是以二进制数形式存放的,位运算就是指对存储单元中二进制位的运算。C语言提供6种位运算符。

二、位运算

位运算符 &  |~<<  >>  ∧ 按优先级从高到低排列的顺序是:

位运算符中求反运算“~“优先级最高,而左移和右移相同,居于第二,接下来的顺序是按位与 “&“、按位异或 “∧“和按位或 “|“。顺序为~  <<  >>  &  ∧  |  。

例1左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。

例 2右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。

应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。

例 3 设二进制数a是00101101 ,若通过异或运算a∧b 使a的高4位取反,低4位不变,则二进制数b是。

解析:异或运算常用来使特定位翻转,只要使需翻转的位与1进行异或操作就可以了,因为原数中值为1的位与1进行异或运算得0 ,原数中值为0的位与1进行异或运算结果得1。而与0进行异或的位将保持原值。异或运算还可用来交换两个值,不用临时变量。

所以本题的答案为: 11110000 。

2. c语言中cpy(str,c)什么意思

标准库的string类提供了三个成员函数来从一个string得到c类型的字符数组:
c_str( ),data( ),cpy( p,n).
这里简单说一下第三个,也就是问的这个cpy( p,n)
从string类型对象中至多复制n个字符指针p指向的空间中。
默认从首字符开始,但是也可以指定,开始的位置(记住从0开始)。返回真正从对象中复制的字符。
!!!用户要确保p指向的空间足够保存n个字符。

3. c语言中移位操作规则与操作对象的数据类型有关吗

#include < stdio.h >

int main(int argc, char **argv)
{
unsigned char v1 = 3;
unsigned char v2 = 0x03;
unsigned char v3 = 0;

v3 = v1 << 2;

4. c语言版数据结构图的一些基本操作函数如下,有三个地方不了解,请各位帮帮忙

(1)问题三:
i=LocateVex(*G,va);
j=LocateVex(*G,vb);
*G不是指针,是指针G所指对象,就是ALGraph类型。程序中多处使用变量G,但是不同的地方,含义不同。在void CreateGraph(ALGraph *G)里面,G是一个指针,因此,引用其所指对象,要用*G。其他情况下,ALGraph G,G不是指针。
(2)第一:这个void DFSTraverse(ALGraph G,void(*print)(char*)) 为什么不能直接调用print函数,像调用DFS函数一样?可以的,使用函数指针是为以后任意扩展输出程序,以适应不同需要,并且可以作为参数传递。
(3)第二:FirstAdjVex(G,G.vertices[v].data)为什么要用顶点,用了之后又取位置,而不直接用位置,会有什么漏洞吗?不会
int FirstAdjVex(ALGraph G,VertexType v)
{
ArcNode *p;
int v1;
v1=LocateVex(G,v);
p=G.vertices[v1].firstarc;
if(p)
return p->adjvex;
else
return -1;
}
利用已经定义的定位函数LocateVex直接定位顶点v,然后直接读取其firstarc,很自然的过程。

5. C语言程序

C语言中的static有两种用法:
面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。
一、面向过程设计中的static
1、静态全局变量
在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下:
//Example 1
#include <iostream.h>
void fn();
static int n; //定义静态全局变量
void main()
{ n=20;
cout<<n<<endl;
fn();
}
void fn()
{ n++;
cout<<n<<endl;
}
静态全局变量有以下特点:
该变量在全局数据区分配内存;
未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化);
静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;
静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量。对于一个完整的程序,在内存中的分布情况如下图:
代码区
全局数据区
堆区
栈区
一般程序的由new产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静 态局部变量)也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。细心的读者可能会发现,Example 1中的代码中将
static int n; //定义静态全局变量
改为
int n; //定义全局变量
程序照样正常运行。
的确,定义全局变量就可以实现变量在文件中的共享,但定义静态全局变量还有以下好处:
静态全局变量不能被其它文件所用;
其它文件中可以定义相同名字的变量,不会发生冲突;
您可以将上述示例代码改为如下:
//Example 2//File1
#include <iostream.h>
void fn();
static int n; //定义静态全局变量
void main()
{ n=20;
cout<<n<<endl;
fn();
}
//File2
#include <iostream.h>
extern int n;
void fn()
{ n++;
cout<<n<<endl;
}
编译并运行Example 2,您就会发现上述代码可以分别通过编译,但运行时出现错误。 试着将
static int n; //定义静态全局变量
改为
int n; //定义全局变量
再次编译运行程序,细心体会全局变量和静态全局变量的区别。
2、静态局部变量
在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量。
我们先举一个静态局部变量的例子,如下:
//Example 3
#include <iostream.h>
void fn();
void main()
{ fn();
fn();
fn();
}
void fn()
{ static int n=10;
cout<<n<<endl;
n++;
}
通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。
但有时候我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。
静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。
静态局部变量有以下特点:
该变量在全局数据区分配内存;
静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;
静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;
它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;
3、静态函数
在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。
静态函数的例子:
//Example 4
#include <iostream.h>
static void fn();//声明静态函数
void main()
{
fn();
}
void fn()//定义静态函数
{ int n=10;
cout<<n<<endl;
}
定义静态函数的好处:
静态函数不能被其它文件所用;
其它文件中可以定义相同名字的函数,不会发生冲突;
二、面向对象的static关键字(类中的static关键字)
1、静态数据成员
在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员。先举一个静态数据成员的例子。
//Example 5
#include <iostream.h>
class Myclass
{
public:
Myclass(int a,int b,int c);
void GetSum();
private:
int a,b,c;
static int Sum;//声明静态数据成员
};
int Myclass::Sum=0;//定义并初始化静态数据成员
Myclass::Myclass(int a,int b,int c)
{ this->a=a;
this->b=b;
this->c=c;
Sum+=a+b+c;}
void Myclass::GetSum()
{ cout<<"Sum="<<Sum<<endl;
}
void main()
{ Myclass M(1,2,3);
M.GetSum();
Myclass N(4,5,6);
N.GetSum();
M.GetSum();}
可以看出,静态数据成员有以下特点:
对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷 贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共 用。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新;
静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。在Example 5中,语句int Myclass::Sum=0;是定义静态数据成员;
静态数据成员和普通数据成员一样遵从public,protected,private访问规则;
因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以,它不属于特定的类对象,在没有产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它;
静态数据成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式为:
<数据类型><类名>::<静态数据成员名>=<值>
类的静态数据成员有两种访问形式:
<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>
如果静态数据成员的访问权限允许的话(即public的成员),可在程序中,按上述格式来引用静态数据成员 ;
静态数据成员主要用在各个对象都有相同的某项属性的时候。比如对于一个存款类,每个实例的利息都是相同的。所以,应该把利息设为存款类的静态数据成员。这 有两个好处,第一,不管定义多少个存款类对象,利息数据成员都共享分配在全局数据区的内存,所以节省存储空间。第二,一旦利息需要改变时,只要改变一次, 则所有存款类对象的利息全改变过来了;
同全局变量相比,使用静态数据成员有两个优势:
静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性;
可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能;
2、静态成员函数
与静态数据成员一样,我们也可以创建一个静态成员函数,它为类的全部服务而不是为某一个类的具体对象服务。静态成员函数与静态数据成员一样,都是类的内部 实现,属于类定义的一部分。 普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。通常情况下,this 是缺省的。如函数fn()实际上是this->fn()。但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指 针。从这个意义上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。 下面举个静态成员函数的例子。
//Example 6
#include <iostream.h>
class Myclass
{public:
Myclass(int a,int b,int c);
static void GetSum();/声明静态成员函数
private:
int a,b,c;
static int Sum;//声明静态数据成员
};
int Myclass::Sum=0;//定义并初始化静态数据成员
Myclass::Myclass(int a,int b,int c)
{ this.a=a;
this.b=b;
this.c=c;
Sum+=a+b+c; //非静态成员函数可以访问静态数据成员
}
void Myclass::GetSum() //静态成员函数的实现
{// cout<<a<<endl; //错误代码,a是非静态数据成员
cout<<"Sum="<<Sum<<endl;
}
void main()
{ Myclass M(1,2,3);
M.GetSum();
Myclass N(4,5,6);
N.GetSum();
Myclass::GetSum();
}
关于静态成员函数,可以总结为以下几点:
出现在类体外的函数定义不能指定关键字static;
静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
非静态成员函数可以任意地访问静态成员函数和静态数据成员;
静态成员函数不能访问非静态成员函数和非静态数据成员;
由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;
调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式:
<类名>::<静态成员函数名>(<参数表>)
调用类的静态成员函数。
===============================================================================================
static静态变量声明符。 在声明它的程序块,子程序块或函数内部有效,值保持,在整个程序期间分配存储器空间,编译器默认值0。
是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性。
2、为什么要引入static?
函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 最容易想到的方法是定义一个全局的变量,但定义为一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅受此函数控制)。
3、什么时候用static?
需要一个数据对象为整个类而非某个对象服务,同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见。
4、static的内部机制:
静态数据成员要在程序一开始运行时就必须存在。因为函数在程序运行中被调用,所以静态数据成员不能在任何函数内分配空间和初始化。
这样,它的空间分配有三个可能的地方,一是作为类的外部接口的头文件,那里有类声明;二是类定义的内部实现,那里有类的成员函数定义;三是应用程序的main()函数前的全局数据声明和定义处。
静态数据成员要实际地分配空间,故不能在类的声明中定义(只能声明数据成员)。类声明只声明一个类的“尺寸和规格”,并不进行实际的内存分配,所以在类声明中写成定义是错误的。它也不能在头文件中类声明的外部定义,因为那会造成在多个使用该类的源文件中,对其重复定义。
static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间,静态
数据成员按定义出现的先后顺序依次初始化,注意静态成员嵌套时,要保证所嵌套的成员已经初始化了。消除时的顺序是初始化的反顺序。
5、static的优势:
可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。
6、引用静态数据成员时,采用如下格式:
<类名>::<静态成员名>
如果静态数据成员的访问权限允许的话(即public的成员),可在程序中,按上述格式
来引用静态数据成员。
7、注意事项:
(1)类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致
了它仅能访问类的静态数据和静态成员函数。
(2)不能将静态成员函数定义为虚函数。
(3)由于静态成员声明于类中,操作于其外,所以对其取地址操作,就多少有些特殊
,变量地址是指向其数据类型的指针 ,函数地址类型是一个“nonmember函数指针”。
(4)由于静态成员函数没有this指针,所以就差不多等同于nonmember函数,结果就
产生了一个意想不到的好处:成为一个callback函数,使得我们得以将C++和C-based X W
indow系统结合,同时也成功的应用于线程函数身上。
(5)static并没有增加程序的时空开销,相反她还缩短了子类对父类静态成员的访问
时间,节省了子类的内存空间。
(6)静态数据成员在<定义或说明>时前面加关键字static。
(7)静态数据成员是静态存储的,所以必须对它进行初始化。
(8)静态成员初始化与一般数据成员初始化不同:
初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆;
初始化时不加该成员的访问权限控制符private,public等;
初始化时使用作用域运算符来标明它所属类;
所以我们得出静态数据成员初始化的格式:
<数据类型><类名>::<静态数据成员名>=<值>
(9)为了防止父类的影响,可以在子类定义一个与父类相同的静态变量,以屏蔽父类的影响。这里有一点需要注意:我们说静态成员为父类和子类共享,但我们有重复定义了静态成员,这会不会引起错误呢?不会,我们的编译器采用了一种绝妙的手法:name-mangling 用以生成唯一的标志。

6. c语言程序求解

这个是在心形内部加波纹,原理是f<0的时候说明点在心内内部,就打印出相应的符号,且在偏离心形边缘越远也就是越中心的位置,f的值会越小,绝对值也就越大,乘以-8得得到值也越大,就越可能打印偏后的符号,边缘位置反之,所以中心位置都是偏向#%@之类的,边缘位置都是偏向.:-=之类的。
解释为什么要乘以-8,因为按照上面所说的,离中心位置越近,f的值越小,所以当y取0,x取0(都是中心位置)的时候,f值达到最小,也就是-1,所以f的取值范围为-1~0,乘以-8后取值范围为0~8,而字符串中的字符刚好有9个,和0~8对应

7. C语言中string指令是什么

string 是 c++的,不是 c 的
stirng 是C++里面一个用来处理字符串的类。包含了字符串处理掉一下常用方法,如:

Constructors 构造函数,用于字符串初始化
Operators 操作符,用于字符串比较和赋值
append() 在字符串的末尾添加文本
assign() 为字符串赋新值
at() 按给定索引值返回字符
begin() 返回一个迭代器,指向第一个字符
c_str() 将字符串以C字符数组的形式返回
capacity() 返回重新分配空间前的字符容量
compare() 比较两个字符串
() 将内容复制为一个字符数组
data() 返回内容的字符数组形式
empty() 如果字符串为空,返回真
end() 返回一个迭代器,指向字符串的末尾。(最后一个字符的下一个位置)
erase() 删除字符
find() 在字符串中查找字符
find_first_of() 查找第一个与value中的某值相等的字符
find_first_not_of() 查找第一个与value中的所有值都不相等的字符
find_last_of() 查找最后一个与value中的某值相等的字符
find_last_not_of() 查找最后一个与value中的所有值都不相等的字符
get_allocator() 返回配置器
insert() 插入字符
length() 返回字符串的长度
max_size() 返回字符的最大可能个数
rbegin() 返回一个逆向迭代器,指向最后一个字符
rend() 返回一个逆向迭代器,指向第一个元素的前一个位置
replace() 替换字符
reserve() 保留一定容量以容纳字符串(设置capacity值)
resize() 重新设置字符串的大小
rfind() 查找最后一个与value相等的字符(逆向查找)
size() 返回字符串中字符的数量
substr() 返回某个子字符串
swap() 交换两个字符串的内容

8. C语言基础知识点

C语言基础知识点集锦

【知识点1】C程序

C语言程序结构有三种: 顺序结构 , 循环结构(三个循环结构), 选择结构(if 和 switch)

【知识点2】main函数

每个C语言程序中main 函数是有且只有一个。读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择)。

【知识点3】存储形式

计算机的数据在电脑中是以二进制的形式保存。最低的存储单元是bit(位),位是由为 0 或者1构成。 byte 是指字节, 一个字节 = 八个位。数据存放的位置就是它的地址。

【知识点4】注释

是对程序的说明,可出现在程序中任意合适的地方,注释从“/*”开始到最近一个“*/”结束,其间任何内容都不会被计算机执行,注释不可以嵌套。

【知识点5】书写格式

每条语句的后面必须有一个分号,分号是语句的一部分。一行内可写多条语句,一个语句可写在多行上。

【知识点6】标识符

合法的用户标识符考查:

合法的要求是由字母,数字,下划线组成。有其它元素就错了。

并且第一个必须为字母或则是下划线。第一个为数字就错了。

C语言标识符分如下3类

(1)关键字。它们在程序中有固定的含义,不能另作他用。如int、for、switch等。

(2)预定义标识符。预先定义并具有特定含义的标识符。如define、include等。

(3)用户标识符。用户根据需要定义的标识符,符合命名规则且不与关键字相同。

关键字不可以作为用户标识符号。main define scanf printf 都不是关键字。迷惑你的地方If 是可以做为用户标识符。因为If 中的第一个字母大写了,所以不是关键字。

【知识点7】实型数据

实型数据的.合法形式:小数形式和指数形式。掌握判定指数形式合法性。

2.333e-1 就是合法的,且数据是2.333×10-1。

【知识点8】字符

字符数据的合法形式::

1 是字符占一个字节,"1"是字符串占两个字节(含有一个结束符号)。

0 的ASCII 数值表示为48,a 的ASCII 数值是97,A的ASCII 数值是65。

字符型和整数是近亲:

char a = 65 ;

printf(“%c”, a); 得到的输出结果:a

printf(“%d”, a); 得到的输出结果:65

一般考试表示单个字符错误的形式:65 "1"

字符是可以进行算术运算的,记住: 0-0=48

大写字母和小写字母转换的方法: A+32=a 相互之间一般是相差32。

【知识点9】整型数据

整型一般是两个字节, 字符型是一个字节,双精度一般是4 个字节:

考试时候一般会说,在16 位编译系统,或者是32 位系统。碰到这种情况,不要去管,

一样做题。掌握整型一般是两个字节, 字符型是一个字节,双精度一般是4 个字节就可以了。

【知识点10】转义字符

转义字符的考查:

在程序中 int a = 0x6d,是把一个十六进制的数给变量a 注意这里的0x 必须存在。

在程序中 int a = 06d, 是一个八进制的形式。

在转义字符中, ’x6d’ 才是合法的,0 不能写,并且x 是小写。

‘141’ 是合法的, 0 是不能写的。

‘108’是非法的,因为不可以出现8。

【知识点11】算术运算

算术运算符一共有+、—、*、/、%这五个。%符号两边要求是整数。不是整数就错了。

三种取整丢小数的情况:不是四舍五入是舍掉小数部分。

1、int a =1.6;

2、(int)a;

3、1/2; 3/2;

【知识点12】强制类型转换

将一个运算对象转换成指定类型,格式为(类型名)表达式

一定是 (int)a 不是 int(a),注意类型上一定有括号的。

注意(int)(a+b) 和(int)a+b 的区别。前是把a+b 转型,后是把a 转型再加b。

【知识点13】赋值

是表达式就一定有数值。

赋值表达式:表达式数值是最左边的数值,a=b=5;该表达式为5,常量不可以赋值。

复合赋值运算符:注意:a*=m+2 是 a=a*(m+2)

自加、自减表达式:假设a=5,++a(表达式的值为6), a++(表达式的值为5);

j=a++;等价于j=a;a=a+1; 而j=++a;等价于a=a+1;j=a;。

考试口诀:++在前先加后用,++在后先用后加。

【知识点14】逗号运算

逗号表达式:优先级别最低; 表达式的数值逗号最右边的那个表达式的数值。

(2,3,4)的表达式的数值就是4。

【知识点15】数制转换

一定要记住二进制 如何转换成十进制。

八进制是没有8 的,逢8 进1,018 的数值是非法的。

9. c语言重点

站长提醒广大考生:下面的138道题目,在二级考试中命中率极高。

一、选择题
(1) 下面叙述正确的是(C)
A. 算法的执行效率与数据的存储结构无关B. 算法的空间复杂度是指算法程序中指令(或语句)的条数C. 算法的有穷性是指算法必须能在执行有限个步骤之后终止 D. 以上三种描述都不对
(2) 以下数据结构中不属于线性数据结构的是(C)
A. 队列 B. 线性表 C. 二叉树 D. 栈
(3) 在一棵二叉树上第5层的结点数最多是(B) 注:由公式2k-1得
A. 8 B. 16 C. 32 D. 15
(4) 下面描述中,符合结构化程序设计风格的是(A)
A. 使用顺序、选择和重复(循环)三种基本控制结构表示程序的控制逻辑 B. 模块只有一个入口,可以有多个出口 C. 注重提高程序的执行效率 D. 不使用goto语句
(5) 下面概念中,不属于面向对象方法的是 (D) 注:P55-58
A. 对象 B. 继承 C. 类 D. 过程调用
(6) 在结构化方法中,用数据流程图(DFD)作为描述工具的软件开发阶段是(B)
A. 可行性分析 B. 需求分析 C. 详细设计 D. 程序编码
(7) 在软件开发中,下面任务不属于设计阶段的是(D)
A. 数据结构设计 B. 给出系统模块结构
C. 定义模块算法 D.定义需求并建立系统模型
(8) 数据库系统的核心是(B)
A. 数据模型 B. 数据库管理系统 C. 软件工具 D. 数据库
(9) 下列叙述中正确的是(C)
A.数据库是一个独立的系统,不需要操作系统的支持B.数据库设计是指设计数据库管理系统C.数据库技术的根本目标是要解决数据共享的问题 D.数据库系统中,数据的物理结构必须与逻辑结构一致
(10) 下列模式中,能够给出数据库物理存储结构与物理存取方法的是(A) 注:P108
A. 内模式 B. 外模式 C. 概念模式 D. 逻辑模式
(11) 算法的时间复杂度是指(C)
A. 执行算法程序所需要的时间 B. 算法程序的长度 C. 算法执行过程中所需要的基本运算次数 D. 算法程序中的指令条数
(12) 算法的空间复杂度是指(D)
A. 算法程序的长度 B. 算法程序中的指令条数 C. 算法程序所占的存储空间 D. 算法执行过程中所需要的存储空间
(13) 设一棵完全二叉树共有699个结点,则在该二叉树中的叶子结点数为(B) 注:利用公式n=n0+n1+n2、n0=n2+1和完全二叉数的特点可求出
A. 349 B. 350 C. 255 D. 351
(14) 结构化程序设计主要强调的是(B)
A.程序的规模 B.程序的易读性
C.程序的执行效率 D.程序的可移植性
(15) 在软件生命周期中,能准确地确定软件系统必须做什么和必须具备哪些功能的阶段是(D) 注:即第一个阶段
A. 概要设计 B. 详细设计 C. 可行性分析 D. 需求分析
(16) 数据流图用于抽象描述一个软件的逻辑模型,数据流图由一些特定的图符构成。下列图符名标识的图符不属于数据流图合法图符的是(A) 注:P67
A. 控制流 B. 加工 C. 数据存储 D. 源和潭
(17) 软件需求分析阶段的工作,可以分为四个方面:需求获取、需求分析、编写需求规格说明书以及(B) 注:P66
A. 阶段性报告 B. 需求评审 C. 总结 D. 都不正确
(18) 下述关于数据库系统的叙述中正确的是(A)
A. 数据库系统减少了数据冗余 B. 数据库系统避免了一切冗余
C. 数据库系统中数据的一致性是指数据类型的一致 D. 数据库系统比文件系统能管理更多的数据
(19) 关系表中的每一横行称为一个(A)
A. 元组 B. 字段 C. 属性 D. 码
(20) 数据库设计包括两个方面的设计内容,它们是(A)
A. 概念设计和逻辑设计 B. 模式设计和内模式设计
C. 内模式设计和物理设计 D. 结构特性设计和行为特性设计
(21) 下列叙述中正确的是(A)
A. 线性表是线性结构 B. 栈与队列是非线性结构
C. 线性链表是非线性结构 D. 二叉树是线性结构
(22) 下列关于栈的叙述中正确的是(D)
A. 在栈中只能插入数据 B. 在栈中只能删除数据
C. 栈是先进先出的线性表 D. 栈是先进后出的线性表
(23) 下列关于队列的叙述中正确的是(C)
A. 在队列中只能插入数据 B. 在队列中只能删除数据
C. 队列是先进先出的线性表 D. 队列是先进后出的线性表
(24) 对建立良好的程序设计风格,下面描述正确的是(A) 注:P48
A. 程序应简单、清晰、可读性好 B. 符号名的命名要符合语法
C. 充分考虑程序的执行效率 D. 程序的注释可有可无
(25) 下面对对象概念描述错误的是(A) 注:P55
A. 任何对象都必须有继承性 B. 对象是属性和方法的封装体
C. 对象间的通讯靠消息传递 D. 操作是对象的动态性属性
(26) 下面不属于软件工程的3个要素的是(D) 注:P62
A. 工具 B. 过程 C. 方法 D. 环境
(27) 程序流程图(PFD)中的箭头代表的是(B) 注:P81
A. 数据流 B. 控制流 C. 调用关系 D. 组成关系
(28) 在数据管理技术的发展过程中,经历了人工管理阶段、文件系统阶段和数据库系统阶段。其中数据独立性最高的阶段是(A)
A.数据库系统B. 文件系统 C. 人工管理 D. 数据项管理
(29) 用树形结构来表示实体之间联系的模型称为(B)
A. 关系模型 B. 层次模型 C. 网状模型 D. 数据模型
(30) 关系数据库管理系统能实现的专门关系运算包括(B)
A. 排序、索引、统计 B. 选择、投影、连接
C. 关联、更新、排序 D. 显示、打印、制表
(31) 算法一般都可以用哪几种控制结构组合而成(D) 注:P3
A. 循环、分支、递归 B. 顺序、循环、嵌套
C. 循环、递归、选择 D. 顺序、选择、循环
(32) 数据的存储结构是指(B) 注:P13,要牢记
A. 数据所占的存储空间量 B. 数据的逻辑结构在计算机中的表示
C. 数据在计算机中的顺序存储方式 D. 存储在外存中的数据
(33) 设有下列二叉树:图见书P46
对此二叉树中序遍历的结果为(B)
A. ABCDEF B. DBEAFC C. ABDECF D. DEBFCA
(34) 在面向对象方法中,一个对象请求另一对象为其服务的方式是通过发送(D) 注:P56
A. 调用语句 B. 命令 C. 口令 D. 消息
(35) 检查软件产品是否符合需求定义的过程称为(A) 注:P95
A. 确认测试 B. 集成测试 C. 验证测试 D. 验收测试
(36) 下列工具中属于需求分析常用工具的是(D) 注:P67
A. PAD B. PFD C. N-S D. DFD
(37) 下面不属于软件设计原则的是(C) 注:P73
A. 抽象 B. 模块化 C. 自底向上 D. 信息隐蔽
(38) 索引属于(B)
A. 模式 B. 内模式 C. 外模式 D. 概念模式
(39) 在关系数据库中,用来表示实体之间联系的是(D)
A. 树结构 B. 网结构 C. 线性表 D. 二维表
(40) 将E-R图转换到关系模式时,实体与联系都可以表示成(B)
A. 属性 B. 关系 C. 键 D. 域
(41) 在下列选项中,哪个不是一个算法一般应该具有的基本特征(C)
A. 确定性 B. 可行性 C.无穷性D. 拥有足够的情报
(42) 希尔排序法属于哪一种类型的排序法(B)
A.交换类排序法 B.插入类排序法 C.选择类排序法 D.建堆排序法
(43) 在深度为5的满二叉树中,叶子结点的个数为(C)
A. 32 B. 31 C. 16 D. 15
(44) 对长度为N的线性表进行顺序查找,在最坏情况下所需要的比较次数为(B) 注:要牢记
A. N+1 B. N C. (N+1)/2 D. N/2
(45) 信息隐蔽的概念与下述哪一种概念直接相关(B) 注:P74
A.软件结构定义 B. 模块独立性 C. 模块类型划分 D. 模拟耦合度
(46) 面向对象的设计方法与传统的的面向过程的方法有本质不同,它的基本原理是(C)
A. 模拟现实世界中不同事物之间的联系 B. 强调模拟现实世界中的算法而不强调概念 C. 使用现实世界的概念抽象地思考问题从而自然地解决问题 D. 鼓励开发者在软件开发的绝大部分中都用实际领域的概念去思考
(47) 在结构化方法中,软件功能分解属于下列软件开发中的阶段是(C) 注:总体设计也就是概要设计
A. 详细设计 B. 需求分析 C. 总体设计 D. 编程调试
(48) 软件调试的目的是(B) 注:与软件测试要对比着复习
A.发现错误 B.改正错误 C.改善软件的性能 D.挖掘软件的潜能
(49) 按条件f对关系R进行选择,其关系代数表达式为(C)
A. R|X|R B. R|X|Rf C. бf(R) D. ∏f(R)
(50) 数据库概念设计的过程中,视图设计一般有三种设计次序,以下各项中不对的是(D) 注:P127,要牢记
A. 自顶向下 B. 由底向上 C. 由内向外 D. 由整体到局部
(51) 在计算机中,算法是指(C)
A. 查询方法 B. 加工方法
C. 解题方案的准确而完整的描述 D. 排序方法
(52) 栈和队列的共同点是(C) 注:这一共同点和线性表不一样
A. 都是先进后出 B. 都是先进先出 C. 只允许在端点处插入和删除元素 D. 没有共同点
(53) 已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是(A) 注:P38,前提要掌握三种遍历的方法
A. cedba B. acbed C. decab D. deabc
(54) 在下列几种排序方法中,要求内存量最大的是(D) 注:要牢记,书中没有提到。
A. 插入排序 B. 选择排序 C. 快速排序 D. 归并排序
(55) 在设计程序时,应采纳的原则之一是(A) 注:和设计风格有关
A. 程序结构应有助于读者理解 B. 不限制goto语句的使用
C. 减少或取消注解行 D. 程序越短越好
(56) 下列不属于软件调试技术的是(B) 注:P98
A. 强行排错法 B. 集成测试法 C. 回溯法 D. 原因排除法
(57)下列叙述中,不属于软件需求规格说明书的作用的是(D)注:P71
A. 便于用户、开发人员进行理解和交流 B. 反映出用户问题的结构,可以作为软件开发工作的基础和依据 C. 作为确认测试和验收的依据 D. 便于开发人员进行需求分析
(58) 在数据流图(DFD)中,带有名字的箭头表示(C)
A. 控制程序的执行顺序 B. 模块之间的调用关系 C. 数据的流向 D. 程序的组成成分
(59) SQL语言又称为(C)
A. 结构化定义语言 B. 结构化控制语言
C. 结构化查询语言 D. 结构化操纵语言
(60) 视图设计一般有3种设计次序,下列不属于视图设计的是(B)
A. 自顶向下 B. 由外向内 C. 由内向外 D. 自底向上
(61) 数据结构中,与所使用的计算机无关的是数据的(C)
A. 存储结构 B. 物理结构 C. 逻辑结构 D. 物理和存储结构
(62) 栈底至栈顶依次存放元素A、B、C、D,在第五个元素E入栈前,栈中元素可以出栈,则出栈序列可能是(D)
A. ABCED B. DBCEA C. CDABE D. DCBEA
(63) 线性表的顺序存储结构和线性表的链式存储结构分别是(B)
A. 顺序存取的存储结构、顺序存取的存储结构 B. 随机存取的存储结构、顺序存取的存储结构 C. 随机存取的存储结构、随机存取的存储结构 D. 任意存取的存储结构、任意存取的存储结构
(64) 在单链表中,增加头结点的目的是(A)
A. 方便运算的实现 B. 使单链表至少有一个结点 C. 标识表结点中首结点的位置 D. 说明单链表是线性表的链式存储实现
(65) 软件设计包括软件的结构、数据接口和过程设计,其中软件的过程设计是指(B) 注:P73
A. 模块间的关系 B. 系统结构部件转换成软件的过程描述 C. 软件层次结构 D. 软件开发过程
(66) 为了避免流程图在描述程序逻辑时的灵活性,提出了用方框图来代替传统的程序流程图,通常也把这种图称为(B) 注:P82
A. PAD图 B. N-S图 C. 结构图 D. 数据流图
(67) 数据处理的最小单位是(C) 注:数据项不可再分割
A. 数据 B. 数据元素 C. 数据项 D. 数据结构
(68) 下列有关数据库的描述,正确的是(C) 注:P102
A. 数据库是一个DBF文件 B. 数据库是一个关系 C. 数据库是一个结构化的数据集合 D. 数据库是一组文件
(69) 单个用户使用的数据视图的描述称为(A) 注:P108
A. 外模式 B. 概念模式 C. 内模式 D. 存储模式
(70) 需求分析阶段的任务是确定(D)
A. 软件开发方法 B. 软件开发工具 C. 软件开发费用 D. 软件系统功能
(71) 算法分析的目的是(D) 注:书中没有总结,但要牢记
A. 找出数据结构的合理性 B. 找出算法中输入和输出之间的关系 C. 分析算法的易懂性和可靠性 D. 分析算法的效率以求改进
(72)链表不具有的特点是(B)
A.不必事先估计存储空间 B.可随机访问任一元素
C.插入删除不需要移动元素 D.所需空间与线性表长度成正比
(73) 已知数据表A中每个元素距其最终位置不远,为节省时间,应采用的算法是(B)
A. 堆排序 B. 直接插入排序 C. 快速排序 D. 直接选择排序
(74) 用链表表示线性表的优点是(A) 注:因为不需要移动元素
A. 便于插入和删除操作 B. 数据元素的物理顺序与逻辑顺序相同 C. 花费的存储空间较顺序存储少 D. 便于随机存取
(75) 下列不属于结构化分析的常用工具的是(D) 注:P67
A. 数据流图 B. 数据字典 C. 判定树 D. PAD图
(76) 软件开发的结构化生命周期方法将软件生命周期划分成(A)
A. 定义、开发、运行维护 B. 设计阶段、编程阶段、测试阶段 C. 总体设计、详细设计、编程调试 D. 需求分析、功能定义、系统设计
(77) 在软件工程中,白箱测试法可用于测试程序的内部结构。此方法将程序看做是(C) 注:P87
A. 循环的集合 B. 地址的集合 C. 路径的集合 D. 目标的集合
(78) 在数据管理技术发展过程中,文件系统与数据库系统的主要区别是数据库系统具有(D) 注:数据模型采用关系模型(二维表)
A. 数据无冗余 B. 数据可共享
C. 专门的数据管理软件 D. 特定的数据模型
(79) 分布式数据库系统不具有的特点是(B)
A. 分布式 B. 数据冗余
C. 数据分布性和逻辑整体性 D. 位置透明性和复制透明性
(80) 下列说法中,不属于数据模型所描述的内容的是(C) 注:P110
A. 数据结构 B. 数据操作 C. 数据查询 D. 数据约束
(81)根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分成(C)
A.动态结构和静态结构 B.紧凑结构和非紧凑结构
C.线性结构和非线性结构 D.内部结构和外部结构
(82)下列叙述中,错误的是(B)
A.数据的存储结构与数据处理的效率密切相关 B.数据的存储结构与数据处理的效率无关 C.数据的存储结构在计算机中所占的空间不一定是连续的 D.一种数据的逻辑结构可以有多种存储结构
(83)线性表L=(a1,a2,a3,…ai,…an),下列说法正确的是(D)
A.每个元素都有一个直接前件和直接后件 B.线性表中至少要有一个元素 C.表中诸元素的排列顺序必须是由小到大或由大到
D.除第一个元素和最后一个元素外,其余每个元素都有一个且只有一个直接前件和直接后件
(84)线性表若采用链式存储结构时,要求内存中可用存储单元的地址(D)
A.必须是连续的 B.部分地址必须是连续的
C.一定是不连续的 D.连续不连续都可以
(85)栈通常采用的两种存储结构是(A)
A.顺序存储结构和链式存储结构 B.散列方式和索引方式
C.链表存储结构和数组 D.线性存储结构和非线性存储结构
(86)下列数据结构中,按先进后出原则组织数据的是(B)
A.线性链表 B.栈 C.循环链表 D.顺序表
(87)树是结点的集合,它的根结点数目是(C)
A.有且只有1 B.1或多于1 C.0或1 D.至少2
(88)具有3个结点的二叉树有(D)
A.2种形态 B.4种形态 C.7种形态 D. 5种形态
(89)设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为(B)
A. 12 B. 13 C.14 D. 15
(90)在结构化程序设计思想提出之前,在程序设计中曾强调程序的效率,现在,与程序的效率相比,人们更重视程序的(C)
A.安全性 B.一致性 C.可理解性 D.合理性
(91)为了提高测试的效率,应该 (D) 注:P85
A.随机选取测试数据B.取一切可能的输入数据作为测试数据C.在完成编码以后制定软件的测试计划 D.集中对付那些错误群集的程序
(92)软件生命周期中所花费用最多的阶段是(D)
A.详细设计 B.软件编码 C.软件测试 D.软件维护

二、填空题
(1) 算法的复杂度主要包括______复杂度和空间复杂度。 答:时间
(2) 数据的逻辑结构在计算机存储空间中的存放形式称为数据的______。答:存储结构#物理结构
(3) 若按功能划分,软件测试的方法通常分为白盒测试方法和______测试方法。答:黑盒
(4) 如果一个工人可管理多个设施,而一个设施只被一个工人管理,则实体"工人"与实体"设备"之间存在______联系。
答:一对多#1:N#1:n
(5) 关系数据库管理系统能实现的专门关系运算包括选择、连接和______。 答:投影
(6) 在先左后右的原则下,根据访问根结点的次序,二叉树的遍历可以分为三种:前序遍历、______遍历和后序遍历。答:中序
(7) 结构化程序设计方法的主要原则可以概括为自顶向下、逐步求精、______和限制使用goto语句。 答:模块化
(8) 软件的调试方法主要有:强行排错法、______和原因排除法。答:回溯法
(9) 数据库系统的三级模式分别为______模式、内部级模式与外部级模式。答:概念#概念级
(10) 数据字典是各类数据描述的集合,它通常包括5个部分,即数据项、数据结构、数据流、______和处理过程。答:数据存储
(11) 设一棵完全二叉树共有500个结点,则在该二叉树中有______个叶子结点。答:250
(12) 在最坏情况下,冒泡排序的时间复杂度为______。 答:n(n-1)/2#n*(n-1)/2#O(n(n-1)/2)#O(n*(n-1)/2)
(13) 面向对象的程序设计方法中涉及的对象是系统中用来描述客观事物的一个______。答:实体
(14) 软件的需求分析阶段的工作,可以概括为四个方面:______、需求分析、编写需求规格说明书和需求评审。 答:需求获取
(15) ______是数据库应用的核心。 答:数据库设计
(16) 数据结构包括数据的______结构和数据的存储结构。
答:逻辑
(17) 软件工程研究的内容主要包括:______技术和软件工程管理。答:软件开发 注:P64
(18) 与结构化需求分析方法相对应的是______方法。
答:结构化设计
(19) 关系模型的完整性规则是对关系的某种约束条件,包括实体完整性、______和自定义完整性。答:参照完整性
(20) 数据模型按不同的应用层次分为三种类型,它们是______数据模型、逻辑数据模型和物理数据模型。答:概念 注:P110
(21) 栈的基本运算有三种:入栈、退栈和______。
答:读栈顶元素#读栈顶的元素#读出栈顶元素
(22) 在面向对象方法中,信息隐蔽是通过对象的______性来实现的。答:封装
(23) 数据流的类型有______和事务型。 答:变换型 注:P77
(24) 数据库系统中实现各种数据管理功能的核心软件称为______。答:数据库管理系统#DBMS 注:要牢记,重要
(25) 关系模型的数据操纵即是建立在关系上的数据操纵,一般有______、增加、删除和修改四种操作。答:查询 注:要牢记
(26) 实现算法所需的存储单元多少和算法的工作量大小分别称为算法的 ______。 答:空间复杂度和时间复杂度
(27) 数据结构包括数据的逻辑结构、数据的 ______以及对数据的操作运算。答:存储结构 注:P7
(28) 一个类可以从直接或间接的祖先中继承所有属性和方法。采用这个方法提高了软件的______。答:可重用性
(29) 面向对象的模型中,最基本的概念是对象和 ______。 答:类
(30) 软件维护活动包括以下几类:改正性维护、适应性维护、______维护和预防性维护。答:完善性 注:要牢记,书中没有提到
(31) 算法的基本特征是可行性、确定性、______和拥有足够的情报。答:有穷性
(32) 顺序存储方法是把逻辑上相邻的结点存储在物理位置______的存储单元中。答:相邻
(33) Jackson结构化程序设计方法是英国的M.Jackson提出的,它是一种面向______的设计方法。答:数据结构 注:P67
(34) 数据库设计分为以下6个设计阶段:需求分析阶段、______、逻辑设计阶段、物理设计阶段、实施阶段、运行和维护阶段。
答:概念设计阶段#数据库概念设计阶段
(35) 数据库保护分为:安全性控制 、______、并发性控制和数据的恢复。答:完整性控制 注:要牢记
(36) 测试的目的是暴露错误,评价程序的可靠性;而______的目的是发现错误的位置并改正错误。答:调试
(37) 在最坏情况下,堆排序需要比较的次数为______。
答:O(nlog2n)
(38) 若串s="Program",则其子串的数目是______。答:29
(39) 一个项目具有一个项目主管,一个项目主管可管理多个项目,则实体"项目主管"与实体"项目"的联系属于______的联系。
答:1对多#1:N
(40) 数据库管理系统常见的数据模型有层次模型、网状模型和______三种。答:关系模型
(41)数据的逻辑结构有线性结构和_______两大类。 答非线性结构
(42)数据结构分为逻辑结构与存储结构,线性链表属于_______。答:存储结构
(43)数据的基本单位是_______。答:元素
(44)长度为n的顺序存储线性表中,当在任何位置上插入一个元素概率都相等时,插入一个元素所需移动元素的平均个数为______。
答:n/2
(45)当循环队列非空且队尾指针等于队头指针时,说明循环队列已满,不能进行入队运算。这种情况称为______。 答:上溢
(46)在面向对象方法中,类之间共享属性和操作的机制称为_______。答:继承