当前位置:文档之家› C语言中级培训教程

C语言中级培训教程

C语言中级培训教程
C语言中级培训教程

C++中级培训教程

第一章类、接口

学习要求:

1、了解类的继承、封装等概念之间的关系

2、了解什么是接口,什么是虚函数,它有什么样的特点。学会使用接口编程的思想

本章节主要介绍C++中的类、接口。类,包涵了一组数据和一组基于数据上的一组方法。它描述了一个对象的属性、状态和行为;接口,它只是描述了一个对象的简单的行为。

有关类的基本概念:

Class names

Class members

Member Functions

Static Member Functions

Unions

C++ Bit Fields

Nested Class Declarations

Type Names in Class Scope

Multiple Base Classes

Virtual Functions

Abstract Classes

Controlling Access to Class Members

p rivate Members

protected Members

public Members

Access Specifiers for Base Classes,priavte,public、protected

Friends

Constructors

Destructors

Conversion Functions

the new operator and the delete operator

CopyingConstructorFunctions

Interface

Handle-Body与接口、抽象接口

在C++中封装的概念是把一个对象的外观接口同实际工作方式(实现)分离开来,但是C++的封装是不完全的,编译器必须知道一个对象的所有部分的声明,以便创建和管理它。我们可以想象一种只需声明一个对象的公共接口部分的编程语言,而将私有的实现部分隐藏起来。C + +在编译期间要尽可能多地做静态类型检查。这意味着尽早捕获错误,也意味着程序具有更高的效

率。然而这对私有的实现部分来说带来两个影响:一是即使程序员不能轻易地访问实现部分,但他可以看到它;二是造成一些不必要的重复编译。

然而C++并没有将这个原则应用到二进制层次上,这是因为C++的类既是描述了一个接口同时也描述了实现的过程,示例如下:

class CMyString

{

private:

const int m_cch;

char *m_psz;

public:

CMyString(const char *psz);

~CMyString();

int Length() const;

int Index(const char *psz) const;

}

CMyStirng对外过多的暴露了内存布局实现的细节,这些信息过度的依赖于这些成员变量的大小和顺序,从而导致了客户过度依赖于可执行代码之间的二进制耦合关系,这样的接口不利于跨语言跨平台的软件开发和移植。

Handle-Body模式

解决这个问题的技术有时叫句柄类( handle classes)或叫“Cheshire Cat”[ 1 ]。有关实现的任何东西都消失了,只剩一个单一的指针“m_pThis”。该指针指向一个结构,该结构的定义与其所有的成员函数的定义一样出现在实现文件中。这样,只要接口部分不改变,头文件就不需变动。而实现部分可以按需要任意更动,完成后只要对实现文件进行重新编译,然后再连接到项目中。

这里有这项技术的简单例子。头文件中只包含公共的接口和一个简单的没有完全指定的类指针。

class CMyStringHandle

{

private:

class CMyString;

CMyString *m_pThis;

public:

CMyStringHandle (const char *psz);

~ CMyStringHandle ();

int Length() const;

int Index(const char *psz) const;

};

CMyStringHandle:: CMyStringHandle(const char *psz) :m_pThis(new CMyString(psz));

{

}

CMyStringHandle::~ CMyStringHandle()

{

delete m_pThis;

}

int CMyStringHandle::Length()

{

return m_pThis->Length();

}

int CMyStringHandle::Index(const char *psz)

{

return m_pThis->Index(psz);

}

这是所有客户程序员都能看到的。这行

class CMyString;

是一个没有完全指定的类型说明或类声明(一个类的定义包含类的主体)。它告诉编译器,cheshire 是一个结构的名字,但没有提供有关该结构的任何东西。这对产生一个指向结构的指针来

说已经足够了。但我们在提供一个结构的主体部分之前不能创建一个对象。在这种技术里,包含具体实现的结构主体被隐藏在实现文件中。

在设计模式中,这就叫做Handle-Body 模式,Handle-Body

只含有一个实体指针,服务的数据成员永远被封闭在服务系统中。

Handle-Body 模式如下:

Handle-Body 模式(句柄类做为接口)

Handle-Body 的布局结构永远不会随着实现类数据成员的加入或者删除或者修改而导致Handle-Body 的修改,即Handle-Body 协议不依赖于C++实现类的任何细节。这就有效的对用户的编译器隐藏了这些斜街,用户在使用对这项技术时候,Handle-Body 接口成了它唯一的入口。

然而Handle-Body 模式也有自己的弱点:

classHandle m_pThis

class

接口类必须把每一个方法调用显示的传递给实现类,这在一个只有一个构造和一个析构的类来说显然不构成负担,但是如果一个庞大的类库,它有上百上千个方法时候,光是编写这些方法传递就有可能非常冗长,这也增加了出错的可能性。

对于关注于性能的应用每一个方法都得有两层的函数调用,嵌套的开销也不理想

由于句柄的存在依然存在编译连接器兼容性问题。

接口和实现分离的Handle-Body。

抽象接口

使用了“接口与实现的分离”技术的Handle-Body 解决了编译器/链接器的大部分问题,而C++面向对象编程中的抽象接口同样是运用了“接口与实现分离”的思想,而采用抽象接口对于解决这类问题是一个极其完美的解决方案。

抽象接口的语言描述:

class IMyString

{

virtual int Length() const = 0;//这表示是一个纯虚函数,具有纯虚函数的接口

virtual int Index(const char *psz) const = 0;

};

抽象接口的内存结构:

抽象接口的内存布局 抽象接口的实现代码: 接口:

class IMyString {

virtual int Length() const = 0;//这表示是

一个纯虚函数,具有纯虚

//函数

的接口

virtual int Index(const char *psz) const =

0;

class

vtpr

class::m1 class::m2

};

实现:

class CMyString:public IMyString

{

private:

const int m_cch;

char *m_psz;

public:

CMyString(const char *psz);

virtual ~CMyString();

int Length() const;

int Index(const char *psz) const;

}

从上面采用抽象接口的实例来看,抽象接口解决了Handle-Body所遗留下来的全部缺陷。

抽象接口的一个典型应用:

抽象工厂(AbstractFactroy)

抽象工厂模式

多继承与菱形缺陷、this跳转等

多重继承是C++语言独有的继承方式,其它几乎所有语言都秉承了单一继承的思想。这是因为多重继承致命的缺陷导致的:

菱形缺陷

当继承基类时,在派生类中就获得了基类所有的数据成员副本。假如类B 从A1和A2两个类多重继承而来,这样B类就包含A1、A2类的数据成员副本。

考虑如果A1、A2都从某基类派生,该基类称为Base,现在继承关系如下:

菱形继承关系

我们C++语言来描述这种继承关系:

class Base{…… };

class A1 :public Base {…… };

class A2 :public Base {…… };

class B :public A1,public A2 {…… };

那么A1、A2都具有Base的副本。这样B就包含了Base的两个副本,副本发生了重叠,不但增加了存储空间,同时也引入了二义性。这就是菱形缺陷,菱形缺陷时间是两个缺陷:

子对象重叠

向上映射的二义性。

菱形缺陷的其中一种解决办法将

在C++世界里最广泛的使用虚拟继承解决菱形缺陷的应用便是标准C++的输入/输出iostream;

标准C++的输入/输出

多重接口与方法名冲突问题(Siamese twins)

对继承而来的虚函数改写很容易,但是如果是在改写一个“在两个基类都有相同原型”的虚函数情况就不那么容易了。

提出问题:

假设汽车最大速度的接口为ICar,潜艇最大速度的接口为IBoat,有一个两栖类的交通工具它可以奔跑在马路上,也可以航行在大海中,那么它就同时拥有ICar、IBoat两种交通工具的最大速度特性,我们定义它的接口为ICarBoat;

classICar

{

virtual int GetMaxSpeed()= 0;

};

classIBoat

{

virtual int GetMaxSpeed()= 0;

};

我们先对ICarBoat的接口做一个尝试:

class CCarBoat

{

virtual int GetMaxSpeed();//既完成ICar的GetMaxSpeed()接口方法又//完成IBoat的接口方法?显然不能够

};

解决问题:

显然上面这个尝试根本就无法成功,只用一个实现方法,怎么能够求出这个ICarBoat交通工具奔跑在马路上的最高时速,同时也能够求出航行在大海上的最大航行速度呢。

上面这一问题矛盾就在一一个方法,却需要两个答案。看来ICarBoat要返回两个答案就必须有两个方法了,我们假设一个方法是求在陆地上奔跑的速度,名称为GetCarMaxSpeed();另一个方法是求在大海上航行的最大速度,名称为GetBoatMaxSpeed();那这两个方法又怎么和GetMaxSpeed()接口方法联系起来呢;

幸运的是,我们找到了解决办法,而且解决办法有很多种,下面介绍一下继承法。

class IXCar :public ICar

{

virtual int GetMaxSpeed()

{

GetCarMaxSpeed();

}

virtual int GetCarMaxSpeed() = 0; };

class IXBoat:public IBoat

{

virtual int GetMaxSpeed()

{

GetBoatMaxSpeed();

}

virtual int GetBoatMaxSpeed() = 0; };

classCCarBoat: public IXCar , public IXBoat {

virtual int GetCarMaxSpeed()

{

……

}

virtual int GetBoatMaxSpeed()

{

……

}

};

多重接口与方法名冲突问题

this跳转

this跳转是指的“对象同一性”问题。

在单一继承的世界内,无论继承关系怎么复杂,针对于同一对象,无论它的子类或者父类的this指针永远相等。即如果有下面的模型:

B从A继承的关系图

那么对于一个已经实例化B类的对象 bObject,永远有(B*)&bObject ==(A*)&bObject 成立。

但是在多继承的世界内,上面的等式就不能恒成立,对象的同一性受到了挑战。

特别的是,在多继承世界内如果图四的菱形关系存在情况下,如果对于已经实例化B类的对象bObject; (Base*)(A1*)&bObject != (Base*)(A2*)&bObject 成立,当这种事情发生的时候我们就只能特殊处理了。这种情况在COM应用中处处都会发生。

C++多态的两种多态形式和区别

C++有两种多态多态形式:

编译时刻多态,编译时刻多态依靠函数重载或者模板实现

运行时刻多态。运行时刻多态依靠需函数虚接口实现

第二章重载

学习要求:

1、了解什么是函数重载,什么是运算符重载

2、学会运用智能指针,仿函数

在C++的世界里,有两种重载:函数重载和运算符重载,函数重载就采用采用参数匹配的原则,进行重载的,它是一种编译时刻的多态。而运算符重载,使采用改写或者说重新定义C++的内嵌运算符的方法。

有关重载的基本概念:

Overloaded Functions

Overloaded Operators

Declaration Matching

Argument Matching

Argument Types Matching

Argument Counts Matching

C++ Unary Operators

Binary Operators

Smart Pointer

Function objects

函数重载

函数重载方法是在当前范围内选择一个最佳匹配的函数声明供调用该方法者使用。如果一个适合的函数被找到后,这个函数将会被调用,在这里“适合的”是指按下列顺序匹配的符合下面条件的:

一个精确匹配的函数被找到

一个参数只有细微的差别,几乎可以忽略不计的。

象类似通过子类向父类转化达到参数匹配的

通过正常转化函数进行类型转换,能够达到参数匹配到的。

通过用户自定义的转化函数(如转化运算符或者构造函数)达到参数匹配的

参数是采用省略符号

函数重载的方法基本上有:

根据函数参数数据类型的不同进行的重载;

根据参数个数的不同进行的重载;

缺省参数上的重载

我们在这里把缺省参数也称为一种函数重载,实际上它并

不是严格意义上的重载。在使用缺省参数时必须记住两条规则。

第一,只有参数列表的后部参数才可是缺省的,也就是说,我们

不可以在一个缺省参数后面又跟一个非缺省的参数。第二,一旦

我们开始使用缺省参数,那么这个参数后面的所有参数都必须是

缺省的。第三,缺省参数只能放在函数声明中。第四,缺省参数可以让声明的参数没有标识符。

返回值重载

特别注意,在C++中并没有根据返回返回值的不同进行重载的,即我们不能定义这样的函数:

void f();

int f();

在C++中这样的函数声明方法是被禁止的,但是我们有时间可能又需要这样的重载方法,我们又怎么实现呢,其实很简单,jiang函数的参数进行扩展,将这个函数返回值的数据类型,做为扩展参数的数据类型来。如下:

void f(void);

void f(int);

此时这个例子中的参数列表的数据,只在编译时刻起到分练函数的作用,在运行时刻并不起到传值作用,模板中经常都应用到了这种方法。

运算符重载

你可以重新定义C++绝大多数内嵌运算符的实现方法和功能,这些重定义的或者说重载的运算符,有可能全局作用的,也有可能作用在类基础之上的,运算符重载的实现可能以类的成员函数的形式出现,也有可能以全局性的函数的身份出现。

在C++中重载运算符的名字为operator x, 在这里 x 是一个可重载的运算符,如:重载加法运算符,你需要定义一个名为operator+ 的函数,然后实现他,其它的类似定义就可以了,例如:

Class complex //very simplified complex

{

doublere,im;

public:

complex(doubler,doublei):re(r),im(i){};

complex operator+(complex);

complex operator*(complex);

};

定义了complex 这个复数的一个简单的实现概念模型。一个复数是由一对double类型的数据组成,并定义了这个复数的两个方法,加法运算 complex::operartor+()和乘法运算complex::operator*().现在我们就能够实现下面的复数表达式了:

void f()

{

complex a = complex(1 , 3.1);

complex b = complex(1.2 , 2);

complex c = b;

a =

b + c;

b = b +

c * a;

6.以下程序的输出结果为(D)。 main( ) { char c; int i; for(i=65;i<68;i++) { c=i+32; switch(c) { case ‘a’:printf("%c,",c);break; case ‘b’:case ‘e’:printf("ok,"); default: printf("end"); } } } A a,ok,end B a,ok,endend C a,ok,end,end D a,ok,ok 9.以下程序的输出结果为(B)。 #define A 3 #define B(a) (A+1)*a main() { int x; x=3*A+B(7); printf("x=%d\n",x); } A x=93 B x=37 C x=60 D x=90 三写出下列程序的运行结果(10分,每小题2分) 1.main( ) { char c1=‘A’,c2=‘\144’,c3=‘\x44’,c=0xf5,x=13,a; int i=0122,j=0xa4; printf(“c1=%c,c4=%c\tc5=%c\n”,c1,c2,c3); printf(“%d,%d\n”,i,j); i=-34; j=20; printf(“%d,%d,%d\n”,i%j,i&j<<2,sizeof(j)); printf(“c=%d\n”,c|x); a=c^x<<2;

printf(“a=%d\n”,a); } 2.main() { int x,y=1,z=10; if(y!=0) x=5; printf(“x=%d\t”,x); x=1; if(z<0) if(y>0) x=3; else x=5; printf(“x=%d\n”,x); if(z=y<0) x=3; else if(y==0) x=5; else x=7; printf(“x=%d\t”,x); printf(“z=%d\n”,z); } 3.main( ) { char s[20]=“I like it.”,t[20]=“Are you?”,c[20]; int i=0; while(s[++i]!=‘\0’) t[i]=s[i]; t[i]=0; printf(“string s:%s\n”,s); printf(“string t:%s\n”,t); } 4.int i=5; main( ) { int i=3; { int i=10; i++; printf(“%d\n”,i);

C语言模拟试题 一、判断 1、关系运算符<= =与= =的优先级相同。(N ) 2、C语言的函数可以嵌套定义。(N ) 3、若有定义和语句:int a;char c;float f;scanf(“%d,%c,%f”,&a,&c,&f);若通过键盘输入:10,A,12.5, 则a=10,c=?A?,f=12.5.( Y ) 4、变量根据其作用域的范围可以分作局部变量和全局变量。( Y ) 5、#define和printf都不是C语句。( Y ) 6、Int I,*p=&I;是正确的C说明。( Y ) 7、结构体类型只有一种。( N ) 8、在Turbo C中,整形数据在内存中占2个字节。( N ) 9、一个include命令可以指定多个被包含的文件。( N ) 10、有如下说明:int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;则数值为9的表达式是*(p+8).( Y ) 二、选择 2、C语言中,char类型数据占(A) A、1个字节 B、2个字节 C、4个字节 D、8个字节 3、已知x=43,ch=?A?,y=o;则表达式(x>=y&&ch1;i--) for(j=1;j

单选题 1. (A) 包含1 个字符 (B) 包含2 个字符 (C) 包含3 个字符 (D) 是非法 表示 C 难度:较易 分值: 2. (A) 108 (B) 18 (C) 12 (D) 2 A 难度:较易 分值: 3. (A) 5 18 7 1 6 9 12 (B) 15 18 17 16 19 12 (C) 15 8 17 6 19 2 (D) 5 8 7 6 9 2

A难度:较易分值: 4. (A) -1 (B) 2 (C) 1 (D) 0 D难度:较易分值: 5. (A) 2 (B) 3 (C) 6 (D) 7 D难度:较易分值: 6. (A) S是一个结构体类型名 (B) p是一个结构体类型名 (C) p是指向结构体类型S的指针类型名 (D) no是结构体类型S的成员

B难度:较易分值:7. (A) (B) (C) (D) B难度:较易分值:8. (A) (B) (C) (D) B难度:较易分值:

9. (A) (B) (C) (D) D难度:较易分值: 10. (A) 0 (B) 3 (C) 4 (D) 无限 C难度:较易分值:11. (A) (B) (C)

(D) C难度:较易分值:12. (A) (B) (C) (D) B难度:较易分值:13. 对二维数组的正确定义是() (A) (B) (C) (D) C难度:较易分值:14.

(A) (B) (C) (D) C难度:较易分值: 15. (A) 11 (B) 10 (C) 9 (D) 8 B难度:较易分值: 16. 以下叙述正确的是() (A) 宏名必须用大写的英文字母表示 (B) 宏定义不仅是符号替换,也可以赋值 (C) 宏替换是在程序编译时完成的,不占用程序运行时间 (D) 引用带参数的宏时,实际参数与宏定义中的形式参数类型应一致 B难度:较易分值: 17. 以下属于C语言保留字的是() (A) fopen (B) include (C) get (D) unsigned

1 【C语言】《C语言程序设计教程(第二版)》习题答案 说明 1. 本文所指的《C语言程序设计教程(第二版)》是李凤霞主编、北京理 工大学出版社出版的,绿皮。 2 第1章程序设计基础知识 一、单项选择题(第23页) 1-4.CBBC 5-8.DACA 二、填空题(第24页) 1.判断条件 2.面向过程编程 3.结构化 4.程序 5.面向对象的程序设计语言 6.基本功能操作和控制结构 7.有穷性 8.直到型循环 9.算法10.可读性11.模块化12.对问题的分析和模块的划分 三、应用题(第24页) 2.源程序: main() {int i,j,k; /* i:公鸡数,j:母鸡数,k:小鸡数的1/3 */ printf("cock hen chick\n"); for(i=1;i<=20;i++) for(j=1;j<=33;j++) for(k=1;k<=33;k++) if (i+j+k*3==100&&i*5+j*3+k==100) printf(" %d %d %d\n",i,j,k*3);} 执行结果: cock hen chick 4 18 78 8 11 81 12 4 84 3.现计算斐波那契数列的前20项。 递推法源程序: main() {long a,b;int i; a=b=1; for(i=1;i<=10;i++) /*要计算前30项,把10改为15。*/ {printf("%8ld%8ld",a,b); a=a+b;b=b+a;}} 递归法源程序: main() {int i; for(i=0;i<=19;i++)

printf("%8d",fib(i));} fib(int i) {return(i<=1?1:fib(i-1)+fib(i-2));} 执行结果: 1 1 2 3 5 8 13 21 3 4 55 89 144 233 377 610 987 1597 2584 4181 6765 4.源程序: #include "math.h"; main() {double x,x0,deltax; x=1.5; do {x0=pow(x+1,1./3); deltax=fabs(x0-x); x=x0; }while(deltax>1e-12); printf("%.10f\n",x);} 执行结果: 1.3247179572 5.源程序略。(分子、分母均构成斐波那契数列) 结果是32.66026079864 6.源程序: main() {int a,b,c,m; printf("Please input a,b and c:"); scanf("%d %d %d",&a,&b,&c); if(a

一、选择题,(1-50)每题1分,下列各题A)、B)、C)、D)四个选项中,只有一个选项是 正确的,请将正确选项涂写在试卷最后答题纸相应位置上,答在试卷上不得分。 (1) 用8位表示,-2的补码是D A) 10000001 B) 11111111 C) 00000001 D) 11111110 (2) 在VC中,实型float占用的字节数是c A) 1 B) 2 C) 4 D) 8 (3) unsigned short的取值范围是d A) 0~ 255 B) -128 ~ 127 C) -32768 ~ +32767 D) 0 ~ 65535 (4) 十六进制数FE的十进制结果为A A) 254 B) 512 C) 1024 D) 64 (5) 源程序ex1.c编译后生成的文件名为 C A) ex1.doc B) ex1.obj C) ex1.exe D) ex1.cpp (6) C语言源程序的后缀为B A) .cpp B) .c C) .exe D) .doc (7) 工程文件名的后缀为A A) .prj B) .c C) .cpp D) .bin (8) 字符’B’的ASCII值是A A) 66 B) 0x3A C) 0x42 D) 49 (9) 将十进制数132转为二进制数的结果是D A) 11001100 B) 110011011 C) 10101010 D) 10000100 (10) 终止死循环用组合键B A) Alt+F10 B) Ctrl+C或Ctrl+Break C) Ctrl+F1 D) Ctrl+Shit或Ctrl+ESC (11) 在VC中,编译的快捷键是B A) F7 B) Ctrl+F7 C) Ctrl+F5 D) F5 (12) 以下选项中可作为C语言合法整数的是D A) 10110B B) 0386 C) 0Xffa D) x2a2 (13) 以下不能定义为用户标识符的是D A) scanf B) Void C) _3com_ D) int (14) 以下程序 swap(int x, int y) {int temp; temp=x; x=y; y=temp; } main() {int a=10,b=20; swap(a,b); printf("a=%d,b=%d\n",a,b); } 的运行结果是B A)a=20,b=10 B)a=10,b=20 C)10,20 D)20,10 (15) 以下程序: main() {int a=0x55, b=0xaa; printf("%d\n", a^b); } 的运行结果是:C A) 0 B) 1 C) 255 D) 0xaa (16) 有以下程序 main() {int a=1,b=2,m=0,n=0,k; k=(n=b>a)||(m=a

精选考试类文档,如果您需要使用本文档,请点击下载! 祝同学们考得一个好成绩,心想事成,万事如意! 大学C语言考试试题及答案 姓名成绩 温馨提示:同学们,经过培训学习,你一定积累了很多知识,现在请认真、仔细地完成这张试题吧。加油! 一单项选择题 1. 在C语言中,以 D 作为字符串结束标志 A)’\n’ B)’ ’ C) ’0’ D)’\0’ 2.下列数据中属于“字符串常量”的是( A )。 A.“a” B.{ABC} C.‘abc\0’ D.‘a’ 若干个字符构成字符串 在C语言中,用单引号标识字符;用双引号标识字符串

选项B,C,分别用{}和’’标识字符串 选项D,标识字符。 3、以下说法中正确的是( C )。 A、C语言程序总是从第一个定义的函数开始执行 B、在C语言程序中,要调用的函数必须在main( )函数中定义 C、C语言程序总是从main( )函数开始执行 D、C语言程序中的main( )函数必须放在程序的开始部分 4.下列关于C语言的说法错误的是( B )。 A) C程序的工作过程是编辑、编译、连接、运行 B) C语言不区分大小写。 C) C程序的三种基本结构是顺序、选择、循环 D) C程序从main函数开始执行 5.下列正确的标识符是(C )。 A.-a1 B.a[i] C.a2_i D.int t 6.下列C语言用户标识符中合法的是( B )。 A)3ax B)x C)case D)-e2 E)union 7.下列四组选项中,正确的C语言标识符是( C )。 A) %x B) a+b C) a123 D) 123 8、下列四组字符串中都可以用作C语言程序中的标识符的是( A )。 A、print _3d db8 aBc B、I\am one_half start$it 3pai C、str_1 Cpp pow while D、Pxq My->book line# His.age 9.C语言中的简单数据类型包括(D )。 A、整型、实型、逻辑型 B、整型、实型、逻辑型、字符型 C、整型、字符型、逻辑型 D、整型、实型、字符型 10.在C语言程序中,表达式5%2的结果是 C 。 A)2.5 B)2 C)1 D)3 11.如果int a=3,b=4;则条件表达式"a

课程代码:A100002座位号: 《计算机技术基础(C语言)》试卷A 姓名: 学号: 专业: 学院: 班级: 20 年月日 第一部分 选择题(共 30 分) 一、单项选择题(本大题共 15 小题,每题只有一个正确答案,答对一题得 2 分,共 30 分) 1、以下关于C语言标识符的描述中,正确的是【】。 A)标识符可以由汉字组成B)标识符只能以字母开头 C)关键字可以作为用户标识符D)Area与area是不同的标识符 2、使下列程序段输出“123,456,78”,键盘输入数据,正确的输入是【】。 int i,j,k; scanf(“%d,%3d%d”,&i,&j,&k); printf(“%d,%d,%d\n”,i,j,k); A)12345678 B)123,456,78 C)123,45678 D)123,*45678 3、判断char类型的变量c1是否为数字字符的正确表达式为【】。 A) (c1>=0)&&(c1<=9) B) (c1>=’0’)&&(c1<=’9’) C) ’0’<=c1<=’9’ D) (c1>=’0’)||(c1<=’9’) 4、若有语句int a=1,b=2,c=3;则以下值为0的表达式是【】。 A)’a’&&’b’ B)a<=b C)((a>b)||(b

A. *(a[0]+2) B. a[1][3] C . a[1][0] D. *(*(a+1)+2) 6、在循环语句的循环体中执行break语句,其作用是【】。A)跳出该循环体,提前结束循环 B)继续执行break语句之后的循环体各语句 C)结束本次循环,进行下次循环 D)终止程序运行 7、执行语句for(i=10;i>0;i--);后,变量i的值为【】。A)10 B)9 C)0 D)1 8、若有int *p1, *p2,k; 不正确的语句是【】 A. p1=&k B. p2=p1 C. *p1=k+12 D. k=p1+p2 9、在函数中未指定存储类别的局部变量,其隐含的存储类别是【】 A. 静态(static) B. 外部(extern) C. 自动(auto)D. 寄存器(register) 10、如下程序的输出结果是【】 main( ) { int x=2,a=0,b=0; switch(x) { case 2: a++; b++; case 1: ++a; b--; break; case 0: b++;} printf("a=%d, b=%d\n", a, b);} A. a=2, b=0 B. a=2, b=1 C. a=1, b=1 D. a=1, b=0 11、表示关系a main() {int x; scanf(“%d”,&x); if(x<=3) ; else if(x !=10)printf(“%d\n”,x); } 程序运行时,输入的值在哪个范围才会有输出结果。【】

单选题 1. C 语言中,若缺省定义函数返回值类型,则该函数默认返回值类型是( )。 (A) void (B) long (C) int (D) double C 难度:较易 分值:1.0 2. 下面叙述错误的是( )。 (A) C 源程序可由一个或多个函数组成 (B) (C) (D) 注释说明部分只能位于C 源程序的最前面 D 难度:较易 分值:1.0 3. 下面叙述错误的是( )。 (A ) (B ) (C ) 预处理命令行必须以分号结束 (D ) C 源程序中加入一些预处理命令是为了改进程序设计环境,提高编程效率 D 难度:较易 分值:1.0 4. ( )语句符合C 语言语法。 (A) (B)

(C) (D) B难度:较易分值:1.0 5. C语言中,数组名作为函数调用的实参时,下面叙述正确的是()。 传递给形参的是数组元素的个数 (A) 传递给形参的是数组第一个元素的值 (B) 传递给形参的是数组中全部元素的值 (C) 形参数组中各元素值的改变会使实参数组相应元素的值同时发生变化 (D) D难度:较易分值:1.0 6. (A) (B) (C) (D) A难度:较易分值:1.0 7. 下面关于字符数组的叙述中,错误的是()。 (A) (B) (C) (D) A难度:较易分值:1.0 8. 下面叙述正确的是()

(A) 每行最多只能写两条语句 (B) 程序中必需含有自定义函数 (C) (D) D 难度:较易 分值:1.0 9. 以下叙述中正确的是( )。 (A) (B) (C) (D) A 难度:较易 分值:1.0 10. ( )是关于C 语言数据类型的正确叙述。 (A) 变量必须先定 义后使 用 (B) 不允许使 用空 类型 (C) 枚举类型不是 基本类 型 (D) 数组并不是构造类型 A 难度:较易 分值:1.0 11. ( )为正确的用户标识符。 (A) (B) (C) (D) D 难度:较易 分值:2.0

2004级信息学院《C语言设计》考试试题 一、判断下列语句或程序的对错。 10分√ 1 int x=y=z=’0’; (×) y,z没有定义 2 #include ; (×)不能有分号,#开头的结尾均不能有分号; 3 printf(“%s\n”,”c language”); (√) 4 float a[100]; int *p=a; (×)数据类型不匹配 5 char str[20]; 6 int data[4]={0,1,2,3,4}; (×)五个元素,但是只有四个单元 7 float x=1.45e+310L; (×)数值越界 8 int xyz-1=2; (×) 9 int x=‘\xae’ ; (√) 10 int *p,a[2][3] ; p=a ; (×)数据类型不匹配 二计算下列表达式的值 10分 设 unsigned int a=10,b=17,c=5,d=3; float f ; (1)f=b/c ( 3.0 ) (2)!(a+b)+c-1&&b+c/2 ( 1 ) (3)(a^b)+(c>>1+d) ( 0x1b ) (4)a+=b%=a=b ( 17 ) (5)a=2,b=a*++b ( 2 ) 三程序改错 10分 (1)求两个浮点数的平方和及平方差 #include float calculate (float x,float y,float *sub);添加函数原型声明 main () { float a,b; float add_reasult, sub_result; scanf (“%f,%f”,a,b); add_result=calculate(a,b,&sub_result); printf( “a*a+b*b=%d,a*a-b*b=%d\n”,add_result,sub_result); } float calculate (float x,float y,float *sub) 添加函数类型 { float *temp; 应该直接定义为变量float temp; sub=a*a-b*b ; *sub=a*a-b*b;

================================================== 题号:1482 执行以下程序段后,输出结果和a的值是()。int a=10; printf("%d",a++); A、11 和10 B、11 和11 C、10 和11 D、10 和10 答案: C 题号:2100 已知字符'A'的ASCⅡ代码值是65,字符变量c1的值是'A',c2的值是'D'.执行语句printf("%d,%d",c1,c2-2);后,输出结果是 A、65,66 B、A,B C、65,68 D、A,68 答案: A 题号:5055 相同结构体类型的变量之间,可以()。 A、比较大小 B、地址相同 C、赋值 D、相加 答案: C 题号:3217 int a[10];合法的数组元素的最小下标值为()。 A、1 B、0 C、10 D、9 答案: B

能正确表示逻辑关系:" a≥10或a≤0 "的C语言表达式是 A、a>=0 | a<=10 B、a>=10 or a<=0 C、a>=10 && a<=0 D、a>=10 || a<=0 答案: D 题号:157 main() {int x=1,a=0,b=0; switch (x) { case 0: b++; case 1: a++; case 2: a++;b++;} printf("a=%d,b=%d",a,b); }该程序的输出结果是( ) A、2,2 B、2,1 C、1,1 D、1,0 答案: B 题号:4784 设变量a是整型,f是实型,i是双精度型,则表达式10+'a'+i*f值的 数据类型为()。 A、不确定 B、double C、int D、float 答案: B 题号:1647 以下程序中,while循环的循环次数是______ main() { int i=0;

单选题 1. C语言中,若缺省定义函数返回值类型,则该函数默认返回值类型是()。 (A) void (B) long (C) int (D) double C难度:较易分值:1.0 2. 下面叙述错误的是()。 (A) C源程序可由一个或多个函数组成 (B) (C) (D) 注释说明部分只能位于C源程序的最前面 D难度:较易分值:1.0 下面叙述错误的是()。 3 . (A ) (B ) (C 预处理命令行必须以分号结束 ) (D C源程序中加入一些预处理命令是为了改进程序设计环境,提高编程效率) D难度:较易分值:1.0 4. ()语句符合C语言语法。 (A) (B)

(C) (D) B难度:较易分值:1.0 5. C语言中,数组名作为函数调用的实参时,下面叙述正确的是()。 (A) 传递给形参的是数组元素的个数 (B) 传递给形参的是数组第一个元素的值 (C) 传递给形参的是数组中全部元素的值 (D) 形参数组中各元素值的改变会使实参数组相应元素的值同时发生变化 D难度:较易分值:1.0 6. (A) (B) (C) (D) A难度:较易分值:1.0 7. 下面关于字符数组的叙述中,错误的是()。 (A) (B) (C) (D) A难度:较易分值:1.0 8. 下面叙述正确的是()

(A) 每行最多只能写两条语句 (B) 程序中必需含有自定义函数 (C) (D) D 难度:较易 分值:1.0 9. 以下叙述中正确的是( )。 (A) (B) (C) (D) A 难度:较易 分值:1.0 10. ( )是关于C 语言数据类型的正确叙述。 (A) 变量必须先定 义后使 用 (B) 不允许 使用空类型 (C) 枚举类型不是基本类 型 (D) 数组并不是构造类型 A 难度:较易 分值:1.0 11. ( )为正确的用户标识符。 (A) (B) (C) (D) D 难度:较易 分值:2.0

C语言程序设计教程杨路明课后习题答案北京邮电大学出 版社 第一章 1、算法描述主要是用两种基本方法:第一是自然语言描述,第二是使用专用工具进行算法描述 2、c语言程序的结构如下: ①c语言程序由函数组成,每个程序必须具有一个main函数作为程序的主控函数。 ②"/*"与"*/"之间的内容构成c语言程序的注释部分。 ③用预处理命令#include可以包含有关文件的信息。 ④大小写字母在c语言中是有区别的。 ⑤除main函数和标准库函数以外,用户可以自己编写函数,程序一般由多个函数组成,这些函数制定实际所需要做的工作。 例如: void main() inta,b,c,s; a=8;b=12;c=6; s=a b*c; printf("s=%d",s); 3、c语言的特点: ①c语言具有结构语言的特点,程序之间很容易实现段的共享; ②c语言的主要结构成分为函数,函数可以在程序中被定义完成独立的任务,独立地编译成代码,以实现程序的模块化。 ③c语言运算符丰富,运算包含的范围很广; ④c语言数据类型丰富。 ⑤c语言允许直接访问物理地址,即可直接对硬件进行操作,实现汇编语言的大部分功能; ⑥c语言语法限制不太严格,程序设计自由度大,这样是c语言能够减少对程序员的束缚; ⑦用c语言编程,生成的目标代码质量高,程序执行效率高,可移植性好; 4、合法标识符:AB12、leed_3、EF3_3、_762、PAS、XYZ43K2 不合法标识符:a*b2、8stu、D.K.Jon、if、ave#xy、#_DT5、C.D

5、F2:将当前编辑器中文件存盘 F10:调用主菜单 F4:程序运行到光标所在行 Ctrl F9:当前编辑环境下,进行编译、连接且运行程序; Alt F5:将窗口切换到DOS下,查看程序运行结果 6、(1): ******************** welcome you very good ******************** (2): please input three number;5,7,8 max number is:8 7、main 8、User screen、Alt F5 9、标识符必须是字母或下划线开头,大小写字母含义不同。由数字、字母和下划线组成;关键字是一种语言中规定具有特定含义的标识符。关键字不能作为变量或函数名来使用,用户只能根据系统的规定使用它们。 10、选择主菜单File项下拉子菜单中Save项或直接按F2键存盘。 第二章 1、符合C语法规定的常数为:0x1e、"ab"、1.e5 2、(1): 错误如下:intx,y=5,z=5,aver; x=7; aver = (x y x)/3; 结果如下:AVER=5 (2): 错误如下:char c1='a',c2='b',c3='c'; printf("a=?=__end",a,b); 结果如下:a=3b='A'"end"

模拟试卷A 一、单选题 1、C语言中运算对象一定不能是double类型的运算符是___ 。 A、%= B、/ C、= D、<= 2、能正确表达数学逻辑关系"0b) c=0; else c=1; 等价于___。 A、c=(a>b)?1:0; B、c=a>b; C、c=a<=b; D、以上均不是 7、有如下定义语句:int a, b=5, *p=&a; 则能完成a=b赋值功能的语句是___。 A、a=*p; B、*p=*&b; C、a=&b; D、*p =&*p; 8、设int *ptr, x, array[5]={5,4,3,2,1}; ptr=array; 能使x的值为3的语句是___。 A、x=array[3]; B、x=*(array+3); C、x=*(ptr+2); D、array+=2; x=*array; 9、有函数原型为void f(int,int *);主函数中有变量定义:int a,*p=&a,b[10]; 则下列几种调用错误的是___。

《C语言程序设计》期中考试试卷 课程编号:03402513试卷类型:A卷考试形式:笔试考试日期: 注意事项:1.请将试卷最后一页的答题纸撕下,将答案填写在其中;2.交卷时请确认答题纸是否按要求写好姓名等信息并与试题一起上交;3.不准携带任何书籍、资料、纸张等。4.草稿纸用试卷的背面。 一、单项选择题(1空1分,共20分) 1、C语言程序的基本结构是(【1】) 。 【1】 A) 函数 B) 语句 C) 字符 D) 程序行 2、一个C程序的执行是(【2】) 。 【2】A) 从本程序的主函数开始,到本程序的主函数结束 B)从本程序的第一个函数开始,到本程序的最后一个函数结束 C) 从本程序的主函数开始,到本程序的最后一个函数结束 D)从本程序的第一个函数开始,到本程序的主函数结束 3、下列四个叙述中,错误的是(【3】) 。 【3】 A) 一个C源程序必须有且只能有一个主函数 B) 一个C源程序可以含一个或多个子函数 C) 在C源程序中注释说明必须位于语句之后 D) C源程序的基本结构是函数 4、下面不属于C语言保留字的是(【4】) 。 【4】 A) short B) ELSE C) extern D) for 5、下列四个叙述中,正确的是(【5】) 。 【5】 A) 库函数也是C语言本身的组成部分 B) C语言中的输入输出操作是由相应语句完成的 C) 库函数是C编译系统提供的功能函数 D) 标题文件(头文件)可以在程序的函数内部调用 6、下列四组数据类型中,C语言允许的一组是(【6】)。 【6】 A) 整型、实型、逻辑型 B) 整型、实型、字符型 C) 整型、双精度型、布尔型 D) 整型、实型、复型 7、在C语言中不同数据类型的的长度是(【7】)。 【7】 A) 固定的 B) 由用户自己定义的 C) 任意的 D) 与机器字长有关

第四章: 第一题:从键盘输入100个整数,从中找出最大数和最小数代码如下: # include void main() { int i,a,b,c,min,max; scanf("%d%d",&a,&b); min=a>b?b:a; max=a>b?a:b; for(i=1;i<=98;i++) { scanf("%d",&c); minc?max:max=c; } printf("min=%d,max=%d\n",min,max); } 第三题:编程计算1!+2!+3!+ (20) 代码如下: # include void main() { int i=0; double a,b; a=1,b=0; do { i++; a=a*i; b=b+a; }while(i<20); printf("%f\n",b); } 第四题:编程打印出100以内所有素数。 代码如下: #include void main() { int i,n,a; for(n=2;n<=100;n++) { i=2; do

a=n%i; i++; if(a==0) break; }while(i void main() { int a,b,r,t; scanf("%d%d",&a,&b); a<=b?t=a,a=b,b=t:a=a,b=b; r=a%b; if(r==0) printf("最大公约数=%d",b); else { do { a=b; b=r; r=a%b; }while(r!=0); printf("最大公约数=%d",b); } } 第五章: 第一题:编程计算矩阵a[5][5]主对角线元素之和,此对角线元素之和和周边元素之和。 代码如下: #include void main() { int a[5][5],i,j,s1,s2,s3; for(i=0;i<5;i++) { for(j=0;j<5;j++)

课程代码:A100002 座位号: 《计算机技术基础(C 语言)》试卷A 姓名: 学号: 专业: 学院: 班级: 20 年 月 日 第 一、 单项选择题(本大题共 15 小题,每题只有一个正确答案,答对 一题得 2 分,共 30 分) 1、以下关于C 语言标识符的描述中,正确的是 【 】。 A )标识符可以由汉字组成 B )标识符只能以字母开头 C )关键字可以作为用户标识符 D )Area 与area 是不同的标识符 2、使下列程序段输出“123,456,78”,键盘输入数据,正确的输入是【 】。 int i,j,k; scanf(“%d,%3d%d”,&i,&j,&k ); printf(“%d,%d,%d \n”,i,j,k); 3、判断char 类型的变量c1是否为数字字符的正确表达式为 【 】。 A) (c1>=0)&&(c1<=9) B) (c1>=’0’)&&(c1<=’9’) C) ’0’<=c1<=’9’ D) (c1>=’0’)||(c1<=’9’) 4、若有语句int a=1,b=2,c=3;则以下值为0的表达式是 【 】。 A )’a’&&’b’ B )a<=b C )((a>b)||(b0;i--);后,变量i 的值为 【 】。 A )10 B )9 C )0 D )1 8、若有int *p1, *p2,k; 不正确的语句是 【 】

一、单项选择题(每小题2分,共50分) 1、一个C程序的执行是从___A__。 A、本程序的main函数开始,到main函数结束 B、本程序的main函数开始,到本程序文件的最后一个函数结束 C、本程序文件的第一个函数开始,到本程序文件的最后一个函数结束 D、本程序文件的第一个函数开始,到本程序main函数结束 2、C语言程序的基本单位是___C___。 A、程序行 B、语句 C、函数 D、字符 3、请选出可用作C语言用户标识符的一组标识符___B___。 A、void B、a3_b3 C、For D、2a define_123-abcDO WORDIFasesizeof 4、假定x和y为double型,则表达式(x=2,y=x+5/2)的值是__C__。 A、、4 C、、 5、下列可以正确表示字符型常量的是___D__。 A、297 B、"a" C、"\n" D、'\t' 6、在C语言中,要求运算数必须是整型的运算符是__D__。 A、/ B、++ C、*= D、% 7、C语言中,复合语句的构成是将一系列语句置于__C__。 A、begin与end之间 B、方框号“[]”之间 C、花括号“{}”之间 D、圆括号“()”之间 8、有如下程序段,对应正确的数据输入是___A___。 floatx,y; scanf(”%f%f”,&x,&y); printf(”a=%f,b=%f”,x,y); A、<回车> B、,<回车> <回车> C、A=,B=<回车> D、回车> 9、以下程序段的输出结果是___D__。 inta=5678; printf(”%2d\n”,a); A、提示出错、无结果 B、56 C、78 D、5678 10、已知:charch='A';则下列表达式的值是__B__。 ch=(ch>='A'&&ch<='Z')?(ch+32):ch; A、A B、a C、Z D、z

安徽大学 C语言程序设计期末试题 一. 单项选择题:(每题2分,共20分) 1.执行程序: int a; printf("%d \n", (a=3*5, a*4, a+5) );后,a的值是______。 A)60 B)20 C)15 D)10 2.程序段:int x=023; printf("%d \n", --x );的输出是______。 A)19 B)18 C)23 D)22 3.程序段:static char s[10]={'C','h','i','n','a'}; printf("%d\n",strlen(s));的输出是______。 A)6 B)5 C)11 D)10 4.若fun( int x) { printf(“%d\n”,x);}, 则fun_______。 A)返回值为void 类型B)返回值类型无法确定 C)返回值为int 类型D)没有返回值 5. 有宏定义:#define MULT1(a,b) a*b #define MULT2(a,b) (a)*(b) 且引用宏:y=MULT1(3+2,5+8); z=MULT2(3+2,5+8); 则y和z的值是______。 A)y=65,z=65 B)y=21,z=65 C)y=65,z=21 D)y=21,z=21 6.程序段char s[]="Hello", *p; p=s;执行后,*(p+5)的值是______。 A)'o' B)'\0' C)'o'的地址D)不确定的值 7. 程序段:char *s=”ABCD”, *p; for( p=s; *p ; p++) printf("%s\n", p);的输出是______。 A)ABCD B)A C)D D)ABCD BCD B C ABC CD C B AB D D A A 8. 若定义:int (*p)[3]; 则标识符p______。 A)定义不合法。 B)是一个指针数组名,每个元素是一个指向整型变量的指针。 C)是一个指针,它指向一个具有三个元素的一维数组。 D)是一个指向整型变量的指针。 9. 定义: struct sk {int a; float b;} data,*p; 且p=&data; 则正确引用成员a的方式是______。 A) p.data.a B) (*p).a C) p->data.a D) (*p).data.a 10. 以二进制只读方式打开一个已有的文本文件file1,正确调用fopen函数的方式是______。 A)FILE *fp; B)FILE *fp; fp=fopen("file1","rb"); fp=fopen("file1","r+"); C)FILE *fp; D)FILE *fp; fp=fopen("file1","r"); fp=fopen("file1","rb+");

相关主题
文本预览
相关文档 最新文档