人民邮电出版社c语言课后题答案
程序设计基础(人民邮电出版社)答案第3章最简单的C程序设计

一、选择题1. C 语言中,执行下列语句时,要使 x,y 的值均为1.25,正确的输入是 _C scanf(“x=%f,y=%”f,&x,&y);A. 1.25,1.25 C. x=1.25,y=1.252. 已知i,j,k 为int 型变量,若从键盘输入1, 2, 3/,使i 的值为1,j 的值为2, k 的值为 3,则以下选项中正确的输入语句是 A.scanf(“%2d%2d%2d ”,&i,&j,&k) ; C. scanf(“%d,%d,%d ”,&i,&j,&k) ;D. scanf(“i=%d,j=%d,k=%d ”,&i,&j,&k) ;3.以下程序段的执行结果是 int a=1234 ;printf(“%2d\n ”,a); A. 12 C. 12344. 如果x 为float 类型变量,则以下语句输出为 x=213.82631;printf(“%4.2f\n ”,x); A. 213.82 C. 213.826315. 执行下列程序时输入: 123 456 789/,输出结果是 ___D #include<stdio.h> void main(){char s[10]; int c,i;scanf(“%c ”,&c); scanf(“%d ”,&i); scanf(“%s ”,s);printf( “%c,%d,%s\n ”,c,i,s);}A. 123,456,789 C. 1,23,456,789二、填空题1.在 printf() 函数中以小数形式输出单精度、 双精度实数,应采用格式符 __%f___。
2•在seanf()函数中要输入一个字符串,应采用格式符 __%s3. 有以下程序,输入123456789/,其输出结果是 _12,56,789.00000Q_。
C语言程序设计与应用课后题答案 人民邮电出版社

第二章1. (1)1 (2)10 20 0 (3)0 90 80 70 60 50 40 30 20 1 (4)4 55 99 (5)1 (6)67 G2. (1)C (2)B (3)A (4)C (5)B (6)C第三章(1) 没有输出结果,无限循环(2) 8 5 2(3) x<0 x<amin3.2(1) D(2) D(3) C(4) B3.3(1)#include <stdio.h>main(void){int i=1;while(i<101){printf((i%5)?(""):("%d\n"),i);i++;}}(2)#include <stdio.h>main(void){int i,j;for(i=0;i<7;i++){if (i<4){for(j=3-i;j>0;j--)printf(" ");for(j=0;j<(2*i+1);j++)printf(" *");}else{for(j=i-3;j>0;j--)printf(" ");for(j=13-2*i;j>0;j--)printf(" *");}printf("\n");}}或者#include <stdio.h>main(void){int i,j;for(i=0;i<4;i++){for(j=3-i;j>0;j--)printf(" ");for(j=0;j<(2*i+1);j++)printf(" *");printf("\n");}for(i=3;i>0;i--){for(j=0;j<(3-i)+1;j++)printf(" ");for(j=0;j<(2*i-1);j++)printf(" *");printf("\n");}}(3)#include<stdio.h>main(void){int i,j,k;for(i=1;i<9;i++)for(j=0;j<9;j++)for(k=0;k<9;k++)if((i*i*i+j*j*j+k*k*k)==(i*100+j*10+k))printf("%d%d%d\t",i,j,k);}或者main(void){int i,j,k,n;printf("'water flower'number is:");for(n=100;n<1000;n++){i=n/100;/*分解出百位*/j=n/10%10;/*分解出十位*/k=n%10;/*分解出个位*/if(i*100+j*10+k==i*i*i+j*j*j+k*k*k){printf("%-5d",n);}}printf("\n");}(4)#include "stdio.h"int main (){int i_rows; /* 打印字符的行数*/char c_str; /*每次打印的字符*/for(i_rows=0;i_rows<7;i_rows++){for(c_str='G'-i_rows;c_str>('G'-7);c_str--)printf("%c",c_str);printf("\n");}}(5)1.程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
C语言教材课后习题答案

2.简述程序设计语言发展的过程
程序设计语言经过最初的机器代码到今天接近自然语言的表达, 经过了四代的演变。 一 般认为机器语言是第一代,符号语言即汇编语言为第二代,面向过程的高级语言为第三代, 面对象的编程语言为第四代。
3.简述高级程序设计语言中面向过程与面向对象的概念。
“面向过程”是一种以过程为中心的编程思想。首先分析出解决问题所需要的步骤,然 后用函数把这些步骤一步一步地实现, 使用的时候依次调用函数即可。 一般的面向过程是从 上往下步步求精,所以面向过程最重要的是模块化的思想方法。 “面向对象”是一种以事物为中心的编程思想。面向对象的方法主要是将事物对象化, 对象包括属性与行为。 面向过程与面向对象的区别:在面向过程的程序设计中,程序员把精力放在计算机具体 执行操作的过程上,编程关注的是如何使用函数去实现既定的功能;而在面向对象的程序设 计中,技术人员将注意力集中在对象上,把对象看做程序运行时的基本成分。编程关注的是如 何把相关的功能(包括函数和数据)有组织地捆绑到一个对象身上。
不能使变量 k 得到正确数值的原因是: scanf("%d", &k);中的格式控制类型与变量 k 的定义类型不匹配,应将%d 改为%f.
习题 4 答案
选择题 1. B 2. A 3. B 4. B 阅读程序,写结果 7. 12 8.13 9. *0**2* 10. if(s>=90) m=4; else if(s>=80) m=3; else if(s>=70) m=2; else if(s>=60) m=1; else m=0; 11.输入 4 个整数 a,b,c,d,编写程序,将它们按从大到小顺序输出。 #include<stdio.h> main() { int a,b,c,d,t; scanf("%d%d%d%d",&a,&b,&c,&d); if(a<b) {t=a;a=b;b=t;} if(a<c) {t=a;a=c;c=t;} if(a<d) {t=a;a=d;d=t;} if(b<c) {t=b;b=c;c=t;} if(b<d) {t=b;b=d;d=t;} if(c<d) {t=c;c=d;d=t;} printf("%4d%4d%4d%4d",a,b,c,d); } 12.据所输入的 3 条边长值,判断它们能否构成三角形,如能构成,再判断是等腰三角形、 直角三角形还是一般三角形? 源程序: 5. C 6. B
C语言课后习题参考答案(前5章)

《C语言程序设计基础》书后习题参考答案(无编程题答案,红色为书上错误)第二章习题一、选择题。
1、在C语言中,要求参加运算的数必须是整数的运算符是()A)% B)/ C)!D)*2、若已定义x和y为double类型,则表达式“x=1.0,y=x+3/2”的值是()A)1 B)2 C)2.0 D) 2.53、若变量已正确定义并赋值,符合C语言语法的表达式是()A)a=a+7; B) a=7+b+c,a++ C) int (12.3/4 ) D) a=a+7=c+b4、若有定义:int x=3,y=2;float a=2.5,b=3.5;则表达式(x+y)%2+(int)a/(int)b的值为()A)1.0 B)1 C) 2.0 D)25、若x和n均是int型变量,且x的初值为12,n的初值为5 ,则执行表达式x%=(n%=2) 后x 的值为()A) 0 B)1 C) 2 D)36、假设所有变量均为整型,则表达式(a=2,b=5,a++,b++,a+b)的值为()A)7 B)8 C)9 D)107、指出下列哪一个选项的程序是错误的()A)#include<stdio.h> B) #include<stdio.h>void main( ) void main( ){int x,y,z; {int x,y,z;x=0;y=x+1; x=0,y=x+1;z=x+y; z=x+y;} }C) #include<stdio.h> D) #include<stdio.h>void main( ) void main( ){int x,y,z; {int x,y,z;x=0;y=x+1, x=0,y=x+1;z=x+y; z=x+y,} }8、若a为整型变量,则以下语句( )a=-2L;printf(“%d\n”,a);A)赋值不合法B)输出值为-2 C)输出为不确定值D)输出值为29、若变量a,i已经正确定义,且i已正确赋值,则合法的语句是()A)i=int(a) B) ++i; C)a=a++=5; D) a=int(i);10、若执行以下程序段后,c3的值为()int c1=1,c2=2,c3;c3=1.0/c2*c1;A)0 B)0.5 C)1 D)211、如下程序的运行结果是()#include<stdio.h>void main( ){ int y=3,x=3,z=1;printf(“%d%d\n”,(++x,y++),z+2);}A) 3 4 B) 4 2 C) 4 3 D) 3 312、以下程序的输入结果为()#include<stdio.h>void main( ){int i=4,a;a=i++;printf(“a=%d,i=%d’,a,i);}A)a=4,i=4 B)a=5,i=4 C)a=4,i=5 D)a=5,i=513、以下程序的输出结果是()#include <stdio.h>void main( ){ int a=5,b=4,c=6,d;printf(“%d\n”,d=a>b?(a>c?a:c):( b); //多了(}A) 5 B) 4 C) 6 D) 不确定14、在C语言中,如果下面的变量都是int类型,则输出的结果是()sum=pad=5;pad=sum++,pad++,++pad;printf(“%d\n”,pad);A)7 B)6 C)5 D)415、已知int i;float f;,正确的语句是()A)(int f)%i; B)int(f)%i; C) int(f%i); D)(int)f%i;16、已知int j,i=1;执行语句j=-i++;后,j的值是()A)1 B)2 C)-1 D)-217、已知各变量的类型说明如下:int k,a,b;unsigned long w=5;double x=1.42;则以下不符合C语言语法的表达式是()A)x%(-3) B)w+=-2 C)k=(a=2,b=3,a+b) D)a+=a-=a*(a=3)18、C语言中运算对象必须是整型的运算符是( )A) %= B) / C) = D)<=19、有以下程序main(){ int m=12,n=34;printf("%d%d",m++,++n);printf("%d%d\n",n++,++m);}程序运行后的输出结果是( )A)12353514 B)12353513 C)12343514 D)1234351320、下面程序的输出结果是()#include<stdio.h>main( ){int x=5,y=3;printf(“%d\n”,y=x/y); }A)0 B)1 C)3 D)不确定的值21、执行下列程序中的输出语句后,a的值是()#include<stdio.h>void main( ){int a;printf(“%d\n”,(a=3*5,a*4,a+5)); }A) 65 B)20 C)15 D)1022、执行下列程序时输入1234567,程序的运行结果为()#include<stdio.h>main( ){int x,y;scanf (“%2d%2ld”,&x,&y);printf(“%d\n”,x+y); }A)17 B)46 C)15 D)923 、已知char a;int b;float c;double d; 则表达式a*b+c-d结果类型为()A) double B)int C)float D) char二、填空题1、若i为int整型变量且赋值为6,则运算i++后的表达式的值是__6__,变量i的值是___7___。
c++语言程序设计教程(人民邮电出版社) 课后习题解答610

第6章;类和对象(一)练习题66.1判断题×1.使用class定义的类,其默认的访问权限是公有的,使用struct定义的类,其默认的访问权限是私有的。
×2.类中的成员函数都是公有的,数据成员都是私有的。
×3.定义在类体内的成员函数是内联函数,定义在类体外的成员函数不能是内联函数。
√4.类定义后,它的成员个数及名称就不会再被改变了。
×5.定义或说明对象时,系统会自动调用构造函数为创建的对象初始化。
如果类中没有定义任何构造函数时,就无法给定义的对象初始化。
√6.定义一个对象时,系统只为该对象的数据成员开辟内存空间,而成员函数是同类对象共享的。
√7.对象成员的表示方法与结构变量成员的表示方法相同。
√8.创建对象时系统自动调用相应的构造函数为对象初始化,没有相应的构造函数时,系统会自动生成。
√9.构造函数是一个其名与类名相同的特殊的成员函数。
×10.析构函数是一个函数体为空的成员函数。
√11.构造函数和析构函数都是系统自动调用的成员函数。
×12.构造函数和析构函数都可以重载。
√13.成员函数与一般函数一样可以重载、内联和设置参数的默认值。
×14.静态成员是指静态对象的成员。
×15.静态数据成员必须在构造函数的成员初始化列表中进行初始化。
√16.静态成员都可以使用类名加作用域运算符的方法来引用。
×17.静态成员函数中引用静态数据成员和非静态数据成员的方式是相同的。
√18.常成员指的是类体内使用const关键字说明的常数据成员和常成员函数。
×19.常数据成员在常成员函数中的值是不允许改变的,而在非常成员函数中是允许改变的。
√20.常对象需要引用常成员函数,而不能引用非常成员函数。
×21.常对象的数据成员都是常数据成员。
√22.友元函数是说明在类体内的非成员函数,它可以访问类中的所有成员。
×23.可以把一个一般函数说明为某类的友元函数,也可以将某类的成员函数说明为另类的友元函数。
C#程序设计及应用教程(第2版)课后答案__人民邮电出版社(马骏、邓居英)

} } }
9、错误和异常有什么区别,为什么要进行异常处理,用于异常处理的语句有哪些? 【解答】
错误是指在执行代码过程中发生的事件,它中断或干扰代码的正常流程并创建异常对象。 当错误中断流程时,该程序将尝试寻找异常处理程序(一段告诉程序如何对错误做出响应的 代码),以帮助程序恢复流程。换句话说,错误是一个事件,而异常是该事件创建的对象。
Console.WriteLine("你输入的字符个数不是 5 个,请重新输入。"); } else {
ok = true; for (int i = 0; i < 5; i++) {
char c = str[i]; if (c < 'A' || c > 'Z') {
Console.WriteLine("第{0}个字符“{1}”不是大写字母,请重新 输入。", i + 1, c);
12.34--1,234.00%good 0--good 456--00456good 5、编写一个控制台应用程序,输出 1 到 5 的平方值,要求:
1) 用 for 语句实现。 2) 用 while 语句实现。 3) 用 do-while 语句实现。 【解答】
using System; using System.Collections.Generic; using System.Text; namespace outputSquareValue {
【解答】
using System; using System.Collections.Generic; using System.Text; namespace testOutput {
C语言程序设计教程(人民邮电出版社) 课后习题答案

第1章C++语言概述练习题11.1 判断题×1.C++语言和C语言都是面向对象的程序设计语言。
√2.面向对象方法具有封装性、继承性和多态性。
√3.C语言是C++语言的一个子集。
C++语言继承了C语言。
×4.C++语言程序与C语言程序一样都是函数串。
×5.C++语言支持封装性和继承性,不支持多态性。
√6.C++语言比C语言对数据类型要求更加严格了。
√7.C++语言对C语言进行了一次改进,使得编程更加方便了。
×8.C++源程序在编译时可能出现错误信息,而在连接时不会出现错误信息。
√9.编译C++源程序时,出现了警告错(Warning)也可以生成可执行文件。
√10.C++语言程序的实现也要经过编辑、编译连接和运行3个步骤。
1.2 单选题1.下列关于面向对象概念的描述中,错误的是(C )。
A.面向对象方法比面向过程方法更加先进B.面向对象方法中使用了一些面向过程方法中没有的概念C.面向对象方法替代了结构化程序设计方法D.面向对象程序设计方法要使用面向对象的程序设计语言2.下列各种高级语言中,不是面向对象的程序设计语言是(D )。
A.C++ B.JavaC.VB D.C3.下列关于类的描述中,错误的是( A )。
A.类就是C语言中的结构类型B.类是创建对象的模板C.类是抽象数据类型的实现D.类是具有共同行为的若干对象的统一描述体4.下列关于对象的描述中,错误的是(C )。
A.对象是类的一个实例B.对象是属性和行为的封装体C.对象就是C语言中的结构变量D.对象是现实世界中客观存在的某种实体5.下列关于C++程序中使用提取符和插入符的输入/输出语句的描述中,错误的是(C )。
A.提取符是对右移运算符(>>)重载得到的B.插入符是对左移运算符(<<)重载得到的C.提取符和插入符都是双目运算符,它们要求有两个操作数D.提取符和插入符在输入/输出语句中不可以连用1.3 填空题1.C++语言具有面向对象方法中要求的三大特性:封装性、继承性和多态性。
C语言程序设计教程第2版 课后答案_人民邮电出版社_宗大华_陈吉人_百度

本文由airalex1982贡献 pdf文档可能在WAP端浏览体验不佳。
建议您优先选择TXT,或下载源文件到本机查看。
《C 语言程序设计教程(第 2 版) 》习题解答 第 1 章习题解答 一、填空 1.机器语言即是指计算机本身自带的 指令系统 。
完成这个翻译工作 2. 将汇编语言编写的程序翻译成机器语言程序的过程称为 汇编 , 的程序称为 汇编程序 。
3.在C语言程序中,写“\110”和写“\x68” ,分别代表字母 H 和字母 h 。
4.在用New命令创建新的C源程序时,文件名默认为是 NOMANE.C 。
5.C语言程序都是从名为 main 的函数它开始执行的。
二、选择 1.下面给出的命令中, (C)不能保存源程序对应的“.OBJ”文件。
A.Make EXE File B.Run C.Save D.Compile to OBJ 分析:Compile to OBJ 是文件的编译命令;Make EXE File 是一次完成编译和连接的命 令;在没有编译、连接的前提下,直接使用 Run 命令,就会先完成编译,再进行连接,最 后运行。
所以,这三个命令都会保存由源程序产生出的“.OBJ”文件。
而 Save 命令用于编 辑完源程序后,对源程序的保存,即保存“.C”文件。
因此,本题的答案应该是选择 C。
2.下面给出的编辑命令中, (B)是用来定义块首标记的。
A.Ctrl-KK B.Ctrl-KB C.Ctrl-KV D.Ctrl-KH 3.下面给出的编辑命令中, (A)是用来定义块尾标记的。
A.Ctrl-KK B.Ctrl-KB C.Ctrl-KV D.Ctrl-KH 4.以下的(C)是不正确的转义字符。
A.’\\’ B.’\’’ C.’\81’ D.’\0’ 5.转义字符\x65 对应的字母是(C) 。
A.A B.a C.e D.E 三、是非判断(√,×) 1.Turbo C 中,只有命令 New 才能创建新的源程序文件。
《C语言程序设计案例教程》(第2版)习题答案 北邮

模块1习题答案一、选择题1.D2.A3.B4.C5.C6.C二、模仿编程1.参考程序:#inc1ude"stdio.h"main()(f1oatarea,r=2.5,pi=3.1415926;area=pi*r*r;Printf("area=%f∖n",area);)2.略。
模块2习题答案一、选择题1.B2.A3.D4.A5.D6.A7.B8.A9.C10.D二、编程题1.参考程序:#inc1ude"stdio.h"main()(f1oatarea,s z r=2.5,pi=3.1415926;area=pi*r*r;s=2*pi*r;printf("area=%Λns=%f∖n",area,s);)2.参考程序:#inc1ude<std1ib.h>#inc1ude<stdio.h>main()(inta;intb;intc,d;a=1500z b=350;c=a∕b;〃商数d=a%b;〃余数Printf("商数为:%d∖n",c);Printf("余数为:%d∖n",d);return0;)3.参考程序:#inc1ude<stdio.h>#inc1ude<math.h>main()(f1oata,b z x,½z;a=2;b=3;x=3.5;y=2.6;z=(a+b)∕2+sqrt(a)-(y-x);printf("%f",z);)4.略。
模块3习题答案一、选择题1.A2.C3.B4.D5.A6.C7.B8.D9.B10.D二、编程题1参考程序:#inc1ude<stdio.h>intmain()(inthours;f1oatwage;f1oatsa1ary;SCanf("%d%f",&hours,&wage);sa1ary=hours*wage*(1-0.1);printf("thesa1aryshou1dbe%f∖n",sa1ary);)2.参考程序:#inc1ude<stdio.h>intmain()(f1oatf,c;Primf("输入华氏温度:∖n");scanf('"%f"Λf);c=5*(f-32)∕9;Printf("对应的摄氏温度是:%5.2f∖n"z c);)3.参考程序:#inc1ude<stdio.h>#inc1ude<std1ib.h>intmain()intnum,a,b z c;〃输入三位数Printf("请输入一个三位整数:\n”);SCanf("%d",&num);〃输出各位数a=num∕100;b=(num-a*100)∕10;c=(num-a*100-b*10);Printf("千位:%d,十位:%d,个位:%d∖n",a,b,c);return0;)模块4习题答案一、选择题1.B2.B3.D4.C5.A6.C7.C8.C9.A10.A二、编程题1参考程序:#inc1ude<stdio.h>intmain()(charc;c=getchar();〃读入一个字符,存储在c中。
程序设计基础(人民邮电出版社)答案第2章 数据表示及数据运算

1. 填空题⑴在C语言中,用“\”开头的字符序列称为转义字符。
转义字符“\n”的功能是____换行____;转义字符“\r”的功能是___ 回车_______。
⑵运算符“%”两侧运算对象的数据类型必须都是____整型_______;运算符“++”和“--”运算对象的数据类型必须是______变量______。
⑶表达式8/4*(int)2.5/(int)(1.25*(3.7+2.3))值的数据类型为___整型_________。
⑷表达式(3+10)/2的值为_______6___________。
⑸设x=2.5,a=7,y=4.7,则算术表达式x+a%3*(int)(x+y)%2/4的值是2.5 。
2. 选择题⑴下列4组选项中,均不是C语言关键字的选项是_____A__。
A. define IF typeB. getc char printfC. include case scanfD. while go pow⑵下列4组选项中,均是合法转义字符的选项是___A____。
A. ‘\”’‘\\’‘\n’B. ‘\’‘\017’‘\”’C. ‘\018’‘\f’‘xab’D. ‘\\0’‘\101’‘xlf’⑶已知字母‘b’的ASCII码值为98,如ch为字符型变量,则表达式ch=‘b’+‘5’-‘2’的值为___A____。
A. eB. dC. 102D. 100⑷以下表达式值为3的是____B___。
A. 16-13%10B. 2+3/2C. 14/3-2D. (2+6)/(12-9)⑸以下叙述不正确的是____D___。
A. 在C程序中,逗号运算符的优先级最低B. 在C程序中,MAX和max是两个不同的变量C. 若a和b类型相同,在计算了赋值表达式a=b后,b中的值将放入a中,而b中的值不变D. 当从键盘输入数据时,对于整型变量只能输入整型数值,对于实型变量只能输入实型数值⑹以下非法的赋值语句是 CA. n=(i=2,++i);B. j++; C). ++(i+1); D. x=j>0;⑺以下选项中合法的实型常数是 CA. 5E2.0B. E-3C. .2E0D. 1.3E⑻设a和b均为double型变量,且a=5.5、b=2.5,则表达式(int)a+b/b的值是 DA. 6.500000B. 6C. 5.500000D. 6.000000⑼与数学式子3*x n/(2x-1) 对应的C语言表达式是CA. 3*x^n(2*x-1)B. 3*x**n(2*x-1)C. 3*pow(x,n)*(1/(2*x-1))D. 3*pow(n,x)/(2*x-1)⑽已有定义:int x=3,y=4,z=5;,则表达式!(x+y)+z-1&&y+z/2的值是 DA. 6B. 0C. 2D. 1⑾若有定义:int a=8,b=5,c;,执行语句c=a/b+0.4;后,c的值为 BA. 1.4B. 1C. 2.0D. 2⑿若变量a是int类型,并执行了语句:a='A'+1.6;,则正确的叙述是 DA. a的值是字符CB. a的值是浮点型C. 不允许字符型和浮点型相加D. a的值是字符'A'的ASCII值加上1。
C语言学习与应用课后习题答案 学习任务四参考答案 北邮

学习任务四参考答案问题4T:使用当型循环结构编写程序计算10!的值,即1~10的自然数之积。
(1)绘制程序框图:(2)编写程序代码:#incIude"stdio.h"voidmain()( inti,s;i=1;s=1;whi1e(i<=10)(s*=i;i++;)printf(1,10!=%d",s);getchar(); 说明整型变量:恁『0Is=s*i|输出S I问题4-2使用直到型循环结构编写程序,计算1~100的所有偶数之和。
(1)绘制程序框图:(2)编写程序代码:#inc1ude,,stdio.h"voidmain()(inti,s;i=0;s=0;do(s+=i;i=i+2;}whi1e(i<=100);Printf(TIOO所有偶数和二%d",s);getchar();问题4-3使用for循环结构编写程序,计算1~100的所有奇数之和。
for(i=1;i<=100;i=i÷2)(s+=i;)printf("Γ1OO所有奇数和%d",s);getchar();问题4-4使用循环嵌套编写程序使其输出如下图形。
**********#incIude"stdio.h"voidmain()(inti,j;for(i=1;i<=6;i++)((j=1;j<=i;j++)for(pri∏tf(π*");)printf("∖nπ);)getchar();1问题4-5补充程序,实现输出1〜50中能被7整除的数的功能,并画出流程框图。
#inc1ude,,stdio.h"voidmain(){inti;for(i=1;i<=50;i÷+){if(i%7!=0)continue;printf(1,%d∖n,';i);绘制程序框图:编程训练4-1-1计算1〜n的自然数之和。
数据结构C语言版(第2版)严蔚敏人民邮电出版社课后习题答案

数据结构( C语言版)(第 2版)课后习题答案李冬梅2015.3目录第 1 章绪论 (1)第 2 章线性表 (5)第 3 章栈和队列 (13)第 4 章串、数组和广义表 (26)第 5 章树和二叉树 (33)第 6 章图 (43)第 7 章查找 (54)第 8 章排序 (65)第1章绪论1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。
答案:数据:是客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的总称。
如数学计算中用到的整数和实数,文本编辑所用到的字符串,多媒体程序处理的图形、图像、声音、动画等通过特殊编码定义后的数据。
数据元素:是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。
在有些情况下,数据元素也称为元素、结点、记录等。
数据元素用于完整地描述一个对象,如一个学生记录,树中棋盘的一个格局(状态)、图中的一个顶点等。
数据项:是组成数据元素的、有独立含义的、不可分割的最小单位。
例如,学生基本信息表中的学号、姓名、性别等都是数据项。
数据对象:是性质相同的数据元素的集合,是数据的一个子集。
例如:整数数据对象是集合N={0 ,± 1,± 2,, } ,字母字符数据对象是集合C={‘A’,‘B’, , ,‘Z’,‘ a’,‘ b’, , ,‘z ’} ,学生基本信息表也可是一个数据对象。
数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。
换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。
逻辑结构:从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。
因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。
存储结构:数据对象在计算机中的存储表示,也称为物理结构。
抽象数据类型:由用户定义的,表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称。
具体包括三部分:数据对象、数据对象上关系的集合和对数据对象的基本操作的集合。
C语言课后习题答案(第1-8章)

C语言课后习题答案(第1-8章)1.有的编程题答案有多种,只给出一种参考答案。
2.结合课本学习编程思想与技巧。
第一章C语言概述一、简答题1.(1)语言简洁、紧凑,使用方便、灵活;(2)运算符丰富;(3)具有丰富的数据类型;(4)具有结构化的控制语句;(5)语法限制不太严格,程序设计自由度大;(6)C语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接访问硬件;(7)生成目标代码质量高,程序执行效率高;(8)用C 语言写的程序可移植性好,基本上不作修改就能用于各种型号的计算机和各种操作系统。
2.顺序结构,分支结构,循环结构3.所谓算法就是为解决一个问题而采取的方法和步骤。
算法的特性:有穷性、确定性、输入、输出、可行性。
表示算法的方式:(1)用自然语言表示;(2)用流程图表示;(3)用N—S流程图表示;(4)用伪代码表示;(5)用计算机语言表示。
二、算法1.瓶子A里盛有醋瓶子B里盛有酱油有一个空瓶C将A中的醋倒入C将B中的酱油倒入A将C中的醋倒入B2.输入一个数放在a中max = a以下步骤重复9次:输入一个数放在a中如果a>max,max=a打印max的值3.如果a<b< bdsfid="85" p=""></b<>temp=aa=bb=temp如果c>atemp = aa=cc=temp否则如果c>btemp=bb=cc=temp打印a,b,c的值4.i=1sum=0以下程序循环100遍: sum=sum+i i=i+1 打印sum 的值5.如果(n 除以3的余数为0 并且 n 除以5的余数为0)n 能够同时被3和5整除否则 n 不能够同时被3和5整除 6.i=101以下语句循环50遍:j=2 flag=1 当j<(i 除以2的整数部分)时循环以下语句:如果i 除以j 的余数为零flag=0 退出该循环如果flag==1 打印i 的值 i=i+2 7.如果m做以下循环,直到m,n 能够被i 整除:如果m 能够被i 整除并且n 能够被i 整除 i 即是m 和n 的最大公约数跳出循环否则 i=i-1 打印i 的值8.data=b*b —4*a*c 如果data >0否则如果data=0 x1=x2=—b/2 否则无实数解三、编程题1.main () { a data b x 2)(1+-=adata b x 2)(2--=printf(“How do you do?\n”);printf(“##############################\n”);}2.main(){int a,b,c;scanf(“%d%d%d”,&a,&b,&c);printf(“sum=%d”,a+b+c);}第二章数据类型与表达式一、单项选择题1. B2. C3. A4. A5. D6. B7.A8.C9.D二、写出下列程序的运行结果1.aabb cc abcAN2.ab97983. 9,11,9,104.a=2,b=3,c=25.s1=2.500000s2=3三、编程题main(){char c1='c',c2='h',c3='i',c4='n',c5='a';c1=c1+4;c2=c2+4;c3=c3+4;c4=c4+4;c5=c5+4;printf("%c%c%c%c%c\n",c1,c2,c3,c4,c5);}第三章顺序程序设计选择题1)B 2)D 3)D 4)A 5)A 6)B 7)B 8)A 9)D 10)C 11)D 12)A填空题1)b 2)261 3)25 21 37 4)abc 5)5.0,4,c=3 6)3编程题#define PI 3.1415926main( ){float h, r, l, sv, sz ;printf(“请输入圆的半径r,圆柱高h:\n”) ;scanf(“%f,%f”,&r, &h) ;l=2* PI *r ;s= PI *r*r ;sv=3.0/4.0* PI *r*r*r ;sz= PI *r*r*h ;printf(“圆周长为:l=%6.2f, 圆面积为:s=%6.2f\n”, l, s) ;printf(“求体积为:sv=%6.2f, 圆柱体积为:sz=%6.2f\n”, sv, sz) ;}2、main( ){float c, f ;printf(“请输入一个华氏温度:\n”) ;scanf(“%f”, &f) ;c=5.0/9.0*(f-32) ;printf(“摄氏温度为:%6.2f\n”, c) ;}第四章循环程序设计一、选择题1.D2.D3.D4.C5.D6.A7.B8.B9.A 10.D.11.B 12.A 13.B 14.C 15.C 16.A 17.A 18.B 19.D 20.D21.A二、填空题1.5858582.03.184.89215.20,06.67.1,3,28.Year%400==0year%100!=0count++三、编程题1.main(){long a;scanf(“%ld”,&a);if (a>=10000&&a<=99999) printf(“这是个五位数”);else if (a>=1000&&a<=9999) printf(“这是个四位数”);else if (a>=100&&a<=999) printf(“这是个三位数”);else if (a>=10&&a<=99) printf(“这是个二位数”);else if (a>=0&&a<=9)printf(“这是个一位数”);elseprintf(“输入错误”);}3.main(){int a;int g,s,b;//个位、十位、百位printf("水仙花数有:\n"); for(a=100;i<=999;a++){g=a%10;s=a/10%10;b=a/100;if (a==g*g*g+s*s*s+b*b*b) printf("%d ",a);}printf("\n");}4、main(){int i,n;printf("input n:");scanf("%d",&n);printf("\n%d=",n);for(i=2;i<=n;i++){while(i!=n)if(n%i==0){printf("%d*",i);n/=i;} else break;}printf("%d\n",n);}5、#include “stdio.h”main(){char c;int w,x,y,z;w=x=y=z=0;while((c=getchar())!=’\n’){if((c>’a’&&c<’z’)||(c>’A’&&c<’Z’)) w++;else if (c==’’)x++;else if (c>’0’&&c<’9’)y++;else z++;}printf(“英文字母个数:%d\n”,w); printf(“空格个数:%d\n”,x);printf(“数字个数:%d\n”,y);printf(“其他字母个数:%d\n”,z); }6、main(){float h=100,t=100;int j;for(j=1;j<10;j++){t=t/2;h=h+t*2;}printf(“共经过:%f 米\n”,h); printf(“第十次反弹%f 米\n”,t/2); }第五章数组一、单项选择题1. B2. A3. C4. C5. D6. B7.C8.B9.C 10. B二、写出下列程序的运行结果1.S=3682.*************************3.S1=18S2=104.!margorP5.数字0的出现次数是:3数字1的出现次数是:2数字2的出现次数是:2数字3的出现次数是:2数字4的出现次数是:0数字5的出现次数是:1数字6的出现次数是:1数字7的出现次数是:1数字8的出现次数是:1数字9的出现次数是:1 三、编程题1.#include "stdio.h" main(){int a[11];int i,j,t;printf("input 10 number:\n");for (i=1;i<11;i++)scanf("%d",&a[i]);printf("\n");for (i=1;i<=9;i++)for (j=1;j<=10-i;j++)if (a[j]<a[j+1])< bdsfid="320" p=""></a[j+1])<> {t=a[j];a[j]=a[j+1];a[j+1]=t;}printf("the sorted number is:\n");for (i=1;i<11;i++)printf("%4d",a[i]);}2.#include "stdio.h"main(){int a[11],i,b;printf("imput 10 sorted number:\n");for (i=0;i<10;i++)scanf("%d",&a[i]);printf("input an integer:\n");scanf("%d",&b);for (i=9;i>=0&&a[i]>b;i--)a[i+1]=a[i];a[i+1]=b;printf("sorted numbers:\n");for (i=0;i<11;i++)printf("%5d",a[i]);}3.#include "stdio.h"main(){int a[5],i,j,t;printf("input 5 integer:\n");for (i=0;i<5;i++) /*输入5个整数*/scanf("%d",&a[i]);for (i=0,j=4;i<="" bdsfid="348" p="">{t=a[i];a[i]=a[j];a[j]=t;}for (i=0;i<5;i++) /*逆序存放后重新输出*/printf("%5d",a[i]);}4.#include "stdio.h"main(){int i,j,a[10][10]={{1},{1,1}};for (i=2;i<10;i++) /*给二维数组每个元素赋值*/ {a[i][0]=1; for (j=1;j<=i;j++)a[i][j]=a[i-1][j-1]+a[i-1][j];}for (i=0;i<10;i++) /*输出二维数组*/{for (j=0;j<=i;j++)printf("%-5d",a[i][j]);printf("\n");}}5.#include "stdio.h"main(){int a[3][4],i,j,max,row,col;printf("input 3*4 matrix:\n");for (i=0;i<3;i++) /*输入3*4矩阵*/for (j=0;j<4;j++)scanf("%d",&a[i][j]);max=a[0][0]; row=0; col=0;for (i=0;i<3;i++) /*寻找矩阵中的最大值及其行列号*/ for (j=0;j<4;j++)if (max<a[i][j])< bdsfid="376" p=""></a[i][j])<>{max=a[i][j]; row=i, col=j;}printf("\n数组中最大的数是%d,其行号是%d,列号是%d\n",max,row,col);}6.#define N 3#define M 4#include "stdio.h"main(){int a[N][M],i,j,k,max,row,col;printf("input %d*%d matrix: \n",N,M);for (i=0;i<="" bdsfid="387" p="">for (j=0;j<m;j++)< bdsfid="389" p=""></m;j++)<>scanf("%d",&a[i][j]);for (i=0;i<="" bdsfid="392" p="">{max=a[i][0]; row=i; col=0;for(j=1;j<a[i][j])<="" *求矩阵中每一行的最大值及其所行列号*="" bdsfid="395" if="" p="">{max=a[i][j]; col=j;}for (k=0;k<max)<="" *判断每一行的最大值在其所在列是否最大*="" bdsfid="398" if="" p="">break;if (k==N) /*得到鞍点*/{printf("the point is %d,row=%d,col=%d\n",max,row,col);break;}}if (i==N) /*没有鞍点*/printf("no point\n");}7.#include "stdio.h"{int num=0,word=0;/*word=0表示未出现单词,如出现单词就置word为1.num用来统计单词个数*/char c;printf("please input a string :\n");while ((c=getchar())!='\n')if (c==' ')word=0;else if (word==0){word=1; num++;}printf("There are %d words in the line\n",num);}8.#include "stdio.h"main(){int i,j,uppn,lown,dign,span,othn;/*uppn,lown,dign,span,othn分别存放英文大写字母、小写字母、数字、空格和其他字符的个数*/char text[3][80];uppn=lown=dign=span=othn=0;for(i=0;i<3;i++){gets(text[i]);for(j=0;j<80&&text[i][j]!='\0';j++){if(text[i][j]>='A'&&text[i][j]<='Z')uppn++;else if(text[i][j]>='a'&&text[i][j]<='z')lown++;else if(text[i][j]>='0'&&text[i][j]<='9')dign++;else if(text[i][j]==' ')span++;elseothn++;}}for(i=0;i<3;i++)printf("%s\n",text[i]);printf("uppn=%d\n",uppn);printf("lown=%d\n",lown);printf("dign=%d\n",dign);printf("span=%d\n",span);printf("othn=%d\n",othn);}9.#include "stdio.h"{int i,j;char str1[20],str2[20];printf("input two strings:\n");gets(str1);gets(str2);j=strlen(str1); /*求字符串1的长度*/for (i=0;str2[i]!='\0';i++,j++) /*字符串合并*/ str1[j]=str2[i];str1[j]='\0'; /*加上字符串结束标志*/puts(str1);}10.#include "stdio.h"main(){int i,n;char str1[20],str2[20];printf("input two strings:(no more than 20 characters)\n"); gets(str1); gets(str2);n=strlen(str1)printf("%d\n",str1[i]-str2[i]);}第六章函数与编译预处理一、单项选择题1. C2. B3. B4. B5. A6. B7.A8.C9.D 10. A二、写出下列程序的运行结果1.92.4,B8,B3.-4.0000004.a=6,b=55.48三、编程题1.main(){ int prime(int n);int n;printf("input n(n>0):\n");scanf("%d",&n);if (prime(n))printf("%d is a sushu\n",n);else printf("%d is not a sushu\n",n); }int prime(int n){int flag=1,i;for (i=2;i<=n/2&&flag==1;i++)if (n%i==0) flag=0;return(flag);}2.#define N 3convert(int array[3][3]){ int i,j,t;for (i=0;i<n-1;i++)< bdsfid="507" p=""></n-1;i++)<> for (j=i+1;j<n;j++)< bdsfid="509" p=""></n;j++)<> {t=array[i][j];array[i][j]=array[j][i];array[j][i]=t;}}main(){int i,j;int a[N][N];printf("input a:\n");for (i=0;i<n;i++)< bdsfid="520" p=""></n;i++)<>for (j=0;j<n;j++)< bdsfid="522" p=""></n;j++)<> scanf("%d",&a[i][j]);printf("Array a:\n");for (i=0;i<n;i++)< bdsfid="526" p=""></n;i++)<> {for (j=0;j<n;j++)< bdsfid="528" p=""></n;j++)<> printf("%5d",a[i][j]);printf("\n");}convert(a);printf("a de zhuanzhi is:\n");for (i=0;i<n;i++)< bdsfid="535" p=""></n;i++)<>{for (j=0;j<n;j++)< bdsfid="537" p=""></n;j++)<>printf("%5d",a[i][j]);printf("\n");}}3. #include#includemain(){char str[100];printf("input a string:\n") ;gets(str);inverse(str);printf("the reversed string is:%s\n",str);}inverse(char str[]){char t;int i,j;for (i=0,j=strlen(str)-1;i<j;i++,j--)< bdsfid="558" p=""></j;i++,j--)<>{t=str[i];str[i]=str[j];str[j]=t;}4. #includeconcat(char str1[],char str2[]){ int i=0,j;while (str1[i]!='\0')i++;for (j=0;str2[j]!='\0';i++,j++)str1[i]=str2[j];str1[i]='\0';}main(){char str1[100],str2[100];gets(str1);gets(str2);concat(str1,str2);puts(str1);}5. main(){char str[80];printf("input a string (4 ge shu zi zi fu):\n"); scanf("%s",str); insert(str);printf("result is:\n%s\n",str);}insert(char str[]){int i;for (i=strlen(str);i>0;i--){str[2*i]=str[i];str[2*i-1]=' ';}6. #include "stdio.h"int i,ndight,nwhite,nletter,nother;count(char str[]){ndight=nwhite=nletter=nother=0;for (i=0;str[i]!='\0';i++)if (str[i]>='0'&&str[i]<='9')ndight++;else if ((str[i]>='A'&&str[i]<='Z')||(str[i]>='a'&&str[i]<='z')) nletter++;else if (str[i]==' ')nwhite++;else nother++;}main(){char text[80];printf("input a string:\n");gets(text);count(text);printf("ndight=%d,nletter=%d,nwhite=%d,nother=%d\n",n dight,nletter,nwhite,nother); }7. #define N 10#includesort(char str[]){int i,j;char t;for (i=1;i<n;i++)< bdsfid="625" p=""></n;i++)<>for (j=0;j<n-i;j++)< bdsfid="627" p=""></n-i;j++)<> if (str[j]>str[j+1]){t=str[j];str[j]=str[j+1] ;str[j+1]=t;}}main(){char str[N];int i ;printf("Input 10 ge zi fu:\n");gets(str);printf("The sorted result:\n") ;for(i=0;i<n;i++)< bdsfid="639" p=""></n;i++)<> printf("%c",str[i]);}8.这题较复杂#include#include#define N 10void input_e(int num[],char name[N][8]){int i;for (i=0;i<n;i++)< bdsfid="651" p=""></n;i++)<> { printf("input gong hao:");scanf("%d",&num[i]);printf("input name:");getchar();gets(name[i]);}for (i=0;i<n;i++)< bdsfid="659" p=""></n;i++)<> printf("%5d%10s\n",num[i],name[i]);}void sort(int num[],char name[N][8]) /*选择法排序*/{int i,j,min,temp1;char temp2[8];for (i=0;i<n-1;i++)< bdsfid="666" p=""></n-1;i++)<> {min=i;for (j=i+1;j<n;j++)< bdsfid="669" p=""></n;j++)<>if (num[j]temp1=num[i];strcpy(temp2,name[i]);num[i]=num[min];strcpy(name[i],name[min]);num[min]=temp1;strcpy(name[min],temp2);}printf("the sorted result:\n");for (i=0;i<n;i++)< bdsfid="681" p=""></n;i++)<>printf("%5d%10s\n",num[i],name[i]);}void search(int n,int num[],char name[N][8]) /*折半查找法*/ { int top,bott,mid,find;bott=N-1;if ((nnum[N-1]))find=-1;while ((find==0)&&(top<=bott)){mid=(bott+top)/2;if (n==num[mid]){find=1; printf("%d name is:%s\n",n,name[mid]);}else if (n<num[mid])< bdsfid="695" p=""></num[mid])<> bott=mid-1;else top=mid+1;}if ((find==-1)||(find==0))printf("%d is not found.\n",n);}main(){int num[N],number,c,flag;char name[N][8];input_e(num,name);sort(num,name);for (flag=1;flag;){printf("please input chazhao de gonghao:"); /*输入查找的工号*/ scanf("%d",&number);search(number,num,name);printf("continue Y/N?"); /*是否继续查找*/getchar();c=getchar();if (c=='N'||c=='n')flag=0;}}9. #include "stdio.h"#define MAX 10main(){char str[MAX];char c;int i;i=0;printf("input number(16 jinzhi): "); /*输入一个十六进制的数*/while((c=getchar())!='\n'&&i<max)< bdsfid="727" p=""></max)<>{ str[i]=c;i++;printf("result is :%d\n",htod(str));}int htod(char s[]){int i,n;n=0;for(i=0;s[i]!='\0';i++){if (s[i]>='0'&&s[i]<='9')n=n*16+s[i]-'0';if (s[i]>='a'&&s[i]<='f')n=n*16+s[i]-'a'+10;if (s[i]>='A'&&s[i]<='F')n=n*16+s[i]-'A'+10;}return(n);}10. #define SW AP(a,b) t=a;a=b;b=t main(){int a,b,t;printf("input a,b:") ;scanf("%d,%d",&a,&b);SW AP(a,b);printf("result:a=%d,b=%d\n",a,b);}11. #define SURPLUS(a,b) ((a)%(b)) main(){int a,b;printf("input a,b:");scanf("%d,%d",&a,&b);printf("result is: %d\n",SURPLUS(a,b)); } 12. main(){int a,b,c;printf("input a,b,c:");scanf("%d,%d,%d",&a,&b,&c);printf("max=%d\n",max(a,b,c));}int max(int x,int y,int z){int t;t=(x>y ? x : y);return(t>z?t:z);}#define MAX(x,y) ((x)>(y)?(x):(y)) main(){int a,b,c;printf("input a,b,c:");scanf("%d,%d,%d",&a,&b,&c);printf("max=%d\n",MAX(MAX(a,b),c)); }13. #include "stdio.h"#define CHANGE 1#define MAX 80main(){char str[MAX];int i;printf("input a string:\n");gets(str);#if (CHANGE){ for (i=0;str[i]!='\0';i++)if (str[i]>='a'&&str[i]<'z'||str[i]>='A'&&str[i]<'Z')str[i]=str[i]+1;else if (str[i]=='z'||str[i]=='Z')str[i]=str[i]-25;}#endifprintf("%s\n",str);}第七章指针一、选择题1)A 2)D 3)D 4)C 5)B 6)B 7)B 8)C 9)B 10)C 11)A 12)A 13)A 14)C 15)B 16)A 17)C 18)B 19)D 20)B二、阅读下面程序,写出程序运行结果1)abcdeedcba 2)1113151719 3)(TurboC中是11,9 7,11 )(VisualC是9,9 7,11)4)3 6 5)6385三、编程题1、main( ){ int a[10],i,temp,*p=a;printf("Please input array a:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]);printf("array a:\n");for(i=0;i<10;i++)printf("%4d",a[i]);for(i=0;i<5;i++){ temp=p[i];p[i]=p[10-i-1];p[10-i-1]=temp;}printf("\n Now array a:\n");for(i=0;i<10;i++)printf("%4d",a[i]);}2、main( ){ int a[3][3],*p,i,j;printf("please input matrix:\n"); for(i=0;i<3;i++) for(j=0;j<3;j++)scanf("%d",&a[i][j]);p=&a[0][0];move(p);printf("\n Now matrix:\n");for(i=0;i<3;i++){ for(j=0;j<3;j++)printf("%4d",a[i][j]);printf("\n");}}move(int *q){ int i,j,t;for(i=0;i<3;i++)for(j=i;j<3;j++){ t=*(q+3*i+j);*(q+3*i+j)=*(q+3*j+i); *(q+3*j+i)=t;}}3、#include#include。
C语言课后习题解答(北邮版)

****** 第一章 ******1、算法描述主要是用两种基本方法:第一是自然语言描述,第二是使用专用工具进行算法描述2、c语言程序的结构如下:1、c语言程序由函数组成,每个程序必须具有一个main函数作为程序的主控函数。
2、"/*"与"*/"之间的内容构成c语言程序的注释部分。
3、用预处理命令#include可以包含有关文件的信息。
4、大小写字母在c语言中是有区别的。
5、除main函数和标准库函数以外,用户可以自己编写函数,程序一般由多个函数组成,这些函数制定实际所需要做的工作。
例如:void main(){int a,b,c,s;a=8;b=12;c=6;s=a+b*c;printf("s=%d\n",s);}3、c语言的特点:1、c语言具有结构语言的特点,程序之间很容易实现段的共享;2、c语言的主要结构成分为函数,函数可以在程序中被定义完成独立的任务,独立地编译成代码,以实现程序的模块化。
3、c语言运算符丰富,运算包含的范围很广;4、c语言数据类型丰富。
5、c语言允许直接访问物理地址,即可直接对硬件进行操作,实现汇编语言的大部分功能;6、c语言语法限制不太严格,程序设计自由度大,这样是c语言能够减少对程序员的束缚;7、用c语言编程,生成的目标代码质量高,程序执行效率高,可移植性好;4、合法标识符:AB12、leed_3、EF3_3、_762、PAS、XYZ43K2不合法标识符:a*b2、8stu、D.K.Jon、if、ave#xy、#_DT5、C.D5、F2:将当前编辑器中文件存盘F10:调用主菜单F4:程序运行到光标所在行Ctrl+F9:当前编辑环境下,进行编译、连接且运行程序;Alt+F5:将窗口切换到DOS下,查看程序运行结果6、(1):********************welcome youvery good********************(2):please input three number;5,7,8max number is:87、main8、User screen、Alt+F59、标识符必须是字母或下划线开头,大小写字母含义不同。
数据结构C语言版(第2版)严蔚敏人民邮电出版社课后习题答案

数据结构(C语言版)(第2版)课后习题答案李冬梅2015.3目录第1章绪论 (1)第2章线性表 (5)第3章栈和队列 (13)第4章串、数组和广义表 (26)第5章树和二叉树 (33)第6章图 (43)第7章查找 (54)第8章排序 (65)第1章绪论1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。
答案:数据:是客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的总称。
如数学计算中用到的整数和实数,文本编辑所用到的字符串,多媒体程序处理的图形、图像、声音、动画等通过特殊编码定义后的数据。
数据元素:是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。
在有些情况下,数据元素也称为元素、结点、记录等。
数据元素用于完整地描述一个对象,如一个学生记录,树中棋盘的一个格局(状态)、图中的一个顶点等。
数据项:是组成数据元素的、有独立含义的、不可分割的最小单位。
例如,学生基本信息表中的学号、姓名、性别等都是数据项。
数据对象:是性质相同的数据元素的集合,是数据的一个子集。
例如:整数数据对象是集合N={0,±1,±2,…},字母字符数据对象是集合C={‘A’,‘B’,…,‘Z’,‘a’,‘b’,…,‘z’},学生基本信息表也可是一个数据对象。
数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。
换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。
逻辑结构:从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。
因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。
存储结构:数据对象在计算机中的存储表示,也称为物理结构。
抽象数据类型:由用户定义的,表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称。
具体包括三部分:数据对象、数据对象上关系的集合和对数据对象的基本操作的集合。
数据结构C语言版(第2版)严蔚敏人民邮电出版社课后习题答案

数据构造(C说话版)(第2版)课后习题答案李冬梅目录第1章绪论1第2章线性表4第3章栈和队列12第4章串.数组和广义表25第5章树和二叉树32第6章图41第7章查找52第8章排序63第1章绪论1.简述下列概念:数据.数据元素.数据项.数据对象.数据构造.逻辑构造.存储构造.抽象数据类型.答案:数据:是客不雅事物的符号暗示,指所有能输入到盘算机中并被盘算机程序处理的符号的总称.如数学盘算顶用到的整数和实数,文本编辑所用到的字符串,多媒体程序处理的图形.图像.声音.动画等经由过程特别编码界说后的数据.数据元素:是数据的根本单位,在盘算机中平日作为一个整体进行斟酌和处理.在有些情形下,数据元素也称为元素.结点.记载等.数据元素用于完全地描写一个对象,如一个学生记载,树中棋盘的一个格局(状况).图中的一个极点等.数据项:是构成数据元素的.有自力寄义的.不成朋分的最小单位.例如,学生根本信息表中的学号.姓名.性别等都是数据项.数据对象:是性质雷同的数据元素的集合,是数据的一个子集.例如:整数数据对象是集合N={0,±1,±2,…},字母字符数据对象是集合C={‘A’,‘B’,…,‘Z’, ‘a’,‘b’,…,‘z’},学生根本信息表也可是一个数据对象.数据构造:是互相之间消失一种或多种特定关系的数据元素的集合.换句话说,数据构造是带“构造”的数据元素的集合,“构造”就是指数据元素之间消失的关系.逻辑构造:从逻辑关系上描写数据,它与数据的存储无关,是自力于盘算机的.是以,数据的逻辑构造可以看作是从具体问题抽象出来的数学模子.存储构造:数据对象在盘算机中的存储暗示,也称为物理构造.抽象数据类型:由用户界说的,暗示运用问题的数学模子,以及界说在这个模子上的一组操纵的总称.具体包含三部分:数据对象.数据对象上关系的集合和对数据对象的根本操纵的集合.2.试举一个数据构造的例子,论述其逻辑构造和存储构造两方面的寄义和互相关系.答案:例若有一张学生根本信息表,包含学生的学号.姓名.性别.籍贯.专业等.每个学生根本信息记载对应一个数据元素,学生记载按次序号分列,形成了学生根本信息记载的线性序列.对于全部表来说,只有一个开端结点(它的前面无记载)和一个终端结点(它的后面无记载),其他的结点则各有一个也只有一个直接前趋和直接后继.学生记载之间的这种关系就肯定了学生表的逻辑构造,即线性构造.这些学生记载在盘算机中的存储暗示就是存储构造.假如用持续的存储单元(如用数组暗示)来存放这些记载,则称为次序存储构造;假如存储单元不持续,而是随机存放各个记载,然后用指针进行链接,则称为链式存储构造.即雷同的逻辑构造,可以对应不合的存储构造.3.简述逻辑构造的四种根本关系并画出它们的关系图.答案:(1)集合构造数据元素之间除了“属于统一集合”的关系外,别无其他关系.例如,肯定一逻辑学生是否为班级成员,只需将班级看做一个集合构造.(2)线性构造数据元素之间消失一对一的关系.例如,将学生信息数据按照其入学报到的时光先后次序进行分列,将构成一个线性构造.(3)树构造数据元素之间消失一对多的关系.例如,在班级的治理系统中,班长治理多个组长,每位组长治理多名组员,从而构成树形构造.(4)图构造或网状构造数据元素之间消失多对多的关系.例如,多位同窗之间的同伙关系,任何两位同窗都可所以同伙,从而构成图形构造或网状构造.个中树构造和图构造都属于非线性构造.四类根本逻辑构造关系图4.存储构造由哪两种根本的存储办法实现?答案:(1)次序存储构造次序存储构造是借助元素在存储器中的相对地位来暗示数据元素之间的逻辑关系,平日借助程序设计说话的数组类型来描写.(2)链式存储构造次序存储构造请求所有的元素依次存放在一片持续的存储空间中,而链式存储构造,无需占用一整块存储空间.但为了暗示结点之间的关系,须要给每个结点附加指针字段,用于存放后继元素的存储地址.所以链式存储构造平日借助于程序设计说话的指针类型来描写.5.选择题(1)在数据构造中,从逻辑上可以把数据构造分成().A.动态构造和静态构造 B.紧凑构造和非紧凑构造C.线性构造和非线性构造 D.内部构造和外部构造答案:C(2)与数据元素本身的情势.内容.相对地位.个数无关的是数据的().A.存储构造 B.存储实现C.逻辑构造 D.运算实现答案:C(3)平日请求统一逻辑构造中的所稀有据元素具有雷同的特征,这意味着().A.数据具有统一特色B.不但数据元素所包含的数据项的个数要雷同,并且对应数据项的类型要一致C.每个数据元素都一样D.数据元素所包含的数据项的个数要相等答案:B(4)以下说法准确的是().A.数据元素是数据的最小单位B.数据项是数据的根本单位C.数据构造是带有构造的各数据项的集合D.一些概况上很不雷同的数据可以有雷同的逻辑构造答案:D解释:数据元素是数据的根本单位,数据项是数据的最小单位,数据构造是带有构造的各数据元素的集合.(5)算法的时光庞杂度取决于().A.问题的范围B.待处理数据的初态C.盘算机的设置装备摆设D.A和B答案:D解释:算法的时光庞杂度不但与问题的范围有关,还与问题的其他身分有关.如某些排序的算法,其履行时光与待排序记载的初始状况有关.为此,有时会对算法有最好.最坏以及平均时光庞杂度的评价.(6)以下数据构造中,()长短线性数据构造A.树 B.字符串 C.队列 D.栈答案:A6.试剖析下面各程序段的时光庞杂度.(1)x=90; y=100;while(y>0)if(x>100){x=x-10;y--;}else x++;答案:O(1)解释:程序的履行次数为常数阶.(2)for (i=0; i<n; i++)for (j=0; j<m; j++)a[i][j]=0;答案:O(m*n)解释:语句a[i][j]=0;的履行次数为m*n.(3)s=0;for i=0; i<n; i++)for(j=0; j<n; j++)s+=B[i][j];sum=s;答案:O(n2)解释:语句s+=B[i][j];的履行次数为n2.(4)i=1;while(i<=n)i=i*3;答案:O(log3n)解释:语句i=i*3;的履行次数为⎣log3n⎦.(5)x=0;for(i=1; i<n; i++)for (j=1; j<=n-i; j++)x++;答案:O(n2)解释:语句x++;的履行次数为n-1+n-2+……+1= n(n-1)/2.(6)x=n; //n>1y=0;while(x≥(y+1)* (y+1))y++;答案:O(n)解释:语句y++;的履行次数为⎣n⎦.第2章线性表1.选择题(1)次序表中第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是().A.110 B.108 C.100 D.120答案:B解释:次序表中的数据持续存储,所以第5个元素的地址为:100+2*4=108.(2)在n个结点的次序表中,算法的时光庞杂度是O(1)的操纵是().A.拜访第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n)B.在第i个结点后拔出一个新结点(1≤i≤n)C.删除第i个结点(1≤i≤n)D.将n个结点从小到大排序答案:A解释:在次序表中拔出or delete一个结点的时光庞杂度都是O(n),排序的时光庞杂度为O(n2)或O(nlog2n).次序表是一种随机存取构造,拜访第i个结点和求第i个结点的直接前驱都可以直接经由过程数组的下标直接定位,时光庞杂度是O(1).(3)向一个有127个元素的次序表中拔出一个新元素并保持本来次序不变,平均要移动的元素个数为().A.8 B.63.5 C.63 D.7答案:B解释:平均要移动的元素个数为:n/2.(4)链接存储的存储构造所占存储空间().A.分两部分,一部分存放结点值,另一部分存放暗示结点间关系的指针B.只有一部分,存放结点值C.只有一部分,存储暗示结点间关系的指针D.分两部分,一部分存放结点值,另一部分存放结点所占单元数答案:A(5)线性表若采取链式存储构造时,请求内存中可用存储单元的地址().A.必须是持续的 B.部分地址必须是持续的C.必定是不持续的 D.持续或不持续都可以答案:D(6)线性表L在()情形下实用于运用链式构造实现.A.需经常修正L中的结点值B.需不竭对L进行删除拔出C.L中含有大量的结点D.L中结点构造庞杂答案:B解释:链表最大的长处在于拔出和删除时不须要移动数据,直接修正指针即可.(7)单链表的存储密度().A.大于1 B.等于1 C.小于1 D.不克不及肯定答案:C解释:存储密度是指一个结点数据本身所占的存储空间和全部结点所占的存储空间之比,假设单链表一个结点本身所占的空间为D,指针域所占的空间为N,则存储密度为:D/(D+N),必定小于1.(8)将两个各有n个元素的有序表归并成一个有序表,其起码的比较次数是().A.n B.2n-1 C.2n D.n-1答案:A解释:当第一个有序表中所有的元素都小于(或大于)第二个表中的元素,只须要用第二个表中的第一个元素依次与第一个表的元素比较,总计比较n次.(9)在一个长度为n的次序表中,在第i个元素(1≤i≤n+1)之前拔出一个新元素时须向后移动()个元素.A.n-i B.n-i+1 C.n-i-1 D.I答案:B(10) 线性表L=(a1,a2,……a n),下列说法准确的是().A.每个元素都有一个直接前驱和一个直接后继B.线性表中至少有一个元素C.表中诸元素的分列必须是由小到大或由大到小D.除第一个和最后一个元素外,其余每个元素都有一个且仅有一个直接前驱和直接后继.答案:D(11) 创建一个包含n个结点的有序单链表的时光庞杂度是().A.O(1) B.O(n) C.O(n2) D.O(nlog2n)答案:C解释:单链表创建的时光庞杂度是O(n),而要树立一个有序的单链表,则每生成一个新结点时须要和已有的结点进行比较,肯定合适的拔出地位,所以时光庞杂度是O(n2).(12) 以下说法错误的是().A.求表长.定位这两种运算在采取次序存储构造时实现的效力不比采取链式存储构造时实现的效力低B.次序存储的线性表可以随机存取C.因为次序存储请求持续的存储区域,所以在存储治理上不敷灵巧D.线性表的链式存储构造优于次序存储构造答案:D解释:链式存储构造温柔序存储构造各有优缺陷,有不合的实用处合.(13) 在单链表中,要将s所指结点拔出到p所指结点之后,其语句应为().A.s->next=p+1;p->next=s;B.(*p).next=s;(*s).next=(*p).next;C.s->next=p->next;p->next=s->next;D.s->next=p->next;p->next=s;答案:D(14) 在双向链表存储构造中,删除p所指的结点时须修正指针().A.p->next->prior=p->prior;p->prior->next=p->next;B.p->next=p->next->next;p->next->prior=p;C.p->prior->next=p;p->prior=p->prior->prior;D.p->prior=p->next->next;p->next=p->prior->prior;答案:A(15) 在双向轮回链表中,在p指针所指的结点后拔出q所指向的新结点,其修正指针的操纵是().A.p->next=q; q->prior=p;p->next->prior=q;q->next=q;B.p->next=q;p->next->prior=q;q->prior=p;q->next=p->next;C.q->prior=p;q->next=p->next;p->next->prior=q;p->next=q;D.q->prior=p;q->next=p->next;p->next=q;p->next->prior=q;答案:C2.算法设计题(1)将两个递增的有序链表归并为一个递增的有序链表.请求成果链表仍运用本来两个链表的存储空间, 不别的占用其它的存储空间.表中不许可有反复的数据.[标题剖析]归并后的新表运用头指针Lc指向,pa和pb分离是链表La和Lb的工作指针,初始化为响应链表的第一个结点,从第一个结点开端进行比较,当两个链表La和Lb均为到达表尾结点时,依次摘取个中较小者从新链接在Lc表的最后.假如两个表中的元素相等,只摘取La表中的元素,删除Lb表中的元素,如许确保归并后表中无反复的元素.当一个表到达表尾结点,为空时,将非空表的残剩元素直接链接在Lc表的最后.[算法描写]void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc){//归并链表La和Lb,归并后的新表运用头指针Lc指向pa=La->next; pb=Lb->next;//pa和pb分离是链表La和Lb的工作指针,初始化为响应链表的第一个结点Lc=pc=La; //用La的头结点作为Lc的头结点while(pa && pb){if(pa->data<pb->data){pc->next=pa;pc=pa;pa=pa->next;} //取较小者La中的元素,将pa链接在pc的后面,pa指针后移else if(pa->data>pb->data) {pc->next=pb; pc=pb; pb=pb->next;}//取较小者Lb中的元素,将pb链接在pc的后面,pb指针后移else //相等时取La中的元素,删除Lb中的元素{pc->next=pa;pc=pa;pa=pa->next;q=pb->next;delete pb ;pb =q;}}pc->next=pa?pa:pb; //拔出残剩段delete Lb; //释放Lb的头结点}(2)将两个非递减的有序链表归并为一个非递增的有序链表.请求成果链表仍运用本来两个链表的存储空间, 不别的占用其它的存储空间.表中许可有反复的数据.[标题剖析]归并后的新表运用头指针Lc指向,pa和pb分离是链表La和Lb的工作指针,初始化为响应链表的第一个结点,从第一个结点开端进行比较,当两个链表La和Lb均为到达表尾结点时,依次摘取个中较小者从新链接在Lc表的表头结点之后,假如两个表中的元素相等,只摘取La表中的元素,保存Lb表中的元素.当一个表到达表尾结点,为空时,将非空表的残剩元素依次摘取,链接在Lc表的表头结点之后.[算法描写]void MergeList(LinkList& La, LinkList& Lb, LinkList& Lc, ){//归并链表La和Lb,归并后的新表运用头指针Lc指向pa=La->next; pb=Lb->next;//pa和pb分离是链表La和Lb的工作指针,初始化为响应链表的第一个结点Lc=pc=La; //用La的头结点作为Lc的头结点Lc->next=NULL;while(pa||pb ){//只要消失一个非空表,用q指向待摘取的元素if(!pa) {q=pb; pb=pb->next;}//La表为空,用q指向pb,pb指针后移else if(!pb) {q=pa; pa=pa->next;}//Lb表为空,用q指向pa,pa指针后移else if(pa->data<=pb->data) {q=pa; pa=pa->next;}//取较小者(包含相等)La中的元素,用q指向pa,pa指针后移else {q=pb; pb=pb->next;}//取较小者Lb中的元素,用q指向pb,pb指针后移q->next = Lc->next; Lc->next = q;//将q指向的结点插在Lc 表的表头结点之后}delete Lb; //释放Lb的头结点}(3)已知两个链表A和B分离暗示两个集合,其元素递增分列.请设盘算法求出A与B 的交集,并存放于A链表中.[标题剖析]只有同时出如今两集合中的元素才出如今成果表中,归并后的新表运用头指针Lc指向.pa和pb分离是链表La和Lb的工作指针,初始化为响应链表的第一个结点,从第一个结点开端进行比较,当两个链表La和Lb均为到达表尾结点时,假如两个表中相等的元素时,摘取La表中的元素,删除Lb表中的元素;假如个中一个表中的元素较小时,删除此表中较小的元素,此表的工作指针后移.当链表La和Lb有一个到达表尾结点,为空时,依次删除另一个非空表中的所有元素.[算法描写]void Mix(LinkList& La, LinkList& Lb, LinkList& Lc){pa=La->next;pb=Lb->next;pa和pb分离是链表La和Lb的工作指针,初始化为响应链表的第一个结点Lc=pc=La; //用La的头结点作为Lc的头结点while(pa&&pb){ if(pa->data==pb->data)∥交集并入成果表中.{ pc->next=pa;pc=pa;pa=pa->next;u=pb;pb=pb->next; delete u;}else if(pa->data<pb->data) {u=pa;pa=pa->next; delete u;}else {u=pb; pb=pb->next; delete u;}}while(pa){u=pa; pa=pa->next; delete u;}∥ 释放结点空间while(pb) {u=pb; pb=pb->next; delete u;}∥释放结点空间pc->next=null;∥置链表尾标识表记标帜.delete Lb; //释放Lb的头结点}(4)已知两个链表A和B分离暗示两个集合,其元素递增分列.请设盘算法求出两个集合A和B 的差集(即仅由在A中消失而不在B中消失的元素所构成的集合),并以同样的情势存储,同时返回该集合的元素个数.[标题剖析]求两个集合A和B的差集是指在A中删除A和B中共有的元素,即删除链表中的响应结点,所以要保管待删除结点的前驱,运用指针pre指向前驱结点.pa和pb分离是链表La和Lb的工作指针,初始化为响应链表的第一个结点,从第一个结点开端进行比较,当两个链表La 和Lb均为到达表尾结点时,假如La表中的元素小于Lb表中的元素,pre置为La表的工作指针pa删除Lb表中的元素;假如个中一个表中的元素较小时,删除此表中较小的元素,此表的工作指针后移.当链表La和Lb有一个为空时,依次删除另一个非空表中的所有元素.[算法描写]void Difference(LinkList& La, LinkList& Lb,int *n){∥差集的成果存储于单链表La中,*n是成果集合中元素个数,挪用时为0 pa=La->next; pb=Lb->next;∥pa和pb分离是链表La和Lb的工作指针,初始化为响应链表的第一个结点 pre=La;∥pre为La中pa所指结点的前驱结点的指针while(pa&&pb){if(pa->data<q->data){pre=pa;pa=pa->next;*n++;}∥ A链表中当前结点指针后移else if(pa->data>q->data)q=q->next;∥B链表中当前结点指针后移 else {pre->next=pa->next;∥处理A,B中元素值雷同的结点,应删除u=pa; pa=pa->next;delete u;} ∥删除结点}}(5)设盘算法将一个带头结点的单链表A分化为两个具有雷同构造的链表B.C,个中B 表的结点为A表中值小于零的结点,而C表的结点为A表中值大于零的结点(链表A中的元素为非零整数,请求B.C表运用A表的结点).[标题剖析]B表的头结点运用本来A表的头结点,为C表新申请一个头结点.从A表的第一个结点开端,依次取其每个结点p,断定结点p的值是否小于0,运用前插法,将小于0的结点拔出B表,大于等于0的结点拔出C表.[算法描写]void DisCompose(LinkedList A){ B=A;B->next= NULL;∥B表初始化C=new LNode;∥为C申请结点空间C->next=NULL;∥C初始化为空表p=A->next; ∥p为工作指针while(p!= NULL){r=p->next; ∥暂存p的后继if(p->data<0){p->next=B->next; B->next=p; }∥将小于0的结点链入B表,前插法else {p->next=C->next; C->next=p; }∥将大于等于0的结点链入C表,前插法p=r;∥p指向新的待处理结点.}}(6)设计一个算法,经由过程一趟遍历在单链表中肯定值最大的结点.[标题剖析]假定第一个结点中数据具有最大值,依次与下一个元素比较,若其小于下一个元素,则设其下一个元素为最大值,反复进行比较,直到遍历完该链表.[算法描写]ElemType Max (LinkList L ){if(L->next==NULL) return NULL;pmax=L->next; //假定第一个结点中数据具有最大值p=L->next->next;while(p != NULL ){//假如下一个结点消失if(p->data > pmax->data) pmax=p;//假如p的值大于pmax的值,则从新赋值p=p->next;//遍历链表}return pmax->data;(7)设计一个算法,经由过程遍历一趟,将链表中所有结点的链接偏向逆转,仍运用原表的存储空间.[标题剖析]从首元结点开端,逐个地把链表L的当前结点p拔出新的链表头部.[算法描写]void inverse(LinkList &L){// 逆置带头结点的单链表 Lp=L->next; L->next=NULL;while ( p) {q=p->next; // q指向*p的后继p->next=L->next;L->next=p; // *p拔出在头结点之后p = q;}}(8)设计一个算法,删除递增有序链表中值大于mink且小于maxk的所有元素(mink 和maxk是给定的两个参数,其值可以和表中的元素雷同,也可以不合).[标题剖析]分离查找第一个值>mink的结点和第一个值≥maxk的结点,再修正指针,删除值大于mink且小于maxk的所有元素.[算法描写]void delete(LinkList &L, int mink, int maxk) {p=L->next; //首元结点while (p && p->data<=mink){ pre=p; p=p->next; } //查找第一个值>mink的结点if (p){while (p && p->data<maxk) p=p->next;// 查找第一个值≥maxk的结点q=pre->next; pre->next=p; // 修正指针while (q!=p){ s=q->next; delete q; q=s; } // 释放结点空间}//if}(9)已知p指向双向轮回链表中的一个结点,其结点构造为data.prior.next三个域,写出算法change(p),交流p所指向的结点和它的前缀结点的次序.[标题剖析]知道双向轮回链表中的一个结点,与前驱交流涉及到四个结点(p结点,前驱结点,前驱的前驱结点,后继结点)六条链.[算法描写]void Exchange(LinkedList p)∥p是双向轮回链表中的一个结点,本算法将p所指结点与其前驱结点交流.{q=p->llink;q->llink->rlink=p;∥p的前驱的前驱之后继为pp->llink=q->llink;∥p的前驱指向其前驱的前驱.q->rlink=p->rlink;∥p的前驱的后继为p的后继.q->llink=p;∥p与其前驱交流p->rlink->llink=q;∥p的后继的前驱指向原p的前驱p->rlink=q;∥p的后继指向其本来的前驱}∥算法exchange停滞.(10)已知长度为n的线性表A采取次序存储构造,请写一时光庞杂度为O(n).空间庞杂度为O(1)的算法,该算法删除线性表中所有值为item的数据元素.[标题剖析]在次序存储的线性表上删除元素,平日要涉及到一系列元素的移动(删第i个元素,第i+1至第n个元素要依次前移).本题请求删除线性表中所有值为item的数据元素,并未请求元素间的相对地位不变.是以可以斟酌设头尾两个指针(i=1,j=n),从两头向中央移动,凡碰到值item的数据元素时,直接将右端元素左移至值为item的数据元素地位.[算法描写]void Delete(ElemType A[ ],int n)∥A是有n个元素的一维数组,本算法删除A中所有值为item的元素.{i=1;j=n;∥设置数组低.高端指针(下标).while(i<j){while(i<j && A[i]!=item)i++;∥若值不为item,左移指针.if(i<j)while(i<j && A[j]==item)j--;∥若右端元素为item,指针左移 if(i<j)A[i++]=A[j--];}第3章栈和队列1.选择题(1)若让元素1,2,3,4,5依次进栈,则出栈次序不成能出如今()种情形.A.5,4,3,2,1 B.2,1,5,4,3 C.4,3,1,2,5 D.2,3,5,4,1答案:C解释:栈是落后先出的线性表,不难发明C选项中元素1比元素2先出栈,违反了栈的落后先出原则,所以不成能消失C选项所示的情形.(2)若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为().A.i B.n-i C.n-i+1 D.不肯定答案:C解释:栈是落后先出的线性表,一个栈的入栈序列是1,2,3,…,n,而输出序列的第一个元素为n,解释1,2,3,…,n一次性全体进栈,再进行输出,所以p1=n,p2=n-1,…,pi=n-i+1.(3)数组Q[n]用来暗示一个轮回队列,f为当前队列头元素的前一地位,r为队尾元素的地位,假定队列中元素的个数小于n,盘算队列中元素个数的公式为().A.r-f B.(n+f-r)%n C.n+r-fD.(n+r-f)%n答案:D解释:对于非轮回队列,尾指针和头指针的差值等于队列的长度,而对于轮回队列,差值可能为负数,所以须要将差值加上MAXSIZE(本题为n),然后与MAXSIZE(本题为n)求余,即(n+r-f)%n.(4)链式栈结点为:(data,link),top指向栈顶.若想摘除栈顶结点,并将删除结点的值保管到x中,则应履行操纵().A.x=top->data;top=top->link;B.top=top->link;x=top->link;C.x=top;top=top->link; D.x=top->link;答案:A解释:x=top->data将结点的值保管到x中,top=top->link栈顶指针指向栈顶下一结点,即摘除栈顶结点.(5)设有一个递归算法如下int fact(int n) { //n大于等于0if(n<=0) return 1;else return n*fact(n-1); }则盘算fact(n)须要挪用该函数的次数为().A. n+1 B. n-1 C. n D. n+2答案:A解释:特别值法.设n=0,易知仅挪用一次fact(n)函数,故选A.(6)栈在()中有所运用.A.递归挪用B.函数挪用C.表达式求值D.前三个选项都有答案:D解释:递归挪用.函数挪用.表达式求值均用到了栈的落后先出性质.(7)为解决盘算机主机与打印机间速度不匹配问题,平日设一个打印数据缓冲区.主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中掏出数据.该缓冲区的逻辑构造应当是().A.队列 B.栈C.线性表D.有序表答案:A解释:解决缓冲区问题应运用一种先辈先出的线性表,而队列恰是一种先辈先出的线性表.(8)设栈S和队列Q的初始状况为空,元素e1.e2.e3.e4.e5和e6依次进入栈S,一个元素出栈后即进入Q,若6个元素出队的序列是e2.e4.e3.e6.e5和e1,则栈S的容量至少应当是().A.2 B.3 C.4 D. 6答案:B解释:元素出队的序列是e2.e4.e3.e6.e5和e1,可知元素入队的序列是e2.e4.e3.e6.e5和e1,即元素出栈的序列也是e2.e4.e3.e6.e5和e1,而元素e1.e2.e3.e4.e5和e6依次进入栈,易知栈S中最多同时消失3个元素,故栈S的容量至少为3.(9)若一个栈以向量V[1..n]存储,初始栈顶指针top设为n+1,则元素x进栈的准确操纵是( ).A.top++; V[top]=x; B.V[top]=x; top++;C.top--; V[top]=x; D.V[top]=x; top--;答案:C解释:初始栈顶指针top为n+1,解释元素从数组向量的高端地址进栈,又因为元素存储在向量空间V[1..n]中,所以进栈时top指针先下移变成n,之后将元素x存储在V[n].(10)设计一个判别表达式中左,右括号是否配对消失的算法,采取()数据构造最佳.A.线性表的次序存储构造B.队列C. 线性表的链式存储构造D. 栈答案:D解释:运用栈的落后先出原则.(11)用链接方法存储的队列,在进行删除运算时().A. 仅修正头指针B. 仅修正尾指针C. 头.尾指针都要修正D. 头.尾指针可能都要修正答案:D解释:一般情形下只修正头指针,但是,当删除的是队列中最后一个元素时,队尾指针也丧掉了,是以需对队尾指针从新赋值.(12)轮回队列存储在数组A[0..m]中,则入队时的操纵为().A. rear=rear+1B. rear=(rear+1)%(m-1)C. rear=(rear+1)%mD. rear=(rear+1)%(m+1)答案:D解释:数组A[0..m]中共含有m+1个元素,故在求模运算时应除以m+1.(13)最大容量为n的轮回队列,队尾指针是rear,队头是front,则队空的前提是().A. (rear+1)%n==frontB. rear==frontC.rear+1==front D. (rear-l)%n==front答案:B解释:最大容量为n的轮回队列,队满前提是(rear+1)%n==front,队空前提是rear==front.(14)栈和队列的配合点是().A. 都是先辈先出B. 都是先辈后出C. 只许可在端点处拔出和删除元素D. 没有配合点答案:C解释:栈只许可在栈顶处进行拔出和删除元素,队列只许可在队尾拔出元素和在队头删除元素.。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
人民邮电出版社《C语言程序设计》贾宗璞许合利主编课后答案第1章1.选择题(1) C (2) B (3) D2.填空题(1)main (2) main (3) 有穷性、确定性、有零个或多个输入、有一个或多个输出、有效性(4) 顺序、分支和循环(5) 自顶向下,逐步细化、模块化设计、结构化编码第2章1.选择题BBCDA DDBBA BBDCB2、填空题(1) 数字、字母、下划线 (2)0 (3) 4、8 (4) (a+b)*c/(a-b) (5) -60 (6)-16 (7)3 (8)6、4、2 (9)0 (10)10、6 (11)5.500000 (12) 12、4(13)double (14) 0 (15)16 (16)6.63、编程题(1)main(){printf("int:%5d\n""float:%5d\n""char:%5d\n""double:%5d\n""long:%5d\n",sizeof(int),+-sizeof(float),sizeof(char),sizeof(double),sizeof(long));}(2)#define RAT 1.60934main(){float k=0.0;printf("input the km:");scanf("%f",&k);printf("\nmile:%f",k*RAT);}第3章1.选择题(1) ~(10):DDCDCDCDBC2.解析题(1) x=170,x=ㄩㄩㄩ170,x=ㄩㄩㄩ252, x=ㄩㄩㄩ170x=170,x=170ㄩㄩㄩ,x=ㄩㄩㄩ170,x=%6da=513.789185,a=ㄩㄩ513.79,a=513.78918457,a=513.78918457(2) a=3ㄩb=7x=8.5ㄩy=71.82c1=Aㄩc2=a3.编程题(1) main(){int x,y;scanf("%d%d",&x,&y);printf("商数=%d,余数=%d",x/y,x%y);system("pause");}(2)main(){double x,y,z,avg;scanf("%lf%lf%lf",&x,&y,&z);avg=(x+y+z)/3;printf("%.1lf",avg,avg);system("pause");}第4章1.选择题(1)~(10) CCAADCCABD2.填空题(1) ch>='A' && ch<='Z' ch=ch-32(2) x<=10 && x>2 x<=2 && x>-1 y=-1(3) a+b>c && a+c>b && b+c>a a==b&&a==c a==b || a==c || b==c(4) mark/10 k=1 case 9(5) x<0 c=x/10 y!=-23.编程题(1)#include <stdio.h>main(){int x;printf("please input a number:");scanf("%d",&x);if(x%2==0) printf("x is a even number");else printf("x is a odd number");}(2)#include <stdio.h>main(){int x,y;printf("please input a number£o");scanf("%d",&x);if(x<=-5) printf("the number is error");else if(x<0) {y=x; printf("%d",y);}else if(x==0) {y=x-1;printf("%d",y);}else if(x<10) {y=x+1;printf("%d",y);}else printf("the number is error");}(3)#include <stdio.h>main(){ int a,m;printf("please input a number:");scanf("%d",&a);switch(a/10){ case 0:case 1:case 2:m=1;break;case 3:m=2;break;case 4:m=3;break;case 5:m=4;break;default:m=5;break;}printf("%d",m);}(4)#include <stdio.h>main(){float price,tax;printf("please input the price of product:");scanf("%f",&price);if(price>10000) tax=price*0.05;else if(price>5000) tax=price*0.03;else if(price>1000) tax=price*0.02;else tax=0;printf("%f",tax);}(5)#include <stdio.h>main(){float score;printf("please input the score of student:");scanf("%f",&score);if(score>=85) printf("VERY GOOD");else if(score>=60) printf("GOOD");else printf("BAD");}第5章1.选择题(1)d (2) c (3)a (4)d (5)a (6)d (7)d (8)b (9)d (10)b (11)c (12)b (13)d (14)a (15)c2.填空题(1) ==0 m=m/k k++ (2) 5 4 6 (3) 3*i-2(4) -= *= (5) 8 5 2 (6) j++ i%j==0 j>=i(7)sum<k sum==k j-2 (8) s=0 p=1 j<=i3.改错题(1) 第一处改正: For改为for第二处改正: ave=sum/4改为ave=sum/4.0(2) 第一处改正: j<=9第二处改正: m=100*i+10*j+k3.编程题(1)#include <math.h> main(){int s;float n,t,sum;t=1; sum=0; n=1; s=1.0;while(n<=100){sum=sum+t;n=n+1;s=-s;t=s/n;}printf("sum=%10.6f\n",sum);}(2) 利用辗除法,直到b为0为止main(){ int p,r,n,m,temp;printf("input two integer n,m:");scanf("%d,%d",&n,&m);if(n<m){ temp=n;n=m;m=temp;}p=n*m;while(m!=0){r=n%m;n=m;m=r;}printf("greatest common divisor is:%d\n",n); //最大公约数printf("lease common multiple is:%d\n",p/n); //最小公倍数}(3) 采取逆向思维的方法,从后往前推断。
main(){int day,x1,x2;day=9;x2=1;while(day>0){ x1=(x2+1)*2; /*第一天的桃子数是第2天桃子数加1后的2倍*/ x2=x1;day--;}printf("the total is %d\n",x1);}(4)#include <stdio.h>main(){int i;long int n=1;for(i=1;i<=10;i++){n=n*i;printf(i%5==0?"%2d!=%-10ld\n":"%2d!=%-10ld",i,n); }}(5)main(){int m,s,i;for(m=2;m<1000;m++){ s=0;for(i=1;i<m;i++)if((m%i)==0) s=s+i;if(s==m){ printf("%d its factors are ",m);for(i=1;i<m;i++)if(m%i==0) printf("%d,",i);printf("\n");}}}(6)#include <stdio.h>main(){int n,i,j;scanf("%d",&n);for(i=1;i<=n;i++){ for(j=1;j<=n+i-1;j++)if(j<=n-i) printf(" ");else printf("*");printf("\n");}}(7)#include<math.h>main(){float x0,x1,x2,fx0,fx1,fx2;do{ printf("Enter x1 & x2:");scanf("%f,%f",&x1,&x2);fx1=x1*((2*x1-4)*x1+3)-6;fx2=x2*((2*x2-4)*x2+3)-6;}while(fx1*fx2>0);do{ x0=(x1+x2)/2;fx0=x0*((2*x0-4)*x0+3)-6;if((fx0*fx1)<0){ x2=x0;fx2=fx0;} else{ x1=x0;fx1=fx0;}}while(fabs(fx0)>=1e-5);printf("x=%6.2f\n",x0);}第6章1.选择题CCDCC AADBD2. 写出程序的运行结果(1) sum=6 (2) Max=9,row=1,col=0(3)1 02 1 03 2 1 0(4) -53、填空(1)i=j=k=0 、 i<4 、j<5、(2) s、 s[0],s[1] 、str,s[1]、s[2],str 4、编程题(1)#include <stdlib.h>main(){int a[12],count=0,i;randomize();for (i=0;i<12;i++)a=5+random(11);for(i=0;i<12;i++){printf("%5d",a);count++;if(count%4==0)printf("\n") ;}getch();}(2)main(){int a[5]={2,23,43,77,33};int max,min,i;long sum=0L;int count=0;float av;max=min=a[0];for(i=0;i<5;i++){sum+=a;if(a>max)max=a;if(a<min)min=a;}av=(float)sum/5;for(i=0;i<5;i++)if(a>av)count++;printf("max:%d\nmin:%d\nav:%f\ncount:%d",max,min,av,count);getch();}(3)main(){int score[30]={61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,85,89,90,33,44,55,91,92,93};int i,count90=0,count80=0,count70=0,count60=0;for(i=0;i<30;i++){printf("intput NO. %d student's score:",i+1);scanf("%d",score+i);}for(i=0;i<30;i++){if(score>=90){count90++;count80++;count70++;count60++;}else if(score>=80){count80++;count70++;count60++;}else if(score>=70){count70++;count60++;}else if(score>=60){count60++;}}printf("0~60:%d\n60~70:%d\n70~80:%d\n80~90:%d\n90~100:%d",30-count60,count60-count7 0,count70-count80,count80-count90,count90);printf("\n60 or higher:%d\n70 or higher:%d\n80 or higher:%d\n90 orhigher:%d\n",count60,count70,count80,count90);getch(); }(4)1、main(){char a[45];int i,j,k;for(i=0;i<45;i++)a=' '; for(i=0;i<5;i++){for(j=0;j<i;j++)a[9*i+j]=' ';for(k=0;k<5;k++)a[9*i+j+k]='*';}j=0;for(i=0;i<45;i++){printf("%c",a);j++;if(j%9==0)printf("\n"); }getch();}2、main(){char a[5][9];int i,j,k;for(i=0;i<5;i++)for(j=0;j<9;j++)a[j]=' ';for(i=0;i<5;i++){for(j=0;j<i;j++)a[j]=' ';for(k=0;k<5;k++)a[j+k]='*';}for(i=0;i<5;i++){for(j=0;j<9;j++)printf("%c",a[j]); printf("\n");}getch();}。