文档库 最新最全的文档下载
当前位置:文档库 › 算法与数据结构C语言习题参考答案6-9章

算法与数据结构C语言习题参考答案6-9章

算法与数据结构C语言习题参考答案6-9章
算法与数据结构C语言习题参考答案6-9章

1. 现在有一个已排序的字典,请改写二分法检索算法,使之当排序码key在字典中重

复出现时算法能找出第一个key出现的元素下标(用*position来保存)。保持算法时间代价为O(log n)。

【答】

思路

一般的二分法检索算法只要找出关键码key在字典中的一个下标。在比较的过程中,一旦发现相等,记录下当前下标mid就符合要求。程序如下:

数据结构

字典采用6.1.4节中的顺序表示法。

typedef int KeyType;

typedef int DataType;

二分法检索算法

int binarySearch(SeqDictionary * pdic, KeyType key, int * position) {

int low, mid, high;

low = 0;

high = pdic->n - 1;

while (low <= high){

mid = (low + high) / 2;

if (pdic->element[mid].key = = key) {

*position = mid;

return TRUE;

}

else

if (pdic->element[mid].key > key)

high = mid - 1;

else

low = mid + 1;

}

*position = low;

return FALSE;

}

改写后的算法想要找出关键码key在字典中第一次出现的下标。在比较中,如果遇到相等(key与pdic->element[mid].key相等),则需要分情形讨论。

(1)如果当前下标mid等于0,或者key与pdic->element[mid-1].key不等,那么mid 一定是key第一次出现的下标,返回mid即可。

(2)如果情形(1)不成立,那么mid一定大于等于key第一次出现的下标,需要在low 和mid-1之间继续进行搜索,找出key第一次出现的下标。

下面算法中,加粗的部分是对原算法的修改。

修改后的二分法检索算法

int binarySearch1(SeqDictionary * pdic, KeyType key, int * position) {

/*算法结束后,*position存放key第一次出现的下标*/

int low, mid, high;

low = 0;

high = pdic->n - 1;

while (low <= high){

mid = (low + high) / 2;

if (pdic->element[mid].key = = key) {

if (mid = = 0 || key != pdic->element[mid - 1].key) {

*position = mid;

return TRUE;

} /*此时mid就是key在字典中第一次出现的下标*/

else

high = mid - 1; /*在左半段继续搜索*/

}

else

if (pdic->element[mid].key > key)

high = mid - 1;

else

low = mid + 1;

}

*position = low;

return FALSE;

}

代价分析

该算法的时间复杂度为O(log n)。

2. 试编写一算法求出指定结点在给定的二叉排序树中所在的层数。

【答】

数据结构

采用7.1.3节中字典的二叉排序树表示。

算法

int search_layer(PBinTree pbtree, PBinTreeNode pnode) {

/*返回二叉排序树*pbtree中结点*pnode所在层数,要求所给结点在树中*/ int layer = 0;

PBinTreeNode p = *pbtree;

while (p != NULL) {

if (p->key = = pnode->key)

return layer; /*查找结点成功,返回层数*/ if (p->key > pnode->key) {

p = p->llink; /*进入左子树继续查找*/

layer++;

}

else {

p = p->rlink; /*进入右子树继续查找*/

layer++;

}

}

return -1; /*查找结点失败*/

}

代价分析

假设二叉排序树有n个结点,高度是h(

log n<=h<=n),算法执行的时间代价最坏为O(h)。

2

注意根结点为零层。

3. 试编写一算法在给定的二叉排序树上找出任意两个不同结点最近的公共祖先(若在

两结点A,B中,A是B的祖先,则认为A,B最近的公共祖先就是A)。

数据结构

同上题

算法

int FindLowestCommonAncestor(pBinSearchNode root, int value1, int value2) {

pBinSearchNode curnode = root;

while(1) {

if (curnode->key>value1&&curnode->key>value2)

curnode = curnode->llink;

else if(curnode->keykey

curnode = curnode->rlink;

else return curnode->key;

}

}

4. 设计一个有效的算法,在1000个无序的元素中,挑选出其中前5个最大的元素。

【答】

数据结构

typedef int KeyType;

typedef int DataType;

typedef struct

{ KeyType key; /* 排序码字段*/

DataType info; /* 记录的其它字段*/

}RecordNode;

typedef struct

{ int n; /* n为文件中的记录个数*/

RecordNode *record;

}SortObject;

思路

这里不需要整体排序,故选择一种能较快得出最终排序段的前一部分的算法改造即可,如直接选择排序,起泡排序,堆排序都能最先得出前5个最大元素。综合考虑算法的时间代价,选择直接选择排序算法改造即可。

算法

函数返回一个数组,数组中存着挑出的元素,为动态分配的。

RecordNode* Outmax(SortObject *pvector, int out)

{

int i, j, k;

RecordNode *outpart;

RecordNode temp;

if(out>pvector->n)

{

printf("the given value is wrong!");

return NULL;

}

outpart=(RecordNode*)malloc(out*sizeof(RecordNode));

if(outpart==NULL)

{

printf("No space!\n");

return NULL;

}

for(i=0;i

{

k=i;

for( j=i+1;jn;j++)

if(pvector->record[j].key>pvector->record[k].key) k=j;

if(k!=i)

{

temp=pvector->record[i];

pvector->record[i]=pvector->record[k];

pvector->record[k]=temp;

}

outpart[i]=pvector->record[i];

}

return outpart;

}

代价分析

O(n*m) (设从n个元素中选出m个最大元素)。

5. 写一个算法来判断对给定有向图中的指定顶点是否至少存在一条有向边指向它。

【答】图有三种表示方法:出边表(邻接表的一种),入边表(邻接表的一种)和邻接矩阵。相应的有三种算法。设n为顶点数,m为边数。

对于出边表,顺次搜索一遍边即可,时间代价为O(m)。

对于入边表,判断指定顶点的边表头指针是否非空即可,时间代价为O(1)。

对于邻接矩阵,搜索矩阵中指定顶点对应的列,判断其中是否有非0元即可,时间代价为O(n)。

以出边表为例,给出一个算法如下。

数据结构

采用9.1.3节中有向图的邻接表(出边表)表示法。

算法

int is_end(GraphList g, int k) {/*判断图g中是否有边指向第k个结点(0<=k<=g.n-1)*/

EdgeList p;

int i;

for ( i = 0;i < g.n;i++) {

p = g.vexs[i].edgelist;

while (p != NULL) {

if (p->endvex = = i) return 1;

p = p->nextedge;

}

}

return 0;

}

代价分析

该算法的时间复杂度为O(m)。

6.设计一个算法,确定(无权)图中每一对结点之间的可达关系。

【答】

数据结构

采用图的邻接矩阵表示法。

#define MAXVEX 100

typedef char * V exType;

typedef int AdjType;

typedef struct

{

V exType vexs[MAXVEX]; /*顶点信息*/

AdjType arcs[MAXVEX][MAXVEX]; /*边信息*/

int n; /*图的顶点个数*/

}GraphMatrix;

思路

这里介绍Warshall算法,该算法解决了(无权)图的可达性问题。

算法用到了一个矩阵a(a作为算法的参数之一)。开始时,对矩阵a中元素赋值,使a 与图的邻接矩阵相等。这样,矩阵a记录的就是所有直接的边连接。算法的核心部分是一个三重循环。其中外重循环的循环次数为n,每次循环更新a中的元素。循环一次后,a中记录的就是所有直接连接或者只经由结点0而形成的通路的情况。循环k(1≤k≤n)次后,a 中记录的就是所有至多只经由结点0, 1, …, k 1而形成的通路的情况。这样,算法结束时,矩阵a中记录的就是每一对结点之间的可达性信息。a[i][j]为1,表示从结点i到结点j是可达的;为0,则表示不可达。

算法

void warshall(GraphMatrix * pgraph, int a[][MAXVEX]) {

int i, j, m;

for (i = 0; i < pgraph->n; i++) /*对矩阵a中元素赋值,使a与图的邻接矩阵相等*/

for ( j = 0; j < pgraph->n; j++)

a[i][j] = pgraph->arcs[i][j];

for ( m = 0; m < pgraph->n; m++) /*算法的核心部分,一个三重循环*/

for ( i = 0; i < pgraph->n; i++)

for (j = 0; j < pgraph->n; j++)

a[i][j] = a[i][j] || (a[i][m] && a[m][j]);

}

代价分析

算法的核心部分是一个三重循环,每重的循环次数为n,因此该算法的时间代价为O(n3)。

调试结果

该示例程序计算下图的可达性:

运行结果如下:

0 1 0 1 1 1

0 0 0 1 1 1

0 1 0 1 1 1

0 0 0 0 0 0

0 0 0 1 0 1

0 0 0 0 0 0

C语言程序设计第四版第六章答案-谭浩强

1、用筛选法求100之内的素数。解: #include #include int main() {int i,j,n,a[101]; for (i=1;i<=100;i++) a[i]=i; a[1]=0; for (i=2;i int main() {int i,j,min,temp,a[11]; printf("enter data:\n"); for (i=1;i<=10;i++)

{printf("a[%d]=",i); scanf("%d",&a[i]); } printf("\n"); printf("The orginal numbers:\n"); for (i=1;i<=10;i++) printf("%5d",a[i]); printf("\n"); for (i=1;i<=9;i++) {min=i; for (j=i+1;j<=10;j++) if (a[min]>a[j]) min=j; temp=a[i]; a[i]=a[min]; a[min]=temp; } printf("\nThe sorted numbers:\n"); for (i=1;i<=10;i++) printf("%5d",a[i]); printf("\n"); return 0; } 3、求一个3×3的整型矩阵对角线元素之和。解: #include int main() { int a[3][3],sum=0; int i,j; printf("enter data:\n"); for (i=0;i<3;i++) for (j=0;j<3;j++) scanf("%3d",&a[i][j]); for (i=0;i<3;i++) sum=sum+a[i][i]; printf("sum=%6d\n",sum);

C语言第六章习题带答案

练习6-1答案 一、选择题 1.已知函数abc的定义为: void abc() {……} 则函数定义中void的含义是( A )。 A.执行函数abc后,函数没有返回值B.执行函数abc后,函数不再返回C.执行函数abc后,可以返回任意类型 D.以上三个答案全是错误的 2.已知:int p();,p是( C )。 A.int型变量 B.函数p的调用 C.一个函数声明,该函数的返回值是int型的值 D.强制类型转换表达式中的变量 3.以下正确的函数形式是( D )。 A.double fun(int x, int y) B.fun(int x, y) { z=x+y; return z; } { int z; return z; } C.fun(x, y) D.double fun(int x, int y) { int x, y; double z; z=x+y; return z; } { double z; z=x+y; return z; } 4.以下说法正确的是( C )。 A.定义函数时,形参的类型说明可以放在函数体内 B.return后边的值不能为表达式 C.如果函数值的类型与返回值表达式的类型不一致,以函数值类型为准 D.如果形参与实参的类型不一致,以实参类型为准 5.C语言允许函数值类型缺省定义,此时该函数值隐含的类型是( B )。 A.float 型B.int型C.long型D.double型6.下面函数调用语句含有实参的个数为( B )。 func((exp1, exp2), (exp3, exp4, exp5)); A.1 B.2 C.4 D.5 7.以下程序的功能是计算函数F(x, y, z)=(x+y)/(x-y)+(z+y)/(z-y)的值,请选择填空。 #include #include float f(float, float); main() {float x, y, z, sum; scanf("%f%f%f", &x, &y, &z); sum=f( ①B )+f( ②C ); (注:或者选择sum=f( ①C )+f( ②B )) printf("sum=%f\n", sum); } float f(float a, float b) {float value; value=a/b;

C语言第六章数组习题

C语言第六章数组习题 第六章数组 6.1 选择题 [题]在C语言中,引用数组元素时,其数组下标的数据类型允许是_____. A)整型常量B)整型表达式 C)整型常量或整型表达式D)任何类型的表达式 [题]以下对一维整型数组a的正确说明是_____。 A)int a(10);B)int n=10,a[n]; C)int n;D)#define SIZE 10 scanf(\%d,&n);int a[SIZE]; int a[n]; [题]若有说明:int a[l0];则对a数组元素的正确引用是_____。 A) a[10] B)a[3.5] C)a(5) D)a[10-10] [题]在C 语言中,一维数组的定义方式为:类型说明符数组名_____。 A)[常量表达式] B)[整型表达式] C)[整型常量]或[整型表达式] D)[整型常量] [题]以下能对一维数组a进行正确初始化的语句是_____。 A)int a[l0]=(0,0,0,0,0); B)int a[l0]={}; C)int a={0};D)int a[10]={10*1}; [题]以下对二维数组a的正确说明是_____。

1 A)int a[3]; B)float a(3,4); C)double a[1][4]; D)float a(3)(4); [题]若有说明:int a[3][4];则对a数组元素的正确引用是_____。 A)a[2][4] B)a[1,3] C)a[1+1][0] D)a(2)(1) [题]若有说明:int a[3][4];则对a数组元素的非法引用是_____。 A)a[0][2*1] B)a[1][3] C)a[4-2][0] D)a[0][4] [题]以下不能对二维数组a进行正确初始化的语句是_____。 A)int a[2][3]={0}; B)int a[3]={{1,2},{0}}; C)int a[2][3]={{l,2},{3,4},{5,6}}; D)int a[3]={1,2,3,4,5,6}; [题]若有说明:int a[3][4]={0};则下面正确的叙述是_____。 A)只有元素a[0][0]可得到初值0 B)此说明语句不正确 C)数组a中各元素都可得到初值,但其值不一定为0 D)数组a中每个元素均可得到初值0 [题]若有说明:int a[3][4];则数组a中各元素_____。 2

c语言 第6章作业

书面作业8 专业理科学号3120101717 姓名马凌浩 习题6 一、选择题 1.设float x=2.5, y=4.7; int a=7;,printf(“%.1f”, x+a%3*(int)(x+y)%2/4)的结果为 A 。 A.2.5 B.2.8 C.3.5 D.3.8 2.执行下列程序段的输出结果是 C 。 int a = 2; a += a *= a -= a *= 3; printf("%d", a); A.-6 B.12 C.0 D.2 3.设字符型变量x 的值是064,表达式“~ x ^ x << 2 & x”的值是 A 。 A.0333 B.333 C.0x333 D.020 4.设a 为整型变量,不能正确表达数学关系:1010 && a<15 D.!(a<=10) && !(a>=15) 5.设以下变量均为int 类型,表达式的值不为9 的是 C 。 A.(x=y=8,x+y,x+1) B.(x=y=8,x+y,y+1) C.(x=8,x+1,y=8,x+y) D.(y=8,y+1,x=y,x+1) 二.填空题 1 .-127 的原码为11111111 、反码为10000000 、补码为10000001 。 2.逻辑表达式x && 1 等价于关系表达式if(x==0) 表达式的值为0;else 表达式的值为1;。3.设int a=5, b=6; 则表达式(++a==b--)? ++a : --b 的值是7 。 4.设c = 'w', a = 1, b = 2, d = -5, 则表达式'x'+1>c, 'y'!=c+2, -a-5*b<=d+1, b==(a=2)的值 分别为 1 、0 、 1 、 1 。 5.运行以下程序后,如果从键盘上输入china#<回车>,则输出结果为c1=2,c2=5 。 #include int main(void) { int c1 = 0, c2 = 0; char ch; while((ch = getchar()) !=?#?) switch(ch){ case …a?: case …h?: c1++; default: c2++; } printf(“c1=%d,c2=%d\n”, c1, c2); return 0; }

C语言第六章数组习题答案

第六章 数组 习题答案 2、0 4 3、0 6 4、&a[i] i%4==0 printf("\n"); 5、i+j==3_ a[i][j] 6、12 7、a[i][j]+b[i][j] printf(“\n ”) 8、按行存放 9、( a[i]>a[j]) 10、将串str2复制到串str1中后再将串str3连接到串str1之后 三、阅读题 1、如右图所示 2、AQM 3、AzyD 4、9198 5、如右图所示 6、92 7、1,2,5,7, 8、2 9、v1=5,v2=8,v3=6,v4=1 10、a*b*c*d* 四、编程题 1(1)选择法排序 #include void main( ) {int i,j,n=10,p,a[10];int temp; for(i=0;i

for(j=i+1;j void main( ) {int i,j,n=10,p,a[10];int temp; for(i=0;ia[j]) {temp=a[i];a[i]=a[j];a[j]=temp;} printf("\n排序后的一维数组:\n"); for(i=0;i void main( ) {int a[11],i,n=10,k; int point; printf("\n 请输入原始数据:\n"); for(i=0;ik) {point=i; break;} if(i!=n) {for(i=n;i>point;i--) a[i]=a[i-1]; a[point]=k;} /*从后向前方式*/ else a[n]=k; printf("插入后的数是:\n"); for(i=0;i int main() {int i,j,upp,low,dig,spa,oth; char text[3][80];

c语言程序设计(第3版)的习题答案

1.5请参照本章例题,编写一个C程序,输出以下信息: ************ Very Goodj! ************ 解: main() { printf(" ************ \n"); printf("\n"); printf(" Very Good! \n"); printf("\n"); printf(" ************\n"); } 1.6编写一个程序,输入a b c三个值,输出其中最大者。 解:main() {int a,b,c,max; printf("请输入三个数a,b,c:\n"); scanf("%d,%d,%d",&a,&b,&c); max=a; if(max

数据结构(C语言版)第6章习题答案

第6章树和二叉树自测卷解答 一、下面是有关二叉树的叙述,请判断正误(每小题1分,共10分) (√)1. 若二叉树用二叉链表作存贮结构,则在n个结点的二叉树链表中只有n—1个非空指针域。(×)2.二叉树中每个结点的两棵子树的高度差等于1。 (√)3.二叉树中每个结点的两棵子树是有序的。 (×)4.二叉树中每个结点有两棵非空子树或有两棵空子树。 (×)5.二叉树中每个结点的关键字值大于其左非空子树(若存在的话)所有结点的关键字值,且小于其右非空子树(若存在的话)所有结点的关键字值。(应当是二叉排序树的特点) (×)6.二叉树中所有结点个数是2k-1-1,其中k是树的深度。(应2i-1) (×)7.二叉树中所有结点,如果不存在非空左子树,则不存在非空右子树。 (×)8.对于一棵非空二叉树,它的根结点作为第一层,则它的第i层上最多能有2i—1个结点。(应2i-1)(√)9.用二叉链表法(link-rlink)存储包含n个结点的二叉树,结点的2n个指针区域中有n+1个为空指针。 (正确。用二叉链表存储包含n个结点的二叉树,结点共有2n个链域。由于二叉树中,除根结点外,每一个结点有且仅有一个双亲,所以只有n-1个结点的链域存放指向非空子女结点的指针,还有n+1个空指针。)即有后继链接的指针仅n-1个。 (√)10. 〖01年计算机系研题〗具有12个结点的完全二叉树有5个度为2的结点。 最快方法:用叶子数=[n/2]=6,再求n2=n0-1=5 二、填空(每空1分,共15分) 1.由3个结点所构成的二叉树有5种形态。 2. 【计算机研2000】一棵深度为6的满二叉树有n1+n2=0+ n2= n0-1=31 个分支结点和26-1 =32个叶子。 注:满二叉树没有度为1的结点,所以分支结点数就是二度结点数。 3.一棵具有257个结点的完全二叉树,它的深度为9。 (注:用? log2(n) ?+1= ? 8.xx ?+1=9 4.【全国专升本统考题】设一棵完全二叉树有700个结点,则共有350个叶子结点。 答:最快方法:用叶子数=[n/2]=350 5. 设一棵完全二叉树具有1000个结点,则此完全二叉树有500个叶子结点,有499个度为2的结点,有1个结点只有非空左子树,有0个结点只有非空右子树。 答:最快方法:用叶子数=[n/2]=500 ,n2=n0-1=499。另外,最后一结点为2i属于左叶子,右叶子是空的,所以有1个非空左子树。完全二叉树的特点决定不可能有左空右不空的情况,所以非空右子树数=0. 6.【严题集6.7③】一棵含有n个结点的k叉树,可能达到的最大深度为n,最小深度为2。 答:当k=1(单叉树)时应该最深,深度=n(层);当k=n-1(n-1叉树)时应该最浅,深度=2(层),但不包括n=0或1时的特例情况。教材答案是“完全k叉树”,未定量。) 7. 【试题1】二叉树的基本组成部分是:根(N)、左子树(L)和右 子树(R)。因而二叉树的遍历次序有六种。最常用的是三种:前序法(即 按N L R次序),后序法(即按L R N次序)和中序法(也称

C语言程序设计教程 第六章 课后习题参考答案

P158 1求三个实数最大值 #include float max(float,float,float); int main() { float a,b,c,m; printf("请输入三个实数:"); scanf("%f %f %f",&a,&b,&c); printf("最大数为%f\n",max(a,b,c)); return 0; } float max(float a,float b,float c) { float t; if(a>b&&a>c) t=a; else if(b>a&&b>c) t=b; else t=c; return t; } P158 2求最大公约数最小公倍数 #include int fun1(int a,int b); int fun2(int a,int b); int main() { int a,b; printf("请输入两个整数:"); scanf("%d %d",&a,&b); printf("最大公约数为:%d\n",fun1(a,b)); printf("最小公倍数为:%d\n",fun2(a,b)); } int fun1(int a,int b) { int t,r; if(a

} while((r=(a%b))!=0) { a=b; b=r; } return b; } int fun2(int a,int b) { int n; n=(a*b)/fun1(a,b); return n; } P158 3求完全数 #include void wan(int n); void main() { int n; for(n=1;n<1000;n++) wan(n); printf("\n"); } void wan(int n) { int i,s=0; for(i=1;i<=n/2;i++) { if(n%i==0) s=s+i; } if(n==s) printf("%d\t",n); } P158 4无暇素数 #include #include

谭浩强c语言第四版第六章课后答案

//第四版第六章习题 //6.1 # if 0 # include # include # define N 101 int main() { int a[N]; int i,j,k,m=0; for(i=1;ik) { printf("%-3d,",a[i]); m++; if(m%5==0) { puts("\b "); } } } puts("\b "); return 0; } # endif //6.2 # if 0 # include # define N 10 int main() { int a[N]; int i,j,t; printf("请输入十个整数:"); printf("\n"); for(i=0;i

for(i=0;ia[i+1]) { t=a[i]; a[i]=a[i+1]; a[i+1]=t; } } } printf("从小到大输出为:\n"); for(i=0;i int main() { int a[3][3]; int i,j,sum=0; printf("请输入这个整型矩阵:\n"); for(i=0;i<3;++i) { for(j=0;j<3;++j) { scanf("%d",&a[i][j]); } } for(i=0;i<3;++i) { for(j=0;j<3;++j) { if(i==j||(i+j)==2) { sum+=a[i][j]; } } } printf("sum=%d\n",sum); return 0; } # endif //6.4 # if 0 # include

C语言课后习题答案

第四章选择结构 4.22 #include main() { int y0,m0,d0,y1,m1,d1,age; printf("please input your birthday(yyyy-mm-dd):\n"); scanf("%d-%d-%d",&y0,&m0,&d0); printf("please inpur current day(yyyy-mm-dd):\n"); scanf("%d-%d-%d",&y1,&m1,&d1); age=y1-y0; if(m1 main() { int i; printf("input a integer:\n"); scanf("%d",&i); if(i%2==0)printf("%d is a even\n",i); else printf("%d is a odd\n",i); } 4.24 #include main() { int a,b,c,max=0; printf("input 3 numbers:\n"); scanf("%d%d%d",&a,&b,&c); max=a; if(a main() { float x,y; scanf("%f",&x); if(x>-5&&x<0)printf("y=%f",x); if(x==0)printf("y=%f",x-1); if(x>0&&x<10)printf("y=%f",x+1); if(x<=-5||x>=10)printf("error"); }

C语言第六章课后答案

xt6-1 #include #include int main() {int i,j,n,a[101]; for (i=1;i<=100;i++) a[i]=i; a[1]=0; for (i=2;i int main() {int i,j,min,temp,a[11]; printf("enter data:\n"); for (i=1;i<=10;i++) {printf("a[%d]=",i); scanf("%d",&a[i]); } printf("\n"); printf("The orginal numbers:\n"); for (i=1;i<=10;i++)

printf("%5d",a[i]); printf("\n"); for (i=1;i<=9;i++) {min=i; for (j=i+1;j<=10;j++) if (a[min]>a[j]) min=j; temp=a[i]; a[i]=a[min]; a[min]=temp; } printf("\nThe sorted numbers:\n"); for (i=1;i<=10;i++) printf("%5d",a[i]); printf("\n"); return 0; } xt6-3 #include int main() { int a[3][3],sum=0; int i,j; printf("enter data:\n"); for (i=0;i<3;i++) for (j=0;j<3;j++) scanf("%3d",&a[i][j]); for (i=0;i<3;i++) sum=sum+a[i][i]; printf("sum=%6d\n",sum); return 0; }

C语言 第六章 函数期末测试习题与答案

C语言第六章函数期末测试习题与答案 1、以下叙述正确的是 A. C语言中除了main函数,其他函数不可作为单独文件形式存在 B.C语言程序是由过程和函数组成的 C.C语言函数可以嵌套调用 D.C语言函数不可以单独编译 参考答案:C 2、以下关于C语言程序中函数的说法正确的是 A.函数的定义和调用均不可以嵌套; B.函数的定义可以嵌套,但函数的调用不可以嵌套; C.函数的定义和点用都可以嵌套。 D.函数的定义不可以嵌套,但函数的调用可以嵌套; 参考答案:D 3、若已定义的函数有返回值,则以关于该函数调用的叙述中错误的是 A.调用可以出现在表达式中 B.调用可以作为独立的语句存在 C.调用可以作为一个函数的形参 D.调用可以作为一个函数的实参 参考答案:C 4、以下关于return语句的叙述中正确的是 A.没有return语句的自定义函数在执行结束时不能返同到调用处 B.一个自定义函数中可以根据不同情况设置多条return语句 C.定义成void类型的函数中可以有带返回值的return语句 D.一个自定义函数中必须有一条return语句

参考答案:B 5、C语言规定:函数返回值类型是由 A.return语句中的表达式类型决定 B.调用该函数时系统临时决定 C. 定义该函数时所指定的函数类型决定 D.调用该函数时的主调函数类型决定 参考答案:C 6、以下错误的描述是() 函数调用可以_____ A.出现在执行语句中 B.出现在一个表达式中 C.做为一个函数的形参 D.做为一个函数的实参 参考答案:C 7、以下说法不正确的是() C语言规定: A.实参可以是任意类型 B.实参可以是常量、变量或表达式 C.形参应与其对应的实参类型一致 D.形参可以是常量、变量或表达式 参考答案:D 8、C语言规定,简单变量作实参,它与对应形参之间的数据传递方式是() A.由用户指定传递方式 B.单向值传递

《C语言程序设计》第6章习题答案

1、选择题 (1)A(2)C(3)A(4)B(5)B(6)D(7)D(8)B(9)D(10)B 2、填空题 (1)a=10,b=20 a=20,b=10 (2)**pp=60 3、程序设计题 (1) #include char *month_name(int n); void main() { int n; printf("\nPlease enter 1 integer:"); scanf("%d",&n); printf("%d month :%s\n",n,month_name(n)); } char *month_name(int n) { static char*name[]={"illegal month", "Jan","Feb","Mar","Apr","May","Jun", "July","Aug","Sept","Oct","Nov","Dec"}; return ((n<1||n>12)?name[0]:name[n]); } (2) #include #define N 10 sort(int data[]) { int i,j,min_a,temp;

for(i=0;i void reverse(char *c); void main()

《C语言程序设计》课后习题答案第6章

6.1 输入两个正整数m,n,求其最大公约数和最小公倍数。 int m,n,temp,b,y; printf("请输入两个正整数m,n:\n"); scanf("%d,%d",&m,&n); if(m='a'&&c<='z'||c>='A'&&c<='Z') letters++; else if(c==' ') space++; else if(c>='0'&&c<='9') digit++; else other++; } printf("共有字母%d个,共有空格%d个,共有数字%d个,共有其他字符%d个",letters,space,digit,other); 6.3 求s=a+aa+aaa+...+aa...a的值,其中a是一个数字,例如:2+22+222+2222+22222(此时n=5),n有键盘输入 int i=1,a,n,sum=0,temp=0; printf("请输入a、n的值:\n"); scanf("%d,%d",&a,&n);/*一定不要忘记加&&*/ while(i<=n) { temp=temp+a; sum=sum+temp; a=a*10; ++i; } printf("s=a+aa+aaa+...+aa...a的值为%d\n",sum);

华中科技大学标准C语言程序设计及应用习题答案

第二章 一.选择题 1.C 2.B D 3.A 4.A 5. D 6.C 7.D 8.C 9.A 10.D 11.B 12.D 13.C 14.D 15.A 16.B 17.A 18.B 100011 001111 二.判断题 1.错 2.错 3.错 4.错 三.填空题 1. B 66 2. n1=%d\nn2=%d\n 3. 0 四.计算 1 (1)x|y = 0x002f (2)x^y = 0x0026 (3)x&y = 0x0009; (4)~x+~y = 0xffc6 (5)x<<=3 0x0068 (6)y>>=4 0x0002 2 (1) 6 (2)50 (3) 1 (4)–16 (5) 1 (6)20 3 (1)0 (2) 1 (3) 1 (4) 4 (5)8 (6) 1 4 (1)12 (2)0 (3) 1 (4)27

(6) 6 (7)24 (8)27 (9)–29 5 (1)0 (2) 1 (3) 1 (4)–3 (5) 2 五.程序分析题 程序1 b=20 a=3600 程序2 第三章 一.填空题 1.s=6 2.96 3.(1) scanf("%c",&c); (2) c-32 更好的答案:c-('a'-'A') 2.1 main() { int a,b; printf("please input a & b:"); scanf("%d%d",&a,&b); printf("\nmax is %d\n",(a>b)?a:b); } 2.2 int max(int x,int y); main() { int a,b,c,max; printf("please input a & b & c:"); scanf("%d%d%d",&a,&b,&c); max=a>b?a:b; max=c>max?c:max; printf("\nmax is %d\n",max); } 2.3

C语言苏小红版第六章习题答案

第六章习题1. (1)#include main() { int i,j,k; char space=' '; for(i=1;i<=4;i++) { for(j=1;j<=i;j++) { printf("%c",space); } for(k=1;k<=6;k++) { printf("*"); } printf("\n"); } } (2)#include main() { int k = 4, n; for (n = 0; n < k; n++) { if (n % 2 == 0) continue; k--; } printf("k = %d,n = %d\n",k,n); } (3)#include main() { int k = 4, n;

for (n = 0; n < k; n++) { if (n % 2 ==0) break; k--; } printf("k = %d, n = %d\n", k, n); } 2. (1)计算1+3+5+……99+101= #include main( ) { int i,sum=0; for(i=1;i<=101;i=i+2) { sum=sum+i; } printf("sum=%d\n",sum); } (2)计算1*2*3+3*4*5+...+99*100*101= #include main( ) { long i; long term,sum=0; for(i=1;i<=99;i=i+2) { term=i*(i+1)*(i+2); sum=sum+term; } printf("sum=%ld",sum); }

(完整版)c语言第六章循环结构程序设计(习题册答案)

第六章循环结构程序设计 基础练习(A) 一、选择题 1、C语言中while和do-while循环的主要区别是(A)。 A) do-while的循环体至少无条件执行一次 B) while的循环控制条件比do-while的循环控制条件严格 C) C)do-while允许从外部转到循环体内 D) do-while的循环体不能是复合语句 2、以下描述中正确的是(C)。 A) 由于do-while循环中循环体语句只能是一条可执行语句,所以循环体内不能使用 复合语句 B)do-while循环由do开始,用while结束,在while(表达式)后面不能写分号 C) 在do-while循环体中,一定要有能使while后面表达式的值变为零(“假”)的操 作 D)do-while循环中,根据情况可以省略while 3、设有程序段 int k=10; while(k) k=k-1; 则下面描述中正确的是(A)。 A)while循环执行10次B)循环是无限循环 C)循环体语句一次也不执行D)循环体语句执行一次 4、下列循环语句中有语法错误的是( D )。 A) while(x=y) 5;B) while(0) ; C) do 2;while(x==b);D) do x++ while(x==10); 5、已知int i=1;执行语句while (i++<4) ;后,变量i的值为(C)。 A) 3 B) 4 C) 5 D) 6 6、语句while(!E);中的表达式!E等价于(A)。 A)E==0 B)E!=1 C)E!=0 D)E==1 7、下面程序段的运行结果是(A)。 a=1; b=2; c=2; while(a main() { int num=0; while(num<=2) { num++; printf(“%d\n”,nu m); } } A)1 B)1 C)1 D)1 2 2 2 3 3 9、以下能正确计算1×2×3×…×10的程序段是(C)。

c语言习题集合预处理命令)

第六章预处理命令 6.1 选择题 1.下面叙述中正确的是()。 A. 带参数的宏定义中参数是没有类型的 B. 宏展开将占用程序的运行时间 C. 宏定义命令是C语言中的一种特殊语句 D. 使用#include命令包含的头文件必须以“.h”为后缀 2.下面叙述中正确的是()。 A. 宏定义是C语句,所以要在行末加分号 B. 可以使用#undef命令来终止宏定义的作用域 C. 在进行宏定义时,宏定义不能层层嵌套 D. 对程序中用双引号括起来的字符串内的字符,与宏名相同的要进行置换 3.在“文件包含”预处理语句中,当#include后面的文件名用双引号括起时,寻找被包含文件的方式为()。 A. 直接按系统设定的标准方式搜索目录 B.先在源程序所在目录搜索,若找不到,再按系统设定的标准方式搜索 C. 仅仅搜索源程序所在目录 D. 仅仅搜索当前目录 4.下面叙述中不正确的是()。 A. 函数调用时,先求出实参表达式,然后带入形参。而使用带参的宏只是进行简单的字符替换 B. 函数调用是在程序运行时处理的,分配临时的内存单元。而宏展开则是在编译时进行的,在 展开时也要分配内存单元,进行值传递 C. 对于函数中的实参和形参都要定义类型,二者的类型要求一致,而宏不存在类型问题,宏没 有类型 D. 调用函数只可得到一个返回值,而用宏可以设法得到几个结果 5.下面叙述中不正确的是()。 A. 使用宏的次数较多时,宏展开后源程序长度增长。而函数调用不会使源程序变长 B. 函数调用是在程序运行时处理的,分配临时的内存单元。而宏展开则是在编译时进行的,在 展开时不分配内存单元,不进行值传递 C. 宏替换占用编译时间 D.函数调用占用编译时间 6.下面叙述中正确的是( )。 A. 可以把define和if定义为用户标识符 B.可以把define定义为用户标识符,但不能把if定义为用户标识符 C. 可以把if定义为用户标识符,但不能把define定义为用户标识符 D. define和if都不能定义为用户标识符 7.下面叙述中正确的是()。 A.#define和printf都是C语句 B.#define是C语句,而printf不是 C.printf是C语句,但#define不是 D.#define和printf都不是C语句 8.以下叙述中正确的是()。 A. 用#include包含的头文件的后缀不可以是“.a”

C语言第六章循环结构复习题

循环结构程序设计复习题 一.选择题 1.以下while循环中,循环体执行的次数是:() k=1; while (--k) k=10; a) 10次b) 无限次c) 一次也不执行d) 1次 2.有以下程序段,其中x为整型变量,以下选项中叙述正确的是:() x=0; while (!x!=0) x++; a) 退出while循环后,x的值为0 b) 退出while循环后,x的值为1 c) while的控制表达式是非法的 d) while循环执行无限次 3. 有以下程序段,其中n为整型变量,执行后输出结果是:() n=20 ; while(n--) ; printf(“%d”,n) ; a) 2 b) 10 c) -1 d) 0 4. 有以下程序段,其中t为整型变量,以下选项中叙述正确的是:() t=1; while (-1)

{ t--; if(t) break;} a) 循环一次也不执行 b) 循环执行一次 c) 循环控制表达式(-1)不合法 d) 循环执行2次 5. 有以下程序段,其中x为整型变量,以下选项中叙述正确的是:() x=-1; do {;} while (x++); printf(“x=%d”,x); a) 该循环没有循环体,程序错误 b) 输出x=1 c) 输出x=0 d) 输出x=-1 6. 有以下程序段,其中x,y为整型变量,程序输出结果是:() for(x=0,y=0;(x<=1)&&(y=1);x++,y--) ; printf(“x=%d,y=%d”,x,y); a) x=2,y=0 b) x=1,y=0 c) x=1,y=1 d) x=0,y=0

相关文档
相关文档 最新文档