程序设计基础-基于c语言(第2版)课后习题参考答案_第1页
程序设计基础-基于c语言(第2版)课后习题参考答案_第2页
程序设计基础-基于c语言(第2版)课后习题参考答案_第3页
程序设计基础-基于c语言(第2版)课后习题参考答案_第4页
程序设计基础-基于c语言(第2版)课后习题参考答案_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

习题1参考答案

L1解释以下术语

(1)计算机软件:计算机软件是一系列按照特定结构组织的程序、数据(Data)和文档

(Document)的集合。

(2)计算机程序:用计算机语言所编写的一系列指令的集合。

(3)数据:数据是程序加工和处理的对象。

(4)算法:算法是-一组有穷的规则,它们规定了为解决某一特定问题而采取的一系列运算

步骤。

(5)数据结构:数据结构是存在一种或多种特定关系的数据元素的集合,其外在表现为数

据的组织形式。

(6)数据类型:数据类型是一个值的集合和定义在这个值集上的操作的总称。

(7)程序设计:程序设计是给出解决特定问题程序的方法和过程,是软件构造活动中的重

要组成部分。

1.2简答题

(1)简述内存的组织结构形式?

计算机系统把内存看作是由若干个连续的存储单元(StorageLocation)组成的,每个

存储单元的大小为一个字节(Byte)。为了能唯一标志每个存储单元,在计算机系统中给每

个存储单元指定一个唯一的编号,该编号被称为存储单元的地址(Address),计算机在读写

内存时就是按照存储单元的地址进行的。

(2)为什么计算机系统是一个通用的计算系统?

在计算机硬件相对固定不变的前提下,计算机的通用性主要表现在通过运行不同的程序

来完成不同的计算任务。

(3)简述结构化程序设计的基本思想?

在程序设计过程中,如果仅仅使用顺序、选择和循环这三种基本控制结构,并且使每个

代码块只有一个入口和一个出口,则这样的程序设计方法被称为结构化程序设计

(StructuredProgramming)。

(4)简述计算机语言的发展史?

程序设计语言经历了从机器语言、汇编语言、高级语言到超高级语言的发展历程。

(5)简述利用计算机进行问题求解的过程?

1、理解问题特征

2、设想解决方案

3、优化解决方案

4、描述解决方案

5、执行并分析解决方案

(6)简述各个程序质量要素的含义?

1、正确性(Correctness):正确性是指一个计算机程序的正确程度,即程序在预定的

运行环境下能正确完成预期功能的程度。

2、鲁棒性(Robustness):鲁棒性也称为健壮性,是指在硬件发生故障、输入数据无效

或操作错误等意外情况下,程序能做出响应的程度。

3、效率(Efficiency):效率是指为了完成预定的功能,系统需要的计算资源(主要包

括计算时间和存储空间)的多少。

4、易用性(Usability):易用性又称为可用性,是指在完成预定功能时人机交互的难

易程度。易用性高的程序容易被程序用户理解和掌握,使用户操作简单方便。

5、可理解性(Understandability):可理解性是指理解程序的难易程度。可理解性高

的程序才容易测试和维护。如果程序难以读懂,就会给测试和维护带来巨大的困难。

6、可测试性(Testability):可测试性是一个计算机程序能够被测试的容易程度。为

了提高程序的可靠性,必须通过测试尽可能多得发现并改正程序中的错误。程序的可测试性

直接影响测试的质量和效率。

7、可维护性(Maintainability):诊断和改正程序错误以及功能扩充和性能提高的容

易程度。程序设计是一个迭代过程,要开发出高质量的程序需要对程序进行多次修改和完善。

程序的可维护性决定了上述工作的质量和效率。

8、可重用性(Reusability):可重用性是指在其它应用中该程序可以被再次使用的容

易程度。如果我们在开发新程序时,能够直接或稍加修改就能利用原有的程序,则会大大提

高新程序开发的质量和效率。因此,提高程序的可重用性是提高程序设计质量和效率的根本

途径。

1.3计算题

(1)计算T的8位原码、反码、补码和Excess」27码。

分别为:1000000IB,11111110B,01111110B

(2)计算机内存中相邻四个字节的值为10111110000000000000000000000000,试问该值表

示的实数、有符号数和无符号数各为多少?

分别是:实数0.125、有符号数-1107296256(负数在计算机中用补码表示)无符号数

3187671040

(3)字符‘A'、匕'、'1'的ASCH值是多少,给出将大写字母的ASCH转换成对应小写字

母ASCH值得计算公式。

'A':41H'a':61H'1':31H

大写转化为小写:大写字母的ASCII值+20H=小写字母的ASCII值

1.4为下列问题求解设计算法,并分别用程序流程图、N-S盒图和PAD图加以

描述。

(1)有两个调料盒S1和S2,分别盛有糖和盐,要求将它们互换(即S1盒原来盛糖,现在

改盛盐;S2同理)。

算法思想:这是一个两个变量交换值的问题,可以设置一个临时变量,首先把S1的值

放入临时变量中,然后将S2的值放入S1中,最后将临时变量的值放入S1中即可。

程序流程图:

N-S盒图:

PAD图:

(2)依次输入6个整数,要求输出其中最小的数。

算法思想:定义一个临时变量用来存放最小的数,首先输入第一个数赋值于临时变量,

然后循环输入其余的整数,比较输入的整数和临时变量的大小,如果大于临时变量则继续输

入,反之,则给临时变量赋值为次此数。最后临时变量中存放的数输入的数中的最小数,输

入临时变量即可。

程序流程图:

开始

定义变量x

府入第个

整数并赋他

r编入卜个

整数赋值j-

输入完华

输阳丁

结束

N-S盒图:

PAD图:

定义变量X和临时变量T

(3)输入3个整数,按从大到小的顺序输出。

算法思想:输入三个数a、b、c,首先比较a和b,如果a>b,则比较c和a,如果c>a

则输出c、a、b;如果c〈a,在比较c和b,如果c>b,输出a、c、b,否则输出a、b、c;对

于a<b的情况同理可以得出结果。

程序流程图:

N-S盒图:

(4)求1*2*3*........*10。

算法思想:定义一个变量用来存放最后的值,赋初值为1,做十次循环,每次循环在原

来变量的基础上乘循环变量值(即1-10),最后输出这个变量即可。

程序流程图:

N-S盒图:

count=lJ1

i<=10

count=count*l

i++

输出count

PAD图:

(5)输入两个整数,求其最大公约数。

算法思想:选取两个数中较小的数作为起始值,让这两个数分别除以这个值,如果可以

整除,则这个数就是最后结果,如果不能整除则将起始值减一之后再用原来的两个数对其做

除法运算,知道整除为止,得到的起始值的最后值就是结果。

程序流程图:

N-S盒图:

PAD图:

两数A.B公约数C

1.5算法思考题

(1)钞票换硬币:把一元钞票换成一分、二分、五分硬币(每种至少一枚),有哪些种换法?

分析:1元相当于100分,设5分、2分、1分的硬币数分别为X、Y、Z,求换法就是在

寻找这样一种组合,使得5*X+2*Y+Z=100,所以每当找到1种组合时,将个数记录下来,

就可知换法有多少种,算法描述如下:

Count=0;//用于记录个数,初始为0

for(X=l;X<=20;X++)

for(Y=l;Y<=50;Y++)

for(Z=l;Z<=100;Z++)

(

if(5*X+2*Y+Z==100)〃可实现交换

Count++;

)

输出Count

(2)百钱买百鸡:一只公鸡值5元,一只母鸡值3元,3只小鸡值1元,现用一百元要买

一百只鸡,问有什么方案?

分析:由题意可知,假设公鸡、母鸡、小鸡分别有X、Y、Z只,那么X、Y、Z满足:X+Y+Z=100,

而且要满足钱数限定:5*X+3*Y+1/3*Z=100,由于3只小鸡1元钱,所以小鸡的个数必须

是3的整数倍,即:Z是3的整数倍。可通过限制条件,筛选出满足条件的X,Y,Z»当然

X、Y、Z还满足以下条件:5*X<=100;3*Y<=100;Z<=100«以下是算法描述:

for(X=0;X<=100;X++)

for(Y=0;Y<=100;Y++)

for(Z=0;Z<=100;Z++)

if(5*X<=100and3*Y<=100andz%3==0)

if(X+Y+Z=100and5*X+3*Y+Z/3==100)

输出X、Y、Z;

)

)

)

(3)斐波那契兔子的问题:某人有一对兔子饲养在围墙中,如果它们每个月生一对兔子,

且新生的兔子在第二个月后也是每个月生一对兔子,问一年后围墙中共有多少对兔子。

分析:第一个月是最初的一对兔子生下一对兔子,围墙内共有两对兔子。第二个月仍是

最初的一对兔子生下一对兔子,共有3对兔子。到第三个月除最初的兔子新生一对兔子外,

第一个月生的兔子也开始生兔子,因此共有5对兔子。继续推下去,第12个月时最终共有

对377对兔子。由分析知,每个月的兔子都是上个月的兔子与新增兔子之和,而上个月新

生的兔子到下个月才会生兔子,所以新增的兔子都是上两月的兔子生的。设每个月的兔子数

为F(n),则可列出下列式子:

F(O)=F(1)=1

F(n)=F(n-l)+F(n-2)

显然可用递归的方法解出此题,算法流程图如下:

习题2参考答案

(1)请简要描述c语言的发展历史。

答:C语言是一种目前世界上普遍流行、使用广泛的高级程序设计语言,它是在B语

言的基础上发展起来的,1972—1973年间,贝尔实验室设计出了C语言。1983年,美国国

家标准化协会制定了C语言的标准,称为ANSIC«

(2)略。

(3)C语言的主要特点是什么?

答:C语言的主要特点如下。

①C程序是由函数组成的。

②函数由函数头和函数体组成。

③C程序总是从main函数开始执行。

④每个语句和数据声明的最后必须有一个。

⑤C语言没有自己的输入/输出语句,它的输入/输出由库函数printf和scanf完成。

⑥可以添加注释。

⑦C语言程序中的变量必须先声明后使用。

(4)如何使用VisualC++6.0开发控制台程序?

使用VC6开发控制台程序的方法如下:

答:①在MiscrosoftVisualC++6.0环境下,首先建立—空的工程。

②而后建立一个C源程序文件,并在该文件中输入源代码。

③使用Bulid命令或者快捷键F7,进行编译连接。

④如果没有错误,选择Execute命令或者快捷键Ctrl+F5,进行执行。

习题3参考答案:

3.1选择题

1.B2.D3.D4.A5.A6.A7.C8.C9.C10.B

3.2写出下列程序的输出结果

1.200310c8

2.a=100,b=200

3.97,141,61,a

4.

10,10

567.800000,5.678000e+002

3.141593,3.141593e+000,3.14159,3.14159

Pressanykeytocontinue

5.aabbcabc

4,3

6.6,6,6,7

3.3编程题

1.

#include<stdio.h>

voidmain()

(

inta=500;

printf(〃%d,%o,%x\n〃,a,a,a);

)

输出结果:500,764,lf4

2.

ttinclude<stdio.h>

voidmain()

(

floatx;

scanf("%f",&x);

printf(〃a=%.3f,a=%.3e\n〃,x,x);

}

输入:66

输出结果:a=66,000,a=6.60000e+001

3.

ttinclude<stdio.h>

voidmain()

(

charchi='a,ch2=chl;

printf(,z%c,%d,%o,%x\n〃,chi,chi,chi,chi);

printf(,z%c,%d,%o,%x\n〃,ch2,ch2,ch2,ch2);

)

输出结果:A,65,101,41

a,97,141,61

4.

ttinclude<stdio.h>

voidmain()

(

floatx,y,z,s,v;

scanf("%f%f%f”,&x,&y,&z);

s=2*(x*y+x*z+y*z);

v=x*y*z;

printf(Z/Area=%.If,Volume二%.lf\n〃,s,v);

)

输入:345

输出结果:Area=94,Volume=60

5.

#definePI3.14

^include<stdio.h>

^include<math.h>

voidmain()

(

floatr,s,1;

scanf("%f",&r);

s=(float)PI*r*r;

1=2*(float)PI*r;

printf(,zr=%4.If,s=%4.If,1=%4.lf\nz,,r,s,1);

)

输入:3

输出结果:r=3.0,s=28.3,1=18.8

6.

#include<stdio.h>

ttinclude<math.h>

voidmain()

(

floatxl,yl,x2,y2,x3,y3,a,b,c,p,s;

,/,,

scanf(%f%f%f%f%f%f)&xl,&yl,&x2,&y2,&x3,&y3);

a=sqrt((xl-x2)*(xl-x2)+(yl-y2)*(yl-y2));

b=sqrt((xl-x3)*(xl-x3)+(yl-y3)*(yl-y3));

c=sqrt((x2~x3)*(x2-x3)+(y2-y3)*(y2-y3));

p=(a+b+c)/2;

s=sqrt(p*(p-a)*(p-b)*(p-c));

printf(,zArea=%f\n,z,s);

)

输入:5638023

输出结果:Area=12.000013

习题4参考答案

4.1选择题。

(1)D(2)A(3)A(4)C(5)C(6)B(7)B(8)B(9)C(10)A

4.2填空题。

(1)261(2)16(3)0(4)2,1

4.3编程题。

(1)

#include<stdio.h>

voidmain()

(

floatc,f;

printf("输入华氏温度:\n");

scanf;

c=(f-32)*5/9;

printf("摄氏温度为:%5.2f\n"zc);

(2)

#include<stdio.h>

#include〈string.h>

voidmain()

(

charsl[10],s2[10]zs[20];

printf("pleaseentertwostring\n");

gets(si);

gets(s2);

strcat(si,s2);

printf("%s\n",si);

printf("%d\n",strlen(si));

}

(3)

#include<stdio.h>

#include<math.h>

voidmain()

(

doublex,y;

printf("pleaseentertwodata:\nH);

Hn

scanf(%lf%lfz&x,&y);

printf("%lfraisedto%lfis%lf\n",xzy,pow(xzy));

习题5参考答案

L填空题

(1)n=4(2)2*i-l(3)7(4)######

2.#include<stdio.h>

voidmain()

{

longm,n,a,b,s;

printf(^XnPleaseinputvalueofM:〃);

scanf&m);

printf(,z\nPleaseinputvalueofN:〃);

scanf&n);

a=(m>n)?m:n;

b=(m>n)?n:m;

while(a%b!=0)

(

s=a%b;

a=b;

b=s;

)

printf(,z\nGongyueshu:%ld\n〃,s);

printf(z,\nGongBeishu:%ld\n,z,(m*n)/s);

)

3.#include<stdio.h>

voidmain()

inta,b,c,d,e;

printf(z,Pleaseinputaninteger:\nz,);

scanf&a);

if(a/1000=0)

(

printf("inputerror!\n,z);

return;

)

b=a/1000;

e=a%10;

c=a%1000/100;

d=a%100/10;

if(b==e&&c==d)

printf("YES.\n〃);

else

printf(〃N0.\n〃);

}

4.#include<stdio.h>

voidmain()

(

intc;

intNuml,Num2,Num3,Num4;

Num1=Num2=Num3=Nuni4=0;

do

(

c=getchar();

if((c>=,a&&c<=,zf)||(c>='A'&&c<=,Zf))

Numl++;

elseif(c>='0'&&c<=,95)

Num2++;

elseif(c==,')

Num3++;

else

Num4++;

}while(c!=,\n);

printf(〃英文字母有%€1个,数字有%d个,空格有%d个,其它字符有%d个。

\n〃,Numl,Num2,Num3,Num4);

}

5.#include<stdio.h>

#include<math.h>

voidmain()

floata,b,c,disc,xl,x2,realpart,imagepart;

printf("Inputa,bandc:〃);

scanf(,z%f,%f,%f,z,&a,&b,&c);

printf(,zTheequation");

disc=b*b-4*a*c;

if(fabs(disc)<=le-7)

printf(/zhastwoequalroots:%4.2f.\n?,,-b/(2*a));

else

if(disc>le-7)

(

xl=(-b+sqrt(disc))/(2*a);

x2=(-b-sqrt(disc))/(2*a);

printf(z/hasdistincerealroots:%4.2fand%4.2f.\n”,xl,x2);

)

else

(

realpart=-b/(2*a);

imagepart=sqrt(-disc)/(2*a);

printf(z/hascomplextroots:");

printf(z,%4.2f+%4.2fi〃,realpart,imagepart);

printf(,zand%4.2f-%4.2fi\n",realpart,imagepart);

)

)

6.#include<stdio.h>

voidmain()

(

inti,j;

for(i=l;i<=5;i++)

(

for(j=l;j〈=i;j++)

printf(〃*〃);

printf(〃\n〃);

)

for(i=5;i>=l;i­)

(

for(j=i;j>=l;j~)

printf(〃*〃);

printf(〃\n");

)

}

7.#include<stdio.h>

#defineEPSle-7

voidmain()

intn;

doublex,an,sum;

printf("inputx:〃);

scanf&x);

x=x*3.1415926/180;

sum=0;

an=x;

n=l;

do

(

sum+=an;

n=n*(n+l)*(n+2);

an*=(-x*x)/n;

printf(〃an=%f\n〃,an);

}while(fabs(an)>=EPS);

printfCsin(%.41f)=%.41f\n〃,x,sum);

}

8.#include<stdio.h>

voidmain()

(

unsignedintn;

charc;

n=0;

printf(z,inputabinaryinteger:");

while((c=getchar())!='\n)

(

switch(c)

(

case'O':

n=n*2+0;

break;

case'1':

n=n*2+l;

break;

)

)

printf("thedecimalis%d.\n〃,n);

}

9.#include<stdio.h>

voidmain()

{

inti,j;

for(i=l;i<10;i++)

printf(〃\t%d〃,i);

printf(〃\n〃);

for(i=l;i<10;i++)

(

printf(,,%d,/,i);

for(j=l;j<=i;j++)

printfC\t%d,z,i*j);

printf(〃\n〃);

)

)

10.#include<stdio.h>

voidmain()

(

intn,m,z,x,y;

printf("inputn:〃);

scanf("%d〃,&n);

m=n;

z=x=y-l;

while(n>l)

(

z=x+y;

X=y;

y二z;

n——;

)

printf("Fibonacci(/d)=%d.\n”,m,z);

)

11.#include<stdio.h>

ttinclude<math.h>

voidmainO

(

inti,j;

intflag;

for(i=l;i<=100;i++)

(

flag=l;

for(j=2;j<=sqrt(i);j++)

if(i%j==0)

(

flag=0;

break;

}

if(flag==l)

printfi);

)

)

12.#include<stdio.h>

voidmain()

(

inti,sum;

sum=0;

for(i=l;i<=1000;i++)

if(i%3=0&&i%5=0&&i%7==0)

sum十=i;

printf(^sumis%d.\n〃,sum);

}

13.#include<stdio.h>

voidmain()

(

intx;

longf;

printf("inputx:");

scanf&x);

if(x>=l&&x<=3)

f=2*x+3;

elseif(x>=4&&x<=10)

f=3*(x+4);

else

f=x*x+3*x-6;

printfrf(%d)=%d\n",x,f);

}

习题6参考答案

6.1&b[i][j]=3001+i*16+j*4;

6.2求一维数组各元素的最大值、最小值及所有元素的乘积

#include<stdio.h>

#defineN10

voidmain()

(

inta[N];

intmax,min,i,product;

printf(〃输入%(1个数组元素:\n〃,N);

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

scanf&a[i]);

max=a[0];

min=a[0];

product=a[0];

for(i=l;i<N;i++)

product*=a[i];

if(max<a[i])max=a[i];

if(min>a[i])min=a[i];

)

printf(〃各元素最大值为:%d\n”,max);

printf(〃各元素最小值为:%d\n〃,min);

printf("各元素的乘积为:%d\n/z,product);

)

6.3已知数列a0=0,al=l,an=an-2+an-2an-l,求数列的前10个元素

#include<stdio.h>

#defineN10

voidmain()

(

inta[N]={0,1};

inti;

for(i=2;i<N;i++)

a[i]=a[i-2]+a[i-2]*a[i-l];

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

(

if(i%5==0)printfCXn");

printf(〃%5c

)

printf(〃\rT);

)

6.4用改进的冒泡算法对•N个数由小到大排序

#include<stdio.h>

#defineN10

voidmain()

{

inta[N];

inti,j,temp,flag;

printf(〃输入待排序数据:\n〃);

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

scanf&a[i]);

for(i=0;i<N-l;i++)

(

flag=0;

for(j=0;j<N-i;j++)

if(a[j]>a[j+l])

(

temp=a[j];

a[j]=a[j+l];

a[j+l]=temp;

flag=l;

)

if(flag==O)break;

)

printf(〃排序后数据为:\n〃);

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

printf(〃%d",a[i]);

printf(〃\rT);

)

6.5用插入法对N个数由小到大排序

#include<stdio.h>

#defineN10

voidmain()

(

inta[N];

inti,j,temp;

printf("输入待排序数据:\n");

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

scanf&a[i]);

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

(

j=i-l;

temp=a[i];

while(a[j]>temp&&j>=0)

(

a[j+l]=a[j];

j—;

)

a[j+l]=temp;

)

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

printf(z/%d",a[i]);

printf("\n");

)

6.6用筛选法求1—100内的素数

#include<stdio.h>

#include<math.h>

voidmain()

(

inta[101];

inti,j,count=0;

for(i=l;i<=100;i++)

a[i]=i;

a[l]=0;

for(i=2;i<sqrt(100);i++)

if(a[i]!=0)

for(j=i+l;j<=100;j++)

(

if(a[j]!=0&&a[j]%a[i]==0)

a[j]=O;

)

)

for(i=l;i<=100;i++)

(

if(a[i]!=0)

(

printf("%5d〃,a[i]);

count++;

if(count%5==0)printf(,,\n,z);

}

)

)

6.7将•维数组中各个元素的顺序变反

#include<stdio.h>

#defineN10

voidmain()

(

inta[N],i,temp;

printf("请输入%d个整数:\n〃,N);

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

scanf(〃%d〃,&a[i]);

for(i=0;i<N/2;i++)

(

temp=a[i];

a[i]=a[N-l-i];

a[N-l-i]=temp;

)

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

printf("%5d",a[i]);

printfCAnO;

)

-116

57

6.8输出如下上三角矩阵,主对角线以下的元素不输出L42

#include<stdio.h>

ttdefineN3

voidmain()

inta[N][N]={{1,1,6},{0,5,7},{0,0,2});

inti,j;

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

(

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

printf(,z〃);

for(j=i;j<N;j++)

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

printf(〃\n〃);

)

)

6.9求两个矩阵的和,要求不引入新的矩阵

#include<stdio.h>

#defineM3

#defineN4

voidmain()

(

inta[M][N],i,j;

printf(“请输入%d*%d矩阵A:\n”,M,N);

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

for(j=0;j<N;j++)

scanf&a[i][j]);

printf(“请输入%d*%d矩阵B:\n〃,M,N);

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

for(j=0;j<N;j++)

scanf(〃%d〃,&b[i][j]);

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

for(j=0;j<N;j++)

printf(〃两矩阵的和为:\n〃);

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

(

for(j=0;j<N;j++)

printf(〃%5d〃,a[i][j]);

printf(〃\n〃);

6.10求矩阵的最大元素和最小元素及其所在行和列

#include<stdio.h>

#defineM3

#defineN4

voidmain()

inta[M][N],i,j,max,maxi=0,maxj=0,min,mini=0,minj=0;

printf(〃请输入%d*%d矩阵A:\n〃,M,N);

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

for(j=0;j<N;j++)

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

max=a[0][0];

min=a[0][0];

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

for(j=0;j<N;j++)

(

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

(

max=a[i][j];

maxi=i;

maxj=j;

}

if(a[i][j]<min)

(

min=a[i][j];

mini=i;

minj=j;

)

)

printf(〃最大元素为a[%d][%d]=%d\nz,,maxi,maxj,max);

printf("最小元素为a[%d][%d]=%d\n,z,mini,minj,min);

}

6.11输出杨辉三角形的前10行

1

11

121

1331

14641

15101051

说明:杨辉三角形是(a+b)n展开后各项的系数。首行(a+b)0的系数为1,次行为1,1;

其余各行中首末元素为b其余元素为其左上方元素与正上方元素的和。

#include<stdio.h>

#defineN10

voidmain()

(

inta[N][N],i,j;

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

(

a[i][0]=1;

for(j=l;j<i;j++)

a[i][j]=a[i-l][j-l]+a[i-l][j];

)

printf("杨辉三角的前%d行为:\n”,N);

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

(

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

printf(线5d”,a[i][j]);

printf("\n");

)

)

6.12输出N阶魔方阵,其中N为一个奇数。

N阶魔方阵是指一个N*N的方阵,其元素由1到N2组成,且方阵每行、每列以及对角

线元素的和都相等。如三阶魔方阵为

'816'

357

492

魔方阵中各数的排列规律如下:

(1)1在第一行中间一列;

(2)从2到N*N的各个数依次按如下规则存放:每一个数存放的行比前一个数的行数

减1,列数加1(如上面的三阶魔方阵,5在4的匕一行后一列);

(3)如果上一个数在第一行,则下一个数在最后一行,列数加1;

(4)如果上一个数在最后一列,则下一个数在第一列,行数减1;

(5)如果按上述规则确定的位置已经有数,或上一个数在第1行第N歹U,则下一个数

放在上一个数的正下方。如三阶魔方阵中,按前四条规则,4应该放在第一行、第二列的位

置,但由于1已经在该位置,故4放在3的下面。再如6,因其位于第一行第3列,故7在

其下方。

#include<stdio.h>

#defineN5

voidmain()

(

inta[N][N]={0}>i,j,k;

i=0;

j=N/2;

a[i][j]=l;

for(k=2;k<=N*N;k++)

(

i=i-l;

j=j+l;

if(i<O&&j==N)

(

i=i+2;

j=j-l;

a[i][j]=k;

}

elseif(i<0)

i=N-l;

elseif(j==N)

j=0;

elseif(a[i][j]!=0)

(

i=i+2;

j=j-l;

}

a[i][j]=k;

)

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

(

for(j=0;j<N;j++)

printf(〃%5d”,a[i][j]);

printf(〃\n〃);

)

)

6.13求二维数组的鞍点。即找一个位置,该位置上的元素同行中最大,同列中最小。

#include<stdio.h>

#defineM3

#defineN4

voidmain()

(

inta[M][N];

inti,j,maxj,count=0,flag;

printf(“请输入%d*%d阶矩阵A:\n〃,M,N);

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

for(j=0;j<N;j++)

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

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

(

maxj=0;

for(j=l;j<N;j++)

if(a[i][maxj]<a[i][j])maxj=j;

flag=l;

for(j=0;j<M;j++)

if(a[j][maxj]<a[i][maxj])flag=O;

if(flag==l)

(

count++;

printf(〃第%d个鞍点:a[%d][%d]=%d\n〃,count,i,maxj,a[i][maxj]);

)

)

if(count==0)

printf(〃没有鞍点”);

)

6.14输出以下图案

****

***

**

*

#include<stdio.h>

^defineN4

voidmain()

{

inti,j;

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

(

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

printf(〃〃);

for(j=i;j<N;j++)

printf(〃*〃);

printffW);

)

}

6.15通过键盘输入一行字符串,之后按如下规律对其加密:

AfZa-*z

B-*Ybfy

CfXc-*x

即将字符串中的第i个大写或小写英文字母变成相应的第26-i+l个大写或小写字母,

其它字符不变。

#include<stdio.h>

#include<string.h>

voidmainO

(

charstr[100];

inti,len;

printf(〃请输入字符串:\n〃);

gets(str);

len=strlen(str);

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

(

if(str[i]>=,&&str[i]<=,Z')

str[i]=,A*+25-(str[i]->A*);

if(str[i]>=,a'&&str[i]<=,z')

str[i]=,a'+25-(str[i]」a);

)

puts(str);

)

6.16编程实现strcmp函数的功能。

#include<stdio.h>

voidmain()

(

charstrl[100],str2[100];

inti=0,result;

printf(〃请输入字符串strl:\n〃);

gets(strl);

printf(〃请输入字符串str2:\n");

gets(str2);

while(strl[i]=str2[i]&&strl[i]!='\0')

i++;

if(strl[i]=0,&&str2[i]=0)

result=0;

else

result=strl[i]-str2[i];

printf(〃结果为:%d\n",result);

)

6.17编程实现strcpy函数的功能。

#include<stdio.h>

#include<string.h>

voidmain()

{

charstrl[100],str2[100];

inti=0;

printf("请输入字符串str2:\n〃);

gets(str2);

while(str2[i]!='\0')

(

strl[i]=str2[i];

i++;

}

strl[i]='\0';

printf(z,strl=%s\nz,,strl);

printf(,,str2=%s\n,z,str2);

习题7参考答案

7.1答:从用户使用的角度,可以将函数分为:

•库函数

库函数也称为标准函数,指由C系统提供而无需用户定义的函数。这种函数只需在程

序前面包含该函数原型所在的头文件即可(即使用#include预处理命令)。

•用户自定义函数

指用户按照实际需要自己编写的实现一定功能的函数。这种函数需要在程序中进行声

明和定义才可以使用。

从函数返回值的角度,可以将函数分为:

•有返回值函数

如果一个函数被调用,并在执行完成后要向调用者返回一个执行结果,则称为有返回值

函数,这个函数返回的执行结果即为返回值。如:getchar函数便返回一个字符。

如果一个用户自定义函数是有返回值的,那么必须在函数声明和定义中明确指出返回

值的类型。

•无返回值函数

如果•个函数被调用,但在执行完成后不向调用者返回函数值,则称为无返回值函数。

此类函数主要用于完成某种特定的处理任务(类似于Basic、Pascal等语言中的过程),

如:printf函数实现输出功能,就没有返回值。

用户在定义一个无返回值函数时,需要指定其返回值类型为空类型,即void类型。

从函数有无参数的角度,可以将函数分为:

•有参函数

有参函数也称为带参函数。如果一个函数被调用时需要从调用者那里接收一些参数,那

么它就是一个有参函数。如:printf,scanf就是有参函数,在调用时需要指明输出、输

入的格式和内容。

在函数定义和声明中使用的参数,称为形式参数,简称为形参,用于表明一个函数需要

接收的数据;在函数调用时给出的参数称为实际参数,简称为实参,用于给被调用的函数传

递实际数据。

•无参函数

如果一个函数被调用时不需要从调用者那里接收任何参数,则称为无参函数。如我们前

面所有的main函数都是无参函数。

7.2答:C语言中函数定义的格式有两种。第一种是传统格式(或称为K&R格式),是

早期编译系统使用的格式;第二种是现代格式(或称为ANSI格式),是现代编译系统采用

的格式。

传统格式:[存储类型][数据类型]函数名([形参名”,形参名2[,……]]])

[数据类型1形参名1;[数据类型2形参名2;[……]]]

[函数体]

}

现代格式:[存储类型][数据类型]函数名([数据类型1形参名1L数据类型2形参名

2[,……]]])

[函数体]

)

功能:定义一个函数。

7.3答:函数调用有两种方式:一是使用函数名进行调用,二是使用函数指针进行调用。

格式:函数名([实参1,实参2,……])

功能:调用函数名指定的函数。

7.4填空题

(1)10(2)15(3)4,3,7(4)12334(5)x<ar[i][j]ar[i][j]br[i]=x

(6)intF(int);longSunFun(int);F(x)x*x+l

7.5函数1和函数2之间除变量i和j的存储类型不同外,其它均相同。当函数只执行

一次时,两个都是正确的;但是当函数在程序中被反复多次调用时,函数2就是错误的。

条件表达式!)<二0||(!(n&1)&&n!二2)用于在输入的参数n不是正数或者为不等于2

的偶数时退出程序。

7.6intF(int);

voidmain()

(

inta;

printf(/zinputanumber:/z);

scanf("%d〃,&a);

if(F(a)==0)

printf(〃不是水仙花数。\n〃);

else

printf(〃是水仙花数。\n〃);

}

intF(inta)

(

intb,c,d;

b=a/100;

c=a%l00/10;

d=a%10;

if(a==b*b*b+c*c*c+d*d*d)

return1;

e

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论