c++程序设计基础教程课后答案(清华大学出版社郑莉 董渊著)

c++程序设计基础教程课后答案(清华大学出版社郑莉 董渊著),第1张

第 一 章 概述

1-1 简述计算机程序设计语言的发展历程。

解:

迄今为止计算机程序设计语言的发展经历了机器语言、汇编语言、高级语言等阶段,C++语言是一种面向对象的编程语言,也属于高级语言。

1-2 面向对象的编程语言有哪些特点?

解:

面向对象的编程语言与以往各种编程语言有根本的不同,它设计的出发点就是为了能更直接的描述客观世界中存在的事物以及它们之间的关系。面向对象的编程语言将客观事物看作具有属性和行为的对象,通过抽象找出同一类对象的共同属性(静态特征)和行为(动态特征),形成类。通过类的继承与多态可以很方便地实现代码重用,大大缩短了软件开发周期,并使得软件风格统一。因此,面向对象的编程语言使程序能够比较直接地反问题域的本来面目,软件开发人员能够利用人类认识事物所采用的一般思维方法来进行软件开发。C++语言是目前应用最广的面向对象的编程语言。

1-3 什么是结构化程序设计方法?这种方法有哪些优点和缺点?

解:

结构化程序设计的思路是:自顶向下、逐步求精;其程序结构是按功能划分为若干个基本模块;各模块之间的关系尽可能简单,在功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成;其模块化实现的具体方法是使用子程序。结构化程序设计由于采用了模块分解与功能抽象,自顶向下、分而治之的方法,从而有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。

虽然结构化程序设计方法具有很多的优点,但它仍是一种面向过程的程序设计方法,它把数据和处理数据的过程分离为相互独立的实体。当数据结构改变时,所有相关的处理过程都要进行相应的修改,每一种相对于老问题的新方法都要带来额外的开销,程序的可重用性差。

由于图形用户界面的应用,程序运行由顺序运行演变为事件驱动,使得软件使用起来越来越方便,但开发起来却越来越困难,对这种软件的功能很难用过程来描述和实现,使用面向过程的方法来开发和维护都将非常困难。

1-4 什么是对象?什么是面向对象方法?这种方法有哪些特点?

解:

从一般意义上讲,对象是现实世界中一个实际存在的事物,它可以是有形的,也可以是无形的。对象是构成世界的一个独立单位,它具有自己的静态特征和动态特征。面向对象方法中的对象,是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位,由一组属性和一组行为构成。

面向对象的方法将数据及对数据的 *** 作方法放在一起,作为一个相互依存、不可分离的整体--对象。对同类型对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口,与外界发生关系,对象与对象之间通过消息进行通讯。这样,程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。通过实现继承与多态性,还可以大大提高程序的可重用性,使得软件的开发和维护都更为方便。

面向对象方法所强调的基本原则,就是直接面对客观存在的事物来进行软件开发,将人们在日常生活中习惯的思维方式和表达方式应用在软件开发中,使软件开发从过分专业化的方法、规则和技巧中回到客观世界,回到人们通常的思维。

1-5 什么叫做封装?

解:

封装是面向对象方法的一个重要原则,就是把对象的属性和服务结合成一个独立的系统单位,并尽可能隐蔽对象的内部细节。

1-6 面向对象的软件工程包括哪些主要内容?

解:

面向对象的软件工程是面向对象方法在软件工程领域的全面应用,它包括面向对象的分析(OOA)、面向对象的设计(OOD)、面向对象的编程(OOP)、面向对象的测试(OOT)和面向对象的软件维护(OOSM)等主要内容。

1-7 简述计算机内部的信息可分为几类?

解:

计算机内部的信息可以分成控制信息和数据信息二大类;控制信息可分为指令和控制字两类;数据信息可分为数值信息和非数值信息两类。

1-8 什么叫二进制?使用二进制有何优点和缺点?

解:

二进制是基数为2,每位的权是以2 为底的幂的进制,遵循逢二进一原则,基本符号为0和1。采用二进制码表示信息,有如下几个优点:1.易于物理实现;2.二进制数运算简单;3.机器可靠性高;4.通用性强。其缺点是它表示数的容量较小,表示同一个数,二进制较其他进制需要更多的位数。

1-9 请将以下十进制数值转换为二进制和十六进制补码:

(1)2 (2)9 (3)93

(4)-32 (5)65535 (6)-1

解:

(1) (2)10 = (10)2 = (2)16

(2) (9)10 = (1001)2 = (9)16

(3) (93)10 = (1011101)2 = (5D)16

(4) (-32)10 = (11100000)2 = (E0)16

(5) (65535)10 = (11111111 11111111)2 = (FFFF)16

(6) (-1)10 = (11111111 11111111)2 = (FFFF)16

1-10 请将以下数值转换为十进制:

(1)(1010)2 (2)(10001111)2 (3)(01011111 11000011)2

(4)(7F)16 (5)(2D3E)16 (6)(F10E)16

解:

(1)(1010)2 = (10)10

(2)(10001111)2 = (143)10

(3)(01011111 11000011)2 = (24515)10

(4)(7F)16 = (127)10

(5)(2D3E)16 = (11582)10

(6)(F10E)16 = (61710)10

1-11 简要比较原码、反码、补码等几种编码方法。

解:

原码:将符号位数字化为 0 或 1,数的绝对值与符号一起编码,即所谓"符号——绝对值表示"的编码。

正数的反码和补码与原码表示相同。

负数的反码与原码有如下关系:

符号位相同(仍用1表示),其余各位取反(0变1,1变0)。

补码由该数反码的最末位加1求得。

第 二 章 C++简单程序设计

2-1 C++语言有那些主要特点和优点?

解:

C++语言的主要特点表现在两个方面,一是全面兼容C,二是支持面向对象的方法。C++是一个更好的C,它保持了C的简洁、高效、接近汇编语言、具有良好的可读性和可移植性等特点,对C的类型系统进行了改革和扩充,因此C++比C更安全,C++的编译系统能检查出更多的类型错误。 C++语言最重要的特点是支持面向对象。

2-2 下列标识符哪些是合法的?

Program, -page, _lock, test2, 3in1, @mail, A_B_C_D

解:

Program, _lock, test2, A_B_C_D是合法的标识符,其它的不是。

2-3 例2.1中每条语句的作用是什么?

#include <iostream.h>

void main(void)

{

cout<<"Hello!\n"

cout<<"Welcome to c++!\n"

}

解:

#include <iostream.h>//指示编译器将文件iostream.h中的代码

//嵌入到该程序中该指令所在的地方

void main() //主函数名,void 表示函数没有返回值

{ //函数体标志

cout<<"Hello!\n"//输出字符串Hello!到标准输出设备(显示器)上。

cout<<"Welcome to c++!\n"//输出字符串Welcome to c++!

}

在屏幕输出如下:

Hello!

Welcome to c++!

2-4 使用关键字const而不是#define语句的好处有哪些?

解:

const定义的常量是有类型的,所以在使用它们时编译器可以查错;而且,这些变量在调试时仍然是可见的。

2-5 请写出C++语句声明一个常量PI,值为3.1416;再声明一个浮点型变量a,把PI的值赋给a。

解:

const float PI = 3.1416

float a = PI

2-6 在下面的枚举类型中,Blue的值是多少?

enum COLOR

解:

Blue = 102

2-7 注释有什么作用?C++中有哪几种注释的方法?他们之间有什么区别?

解:

注释在程序中的作用是对程序进行注解和说明,以便于阅读。编译系统在对源程序进行编译时不理会注释部分,因此注释对于程序的功能实现不起任何作用。而且由于编译时忽略注释部分,所以注释内容不会增加最终产生的可执行程序的大小。适当地使用注释,能够提高程序的可读性。在C++中,有两种给出注释的方法:一种是延用C语言方法,使用"/*"和"*/"括起注释文字。另一种方法是使用"//",从"//"开始,直到它所在行的行尾,所有字符都被作为注释处理。

2-8 什么叫做表达式?x = 5 + 7是一个表达式吗?它的值是多少?

解:

任何一个用于计算值的公式都可称为表达式。x = 5 + 7是一个表达式,它的值为12。

2-9 下列表达式的值是多少?

1. 201 / 4

2. 201 % 4

3. 201 / 4.0

解:

1. 50

2. 1

3. 50.25

2-10 执行完下列语句后,a、b、c三个变量的值为多少?

a = 30

b = a++

c = ++a

解:

a:32 ; b:30 ; c:32;

2-11 在一个for循环中,可以初始化多个变量吗?如何实现?

解:

在for循环设置条件的第一个""前,用,分隔不同的赋值表达式。

例如:

for (x = 0, y = 10x <100x++, y++)

2-12 执行完下列语句后,n的值为多少?

int n

for (n = 0n <100n++)

1 【C语言】《C语言程序设计教程(第二版)》习题答案

说明

1. 本文所指的《C语言程序设计教程(第二版)》是李凤霞主编、北京理

工大学出版社出版的,绿皮。

2 第1章 程序设计基础知识

一、单项选择题(第23页)

1-4.CBBC 5-8.DACA

二、填空题(第24页)

1.判断条件 2.面向过程编程 3.结构化 4.程序 5.面向对象的程序设计语言 7.有穷性 8.直到型循环 9.算法 10.可读性 11.模块化 12.对问题的分析和模块的划分

三、应用题(第24页)

2.源程序:

main()

{int i,j,k/* i:公鸡数,j:母鸡数,k:小鸡数的1/3 */

printf("cock hen chick\n")

for(i=1i<=20i++)

for(j=1j<=33j++)

for(k=1k<=33k++)

if (i+j+k*3==100&&i*5+j*3+k==100)

printf(" %d %d %d\n",i,j,k*3)}

执行结果

cock hen chick

4 18 78

8 11 81

12 4 84

3.现计算斐波那契数列的前20项。

递推法 源程序:

main()

{long a,bint i

a=b=1

for(i=1i<=10i++) /*要计算前30项,把10改为15。*/

{printf("%8ld%8ld",a,b)

a=a+bb=b+a}}

递归法 源程序:

main()

{int i

for(i=0i<=19i++)

printf("%8d",fib(i))}

fib(int i)

{return(i<=1?1:fib(i-1)+fib(i-2))}

执行结果:

1 1 2 3 5 8 13 21 34 55

89 144 233 377 610 987 1597 2584 4181 6765

4.源程序:

#include "math.h"

main()

{double x,x0,deltax

x=1.5

do {x0=pow(x+1,1./3)

deltax=fabs(x0-x)

x=x0

}while(deltax>1e-12)

printf("%.10f\n",x)}

执行结果:

1.3247179572

5.源程序略。(分子、分母均构成斐波那契数列)

结果是32.66026079864

6.源程序:

main()

{int a,b,c,m

printf("Please input a,b and c:")

scanf("%d %d %d",&a,&b,&c)

if(a<b){m=aa=bb=m}

if(a<c){m=aa=cc=m}

if(b<c){m=bb=cc=m}

printf("%d %d %d\n",a,b,c)}

执行结果:

Please input a,b and c:123 456 789

789 456 123

7.源程序:

main()

{int a

scanf("%d",&a)

printf(a%21==0?"Yes":"No")}

执行结果:

42

Yes

3 第2章 C语言概述

一、单项选择题(第34页)

1-4.BDCB 5-8.AABC

二、填空题(第35页)

1.主 2.C编译系统 3.函数 函数 4.输入输出 5.头 6. .OBJ 7.库函数 8.文本

三、应用题(第36页)

5.sizeof是关键字,stru、_aoto、file、m_i_n、hello、ABC、SIN90、x1234、until、cos2x、s_3是标识符。

8.源程序:

main()

{int a,b,c

scanf("%d %d",&a,&b)

c=aa=bb=c

printf("%d %d",a,b)}

执行结果:

12 34

34 12

4 第3章 数据类型与运算规则

一、单项选择题(第75页)

1-5.DBACC 6-10.DBDBC 11-15.ADCCC 16-20.CBCCD 21-25.ADDBC 26-27.AB

二、填空题(第77页)

1.补码 2.±(10^-308~10^308) 3.int(整数) 4.单目 自右相左 5.函数调用 6.a或b 7.1 8.65,89

三、应用题(第78页)

1.10 9

2.执行结果:

11

0

0

12

1

5 第4章 顺序结构程序设计

一、单项选择题(第90页)

1-5.DCDAD 6-10.BACBB

二、填空题(第91页)

1.一 ;2. 5.169000 3.(1)-2002500 (2)I=-200,j=2500 (3)i=-200

j=2500 4.a=98,b=765.000000,c=4321.000000 5.略 6.0,0,3 7.3 8.scanf("%lf%lf%lf",&a,&b,&c)9. 13 13.000000,13.000000 10.a=a^cc=c^aa=a^c(这种算法不破坏b的值,也不用定义中间变量。)

三、编程题(第92页)

1.仿照教材第27页例2-1。

2.源程序:

main()

{int h,m

scanf("%d:%d",&h,&m)

printf("%d\n",h*60+m)}

执行结果:

9:23

563

3.源程序:

main()

{int a[]={-10,0,15,34},i

for(i=0i<=3i++)

printf("%d\370C=%g\370F\t",a[i],a[i]*1.8+32)}

执行结果:

-10℃=14°F 0℃=32°F 15℃=59°F 34℃=93.2°F

4.源程序:

main()

{double pi=3.14159265358979,r=5

printf("r=%lg A=%.10lf S=%.10lf\n",r,2*pi*r,pi*pi*r)}

执行结果:

r=5 A=31.4159265359 S=49.3480220054

5.源程序:

#include "math.h"

main()

{double a,b,c

scanf("%lf%lf%lf",&a,&b,&c)

if (a+b>c&&a+c>b&&b+c>a)

{double s=(a+b+c)/2

printf("SS=%.10lf\n",sqrt(s*(s-a)*(s-b)*(s-c)))}

else printf("Data error!")}

执行结果:

4 5 6

SS=9.9215674165

6.源程序:

main()

{int a=3,b=4,c=5float d=1.2,e=2.23,f=-43.56

printf("a=%3d,b=%-4d,c=**%d\nd=%g\ne=%6.2f\nf=%-10.4f**\n",a,b,c,d,e,f)}

7.源程序:

main()

{int a,b,c,m

scanf("%d %d %d",&a,&b,&c)

m=aa=bb=cc=m

printf("%d %d %d\n",a,b,c)}

执行结果:

5 6 7

6 7 5

8.源程序:

main()

{int a,b,c

scanf("%d %d %d",&a,&b,&c)

printf("average of %d,%d and %d is %.2f\n",a,b,c,(a+b+c)/3.)

执行结果:

6 7 9

average of 6,7 and 9 is 7.33

9.不能。修改后的源程序如下:

main()

{int a,b,c,x,y

scanf("%d %d %d",&a,&b,&c)

x=a*by=x*c

printf("a=%d,b=%d,c=%d\n",a,b,c)

printf("x=%d,y=%d\n",x,y)}

6 第5章 选择结构程序设计

一、单项选择题(第113页)

1-4.DCBB 5-8.DABD

二、填空题(第115页)

1.非0 0 2.k==0

3.if (abs(x)>4) printf("%d",x)else printf("error!")

4.if((x>=1&&x<=10||x>=200&&x<=210)&&x&1)printf("%d",x)

5.k=1 (原题最后一行漏了个d,如果认为原题正确,则输出k=%。)

6. 8! Right!11 7.$$$a=0 8.a=2,b=1

三、编程题(第116页)

1.有错。正确的程序如下:

main()

{int a,b,c

scanf("%d,%d,%d",&a,&b,&c)

printf("min=%d\n",a>b?b>c?c:b:a>c?c:a)}

2.源程序:

main()

{unsigned long a

scanf("%ld",&a)

for(aprintf("%d",a%10),a/=10)}

执行结果:

12345

54321

3.(1)源程序:

main()

{int x,y

scanf("%d",&x)

if (x>-5&&x<0)y=x

if (x>=0&&x<5)y=x-1

if (x>=5&&x<10)y=x+1

printf("%d\n",y)}

(2)源程序:

main()

{int x,y

scanf("%d",&x)

if(x<10) if(x>-5) if(x>=0) if(x>=5)y=x+1

else y=x-1else y=x

printf("%d\n",y)}

(3)源程序:

main()

{int x,y

scanf("%d",&x)

if(x<10) if(x>=5)y=x+1

else if(x>=0)y=x-1

else if(x>-5)y=x

printf("%d\n",y)}

(4)源程序:

main()

{int x,y

scanf("%d",&x)

switch(x/5)

{case -1:if(x!=-5)y=xbreak

case 0:y=x-1break

case 1:y=x+1}

printf("%d\n",y)}

4.本题为了避免考虑每月的天数及闰年等问题,故采用面向对象的程序设计。

现给出Delphi源程序和C++ Builder源程序。

Delphi源程序:

procedure TForm1.Button1Click(Sender: TObject)

begin

edit3.Text:=format('%.0f天',[strtodate(edit2.text) -strtodate(edit1.text)])

end

procedure TForm1.FormCreate(Sender: TObject)

begin

Edit2.Text:=datetostr(now)

button1click(form1)

end

C++ Builder源程序:

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Edit3->Text=IntToStr(StrToDate(Edit2->Text)-StrToDate(Edit1->Text))+"天"

}

void __fastcall TForm1::FormCreate(TObject *Sender)

{

Edit2->Text=DateToStr(Now())

Button1Click(Form1)

}

执行结果:(运行于Windows下) http://img378.photo.163.com/nxgt/41463572/1219713927.jpg

5.源程序:

main()

{unsigned a,b,c

printf("请输入三个整数:")

scanf("%d %d %d",&a,&b,&c)

if(a&&b&&c&&a==b&&a==c)printf("构成等边三角形\n")

else if(a+b>c&&a+c>b&&b+c>a)

if(a==b||a==c||b==c)printf("构成等腰三角形\n")

else printf("构成一般三角形\n")

else printf("不能构成三角形\n")}

执行结果:

请输入三个整数:5 6 5

构成等腰三角形

6.源程序:

main()

{int x,y

scanf("%d",&x)

if(x<20)y=1

else switch(x/60)

{case 0:y=x/10break

default:y=6}

printf("x=%d,y=%d\n",x,y)}

7.源程序:

main()

{unsigned mfloat n

scanf("%d",&m)

if(m<100)n=0

else if(m>600)n=0.06

else n=(m/100+0.5)/100

printf("%d %.2f %.2f\n",m,m*(1-n),m*n)}

执行结果:

450

450 429.75 20.25

8. 2171天(起始日期和终止日期均算在内)

本题可利用第4小题编好的程序进行计算。把起始日期和终止日期分别打入“生日”和“今日”栏内,单击“实足年龄”按钮,将所得到的天数再加上1天即可。

9.源程序:

#include "math.h"

main()

{unsigned long i

scanf("%ld",&i)

printf("%ld %d\n",i%10,(int)log10(i)+1)}

执行结果:

99887

7 5

10.源程序:

main()

{unsigned long iunsigned j[10],m=0

scanf("%ld",&i)

for(i){j[m++]=(i+2)%10i/=10}

for(mm--)i=i*10+j[m-1]

printf("%ld\n",i)}

执行结果:

6987

8109

(注:要加密的数值不能是0或以0开头。如果要以0开头需用字符串而不能是整数。)

7 第6章 循环结构程序设计

一、单项选择题(第142页)

1-4.BCCB 5-8.CBCA

二、填空题(第143页)

1.原题可能有误。如无误,是死循环 2.原题有误。如果把b=1后面的逗号改为分号,则结果是8。 3.20 4.11 5. 2.400000 6.*#*#*#$ 7.8 5 2 8.①d=1.0 ②++k ③k<=n 9.①x>=0 ②x<amin

三、编程题(第145页)

1. 源程序:

main()

{int i=1,sum=i

while(i<101){sum+=i=-i-2sum+=i=-i+2}

printf("%d\n",sum)}

执行结果:

51

2.源程序:

main()

{double p=0,n=0,fint i

for(i=1i<=10i++)

{scanf("%lf",&f)

if (f>0)p+=felse n+=f}

printf("%lf %lf %lf\n",p,n,p+n)}

3.源程序:

main()

{unsigned a

scanf("%ld",&a)

for (aprintf("%d,",a%10),a/=10)

printf("\b \n")}

执行结果:

23456

6,5,4,3,2

4.源程序:

main()

{unsigned long a,b,c,i

scanf("%ld%ld",&a,&b)

c=a%1000

for(i=1i<bi++)c=c*a%1000

if(c<100)printf("0")

if(c<10)printf("0")

printf("%ld\n",c)}

执行结果:

129 57

009

5.略

6.原题提供的计算e的公式有误(前面漏了一项1)。正确的公式是e= 1 + 1 + 1/2! + 1/3! + … + 1/n! + …

(1)源程序:

main()

{double e=1,f=1int n

for(n=1n<=20n++){f/=ne+=f}

printf("e=%.14lf\n",e)}

执行结果:

e=2.71828182845905

(2)源程序:

main()

{double e=1,f=1int n

for(n=1f>1e-4n++){f/=ne+=f}

printf("e=%.4f\n",e)}

执行结果:

e=2.7183

7.源程序:

main()

{unsigned long a=0,b=1,c=0int i,d

scanf("%d",&d)

for (i=1i<=(d+2)/3i++)

printf("%10ld%10ld%10ld",a,b,(a+=b+c,b+=c+a,c+=a+b))}

本题还可以用递归算法(效率很低),源程序如下:

unsigned long fun(int i)

{return i<=3?i:fun(i-1)+fun(i-2)+fun(i-3)}

main()

{int i,dscanf("%d",&d)

for(i=1i<=di++)

printf("%10ld",fun(i))}

执行结果:

15

1 2 3 6 11 20 37 68

125 230 423 778 1431 2632 4841

8.源程序:

main()

{int i

for(i=1010i<=9876i+=2)

if(i/100%11&&i%100%11&&i/10%100%11&&i/1000!=i%10&&i/1000!=i/10%10&&i/100%10!=i%10)printf(" %d",i)}

执行结果:

1024 1026 1028 1032 1034 1036 …… …… 9874 9876

9.源程序:

main()

{int i,j,k

printf("apple watermelon pear\n")

for(i=1i<=100i++)

for(j=1j<=10j++)

if((k=100-i-j)*2==400-i*4-j*40)

printf("%4d%7d%9d\n",i,j,k)}

执行结果:

apple watermelon pear

5 5 90

24 4 72

43 3 54

62 2 36

81 1 18

10.源程序:

#include "stdio.h"

#define N 4 /* N为阶数,可以改为其他正整数 */

main()

{int m=N*2,i,j

for(i=1i<mprintf("\n"),i++)

for(j=1j<m

putchar(N-abs(i-N)<=abs(j++-N)?' ':'*'))}

如果把N值改为5,则执行结果如下:

*

***

*****

*******

*********

*******

*****

***

*

作者:宁西贯通2006-5-7 23:41 回复此发言

--------------------------------------------------------------------------------

8 说明

注意:上面最后一题的输出结果应该是由星号组成的一个菱形,

9 第7章 数 组

一、单项选择题(第192页)

1-4.BBCC 5-8.AABA

二、填空题(第194页)

1.1

2

4

8

16

32

64

128

256

512

2. ①a[age]++ ②i=18i<26

3. ①break ②i==8

4. ①a[i]>b[j] ②i<3 ③j<5

5. ①b[j]=a[j][0] ②b[j]<a[j][k] 6.a[k++]=a[j]

三、编程题(第196页)

1.源程序:

main()

{int a[4][4],i,j,s=0

for(i=0i<4i++)

for(j=0j<4j++)

scanf("%d",&a[i][j])

for(i=0i<4i++)

for(j=0j<4j++)

if(i==j||i+j==3)s+=a[i][j]

printf("%d\n",s)} /* 注:5×5矩阵不能照此计算! */

执行结果:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

68

2. 源程序:

main()

{int i,a[36]

a[0]=2

for(i=1i<=29i++)a[i]=a[i-1]+2

for(i<=35i++)a[i]=a[(i-30)*5+2]

for(i=0i<=35i++)printf("%d\t",a[i])}

执行结果:

2 4 6 8 10 12 14 16 18 20

22 24 26 28 30 32 34 36 38 40

42 44 46 48 50 52 54 56 58 60

6 16 26 36 46 56

3. 源程序:

#include "stdlib.h"

#include "time.h"

main()

{int a[30],i,m=0

randomize()

for(i=0i<=29i++)

{a[i]=rand()

if(m<a[i])m=a[i]

printf("%d\t",a[i])}

for(i=0i<=29i++)if(a[i]==m)a[i]=-1

printf("\n-----------------\n")

for(i=0i<=29i++)

if(~a[i])printf("%d\t",a[i])

printf("\n")}

执行结果:

20679 29377 18589 9034 27083 4959 3438 5241 32278 23344

32499 29305 22340 5927 13031 2161 2583 31855 22977 14283

4851 22038 6992 11394 20887 27381 6293 18347 16414 10210

-----------------

20679 29377 18589 9034 27083 4959 3438 5241 32278 23344

29305 22340 5927 13031 2161 2583 31855 22977 14283 4851

22038 6992 11394 20887 27381 6293 18347 16414 10210

4.源程序:

main()

{int i,n=0,b[16]

scanf("%d",&i)

for(ii>>=1)b[n++]=i&1

for(n)printf("%d",b[--n])}

执行结果:

9876

10011010010100

本题也可以不用数组。源程序如下:

#include "stdio.h"

main()

{int i,n

scanf("%d",&i)

for(n=16nn--)

{asm ROL i,1

putchar(i&1|48)}

} /* ROL是循环左移的汇编指令 */

5. 源程序:

#include "stdlib.h"

#include "time.h"

#define M 5

#define N 6

main()

{int a[M][N],i,j,t[M]

randomize()

/*生成M行N列随机数*/

for(i=0i<Mprintf("\n"),t[i++]=0)

for(j=0j<Nj++)

printf("%4d",a[i][j]=random(50))

/*找出每行的最小数,t[M]是第M行的最小数所在的列数*/

for(i=0i<Mi++)

for(j=0j<Nj++)

if(a[i][t[i]]>a[i][j])t[i]=j

/*比较每个最小数在其所在的列上是否也是最小*/

for(j=0j<Mj++)

for(i=0i<Mi++)

{if(i==j)continue

if(a[j][t[j]]>a[i][t[j]])

{t[j]=-1break}

}

printf("-------------------\n")

/*输出在行和列上均为最小的数*/

for(i=0i<Mi++)

if(t[i]!=-1)

printf("a[%d,%d]=%d\n",i,t[i],a[i][t[i]])

}

执行结果:

13 19 13 20 0 1

20 41 6 16 35 30

3 5 37 8 23 15

6 36 24 29 18 1

1 5 28 21 46 34

-------------------

a[0,4]=0

a[1,2]=6

a[3,5]=1

a[4,0]=1

6. 源程序:

#include "stdlib.h"

#include "time.h"

#define M 5

#define N 7

main()

{int a[M][N],i,j,t=0

randomize()

for(i=0i<Mi++)

{a[i][N-1]=0

for(j=0j<N-1j++)

{printf("%4d",a[i][j]=random(91)+10)

a[i][N-1]+=a[i][j]}

printf("%4d\n",a[i][N-1])}

for(i=1i<Mi++)

if(a[i][N-1]>a[t][N-1])t=i

if(t)for(j=0j<Nj++)

{i=a[0][j]a[0][j]=a[t][j]a[t][j]=i}

printf("-----------------\n")

for(i=0i<Mprintf("\n"),i++)

10 第7章 数 组

for(j=0j<Nj++)

printf("%4d",a[i][j])

}

执行结果:

89 17 32 95 35 20 288

39 48 22 27 73 22 231

51 87 39 71 84 46 378

84 94 97 77 27 26 405

69 50 56 89 37 46 347

-----------------

84 94 97 77 27 26 405

39 48 22 27 73 22 231

51 87 39 71 84 46 378

89 17 32 95 35 20 288

69 50 56 89 37 46 347

7. 源程序:

#include "stdlib.h"

#include "time.h"

#define M 5

#define N 6

main()

{int a[M][N],i,j

struct data{int value,x,y}max,min

max.value=0min.value=100

randomize()

for(i=0i<Mprintf("\n"),i++)

for(j=0j<Nj++)

{printf("%4d",a[i][j]=random(100)+1)

if(max.value<a[i][j])

{max.value=a[i][j]max.x=imax.y=j}

if(min.value>a[i][j])

{min.value=a[i][j]min.x=imin.y=j}

}

printf("-----------------\n")

i=a[0][N-1]a[0][N-1]=max.valuea[max.x][max.y]=i

i=a[M-1][0]a[M-1][0]=min.valuea[min.x][min.y]=i

for(i=0i<Mprintf("\n"),i++)

for(j=0j<Nj++)

printf("%4d",a[i][j])

}

执行结果:

51 53 74 65 30 40

30 26 50 6 61 27

47 16 54 58 76 19

57 74 44 92 71 48

73 57 60 32 73 67

-----------------

51 53 74 65 30 92

30 26 50 73 61 27

47 16 54 58 76 19

57 74 44 40 71 48

6 57 60 32 73 67

9. 源程序:

main()

{char s[255]int i,j,b=1

printf("Input a string:")

scanf("%s",s)

i=strlen(s)

for(j=1j<=i/2j++)

b=b&&(s[j-1]==s[i-j])

printf(b?"Yes\n":"No\n")}

执行结果:

Input a string:level

Yes

10. 源程序:

main()

{char s[255],t,max=0,min=0,l,i

printf("Input a string(length>4):")

gets(s)

l=strlen(s)

for(i=0i<li++)

{if(s[max]<s[i])max=iif(s[min]>s[i])min=i}

t=s[1]s[1]=s[max]s[max]=tif(min==1)min=max

t=s[l-2]s[l-2]=s[min]s[min]=t

printf("%s\n",s)}

执行结果:

Input a string(length>4):C++Builder

Cu+Beild+r

11. 源程序:

main()

{char m[13][10]={"****","January","February","March",

"April","May","June","July","August","September",

"October","November","December"}

int i,j,k,a,s,n

printf("Please input an integer(100..999):")

scanf("%d",&n)

printf("%d:%d+%d+%d=%d, %d%%13=%d, %s\n", n,i,j,k,s,s,a,m[a=((s=(i=n/100)+(j=n/10%10)+(k=n%10))%13)])}

执行结果:

Please input an integer(100..999):539

539:5+3+9=17, 17%13=4, April

11 第8章 函 数

一、单项选择题(第241页)

1-5.BCCAA 6-10.CCDDD 11-15.ACACB

二、填空题(第243页)

1.看不出原题的意图。因为要计算1~n的累加和,n应是一个≥1的正整数。可是题目中却出现了n=0的情况。除非另加规定当n=0时1~n的累加和为0,或者把原题中的计算式改为计算0~n的累加和。据此猜测,原题应填为:①return(0) ②return(n+sum(n-1))

根据题意,如下程序较为合理:

int sum(int n)

{if(n<=0)return(-1)/* -1是出错标志 */

else if(n==1)return(1)

else return(n+sum(n-1))}

2. ①return(1) ②return(n*facto(n-1))

三、编程题(第244页)

3.源程序:

main()

{int i,a,b,c

for(i=100i<999i++)

if((a=i/100)*a*a+(b=i/10%10)*b*b+(c=i%10)*c*c==i)

printf("%d\t",i)}

执行结果:

153 370 371 407

8.源程序(非递归算法):

#define P 13 /* P可以改为其他正整数 */

main()

{int a[P],r,c

for(r=0r<=Pr++)

{a[r]=1

for(c=r-1c>=1a[c--]+=a[c-1])

printf("%*d",(P-r)*3+1,a[0])

for(c=1c<=rprintf("%6d",a[c++]))

printf("\n")}

}

执行结果:

(应该排列成一个三角形,是贴吧造成现在这个样子的,不是程序有问题)

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

1 6 15 20 15 6 1

1 7 21 35 35 21 7 1

1 8 28 56 70 56 28 8 1

1 9 36 84 126 126 84 36 9 1

1 10 45 120 210 252 210 120 45 10 1

1 11 55 165 330 462 462 330 165 55 11 1

1 12 66 220 495 792 924 792 495 220 66 12 1

1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1

9.源程序(递归算法):

#include "stdio.h"

void printOCT(unsigned long n)

{unsigned long i

if(i=n>>3)printOCT(i)

putchar((n&7)+48)}

main()

{unsigned long i

scanf("%ld",&i)

printOCT(i)}

执行结果:

1234567890

11145401322

本题也可以不用递归算法,源程序请参考第7章第三题4。

12 回复:【C语言】《C语言程序设计教程(第二版)》习题答案

但是不同时间印刷的版本课后题不太一样呢,象我们的是1999年12月第2版,2005年12月第69次印刷的。没有选择填空,应用题和楼主不知道有多少相同的,因为看不到原题。这个比较麻烦呢。

作者:210.77.204.* 2006-5-9 18:38 回复此发言

--------------------------------------------------------------------------------

13 回复:【C语言】《C语言程序设计教程(第二版)》习题答案

你对照一下主编和出版社,看看对吗?(见说明的第一条。)

我不是说叫你有问题另发帖子吗?

14 第9章 指 针

一、单项选择题(第276页)

1-5.DCDAC 6-10.CCABC 11-16.AABBB 16-20.DCDBD

二、填空题(第278页)

1.①int * ②*z

2.*p++

3.①'\0' ②++

4.①q=p+1 ②q<p+10 ③*q>max ④*q<min

三、编程题(第280页)

7.源程序:

main()

{int i=0char c[20]

do{scanf("%s",&c)i++}

while(strcmp(c,"stop"))

printf("%d\n",i)}

执行结果:

This car ran form Nanyang

to Luoyang without a stop

10

9.源程序:

main()

{char s[255],c[255]={0}int i

gets(s)

for(i=0s[i]c[s[i++]]++)

for(i=0i<255i++)

if(c[i])printf("%c=%d\t",i,c[i])}

执行结果:

abcedabcdcd

a=2 b=2 c=3 d=3 e=1

初学者遇到最多的困惑是:上课也能听懂,书上的例题也能看明白,可是到自己动手做编程时,却不知道如何下手。发生这种现象的原因有三个:

一、所谓的看懂听明白,只是很肤浅的语法知识,而我们编写的程序或软件是要根据要解决问题的实际需要控制程序的流程,如果你没有深刻地理解C语言的语句的执行过程(或流程),你怎么会编写程序解决这些实际问题呢?

二、用C语言编程解决实际问题,所需要的不仅仅是C语言的编程知识,还需要相关的专业知识。例如,如果你不知道长方形的面积公式,即使C语言学得再好你也编不出求长方形的面积的程序来。

三、C语言程序设计是一门实践性很强的课程,“纸上谈兵”式的光学不练是学不好C语言的。例如,大家都看过精彩自行车杂技表演,假如,你从来没有骑过自行车,光听教练讲解相关的知识、规则、技巧,不要说上台表演、就是上路你恐怕都不行。

出现问题原因清楚了,那么如何学习呢?请你看【C语言学习六步曲】

特别提醒:在使用本方法之前一定要先阅读C语言的相关内容,要初步掌握相关知识的要点,然后按下述方法学习,可以达到理解、巩固、提高C语言知识和提高程序调式能力的目的。

第一步、验证性练习

在这一步要求按照教材上的程序实例进行原样输入,运行一下程序是否正确。在这一步基本掌握C语言编程软件的使用方法(包括新建、打开、保存、关闭C程序,熟练地输入、编辑C程序;初步记忆新学章节的知识点、养成良好的C语言编程风格)。 单击此处查看【C语言的编程风格】

使用《Turbo C/C++ for Windows 集成实验与学习环境》软件可以很方便地看着软件集成的《C语言入门教程》输入练习其中的程序例题。具体使用方法参见软件帮助部分。

初学者最容易犯的错误是:

1、没有区分开教材上的数字1和字母l,字母o和数字0的区别,造成变量未定义的错误。另一个易错点是将英文状态下的逗号,分号括号()双引号""输入出入成中文状态下的逗号,分号;括号(),双引号“”造成非法字符错误。

2、C语言初学者易犯语法错误:使用未定义的变量、标示符(变量、常量、数组、函数等)不区分大小写、漏掉“;”、“{”与“}”、“(”与“)”不匹配、控制语句(选择、分支、循环)的格式不正确、调用库函数却没有包含相应的头文件、调用未声明的自定义函数、调用函数时实参与形参不匹配、数组的边界超界等。

3、修改C语言语法错误时要注意以下两点:

(1)、由于C语言语法比较自由、灵活,因此错误信息定位不是特别精确。例如,当提示第10行发生错误时,如果在第10行没有发现错误,从第10行开始往前查找错误并修改之。

(2)、一条语句错误可能会产生若干条错误信息只要修改了这条错误,其他错误会随之消失。特别提示:一般情况下,第一条错误信息最能反映错误的位置和类型,所以调试程序时务必根据第一条错误信息进行修改,修改后,立即运行程序,如果还有很多错误,要一个一个地修改,即,每修改一处错误要运行一次程序。

第二步、照葫芦画瓢

在第一步输入的C程序的基础上进行试验性的修改,运行一下程序看一看程序结果发生了什么变化,分析结果变化的原因,加深新学知识点的理解。事实上这和第一步时同步进行的,实现“输入”加深知识的记忆,“修改”加深对知识的理解。记忆和理解是相辅相成的,相互促进。

例如:将最简单的Hello World!程序

#include "stdio.h"

int main()

{

printf("Hello World!\n")

return 0

}

中的printf("Hello World!\n")中的Hello World!改成你的姓名,运行一下程序,看有什么变化?

再如求1+2+3...+100的和的程序

#include <stdio.h>

main()

{

int i,sum=0

for(i=1i<=100i++)

{

sum=sum+i

}

printf("sum=%d\n",sum)

}

 

第1次将for(i=1i<=100i++)中的100改成50,运行一下程序,看有什么变化?

第2次将for(i=1i<=100i++)中的i++改成i=i+2,运行一下程序,看有什么变化? 

找出程序结果变化的原因,就加深了对C语句的理解。

 

第三步、不看教材看是否能将前两步的程序进行正确地输入并运行。

在这一步要求不看教材,即使程序不能运行,看能否将其改正,使其能正确运行。目的是对前两步的记忆、理解进一步强化。

第四步、增强程序的调试能力

在《Turbo C/C++ for Windows 集成实验与学习环境》集成的教材中每章都有C语言初学者易犯的错误,按照易出错的类型,将教材中的正确的程序改成错误的程序,运行一下程序,看出现的错误信息提示,并记下错误信息,再将程序改成正确的,运行一下程序。这样反复修改,就能够学习C语言程序发生错误的原因和修改错误的能力。

注意:每次只改错一个地方,目的是显示发生该错误的真正原因,避免一次改动多个地方,搞清发生错误的真正原因,切记!!!!

注意:上机调试程序时要带一个记录本,记下英文错误提示信息和解决该错误问题的方法,积累程序调试经验,避免在编程犯同样的错误,切记!!!!

例如,将Hello World程序中语句printf("Hello World!\n")中的改成中文的分号;运行一下程序,看有什么结果?

C语言的错误信息的形式:(下面例子是的Turobo C2.0错误信息,如图1)

错误文件名 行号 冒号错误内容

↓ ↓ ↓↓ ↓

Error E:\WinTc\WinTc\frist.c5 :Function call missing) in function main

C语言的错误信息的形式:(下面例子是Visual C++6.0 错误信息,如图2)

文件名 行号 冒号 错误代码 冒号 错误内容

↓ ↓↓ ↓ ↓ ↓

e:\wintc\wintc\frist.c ( 5 ) : error C2143 : syntax error : missing ')' before ''

软件集成了高校教学用的最多的两个编译器Visual C++6.0和Turbo c 2.0,支持C、标准C、C++、标准C++、WINDOWS C程序的编辑、编译、和调试。软件根据用户输入程序的类型智能选择编译器,不用使用者干涉。

调试程序是一种实践性很强的事,光纸上谈兵是是没用的,就像游泳运动员只听教练讲解示范,而不亲自下水练习,是永远学不会游泳的。 即使在优秀的程序员编写程序也会犯错误的,可能事最低级的语法错误,但他能快速发现错误并改正错误,而我们C语言初学者面对错误提示,不知道发生了什么错误,如何改正,这就是差别。

第五步、研究典型的C语言程序,提高程序设计能力

经过上述过程的学习,我们已经学会了C语言各种语句的流程(即计算机是如何执行这些语句的过程),然后就可以研读别人编写C语言经典程序,看懂别人是如何解决问题的,学习解决问题的方法和程序设计技巧,提高自己的程序设计能力。

在软件中有50多个典型的源程序,研究它的实现方法,提高自己的程序设计能力。

 

第六步、研究课程设计源成序,提高C语言程序设计的能力。

C语言课程设计的目的:是让学生综合利用所学的C语言知识,解决一些接近实际问题题目,提高程序设计和调试较大程序的能力,为进一步进行软件开发打下坚实的基础。

最后送C语言初学者一句话来共勉:首先要相信自己是有能力学好C语言的,然后不惜一切代价把这种能力表现出来,你就成功了。做任何事,何尝不是这样呢?兴趣是学习C语言的最大动力,学习方法给你指明努力的方向,让你事半功倍。如果你感觉对你有帮助的话,请回帖支持,让更多的朋友知道它,谢谢支持!!!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11512843.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存