当前位置:文档之家› 算法与数据结构C语言习题参考答案1-5章

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

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

1.绪论

1.将下列复杂度由小到大重新排序:

A.2n B.n! C.n5D.10 000 E.n*log2 (n)

【答】10 000< n*log2(n)< n5< 2n < n!

2.将下列复杂度由小到大重新排序:

A.n*log2(n) B.n + n2 + n3C.24D.n0.5

【答】24< n0.5< n*log2 (n) < n + n2 + n3

3.用大“O”表示法描述下列复杂度:

A.5n5/2 + n2/5 B.6*log2(n) + 9n

C.3n4+ n* log2(n) D.5n2 + n3/2

【答】A:O (n5/2) B:O (n) C:O (n4) D:O (n2)

4.按照增长率从低到高的顺序排列以下表达式:4n2 , log3n, 3n , 20n , 2000 , log2n , n2/3。又n!应排在第几位?

【答】按照增长率从低到高依次为:2000, log3n, log2n , n2/3 , 20n , 4n2 , 3n。

n!的增长率比它们中的每一个都要大,应排在最后一位。

5. 计算下列程序片断的时间代价:

int i=1;

while(i<=n)

{

printf(“i=%d\n”,i);

i=i+1;

}

【答】循环控制变量i从1增加到n,循环体执行n次,第一句i的初始化执行次数为1,第二句执行n次,循环体中第一句printf执行n次,第二句i从1循环到n,共执行n次。所以该程序段总的时间代价为:

T(n) = 1 + n + 2n = 3n+ 1 = O(n)

6. 计算下列程序片断的时间代价:

int i=1;

while(i<=n)

{

int j=1;

while(j<=n)

{

int k=1;

while(k<=n)

{

k=k+1;

}

j=j+1;

}

i=i+1;

}

【答】循环控制变量i从1增加到n,最外层循环体执行n次,循环控制变量j从1增加到n,中间层循环体执行n次,循环控制变量k从1增加到n,最内层循环体执行n次,所以该程序段总的时间代价为:

T(n) = 1 + n + n{1 + n + n[1 + n + 2n +1] +1 +1}+ 1

= 3n3 + 3n2 +4n +2

= O(n3)

2. 线性表

1.试写一个插入算法int insertPost_seq(palist, p, x ),在palist所指顺序表中,下标为p的

元素之后,插入一个值为x的元素,返回插入成功与否的标志。

【答】

数据结构

采用2.1.2节中顺序表定义。

int insertPost_seq(PseqList palist, int p, DataType x ) {

/* 在palist所指顺序表中下标为p的元素之后插入元素x */

int q;

if ( palist->n >= palist-> MAXNUM ) { /* 溢出*/

printf(“Overflow!\n”);

return 0;

}

if (p<0 || p>palist->n-1 ) { /* 不存在下标为p的元素*/

printf(“N ot exist! \n”); return 0;

}

for(q=palist->n - 1; q>=p+1; q--) /* 插入位置及之后的元素均后移一个位置*/

palist->element[q+1] = palist->element[q];

palist->element[p+1] = x; /* 插入元素x */

palist->n = palist->n + 1; /* 元素个数加1 */

return 1;

}

2试写一个删除算法deleteV_seq(palist, x ),在palist所指顺序表中,删除一个值为x的元素,返回删除成功与否的标志。

【答】

数据结构

采用2.1.2节中顺序表定义。

int deleteV_seq(PseqList palist, p, DataType x ) {

/* 在palist所指顺序表中删除值为x的元素*/

int p,q;

for(p=0;p

if(x==palist->element[p]){

for(q=p; qn-1; q++) /* 被删除元素之后的元素均前移一个位置*/

palist->element[q] = palist->element[q+1];

palist->n = palist->n - 1; /* 元素个数减1 */

return 1 ;

}

return 0;

}

3. 设有一线性表e = (e0, e1 , e2 , …, e n-1 ),其逆线性表定义为e'= (e n-1 , …, e2 , e1 ,e0)。

请设计一个算法,将用顺序表表示的线性表置逆,要求逆线性表仍占用原线性表的

空间。

【答】

数据结构

采用2.1.2节中顺序表的定义。

思路

考虑对数组element[ ]进行置逆,即把第一个元素和最后一个元素换位置,把第二个元素和倒数第二个元素换位置……。

注意

这种调换的工作只需对数组的前一半元素进行,所以设置整数变量count用于存放数组长度的一半的值。大家可以考虑一下:为什么不能对整个数组进行如上的对元素“换位置”的工作?(提示:这样会将本来已经置逆的线性表又置逆回来,即又变成了原来的表。)顺序表的置逆算法

void rev_seq(PSeqList palist){

DataType x;

int count, i;

if (palist->n == 0 || palist->n == 1) return; /*空表或只有一个元素,直接返回*/

count = palist->n / 2;

for ( i = 0; i < count; i++){ /*只需调换半个表的元素*/

x = palist->element[i];

palist->element[i] = palist->element[palist->n - 1 - i];

palist->element[palist->n - 1 - i] = x;

}

}

代价分析

该算法中包含一个for循环,其循环次数为n/2。因此,算法的时间代价为O(n)。

4. 已知长度为n的线性表A采用顺序存储结构,请写一算法,找出该线性表中值最小

的数据元素。

【答】

数据结构

采用2.1.2节中顺序表定义。

思路

设置变量min,遍历整个表,不断更新当前已经经历过的元素的最小值即可。

为方便起见,事先假设表不为空。

算法

DataType min_seq(PSeqList palist){ /*求非空顺序表中的最小数据元素*/

DataType min;

min = palist->element[0]; /*初始化min*/

for ( i = 1; i < palist->n; i++) /*min中保存的总是当前的最小数据*/

if (min > palist->element[i])

min = palist->element[i];

return min;

}

代价分析

该算法访问顺序表中每个元素各一次,时间代价为O(n)。

讨论

读者可以试图对上面的算法进行修改,使返回的值不是最小元素的值而是它的下标。

5. 已知线性表A的长度为n,并且采用顺序存储结构。写一算法,删除线性表中所有

值为x的元素。

【答】

数据结构

采用2.1.2节中顺序表的定义。

思路

为了减少移动次数,可以采用快速检索的思想,用两个变量i, j记录顺序表中被处理的两端元素的下标,开始时i = 0,j = n-1,边检索第i个元素边增加i,直到找到一个元素值等于x,再边检索第j个元素边减少j,直到找到一个元素值不等于x,把下标为j的元素移到下标为i的位置后重复上述过程,直到i≥j。另用一变量count记录删除了多少个元素。

算法

void delx_seq(PSeqList p, DataType x){

/*删除顺序表中所有值为x的元素,新顺序表可能不保持原有顺序*/

int i = 0, j = p->n - 1, count = 0; /*i定位于顺序表开始处,j定位于顺序表最后*/

while ( i < j) {

if (p->element[i] == x) { /*找到了一个要删除的元素*/

while ((p->element[j] == x) && (i != j)) {

/*从后往前找不会被删除的元素,当i, j相等时退出循环,count记录从后往前找的过程中遇到了

多少个要删的元素*/

j--;

count++;

}

if ( i = = j) {

p->n = p->n - count - 1;

return;

}

else{

p->element[i] = p->element[j];

count++;

j--;

}

}

i++;

p->n = p->n - count;

if (p->element[i] == x) p->n--;

}

代价分析

该算法访问顺序表中每个元素各一次,时间代价为O(n)。

讨论

这个算法使用了一点技巧使得在中间删除元素时,避免了最后一串元素的移动。但是,它破坏了原来线性表中元素之间的顺序关系。

如果需要保持原来的顺序应该怎样做?这里提供一种可行的思路:从前向后遍历表,如果元素不是x,则继续向后;如果元素是x,则寻找其后第一个不是x的元素,将这两个元素互换。具体算法请读者自己实现。

6.写一算法,在带头结点的单链表llist中,p所指结点前面插入值为x的新结点,并返

回插入成功与否的标志。

【答】

数据结构

采用2.1.3节中单链表定义。

思想:

由于在单链表中,只有指向后继结点的指针,所以只有首先找到p所指结点的前驱结点,然后才能完成插入。而找p所指结点的前驱结点,只能从单链表的第一个结点开始,使用与locate_link 类似的方式进行搜索。

算法:

int insertPre_link(LinkList llist,PNode p,DataType x){

/* 在llist带头结点的单链表中,p所指结点前面插入值为x的新结点*/

PNode p1;

if(llist==NULL) return 0;

p1=llist;

while(p1!=NULL&&p1->link!=p)p1=p1->link; /*寻找p所指结点的前驱结点*/

if(p1=NULL) return 0;

PNode q=(PNode)malloc(sizeof(struct Node));/*申请新结点*/

if(q=NULL) {printf(“Out of space!!!\n”);return 0;}

q->info=x;

q->link=p1->link;

p1->link=q;

return 1;

}

7.写一算法,在带头结点的单链表llist中,删除p所指的结点,并返回删除成功与否的标

志。

【答】

数据结构

采用2.1.3节中单链表定义。

思想:

由于在单链表中,只有指向后继结点的指针,所以只有首先找到p所指结点的前驱结点,然后才能完成删除。而找p所指结点的前驱结点,只能从单链表的第一个结点开始,使用与

locate_link 类似的方式进行搜索。

int deleteP_link(LinkList llist,PNode p){

/* 在llist带头结点的单链表中,删除p所指的结点*/

PNode p1;

if(llist==NULL)return Null;

p1=llist;

while(p1!=NULL&&p1->link!=p)p1=p1->link; /*寻找p所指结点的前驱结点*/

if(p1=NULL)return 0;

p1->link=p->link;

free(p); /* 删除结点p */

return 1;

}

8. 已知list是指向无头结点的单链表的指针变量,写出删除该链表下标为i的(第i+1

个)结点的算法。

【答】

数据结构

采用2.1.3节中单链表定义。

思路

依次遍历表中的每一个结点并计数,到第i+1个结点时实行删除。由于链表是无头结点的,所以在删除第一个结点时要特别注意。

算法

int deleteindex_link_nohead(LinkList * pllist, int i) {

/*删除单链表中下标为i的结点。删除成功返回TRUE,否则返回FALSE。*/

int j;

PNode p, q;

if ((*pllist) == NULL || i < 0) return FALSE;

if ( i = = 0) { /*如果需要删除第一个结点*/

q = (*pllist);

(*pllist) = (*pllist)->link;

free(q);

return TRUE;

}

p = (*pllist);

j = 0;

while (p->link != NULL && j < i - 1) { /*寻找下标为i-1的结点的地址*/

p = p->link;

j++;

}

if (p->link == NULL) return F ALSE; /*此元素不存在*/

q = p->link;

p->link = q->link;

free(q);

return TRUE;

}

代价分析

该算法访问单链表中前面i个结点,时间代价为O(i),最大不超过O(n)。

讨论

如果函数参数不是LinkList *类型而是LinkList类型,在删除i=0的结点时,程序不能正确实现,其原因请读者思考(考虑C语言的参数传递方式)。

如果单链表带表头结点,重写本题的算法。比较这两个算法,是否能体会到表头结点的作用。

9. 已知list是指向无头结点的单链表的指针变量,写出删除该链表中从下标为i的(第

i+1个)结点开始的连续k个结点的算法。

【答】

数据结构

采用2.1.3节单链表定义。

思路

这道题与上题相似,只需要增加计数即可。要注意的是应该判断给出的i和k是否合理,是不是会超出链表长度。

算法

int del_link_nohead(LinkList * pllist, int i, int k) {

/*删除单链表中从下标i开始的k个结点。删除成功返回TRUE,否则返回FALSE。*/ int j;

PNode p, q;

if ((*pllist) == NULL || i < 0 || k <= 0) return FALSE;

if ( i = = 0) { /*如果需要删除从第一个结点开始的k个结点*/ for ( j = 0; j < k && (*pllist) != NULL; j++) {

q = (*pllist);

(*pllist) = (*pllist)->link;

free(q);

}

return TRUE;

}

p = (*pllist);

j = 0;

while ( p->link != NULL && j < i - 1) { /*寻找下标为i-1的结点的地址*/

p = p->link;

j++;

}

if (p->link == NULL) return F ALSE; /*第i个结点不存在*/

for ( j = 0; j < k && p->link != NULL; j++) {

q = p->link;

p->link = q->link;

free(q);

}

return TRUE;

}

代价分析

该算法访问单链表中前面i+k个结点,时间代价为O(i+k),最大不超过O(n)。

13. 请设计一个算法,求出循环表中结点的个数。

【答】

数据结构

采用不带头结点的循环链表。

struct Node;

typedef struct Node * PNode;

struct Node{

DataType info;

PNode link;

};

typedef struct Node * LinkList;

思路

遍历整个循环链表,同时计数即可。

错误算法

int count(LinkList clist){

int count;

PNode p, q;

p = clist;

q = p->link;

if (clist == NULL) return 0; /*如果是空表*/

count = 1;

while ( q != p){

q = q->link;

count++;

}

return count;

}

错误:如果clist是一个空表,那么第5行的语句“q = p->link;”是非法的。

分析:应把第6行语句(用下划线表示)提前1行或2行。一定要放在语句“q = p->link;”之前。

缺点:增加局部变量p。

分析:这样做没有必要,因为p的初值置为clist,在程序中并没有对p做其他修改,所以程序中不需要引入p而直接使用clist即可。

算法

int count(LinkList clist){

int count;

PNode q;

if (clist == NULL) return 0; /*如果是空表*/

q = clist->link;

count = 1;

while ( q != clist){

q = q->link;

count++;

}

return count;

}

代价分析

该算法访问循环链表中每个结点各一次,时间代价为O(n)。

4. 栈与队列

1. 写一个递归算法来把整数字符串转换为整数。(例:“43567”→43567。)

【答】

思路

先递归调用本算法转换除去末位外剩余的字符串,结果乘以10。再转换末位。将两结果相加即为所求。

算法

int stringToInt1(char * s, int start, int end) {

/*把整数字符串s中从start到end的部分转换为整数*/

if (start > end) return -1; /*转换失败*/

if (start == end) return s[end] - '0'; /*只有一个字符,直接转换*/

return stringToInt1(s, start, end - 1) * 10 + s[end] - '0'; /*先转换其他位,再转换末位*/ }

int stringToInt(char * s) { /*把整数字符串s转换为整数*/ int i = 0;

while (s[i] != '\0') i++; /*计算字符串的长度*/

return stringToInt1(s, 0, i - 1);

}

代价分析

设n为字符串的长度。该算法访问每个字符各一次,时间代价为O(n),计算字符串的长度的时间代价也为O(n)。故总的时间代价为O(n)。

递归算法需要栈的支持,栈的大小与递归调用的深度成正比。所以实际空间开销为O(n)。

2. 编写一个算法,对于输入的十进制非负整数,将它的二进制表示打印出来。

【答】

数据结构

采用4.1.2节中栈的顺序表示。

思路

将输入的十进制数字反复除以2,直到它变为0。将每次的数字模2的余数入栈。栈中存放的就是所要求的二进制表示。再将栈中的元素依次弹出打印即可。

算法

void print_bin(int dec_number) { /*将十进制非负整数转化为二进制数打印出来*/ PSeqStack pastack;

int temp = dec_number;

if (temp < 0) {

printf("Error!\n");

return;

}

pastack = createEmptyStack_seq(); /*建立一个空栈*/

while (temp > 0) {

push_seq(pastack, temp % 2);

temp /= 2;

}

while(!isEmptyS tack_seq(pastack)) {

printf("%d", top_seq(pastack));

pop_seq(pastack);

}

free(pastack);

}

代价分析

设输入的十进制数字为n,则算法的时间代价为O(n

log)。空间代价主要是栈的大小,为

2

O(n

log)。

2

3.写一个算法:PSeqStack createEmptyStack_seq( int m ) 创建一个空栈。

数据结构

采用4.1.2节中栈的顺序表示。

PSegStack createEmptyStack_seq(int m){

/* 创建一个空栈*/

PSeqStack pastack = (PSeqStack)malloc(sizeof(struct SeqStack));

if (pastack!=NULL){

pastack ->s = (DataType*)malloc(sizeof(DataType)*m);

if (pastack ->s){

pastack ->MAXNUM=m;

pastack ->t= -1; /* 栈顶变量赋值为-1 */

return (pastack );

}

else free pastack;

}

printf(“Out of space!!\n”); /* 存储分配失败*/

return NULL;

}

4,写一个算法:int isEmptyStack_seq( PSeqStack pastack ) 判断pastack所指的栈是否为空栈。

数据结构

采用4.1.2节中栈的顺序表示。

int isEmptyS tack_seq(PSeqStack pastack){

/* 判断pastack所指的栈是否为空栈*/

else return 0;

}

8. 假设以循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设队头指

针),试编写相应的创建空队列、入队列和出队列的算法。

【答】

数据结构

采用不带头结点的循环链表表示队列。

struct Node;

typedef struct Node * PNode;

struct Node {

DataType info;

PNode link;

};

struct ClinkQueue { /*循环链表表示的队列类型*/

PNode r; /*尾指针*/

}

typedef struct ClinkQueue * PClinkQueue; /*指向循环链表表示的队列的指针类型*/

思路

与队列的单链表表示相似,但节省了指向队头的指针变量,所以在需要找表头结点时必须通过表尾指针进行。

算法

PClinkQueue createEmptyQueue_clink() { /*创建空队列*/

PClinkQueue pcqu = (PClinkQueue)malloc(sizeof(struct ClinkQueue));

pcqu->r = NULL;

return pcqu;

}

void enQueue_clink(PClinkQueue pcqu, DataType x) { /*进队列*/

PNode p;

p = (PNode)malloc(sizeof(struct Node));

p->info = x;

if (pcqu->r == NULL) {

pcqu->r = p;

p->link = p;

return;

} /*进空队列,即往空队列中加入第一个结点*/

p->link = pcqu->r->link;

pcqu->r->link = p;

pcqu->r = p;

}

void deQueue_clink(PClinkQueue pcqu) { /*出队列*/

PNode p;

if (pcqu->r == NULL) { /*是空队列*/

printf("Underflow!\n");

return;

}

if (pcqu->r->link == pcqu->r) { /*只有一个元素的队列*/

free(pcqu->r);

pcqu->r = NULL;

return;

}

p = pcqu->r->link; /*指向队头*/

pcqu->r->link = p->link;

free(p);

}

代价分析

上述几个算法都不包含循环,只有常数条语句,因此每个算法的时间代价均为O(1)。 讨论

本题可以看成队列的循环表实现。

5. 二叉树与树

1. 写一个算法来计算给定二叉树的叶结点数。

【答】

数据结构

采用5.1.3节中二叉树的链接表示。

算法

int num_of_leaves(BinTree t) { /*计算二叉树的叶结点个数*/

if (t = = NULL) return 0; /*空树,返回0*/

if (t->llink = = NULL && t->rlink = = NULL) return 1; /*根结点是树叶,返回1*/

return num_of_leaves(t->llink) + num_of_leaves(t->rlink);

/*返回“左子树的叶结点数+右子树的叶结点数”*/ }

代价分析

该算法访问每个结点各一次,时间代价为O(n)。空间代价为O(h)。

2. 假设二叉树采用链接方法存储,编写一个计算一棵二叉树t的高度的函数。

【答】

数据结构

采用5.1.3节中二叉树的链接表示。

思路

对一棵二叉树t,考察它左右子树的高度,取其中大的一个,再加1即为t的高度。

算法

int depth(BinTree t)

{

PBinTreeNode pbtree;

int dl, dr;

pbtree = t;

if (pbtree = = NULL)

{

return 1;

}

dl = depth(pbtree->llink);

dr = depth(pbtree->rlink);

return (dl > dr ? dl : dr) + 1;

}

代价分析

设树中的结点个数为n,递归访问次数只可能是n。所以,时间代价为O(n)。空间代价为O(h)。h为二叉树的高度。

6. 设计一个程序,根据二叉树的先根序列和对称序序列创建一棵用左右指针表示的二

叉树。

【答】

数据结构

采用5.1.3节中二叉树的链接表示。

思路

二叉树的先根序列和对称序序列,用两个数组preorder和inorder存放。先根序列的第一个元素的值preorder[0]应为二叉树的根上的元素值,在另一个数组中查到此值,设为inorder[k]。此时,数组preorder中从preorder[1]到preorder[k]的序列(长度为k)和数组inorder中从inorder[0]到inorder[k-1](长度为k)的序列,恰好分别是根结点左子树(k个结点)的先根序列和对称序序列。数组preorder中从preorder[k+1]到preorder[n-1]的序列(长度为n-k-1)和数组inorder中从inorder[k+1]到inorder[n-1](长度为n-k-1)的序列,恰好分别是根结点左子树(n-k-1个结点)的先根序列和对称序序列。

根据上述分析,算法先创建根结点,再递归调用自己两次来分别创建左右子树。

算法

int create_BTree(PBinTree pbtree, DataType * preorder, DataType * inorder, int n){

/*根据先根序列preorder和对称序序列inorder(长度为n)创建二叉树pbtree。对于正确的先根

序列和对称序序列,算法返回TRUE,否则返回FALSE。*/

int i, k;

int tag1, tag2;

if (n = = 0) {

*pbtree = NULL;

return TRUE;

}

for (i = 0; i < n; i++)

if (inorder[i] = = preorder[0])

break;

if (i = = n) {

*pbtree = NULL;

return FALSE; /*输入的先根序列或对称序序列有误,创建失败*/ }

k = i;

*pbtree = (PBinTreeNode)malloc(sizeof(struct BinTreeNode));

(*pbtree)->info = preorder[0];

tag1 = create_BTree(&(*pbtree)->llink, preorder + 1, inorder, k);

/*递归调用本算法创建左子树*/

tag2 = create_BTree(&(*pbtree)->rlink, preorder + k + 1, inorder + k + 1, n - k - 1);

/*递归调用本算法创建右子树*/

if (tag1 = = TRUE && tag2 = = TRUE) return TRUE;

return FALSE; /*二叉树创建成功当且仅当其左右子树都创建成功*/ }

代价分析

最坏的情况是,每个非叶结点只有左子树。这时两个数组之间需要比较n+(n-1)+…+1=O(n2)次。所以,该算法的时间代价为O(n2)。空间代价主要包括:存放二叉树的空间O(n)和用于递归调用的栈空间(不超过O(n))。

7. 试设计树的子表表示法的存储结构,并给出在这种表示基础上主要运算的实现算法。

【答】

数据结构

struct EdgeNode /*边表中结点的定义*/

{

int nodeposition; /*子结点位置*/

struct EdgeNode * link; /*下一个边的指针*/

};

struct ChiTreeNode /*结点的定义*/

{

DataType info; /*结点本身信息*/

struct EdgeNode * children; /*到子结点的边表*/

};

struct ChiTree /*树的定义*/

{

struct ChiTreeNode nodelist[MAXNUM]; /*结点表*/

int root; /*根的位置*/

int n; /*结点的个数*/

};

typedef struct ChiTree * PChiTree;

算法

创建空树

PChiTree CreateNullTree_chitree(void)

{

PChiTree p;

p = (PChiTree)malloc(sizeof(struct ChiTree));

if (p = = NULL)

printf("Out of space!\n");

else

{

p->n=0;

p->root = 1;

}

return p;

}

判断树是否为空

int isNull_chitree (PChiTree t)

{

return t->n = = 0;

}

返回非空树的根结点的下标

DataType root_chitree (PChiTree t)

{

return t->root;

}

返回下标为p的结点的父结点的下标

int parent_chitree (PChiTree t, int p)

{

int i;

struct EdgeNode * v;

if (p < 0 || p >= t->n) return -1;

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

{

v = t->nodelist[i].children;

while (v != NULL)

if (v->nodeposition = = p)

return i;

else

v = v->link;

}

return -1;

}

返回下标为p的结点的最左子结点的下标

int leftChild_chitree(PParTree t, int p)

{

struct EdgeNode * v;

if (p < 0 || p >= t->n) return -1;

v = t->nodelist[i].children;

if (v = = NULL) return -1;

return v->nodeposition;

}

返回下标为p的结点的右兄弟结点的下标

int rightSibling_chitree(PParTree t, int p)

{

int i;

struct EdgeNode * v;

if (p < 0 || p >= t->n) return -1; /*没有下标为p的结点*/

for (i = 0; i < t->n; i++) /*for循环每次检查结点下标中一个元素*/

{

v = t->nodelist[i].children;

while (v != NULL) /*每次循环检查结点i的边表中的一个元素*/

if (v->nodeposition = = p)

if(v->link = = NULL)

return -1; /*没有右兄弟结点*/

else

return v->link->nodeposition; /*返回右兄弟结点在结点表中的位置*/

else

v=v->link;

}

return -1; /*没有右兄弟结点*/

}

代价分析

这是一个两重循环程序,外层循环最多执行n次,内层循环对每个结点的子结点进行检查,子结点的个数最大可能与n接近,所以表面看来这是一个n2阶的时间代价;但是,仔细分析内层的循环体,可以看出内层循环最多对树中的每条边执行一次,由于树中边的个数与结点的个数成正比,所以时间代价仍然是O(n)。

补充题:

1. 试设计完全二叉树的顺序表示法的存储结构,并给出在这种表示基础上主要运算的

实现算法。

【答】

数据结构

struct SeqBTree

{

DataType nodelist[MAXNODE];

int n; /*完全二叉树的结点个数*/

};

typedef struct SeqBTree * PSeqBTree;

算法

判断二叉树是否为空

int isNull_seq(PSeqBTree t)

{

return t->n = = 0;

}

返回非空二叉树的根结点的下标

int root_seq(PSeqBTree t)

{

return 0;

}

返回下标为p的结点的父结点的下标

int parent_seq(PSeqBTree t, int p)

{

if (p < 0 || p >= t->n) return -1;

return (p - 1) / 2;

}

返回下标为p的结点的左子结点的下标

int leftChild_seq(PSeqBTree t, int p)

{

if (p < 0 || p >= t->n) return -1;

return 2*p + 1;

}

返回下标为p的结点的右子结点的下标

int rightChild_seqbtree(PSeqBTree t, int p)

{

if (p < 0 || p >= t->n) return -1;

return 2 * (p + 1);

}

2. 试设计二叉树的左右指针表示法的存储结构,并给出在这种表示基础上主要运算的

实现算法。

【答】

数据结构

struct BinTreeNode;

typedef struct BinTreeNode * PBinTreeNode;

struct BinTreeNode {

int info;

PBinTreeNode llink;

PBinTreeNode rlink;

};

typedef struct BinTreeNode * BinTree;

算法

判断二叉树是否为空

int isNull_btree(BinTree t)

{

return t = = NULL;

}

返回非空二叉树的根结点的地址

PBinTreeNode root_btree(BinTree t)

{

return t;

}

返回二叉树t中结点p的父结点的地址

PBinTreeNode parent_btree(PBinTreeNode p, BinTree t)

{

PBinTreeNode r;

if (p = = NULL) return NULL;

if (p = = t || t = = NULL) return NULL;

if (t->llink = = p || t->rlink = = p) return t;

r = parent_btree(p, t->llink); /*递归调用*/

C语言常见复习题(选择填空)及参考答案

C语言常见复习题及参考答案 一、选择题 1.下述标识符中,()是合法的用户标识符。 A.A#C B.getch C.void D.ab* 2.在C语言中,字符型数据在内存中是以()形式存放的。 A.原码 B.BCD码 C.反码 D.ASCII码 3.以下选项中不合法的用户标识符是()。 A.abc.c B.file C.Main D.PRONTF 4.以下选项中不合法的用户标识符是()。 A.123 B.printf C.Anbsp; D.Dim 5.可以在C语言程序中用做用户标识符的一组标识符是()。 A.void B.as-b3 C.for D.2c define -123 -abc Do WORD If cas SIG 6.在以下各组标识符中,合法的用户标识符是(1)、(2)、(3)。 (1)A.001 B.table_1 C.0_t D.k% Int t*.1 W10 point (2)A.Fast_ B.void C.pbl D. Fast+Big abs fabs beep (3)A.xy_ B.longdouble C.*p D.CHAR 变量1 signed history Float 7.()是构成C语言的基本单位。 A.函数 B.过程 C.子程序 D.子例程 8.若有说明:char s1='\067';char s2="1";char s3='1';则s1中(1),s2中(2),s3中(3)。

(1).A.包含3个字符 B.包含2个字符 C.包含1个字符 D.无定值,说明不合法 (2).A.包含1个字符 B.包含2个字符 C.包含3个字符 D.无定值,说明不合法 (3).A.包含1个字符 B.包含2个字符 C.包含3个字符 D.无定值,说明不合法 9.若x为int型变量,则执行以下语句后,x的值为 x=6; x+=x-=x*x A.36 B.-60 C.60 D.-24 10.在C语言中,char 型数据在内存中是以()形式存储的。 A.原码 B.补码 C.ASCII码 D.反码 11.以下运算符中优先级最低的算符为(),优先级最高的为()。 A.&& B.& C.|= D.|| E.?: F.!= 12.若有运算符>、*=、<<、%、sizeof,则它们按优先级(由低至高)的正确排列顺序为 A.*= << > % sizeof B.<< *= > % sizeof C.*= > << sizeof % D.*= > << % sizeof 13.若有以下类型说明语句 char w; int x; float y; double z; 则表达式w*x+z-y 的结果是()类型。 A.float B.char C.int D.double 14.若w,x,y,z 均为int 型变量,则执行下面的语句后, w=(1), x=(2), y=(3), z=(4)。 w=5; x=4; y=w++*w++*w++; z=--x*=--x*--x;

c语言第五章习题答案

第一题: 1. 从键盘输入10个数,求和。 #include "stdio.h" void main( ) { int x,s=0; int i; for(i=0;i<10;i++) {scanf("%d",&x); s+=x;} printf("s=%d\n",s ); } 2. 从键盘输入10个数,求平均值。#include "stdio.h" void main( ) { int x,s=0,ave; int i; for(i=0;i<10;i++) {scanf("%d",&x); s+=x;}

ave=s/10; printf("s=%d,ave=%d\n",s ,ave ); } 3. 从键盘输入10个数,求偶数的和。 #include "stdio.h" void main( ) { int x,s=0; int i; for(i=0;i<10;i++) {scanf("%d",&x); if(x%2==0) s+=x;} printf("s=%d\n",s ); } 4. 从键盘输入10个数,求偶数的平均值。#include "stdio.h" void main( ) { int x,s=0,ave; int i; int k=0;

for(i=0;i<10;i++) {scanf("%d",&x); if(x%2==0) {s+=x;k++;} } ave=s/k; printf("s=%d,ave=%d\n",s,ave ); } 5. 从键盘输入n个数,求偶数的平均值。#include "stdio.h" void main( ) { int x,s=0,ave; int i; int k=0; int n; scanf("%d",&n); for(i=0;i

C语言考试题库及答案复习整理

C 语言理论上机考试选择题部分(共200题) 1、下面程序的输出是___D______ #include void main() { int k=11; printf("k=%d,k=%o,k=%x\n",k,k,k); } A) k=11,k=12,k=11 B) k=11,k=13,k=13 C) k=11,k=013,k=0xb D) k=11,k=13,k=b 2、在下列选项中,不正确的赋值语句是__D______. A) ++t; B) n1=(n2=(n3=0)); C) k=i=j; D) a=b+c=1; 3、下面合法的C 语言字符常量是______A____. A) '\t' B) "A" C) 65 D) A 4、表达式: 10!=9的值是 ________D____. A) true B) 非零值 C) 0 D) 1 5、C 语言提供的合法的数据类型关键字是_____B____. A) Double B) short C) integer D) Char 6、字符(char)型数据在微机内存中的存储形式是__D__. A) 反码 B) 补码 C) EBCDIC 码 D) ASCII 码 7、C 语言程序的基本单位是_____C______. A) 程序行 B) 语句 C) 函数 D) 字符 8、设 int a=12,则执行完语句

a+=a-=a*a 后,a 的值是____D____ A) 552 B) 264 C) 144 D) -264 9、执行下面程序中的输出语句后,输出结果是____B__. #include void main() {int a; printf("%d\n",(a=3*5,a*4,a+5)); } A) 65 B) 20 C) 15 D) 10 10、下面程序的输出是____B______. #include void main() {int x=023; printf("%d\n",--x); } A) 17 B) 18 C) 23 D) 24 11、下面程序的输出的是_____C____. #include void main() {int x=10,y=3; printf("%d\n",y=x/y); } A) 0 B) 1 C) 3 D) 不确定的值 12、已知字母A 的ASCII 码为十进制的65,下面程序的输出是______A_____. #include void main() {char ch1,ch2; ch1='A'+'5'-'3'; ch2='A'+'6'-'3'; printf("%d,%c\n",ch1,ch2); } A) 67,D B) B,C C) C,D D) 不确定的值 13、若要求在if 后一对圆括号中表示a 不等于0的关系,则能正确表示这一关系的表达式为____D__. A) a<>0 B) !a C) a=0 D) a

c语言程序设计课后习题答案 第五章

/*练习5-3*/ #include int prime(int m) { int i; for(i=2;i<=m-1;i++) if(m%i==0) break; if(i==m) return 1; else return 2; } main() { int i,m,n,sum=0,a=0; printf("enter m and n:(1<=m<=n<=500)\n"); scanf("%d",&m); scanf("%d",&n); for(i=m;i<=n;i++) { if(prime(i)==1) sum=sum+i; a=a+1; } printf("之间的素数和为:%d\n",sum); printf("之间的素数个数为:%d\n",a); } /*习题5.1*/ #include int fn(int a,int n) { int i,sum=0,m=1,c; for(i=1;i<=n;i++) { sum=sum+m; m=m*10; } c=sum*a; return c; }

main() { int a,n,i,x,y=0; printf("enter a and n:\n"); scanf("%d",&a); scanf("%d",&n); for(i=1;i<=n;i++) { x=fn(a,i); y=y+x; } printf("y=%d\n",y); } /*习题5.2*/ #include int countdigit(int number,int digit) { int sum=0; while(number>0) { if(number%10==digit) sum=sum+1; number=number/10; } return sum; } main() { int number,y; printf("enter a number:\n"); scanf("%d",&number); y=countdigit(number,2); printf("y=%d\n",y); }

大学C语言考试题库及答案

精选考试类应用文档,如果您需要使用本文档,请点击下载,另外祝您生活愉快,工作顺利,万事如意! 大学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 。

C语言预习及课后习题(参考答案1-5)

第一章C语言概述 课前预习题 1.函数 2.main()函数3.单行注释、块注释、A 参考分析:C语言总是从main函数开始,main函数结束。但是C语言中存在一个exit(0)函数,它可以使得程序在任何时候、任何位置结束程序的运行。如果不考虑exit(0)等函数的特殊作用,C则总是在main函数结束。 2.C 参考分析:C程序对main函数的位置没有任何要求;其书写格式自由,一行可以写多条语句,一条语句(多关键字语句)可以写在多行;C语言忽略注释,把注释看作是一个空格,不会对注释中的内容进行语法检查。因此,如果注释中存在错误,系统是不可能发现的。另外,C语言的I/O操作均通过函数实现,系统本身未提供相应的语句。 3.D 参考分析:C语言中,注释语句的位置是任意的,当然,它不能破坏标识符的完整性。C语言只是将一个注释看作是一个空格,因此对注释内的任何错误都不作检查。 4. C 5.B 参考分析:通常许多语言程序由主程序和子程序构成,但是C语言是函数式语言,整个程序由众多函数组成。尽管有时习惯上称main函数为主程序,显然,严格地讲还是B更为符合C语言的规则。 6.C 7.B 8.C 9.C 10.C 11.绘制NS算法流程图。 (1)输入10个数,求其中的最大值。 (2)输入3个数,将它们升序排列输出。 (3)输入2个数,求它们的最大公约数。(4)输入一元二次方程的系数a、b、c,判断其根。

第二章数据类型、运算符与表达式 课前预习题 1.变量在内存中所占的字节数、变量的表数范围、变量允许参与的运算2.1、4、8 3.float、double 4.八进制、十进制、十六进制5.1 6.26 7.12、4 8.6、4、2 9.-60 10.2 11.10、6 12.13.14.4 15.1 16.0 17.9 18.字符、数字、下划线19.'f' 20.21.int型22.m/10%10*100+m/100*10+m%10 课后习题 1.A 分析:在不同的计算机系统中,不同的C语言系统中,其各种数据类型所占据的存储空间是不同的,但是有一个总的原则,即:char<=short<=int<=long<= float<=double,只有A符合16位PC机中的具体环境。 2.C 参考分析:逗号表达式的计算结果是最后一个表达式的值。k=23是括号内最后一个表达式,因此x变量的值来自k变量的值。 3.B 参考分析:逗号表达式的计算结果是最后一个表达式的值。b++在所在表达式参与运算时的值是5,该表达式计算完成后,b进行自增运算,故a+b的值为2+6=8。 4.A 参考分析:是关键字的有:char、case、while。 5.B 参考分析:不是关键字的:include、scanf、type 6.C 参考分析:合法的有:A、P_0、la0、_A、_123、temp、INT。 7.C 参考分析:教材中只是强调首字符必须为字母,我们应当知道,在语言系统中,下划线和字母具有同等的“法律效力”。 8.A 参考分析:不合法的B2,C2,C3,D2。解释:A2:-0xffff十六进制数本身已经包含了符号位,一般不前面加符号位,但加上符号位也不错误;C3:0668在有些C系统中,八进制数中允许出现8,但是通常不允许使用8;D3:0x显然后面缺少数值,但在TC中是允许的。 9.D 参考分析:不合法的A1,B3,C1,C3,D。解释:A1:--0f1十六进制数没有0x,显然不合法,这里需要讨论的是常

(完整版)C语言程序设计选择题库及答案

单项选择题 导读:单项选择题要求从给出的四个备选答案中,选出一个最符合题意的答案。本类习题主要检查对C语言基本概念的掌握情况,读者可根据学习进度选做部分习题。在完成习题的过程中,不但要选出正确的答案,而且要清楚不正确的选项错在何处,以加深对概念的理解。对于掌握不准的问题, 应该通过上机实验来检验。 【1.1】以下不正确的C语言标识符是____。 A) int B) a_1_2 C) ab1exe D) _x 【1.2】以下是正确的C语言标识符是____。 A) #define B) _123 C) %d D) \n 【1.3】下列四组字符串中都可以用作C语言程序标识符的一组是。 ??? A) print B) i\am C) Pxq D) str_l ??? _3d one_half My->book Cpp ??? oodb start$it line# pow ??? aBc 3pai His.age while

【1.4】下面各选项组中,均是C语言关键字的组是。 A) auto,enum,include B) switch,typedef,continue C) signed,union,scanf D) if,struct,type 【1.5】下列不属于C语言关键字的是。A) default B) register C) enum D) external 【1.6】C语言程序从main()函数开始执行,所以这个函数要写在____。 A) 程序文件的开始B) 程序文件的最后 C) 它所调用的函数的前面D) 程序文件的任何位置 【1.7】下列关于C语言的叙述错误的是____ A) 大写字母和小写字母的意义相同 B) 不同类型的变量可以在一个表达式中 C) 在赋值表达式中等号(=)左边的变量和右边的值可以是不同类型 D) 同一个运算符号在不同的场合可以有不同的含义

c语言程序设计课后习题答案高等教育出版社

#include<> main() { float x=,y=,z=; printf("x=%f\n",x); printf("y=%f\n",y); printf("z=%f\n",z); } (1) #include<> main() { int a=12,b=3; float x=,y=; printf("%f\n",(float)(a*b)/2); printf("%d\n",(int)x%(int)y); } (2) #include<> main() { int x=32,y=81,p,q; p=x++; q=--y; printf("%d %d\n",p,q); printf("%d %d\n",x,y); } #include<> main() { int x,b0,b1,b2,s; printf("Inputx:"); scanf("%d",&x); b2=x/100; printf("骰子出现 2 printf("骰子出现 3 printf("骰子出现 4 printf("骰子出现 5 printf("骰子出现 6

} (1) void Swap(int *x,int *y) { int *pTemp;.\n"); else if(strcmp(userInput,password)<0) printf("Invalid password!user inputpassword...\n"); return 0; } #include<> #define N 24 unsigned int CountLetter(char str[]); int main() { char a[N]; printf("Input a letter:\n"); gets(a); printf("The length of the letter is:%d\n",CountLetter(a)); return 0; } unsigned int CountLetter(char str[]) { char *p=str; int c=0,flag=0; while(*p!='\0') { if(*p!=' ') flag=1; else if(flag==1) { c++; flag=0; } p++; } return c+1; } #include<>

(完整版)C语言选择题(附答案)

第一单元C语言概述 一、选择题 1、C语言中主函数的个数为(A)个。 A)1 B)2 C)无穷个D)任意个 2、以下关于C语言描述错误的是(D)。 A)一个C程序总是从main函数开始执行T B)每个语句和数据声明的最后必须有一个分号T C)C语言的注释符是以“/*”开始并以“*/”结束的T D)一个C程序可以包含多个main函数F 3、C 语言源程序文件后缀为(C )。 A).EXE B).OBJ C).C D).ASM 4、C语言是由(C )组成的。 A)子程序B)主程序与子程序C)函数D)过程 5、C语言属于(B )语言 A)机器语言B)汇编语言C)高级语言D)面向对象语言 第二单元C语言基础 一、选择题 1、C语言中普通整型变量int在内存中占(B )字节。 A)1 B)2 C)3 D)4 2、下列不是C语言基本数据类型的是(A )。 A)字符型B) 整型 C) 浮点型D) 结构体 3、有关自增、自减运算,以下只有(D )是正确的。 A) ---f B) ++78 C) a—b++ D) d++ 4、已知A=7.5,B=2,C=3.6,表达式(A>B && C>A) || (AB)的值是(A )。 A)0 B)10 C)1 D)5

5、若有x=1,y=2,z=3,则表达式(x=‘A’)&(ch<=‘Z’) C) (ch>=‘A’)&&(ch<=‘Z’) D) (‘A’<= ch)AND(‘Z’>= ch) 7、判断整型变量digit是否为数字的正确表达式是(C )。 A) ‘0’<=ch<=‘9’B) (ch>=‘0’)&(ch<=‘9’) C) (ch>=‘0’)&&(ch<=‘9’) D) (‘0’<= ch)AND(‘9’>= ch) 8、一个C程序的执行是从(A )。 A)本程序的main函数开始,到main函数结柬 B)本程序文件的第一个函数开始,到本程序文件的最后一个函数结束 C)本程序的main函数开始,到本程序文件的最后一个函数结束 D)本程序文件的第一个函数开始,到本程序main函数结束 9、在以下标识符中,合法的是(C ) A)if B)0xy C)_xy D)case 10、C语言中各种类型的数据其实决定了占用内存的字节数。float占(C )。 A)一字节B)二字节C)四字节D)八字节 11、下列各选项中,(A )是有效的标识符。 A)ab B)3day C)day-3 D)#abc 12、以下叙述正确的是(C ) A) 在C程序中,每行只能写一条语句 B) 若a是实型变量,C程序中不允许a=10这种赋值。 C) 在C程序中,%是只能用于整数运算的运算符 D) 在C程序中,无论是整数还是实数,没有什么区别 13、有输入语句:scanf(“a=%d,b=%d,c=%d”,&a,&b,&c);为使变量a的值为1,b的值为3,c的值为2,则正确的数据输入方式是( B )。 A)132↙B)1,3,2↙ C)a=1 b=3 c=2↙D)a=1,b=3,c=2↙ 14、设整型变量a为5,使b不为2的表达式是( C )。 A)b = a/2 B)b = 6-(--a) C)b=a%2 D)b=a>3?2:1

C语言课后练习题答案第五章

作业四:简单程序设计 1.printf函数中用到格式符%5s,其中数字5表示输出的字符串占用5列。如果字符串长度大于5,则输出按方式(B);如果字符串长度小于5,则输出按方式(C)。(5分)(重要) A) 从左起输出该字符串,右补空格 B) 按原字符长从左向右全部输出 C) 右对齐输出该字符串,左补空格 D) 输出错误信息 2.阅读以下程序,当输入数据的形式为:25,13,10(注:表示回车),则正确的输出结果为(D)。(5分) main() { int x,y,z; scanf(“%d%d%d”,&x,&y,&z);要和这里一样 printf(“x+y+z=%d\n”,x+y+z); } A) x+y+z=48 B) x+y+z=35 C) x+z=35 D) 不确定值 3.根据下面的程序及数据的输入和输出形式,程序中输入数据的正确形式应该为(WXY)。(5分) main() { char ch1,ch2,ch3;

scanf(“%c%c%c”,&ch1,&ch2,&ch3); printf(“%c%c%c”,ch1,ch2,ch3); } 4.以下的输出结果是(x=1,y=2*sum*=3 10 Squard is : 100)。(5分) main() { int x=1,y=2; printf(“x=%d y=%d * sum * =%d\n”,x,y,x+y); printf(“10 Squared is : %d\n”,10*10); } 5.若a=3,b=4,c=5,x=1.2,y=2.4,z=-3.6,u=51274,n=128765,c1=’a’,c2 =’b’,想得到以下的输出格式和结果,请写出程序(包括定义变量类型和设计输出)。要求输出的结果如下:(20分) a= 3 b= 4 c= 5 x=1.200000,y=2.400000,z=-3.600000 x+y= 3.6 y+z=-1.20 z+x=-2.40 u= 51274 n= 128765 c1=’a’ or 97(ascll) c2=’b’ or 98(ascll) main()

C语言选择题(含答案)

C语言选择题(含答案) 选择题 1.以下叙述正确的是_____。 A) 在C程序中,main函数必须位于程序的最前面。 B) C语言本身没有输入输出语句。 C) C程序的每行只能写一条语句。 D) 在对一个C程序进行编译的过程中,可发现注释中的拼写错误。 2.下面四个选项中,均是不合法的用户标识符的选项是。 A) A B) float C) b-a D) _123 P_0 1a0 goto temp do _A int INT 3、下列四个选项中都是合法的转义字符的 A) ‘\’’‘\\’‘\n’B) ‘\’‘\017’‘\”’ C) ‘\018’‘\f’‘xab’D) ‘\\0’‘\101’‘x1f’ 4、设所有变量均为整型,则表达式z=(a=2,b=5,b++,a+b)的值是: A)7 B)8 C)6 D)2 5、若有代数式,则不正确的C语言表达式是: A) a/b/c*e*3 B) 3*a*e/b/c C) 3*a*e/b*c D) a*e/c/b*3 6、若希望当A的值为奇数时,表达式的值为”真”, A的值为偶数时,表达式的值为”假”。则以 下不能满足要求的表达式是_________。 A) A%2==1 B) !(A%2==0) C) !(A%2) D) A%2 7、以下程序的运行结果是 : main() { int m=6;

if(m++> 6) printf(" %d\n",m); e1se printf("%d\n",--m ); } A)4 B)5 C) 7 D) 6 8、当a=1,b=3,c=5,d=4,执行完下面一段程序后x 的值是 : if(a正确的输出结果为 main() { int x,y,z scanf("%d%d%d",&x,&y,&z ); printf(“x+y+z=%d\n” ,x+y+z);。 } A)x+y+z=48 B)x+y+z=35 C)x+y+z=35 D)不确定值 10、已知各变量的类型说明如下 int k,a,b; unsigned long w= 5; double x=1.42; 则以下不符合C语言语法的表达式是 : A) x%(-3) B) w+=-2

C语言第五章习题带答案更新Word版

练习5-1答案 一、选择题 1.合法的数组说明语句是( B )。 A.int a[]="string"; B.int a[]={0,1,2,3,4,5}; C.char a="string"; D.char a[5]={'0', '1', '2', '3', '4', '5'}; 2.以下对一维整型数组a的说明正确的是( D )。 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]; 3.已知:int a[10];,则对a数组元素的正确引用是( D )。 A.a[10] B.a[3.5] C.a(5) D.a[10-10] 4.以下对一维数组a进行正确初始化的语句是( C )。 A.int a[10]=(0, 0, 0, 0, 0); B.int a[10]={}; C.int a[]={0}; D.int a[2]={10, 9, 8}; 5.对以下说明语句的正确理解是( B )。 int a[10]={6, 7, 8, 9, 10}; A.将5个初值依次赋给a[1]至a[5] B.将5个初值依次赋给a[0]至a[4] C.将5个初值依次赋给a[6]至a[10] D.因为数组长度与初值的个数不相同,所以此语句不正确 二、填空题 6.求所有不超过200的N值,N的平方是具有对称性质的回文数。所谓回文数就是将一个数从左到右与从右到左读都是一样的,例如:34543和1234321都是回文数。 例如:满足题意要求的数有:N=1,11*11=121;N=111,111*111=12321。 #include main() {int m[16], n, i, t, count=0; long a, k; printf("Result is:\n"); for (n=10; n<200; n++) { k=0; t=1; a=n*n; for (i=1; a!=0; i++) { ①; a/=10; }

《C语言程序设计》课后习题参考答案

高等院校计算机基础教育规划教材《C++程序设计》课后习题参考答案 ――武汉大学出版社 习题1参考答案 一、选择题 1. A 2. D 二、填空题 1. BASIC、FORTRAN、AL_GOL60和COBOL 2. 8 3. 关键字 4. 编辑、编译、链接和运行 三、简答题 1.答: (1)C语言具有结构化的控制语句。C语言提供了结构化程序所必需的基本控制语句,实现了对逻辑流的有效控制。 (2)C语言具有丰富的数据结构类型。C语言除提供整型、实型、字符型等基本数据类型外,还提供了用基本数据类型构造出的各种复杂的数据结构,如数组、结构、联合等。C语言还提供了与地址密切相关的指针类型。此外,用户还可以根据需要自定义数据类型。(3)C语言具有丰富的运算符。C语言提供了多达34种运算符,丰富的数据类型与丰富的运算符相结合,使C语言的表达力更具灵活性,同时也提高了执行效率。 (4)C语言简洁、紧凑,使用方便、灵活,程序书写自由,有9种控制语句。 (5)C语言既具有高级语言的功能,又具有低级语言的许多功能,通常被称为中级计算机语言。它既是成功的系统描述语言,又是通用的程序设计语言。 (6)C语言与汇编语言相比,可移植性好。 (7)功能强大。C语言具有低级语言的一些功能,所以,生成目标代码质量高,程序执行效率高。现在许多系统软件都用C语言来描述,可以大大提高了编程效率。 2.答:运行一个C语言程序,一般需要经过如下几个步骤:①上机输入并编辑源程序;②编译源程序;③与库函数连接;④生成可执行目标程序;⑤运行目标程序。 3.答: (1)操作系统的设计与实现。C语言是一种应用非常广泛的结构化高级程序设计语言,既适合编写应用软件,又适合编写系统软件。

C语言题库及答案(选择题)

C语言题库(选择题) 1.C语言源程序的基本单位是()。 A.过程 B.函数 C.子程序 D.标识符 2.下列字符序列中,可用作C标识符的一组字符序列是()。 A. S.b,sum,average,_above B. class,day,lotus_1,2day C. #md,&12x,month,student_n! D. D56,r_1_2,name,_st_1 3.以下标识符中,不能作为合法的C用户定义标识符的是()。 A.a3_b3 B.void C._123 D.IF 4.以下数据中,不正确的数值或字符常量是()。 A.0 B.5L C.o13 D.9861 5.以下数值中,不正确的八进制数或十六进制数是()。 A.0x16 B.16 C.-16 D.0xaaaa 6.以下的选择中,正确的赋值语句是()。 A.a=1,b=2 B.j++ C.a=b=5; D.y=int(x) 7.以下运算符中,优先级最高的运算符是()。 A.?: B.++ C.&& D., 8.在C语言中,能代表逻辑值“真”的是()。 A.TRUE B.大于0的数 C.非0整数 D.非0的数 9.下列变量说明语句中,正确的是()。 A.char:a b c; B.char a;b;c; C.int x;z; D.int x,z; 10.下列字符序列中,不可用作C语言标识符的是()。 A.b70 B.#ab C.symbol D.a_1 11.以下不正确的叙述是()。 A.在C程序中所用的变量必须先定义后使用。 B.程序中,APH和aph是两个不同的变量。 C.若a和b类型相同,在执行了赋值语句a=b;后b中的值将放入a中,b中的值不变。 D.当输入数值数据时,对于整型变量只能输入整型值;对于实型变量只能输入实型值。 12.以下标识符中,不能作为合法的C用户定义标识符的是()。 A.For B.Printf C.WORD D.sizeof 13.以下标识符中,不能作为合法的C用户定义标识符的是()。 A.answer B.to C.signed D._if 14.以下标识符中,不能作为合法的C用户定义标识符的是()。 A.putchar B._double C._123 D.INT 15.以下数据中,不正确的数值或字符常量是()。 A.8.9e1.2 B.10 C.0xff00 D.82.5 16.以下数据中,不正确的数值或字符常量是()。 A.c B.66 C.0xaa D.50 17.以下运算符中,优先级最高的运算符是()。

C语言试题库(带详细讲解答案)

一单项选择题 1.(A)是构成C语言程序的基本单位。 A、函数 B、过程 C、子程序 D、子例程 2.C语言程序从C开始执行。 A) 程序中第一条可执行语句B) 程序中第一个函数 C) 程序中的main函数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 5~8题为相同类型题 考点:标识符的命名规则 (1)只能由字母、数字、下划线构成 (2)数字不能作为标识符的开头 (3)关键字不能作为标识符 选项A中的“-” ,选项B中“[”与“]”不满足(1);选项D中的int为关键字,不满足(3)

6.下列C语言用户标识符中合法的是(B)。 A)3ax B)x C)case D)-e2 E)union 选项A中的标识符以数字开头不满足(2);选项C,E均为为关键字,不满足(3);选项D 中的“-”不满足(1); 7.下列四组选项中,正确的C语言标识符是(C)。 A)%x B)a+b C)a123 D)123 选项A中的“%” ,选项B中“+”不满足(1);选项D中的标识符以数字开头不满足(2) 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 选项B中的“\”,”$” ,选项D中“>”,”#”,”.”,”-”不满足(1);选项C中的while为关键字,不满足(3) 9.C语言中的简单数据类型包括(D)。 A、整型、实型、逻辑型 B、整型、实型、逻辑型、字符型 C、整型、字符型、逻辑型 D、整型、实型、字符型 10.在C语言程序中,表达式5%2的结果是C。 A)2.5 B)2 C)1 D)3 详见教材P52~53. %为求余运算符,该运算符只能对整型数据进行运算。且符号与被模数相同。5%2=1;5%(-2)=1;(-5)%2=-1;(-5)%(-2)=-1; /为求商运算符,该运算符能够对整型、字符、浮点等类型的数据进行运算,5/2=2 11.如果int a=3,b=4;则条件表达式"a

C语言程序设计-------阅读程序题库及答案

阅读程序题 【2.1】以下程序的输出结果是。main(D ) { float a; a=1/100000000; printf("%g",a); } A) 0.00000e+00 B) 0.0 C) 1.00000e-07 D) 0 【2.2】下面程序的输出结果是B____。 #include main( ) { int x=10; { int x=20; printf ("%d,", x); } printf("%d\n", x); } A) 10,20 B) 20,10 C) 10,10 D) 20,20

【2.3】以下程序的输出结果是___B_。 main() { unsigned int n; int i=-521; n=i; printf("n=%u\n",n); }//变量i中的负号传送给变量n后,因n是无符号数,已不作为负号处理。 A) n=-521 B) n=521 C) n=65015 D) n=102170103 【2.4】以下程序的输出结果是。main(D ) { int x=10, y=10;printf("%d %d\n", x――, ――y); } A) 10 10 B) 9 9 C) 9 10 D) 10 9 【2.5】以下程序的输出结果是___B。 main() { int n=1; printf("%d %d %d\n",n,n++,n--); } // C语言在执行printf()时,对函数中的表达式表列的

处理顺序是从后向前,即先处理n- -,再处理n++,最后处理n, A) 1 1 1 B) 1 0 1 C) 1 1 0 D) 1 2 1 【2.6】以下程序的输出结果是____。 main() { int x=0x02ff,y=0x0ff00; printf("%d\n",(x&y)>>4|0x005f); } A) 127 B) 255 C) 128 D) 1 【2.7】以下程序的输出结果是____。 main() { int a=1; char c='a'; float f=2.0; printf("%d\n",(!(a==0),f!=0&&c=='A')); } A) 0 B) 1 【2.8】下面程序的输出结果是____。

C语言_基本选择题和参考答案

计算机程序设计基础(C语言) 单项选择练习题 一、基本概念 1. C语言程序是由 C 构成的。 A)一些可执行语言 B)main函数 C)函数 D)包含文件中的第一个函数 2.(A)是构成C语言程序的基本单位。 A、函数 B、过程 C、子程序 D、子例程 3.C语言程序从 C开始执行。 A) 程序中第一条可执行语句 B) 程序中第一个函数 C) 程序中的main函数 D) 包含文件中的第一个函数4.C语言程序从main()函数开始执行,所以这个函数要写在_D___。 A) 程序文件的开始 B) 程序文件的最后 C) 它所调用的函数的前面 D) 程序文件的任何位置 5、以下说法中正确的是(C)。 A、C语言程序总是从第一个定义的函数开始执行 B、在C语言程序中,要调用的函数必须在main( )函数中定义 C、C语言程序总是从main( )函数开始执行 D、C语言程序中的main( )函数必须放在程序的开始部分 6. 下列方法中错误的是(D)。 A.主函数可以分为两个部分:主函数说明部分和主函数体。 B.主函数可以调用任何非主函数的其它函数。 C.任何非主函数可以调用其它任何非主函数。 D.程序可以从任何非主函数开始执行。 7. 下列说法错误的是:(B) A.C程序运行步骤是编辑、编译、连接、执行。

B.C语言的变量名必须用小写,常量用大写。 C.C语言的三种基本结构是顺序、选择、循环。 D. C程序一定由函数构成的。 8.下列关于C语言的说法错误的是( B )。 A) C程序的工作过程是编辑、编译、连接、运行 B) C语言不区分大小写。 C) C程序的三种基本结构是顺序、选择、循环 D) C程序从main函数开始执行 9. 系统默认的C语言源程序扩展名为.C,需经过 C 之后,生 成.exe文件,才能运行? A) 编辑?编译 B )编辑?连接 C) 编译?连接 D) 编辑?改错 10.下列说法中正确的是(B)。 A.由于C源程序是高级语言程序,因此一定要在TC软件中输入。 B.由于C源程序是由字符流组成的,因此可以作为文本文件在任何 文本编辑的软件中输入。 C.由于C程序是高级语言程序,因此输入后即可执行。 D.由于C程序是高级语言程序,因此它是由命令组成的。 二、数据类型、运算符与表达式 1. 不是C语言提供的合法关键字是(B)。 A.switch B.cher C.case D.default 2.C语言提供的合法关键字是(D)。 A.next B.string C.do case D.default 3.下列不属于C语言中关键字的是 B A)long B)print C)default D)typedef

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