admin 管理员组

文章数量: 1086019


2024年12月31日发(作者:网页特效实训心得体会)

习题1参考答案

1.1解释以下术语

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

(Document)的集合。

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

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

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

步骤。

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

据的组织形式。

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

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

要组成部分。

1.2 简答题

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

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

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

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

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

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

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

来完成不同的计算任务。

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

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

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

(Structured Programming)。

(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)计算-1的8位原码、反码、补码和Excess_127码。

分别为:10000001B、11111110B、11111111B、01111110B

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

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

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

3187671040

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

母ASCII值得计算公式。

‘A’:41H ‘a’:61H ‘1’:31H

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

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

描述。

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

改盛盐;S2同理)。

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

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

程序流程图:

开始

输入S1、S2

设置临时变量T

T=S2

S2=S1

S1=T

结束

N-S盒图:

输入S1、S2

定义临时变量T

T=S1

S1=S2;

S2=T;

PAD图:

输入S1、S2

定义临时变量T

T=S1;S1=S2;S2=T

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

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

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

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

入临时变量即可。

程序流程图:

开始

定义变量X

和T

输入第一个

整数并赋值

于T

输入下一个

N-S盒图:

PAD图:

整数赋值于

X

N

X>TNT=X

Y

输入完毕

Y

输出T

结束

定义变量X和临时变量T

输入第一个数并赋值给T

输入下一个整数赋值于X

Y NX>T

T=X

输出T

定义变量X和临时变量T

输入第一个整数赋值于T

输入下一个整数赋值于X

X>T

T=X

输出T

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

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

则输出c、a、b;如果cb,输出a、c、b,否则输出a、b、c;对

于a

程序流程图:

开始

输入三个整

数并赋值给

a,b,c

Ya>bN

Y

c>a

c>b

Y

N

N

输出c,a,b

c>b

Y

输出a,b,c

输出b,a,c

Nc>a

输出c,b,a

N

依次输出

a,c,b

Y

输出b,c,a

结束

N-S盒图:

输入三个数并赋值给a,b,c

Y Na>b

Y Nc>a

Y Nc>b

输出c,a,b

输出

a,c,b

输出

a,b,c

输出

b,a,c

输出

b,c,a

Y Nc>b

Y c>a

N

输出c,b,a

PAD图:

输入三个数赋值给a,b,c

输出c,a,b

c>a

c>b

输出a,c,b

输出a,b,c

a>b

输出c,b,a

c>b

c>a

输出b,c,a

输出b,a,c

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

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

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

程序流程图:

开始

count=1

i=1

i<=10

T

count=count*i

i++

F

输出count

开始

N-S盒图:

count=1,i=1

i<=10

count=count*I

i++

输出count

PAD图:

count=1,i=1

while (i<=10)

count=count*I

i++

输出count

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

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

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

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

程序流程图:

开始

数A,B

公约数C

A

N-S盒图:

PAD图:

T

C=AC=B

A%C==0 AND

B%C==0

FC--

T

输出C

结束

两个数A,B,公约数C

Y

A

N

C=AC=B

C>=1

Y

A%C==0 AND B%C==0

N

输出CC--

两数A,B公约数C

C=A

A

C=B

输出C

while (C>=1)

A%C==0 AND

B%C==0

C--

1.5算法思考题

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

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

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

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

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

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

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

for(Z=1;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<=100 and 3*Y<=100 and z%3==0)

{

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

{

输出X、Y、Z;

}

}

}

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

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

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

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

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

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

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

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

F(0) = F(1) = 1

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

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

开始

F(n)=0

i=0

Fi==0||i==1

T

F(i) = F(i-1) + F(i-2)F(i)=1i++

i==12

T

输出F(i)

F

开始

习题2参考答案

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

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

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

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

(2)略。

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

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

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

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

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

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

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

⑥ 可以添加注释。

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

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

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

答:① 在Miscrosoft Visual C++ 6.0环境下,首先建立一个空的工程。

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

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

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

习题3参考答案:

3.1 选择题

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

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

1.200 310 c8

2.a=100,b=200

3.97,141,61,a

4.

c abc

4,3

6.6,6,6,7

3.3 编程题

1.

#include

void main()

{

int a=500;

printf("%d,%o,%xn",a,a,a);

}

输出结果:500,764,1f4

2.

#include

void main()

{

float x;

scanf("%f",&x);

printf("a=%.3f,a=%.3en",x,x);

}

输入:66

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

3.

#include

void main()

{

char ch1='a',ch2=ch1;

printf("%c,%d,%o,%xn",ch1,ch1,ch1,ch1);

printf("%c,%d,%o,%xn",ch2,ch2,ch2,ch2);

}

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

a,97,141,61

4.

#include

void main()

{

float x,y,z,s,v;

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

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

v=x*y*z;

printf("Area=%.lf,Volume=%.lfn",s,v);

}

输入:3 4 5

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

5.

#define PI 3.14

#include

#include

void main()

{

float r,s,l;

scanf("%f",&r);

s=(float)PI*r*r;

l=2*(float)PI*r;

printf("r=%4.1f,s=%4.1f,l=%4.1fn",r,s,l);

}

输入:3

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

6.

#include

#include

void main()

{

float x1,y1,x2,y2,x3,y3,a,b,c,p,s;

scanf("%f%f%f%f%f%f",&x1,&y1,&x2,&y2,&x3,&y3);

a=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));

b=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-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("Area=%fn",s);

}

输入:5 6 3 8 0 23

输出结果:Area=12.000013

习题4参考答案

4.1选择题。

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

4.2填空题。

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

4.3编程题。

1)

#include

void main()

{

float c,f;

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

scanf("%f",&f);

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

printf("摄氏温度为:%5.2fn",c);

}

8)B (9)C 10)A

( ( (

(2)

(3)

#include

#include

void main()

{

char s1[10],s2[10],s[20];

printf("please enter two stringn");

gets(s1);

gets(s2);

strcat(s1,s2);

printf("%sn",s1);

printf("%dn",strlen(s1));

}

#include

#include

void main()

{

double x,y;

printf("please enter two data:n");

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

printf("%lf raised to %lf is %lfn",x,y,pow(x,y));

}

习题5参考答案

1.填空题

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

2.#include

void main()

{

long m,n,a,b,s;

printf("nPlease input value of M :");

scanf("%ld",&m);

printf("nPlease input value of N :");

scanf("%ld",&n);

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

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

while (a%b!=0)

{

s=a%b;

a=b;

b=s;

}

printf("nGong yue shu:%ldn",s);

printf("nGong Bei shu:%ldn",(m*n)/s);

}

3.#include

void main()

{

int a,b,c,d,e;

printf("Please input an integer:n");

scanf("%d",&a);

if (a/1000==0)

{

printf("input error!n");

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("NO.n");

}

4.#include

void main()

{

int c;

int Num1,Num2,Num3,Num4;

Num1=Num2=Num3=Num4=0;

do

{

c=getchar();

if ((c>='a' && c<='z') || (c>='A' && c<='Z'))

Num1++;

else if (c>='0' && c<='9')

Num2++;

else if (c==' ')

Num3++;

else

Num4++;

}while(c!='n');

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

n",Num1,Num2,Num3,Num4);

}

5.#include

#include

void main()

{

float a,b,c,disc,x1,x2,realpart,imagepart;

printf("Input a,b and c:");

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

printf("The equation");

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

if (fabs(disc)<=1e-7)

printf("has two equal roots:%4.2f.n",-b/(2*a));

else

if (disc>1e-7)

{

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

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

printf("has distince real roots:%4.2f and %4.2f.n",x1,x2);

}

else

{

realpart=-b/(2*a);

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

printf("has complext roots:");

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

printf(" and %4.2f-%4.2fin",realpart,imagepart);

}

}

6. #include

void main()

{

int i,j;

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

{

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

printf("*");

printf("n");

}

for (i=5;i>=1;i--)

{

for (j=i;j>=1;j--)

printf("*");

printf("n");

}

}

7.#include

#define EPS 1e-7

void main()

{

int n;

double x,an,sum;

printf("input x:");

scanf("%lf",&x);

x=x*3.1415926/180;

sum=0;

an=x;

n=1;

do

{

sum+=an;

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

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

printf("an=%fn",an);

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

printf("sin(%.4lf)=%.4lfn",x,sum);

}

8.#include

void main()

{

unsigned int n;

char c;

n=0;

printf("input a binary integer:");

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

{

switch (c)

{

case '0':

n=n*2+0;

break;

case '1':

n=n*2+1;

break;

}

}

printf("the decimal is %d.n",n);

}

9.#include

void main()

{

int i,j;

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

printf("t%d",i);

printf("n");

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

{

printf("%d",i);

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

printf("t%d",i*j);

printf("n");

}

}

10.#include

void main()

{

int n,m,z,x,y;

printf("input n:");

scanf("%d",&n);

m=n;

z=x=y=1;

while (n>1)

{

z=x+y;

x=y;

y=z;

n--;

}

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

}

11.#include

#include

void main()

{

int i,j;

int flag;

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

{

flag=1;

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

if (i%j==0)

{

flag=0;

break;

}

if (flag==1)

printf("%dt",i);

}

}

12.#include

void main()

{

int i,sum;

sum=0;

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

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

sum+=i;

printf("sum is %d.n",sum);

}

13.#include

void main()

{

int x;

long f;

printf("input x:");

scanf("%d",&x);

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

f=2*x+3;

else if (x>=4 && x<=10)

f=3*(x+4);

else

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

printf("f(%d)=%dn",x,f);

}

习题6参考答案

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

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

#include

#define N 10

void main( )

{

int a[N];

int max,min,i,product;

printf("输入%d个数组元素:n",N);

for(i=0;i

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

max=a[0];

min=a[0];

product=a[0];

for(i=1;i

{

product*=a[i];

if(max

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

}

printf("各元素最大值为:%dn",max);

printf("各元素最小值为:%dn",min);

printf("各元素的乘积为:%dn",product);

}

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

#include

#define N 10

void main( )

{

int a[N]={0,1};

int i;

for(i=2;i

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

for(i=0;i

{

if(i%5==0)printf("n");

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

}

printf("n");

}

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

#include

#define N 10

void main( )

{

int a[N];

int i,j,temp,flag;

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

for(i=0;i

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

for(i=0;i

{

flag=0;

for(j=0;j

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

{

temp=a[j];

a[j]=a[j+1];

a[j+1]=temp;

flag=1;

}

if(flag==0)break;

}

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

for(i=0;i

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

printf("n");

}

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

#include

#define N 10

void main( )

{

int a[N];

int i,j,temp;

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

for(i=0;i

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

for(i=0;i

{

j=i-1;

temp=a[i];

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

{

a[j+1]=a[j];

j--;

}

a[j+1]=temp;

}

for(i=0;i

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

printf("n");

}

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

#include

#include

void main( )

{

int a[101];

int i,j,count=0;

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

a[i]=i;

a[1]=0;

for(i=2;i

if(a[i]!=0)

{

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

{

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

a[j]=0;

}

}

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

{

if(a[i]!=0)

{

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

count++;

if(count%5==0)printf("n");

}

}

}

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

#include

#define N 10

void main( )

{

int a[N],i,temp;

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

for(i=0;i

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

for(i=0;i

{

temp=a[i];

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

a[N-1-i]=temp;

}

for(i=0;i

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

printf("n");

}

1

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

#include

#define N 3

void main()

{

16

57

2

int a[N][N]={{1,1,6},{0,5,7},{0,0,2}};

int i,j;

for(i=0;i

{

for(j=0;j

printf(" ");

for(j=i;j

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

printf("n");

}

}

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

#include

#define M 3

#define N 4

void main( )

{

int a[M][N],b[M][N],i,j;

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

for(i=0;i

for(j=0;j

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

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

for(i=0;i

for(j=0;j

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

for(i=0;i

for(j=0;j

a[i][j]+=b[i][j];

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

for(i=0;i

{

for(j=0;j

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

printf("n");

}

}

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

#include

#define M 3

#define N 4

void main( )

{

int a[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

for(j=0;j

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

max=a[0][0];

min=a[0][0];

for(i=0;i

for(j=0;j

{

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

{

max=a[i][j];

maxi=i;

maxj=j;

}

if(a[i][j]

{

min=a[i][j];

mini=i;

minj=j;

}

}

printf("最大元素为a[%d][%d]=%dn",maxi,maxj,max);

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

}

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

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

. . . . . . .

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

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

#include

#define N 10

void main( )

{

int a[N][N],i,j;

for(i=0;i

{

a[i][0]=1;

a[i][i]=1;

for(j=1;j

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

}

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

for(i=0;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列,则下一个数

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

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

其下方。

#include

#define N 5

void main( )

{

int a[N][N]={0},i,j,k;

i=0;

j=N/2;

a[i][j]=1;

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

{

i=i-1;

j=j+1;

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

{

i=i+2;

j=j-1;

a[i][j]=k;

}

else if(i<0)

i=N-1;

else if(j==N)

j=0;

else if(a[i][j]!=0)

{

i=i+2;

j=j-1;

}

a[i][j]=k;

}

for(i=0;i

{

for(j=0;j

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

printf("n");

}

}

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

#include

#define M 3

#define N 4

void main()

{

int a[M][N];

int i,j,maxj,count=0,flag;

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

for(i=0;i

for(j=0;j

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

for(i=0;i

{

maxj=0;

for(j=1;j

if(a[i][maxj]

flag=1;

for(j=0;j

if(a[j][maxj]

if(flag==1)

{

count++;

printf("第%d个鞍点:a[%d][%d]=%dn",count,i,maxj,a[i][maxj]);

}

}

if(count==0)

printf("没有鞍点");

}

6.14输出以下图案

****

***

**

*

#include

#define N 4

void main()

{

int i,j;

for(i=0;i

{

for(j=0;j

printf(" ");

for(j=i;j

printf("* ");

printf("n");

}

}

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

A→Z a→z

B→Y b→y

C→X c→x

. .

. .

. .

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

其它字符不变。

#include

#include

void main()

{

char str[100];

int i,len;

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

gets(str);

len=strlen(str);

for(i=0;i

{

if(str[i]>='A'&&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

void main()

{

char str1[100],str2[100];

int i=0,result;

printf("请输入字符串str1:n");

gets(str1);

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

gets(str2);

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

i++;

if(str1[i]=='0'&&str2[i]==0)

result=0;

else

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

printf("结果为:%dn",result);

}

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

#include

#include

void main()

{

char str1[100],str2[100];

int i=0;

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

gets(str2);

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

{

str1[i]=str2[i];

i++;

}

str1[i]='0';

printf("str1=%sn",str1);

printf("str2=%sn",str2);

}

习题7参考答案

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

 库函数

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

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

 用户自定义函数

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

明和定义才可以使用。

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

 有返回值函数

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

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

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

值的类型。

 无返回值函数

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

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

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

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

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

 有参函数

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

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

入的格式和内容。

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

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

递实际数据。

 无参函数

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

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

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

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

的格式。

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

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

{

[函数体]

}

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

2[,……]]])

{

[函数体]

}

功能:定义一个函数。

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

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

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

7.4 填空题

(1) 10 (2) 15 (3) 4,3,7 (4) 12334 (5) x

(6) int F(int); long SunFun(int); F(x) x*x+1

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

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

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

的偶数时退出程序。

7.6 int F(int);

void main()

{

int a;

printf("input a number:");

scanf("%d",&a);

if (F(a)==0)

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

else

printf("是水仙花数。n");

}

int F(int a)

{

int b,c,d;

b=a/100;

c=a%100/10;

d=a%10;

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

return 1;

else

return 0;

}

7.7 #include

#define DAYS 30

double gathering()

{

return 100000*DAYS;

}

double paying()

{

int n;

double pay,s=0;

for (n=1,pay=0.01;n<=DAYS;++n,pay+=pay)

s+=pay;

return s;

}

void main()

{

printf("gathering : %.2fnpaying: %.2f.n",gathering(),paying());

}

7.8 #include

double L(int n,double x);

void main()

{

int m, y;

scanf("%d %d",&m,&y);

printf("%.2fn",L(m,y));

}

double L(int n,double x)

{

if (n==0)

return 1;

else if (n==1)

return x;

else

return ((2.0*n-1)*L(n-1,x)-(n-1)*L(n-2,x))/n;

}

7.9 #include

#define N 5

void Tran(int [N][N]);

void Add(int [N][N],int [N][N],int [N][N]);

void Mul(int [N][N],int [N][N],int [N][N]);

void main()

{

int i,j;

int A[N][N],B[N][N],C[N][N];

for (i=0;i

for (j=0;j

scanf(&A[i][j]);

for (i=0;i

for (j=0;j

scanf(&B[i][j]);

Tran(A);

for (i=0;i

{

for (j=0;j

printf("%dt",A[i][j]);

printf("n");

}

Add(A,B,C);

for (i=0;i

{

for (j=0;j

printf("%dt",C[i][j]);

printf("n");

}

Mul(A,B,C);

for (i=0;i

{

for (j=0;j

printf("%dt",C[i][j]);

printf("n");

}

}

void Tran(int A[N][N])

{

int i,j,t;

for (i=0;i

for (j=i;j

{

t=A[i][j];

A[i][j]=A[j][i];

A[j][i]=t;

}

}

void Add(int A[N][N],int B[N][N],int C[N][N])

{

int i,j;

for (i=0;i

for (j=0;j

C[i][j]=A[i][j]+B[i][j];

}

void Mul(int A[N][N],int B[N][N],int C[N][N])

{

int i,j,k;

for (i=0;i

for (j=0;j

{

C[i][j]=0;

for (k=0;k

C[i][j]+=A[i][k]*B[k][j];

}

}

7.10 递归程序:

#include

int half(int s[],int a,int b,int key)

{

int mid;

if(a==b)

if(key==s[a])

return (a);

else

return (-1);

else

{

mid=(a+b)/2;

if(key

return(half(s,a,mid,key));

if(key>s[mid])

return(half(s,mid+1,b,key));

if(key==s[mid])

return (mid);

}

}

非递归程序:

#include

int half(int s[],int a,int b,int key)

{

int left=0;

int right=n-1;

int middle;

while(left<=right)

{

middle=(left+right)/2;

if (x==s[middle])

return middle;

else if (x>s[middle])

left=middle+1;

else

right=middle-1;

}

return -1;

}

7.11 #include

int Encrypt(int a)

{

int i,aa[4],t;

aa[0]=a%10;

aa[1]=a%100/10;

aa[2]=a%1000/100;

aa[3]=a/1000;

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

{

aa[i]+=5;

aa[i]%=10;

}

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

{

t=aa[i];

aa[i]=aa[3-i];

aa[3-i]=t;

}

t=0;

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

t=t*10+aa[i];

return t;

}

void main()

{

int a;

scanf("%d",&a);

printf("encrypted code : %d.n",Encrypt(a));

}

7.12 #include

int length(char p[]);

void main()

{

int len;

char str[80];

printf("please input a string:n");

scanf("%s",str);

len=length(str);

printf("the string has %d characters.",len);

}

int length(char p[])

{

int n;

n=0;

while(p[n]!='0')

n++;

return n;

}

7.13 #include

#define N 10

void main()

{

int i,j,min,tem,a[N];

printf("please input ten num:n");

for(i=0;i

{

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

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

}

printf("n");

for(i=0;i

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

printf("n");

for(i=0;i

{

min=i;

for(j=i+1;j

if(a[min]>a[j])

min=j;

tem=a[i];

a[i]=a[min];

a[min]=tem;

}

printf("After sorted n");

for(i=0;i

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

}

习题8参考答案

参考课本内容自己进行解答。

习题9参考答案

9.1请自己参考课本内容进行总结。

9.2

9.3

9.4

9.5 a为一维数组的数组名,是指向首元素的指针常量,其值为首元素地址2001;a[0]

为一维数组a的首元素,其值为0;b为二维数组数组名,是指向首行的指针常量,其值为

首行数组的起始地址,为3001;b[0]相当于首行数组的数组名,它指向首行首元素,其值

为3001;b[0][0]为二维数组的首元素,其值为0;p1为指向数组元素的指针变量,当前指

向数组a的首元素,其值为2001;p1+1指向数组a的标号为1的元素,其值为2003;p2

是指向一维数组的指针变量,当前指向二维数组b的首行所对应数组,其值为3001;p2+1

指向二维数组b的标号为1的行所对应数组,其值为3009;p3是指向数组元素的指针变量,

当前指向二维数组b的首元素b[0][0],其值为3001,p3+1指向二维数组b的第2个元素

b[0][1],其值为3003。

9.6 #include

void main()

{

int a[3][3],*p1,(*p2)[3];

int i,j;

void inputmatrix(int *p);

void transpose(int (*p)[3]);

p1=a[0];

p2=a;

inputmatrix(p1);

transpose(p2);

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

{

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

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

printf(“n”);

}

}

void inputmatrix(int *p)

{

int i,j;

printf(“输入矩阵元素:n”);

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

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

scanf(“%d”,p+3*i+j);

}

void transpose(int (*p)[3])

{

int i,j,temp;

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

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

{

temp=*(*(p+i)+j);

*(*(p+i)+j)= *(*(p+j)+i);

*(*(p+j)+i)=temp;

}

}

9.7 #include

#define N 4

void average(float (*p)[N],int m)

{

int i,j;

float aver,sum;

for(i=0;i

{

sum=0;

for(j=0;j

sum+=*(*p+j);

aver=sum/N;

printf("the average score of course No.%d is %5.2fn",i+1,aver);

}

}

void search(float s[][N],int m)

{

int i,j;

for(i=0;i

for(j=0;j

if(s[i][j]<60)

printf("course No.%d: student No.%d failedn",i+1,j+1);

}

void main()

{

float score[3][4]={{82,75,62,90},{89,79,50,93},{49,62,52,77}};

average(score,3);

search(score,3);

}

9.8 #include

#define ROWNUM 4 /*矩阵行数*/

#define COLNUM 4 /*矩阵列数*/

/*输入矩阵子函数*/

void inputmatrix(float a[][COLNUM])

{

int i,j;

printf("input the matrix:n");

for(i=0;i

for(j=0;j

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

}

/*输出矩阵子函数*/

void outputmatrix(float a[][COLNUM])

{

int i,j;

printf("the matrix is:n");

for(i=0;i

{

for(j=0;j

printf("n");

}

}

/*若a[i][i]为0,则找其正下方非零元素所在行,找不到返回-1,否则返回行号*/

int findnzero(float a[][COLNUM],int i)

{

int j,result=-1;

for(j=i+1;j

if(a[j][i]!=0){result=j;break;}

return(result);

}

/*两行互换子函数*/

void exchange(float a[][COLNUM],int i,int j)

{

int k;float tmp;

for(k=0;k

}

/*i行加上j行的k倍,结果放回i行*/

void addrow(float a[][COLNUM],int i,int j,float k)

{int tmp;

for(tmp=0;tmp

}

/*Gauss消去法化阶梯形*/

void gauss(float a[][COLNUM])

{

int i,j,flag;

for(i=0;i

{

if(a[i][i]==0)

{

flag=findnzero(a,i);

if(flag==-1)continue; /*当前列剩余元素均零则重新开始循环, 处理下一行*/

else exchange(a,i,flag);

}

for(j=i+1;j

}

}

void main()

{

float a[ROWNUM][COLNUM];

inputmatrix(a);

gauss(a);

outputmatrix(a);

}

9.9

9.10

9.11

9.12

9.13

9.14

9.15

习题10参考答案

10.1 定义结构体变量(成员包括年、月、日),输入一个日期并计算该日是当年中第几天。

#include

void main()

{

struct

{

int year;

int month;

int day;

}date;

int i,days;

int day_tab[12]={31,28,31,30,31,30,31,31,30,31,30,31};

printf("input year,month,day:n");

scanf("%d%d%d",&,&,&);

days=;

for(i=0;i<-1;i++)

days+=day_tab[i];

if((%4==0&&%100!=0||%400==0)&&>2)

days+=1;

printf("the date is the %dth day",days);

}

10.2使用指针变量输入学生姓名、学号及三门课的成绩,计算各自的平均成绩并输出

#include

#define N 3

void main()

{

struct student

{

int num;

char name[20];

float score[N];

};

struct student stu,*p=&stu;

float aver=0;

int i;

printf("请输入学生的学号、姓名及%d门课成绩:n",N);

scanf("%d%s%f%f%f",&p->num,p->name,&p->score[0],&p->score[1],&p->score[2]);

for(i=0;i

aver=(aver*i+p->score[i])/(i+1);

printf("学号:%dn姓名:%sn平均成绩:%6.1fn",p->num,p->name,aver);

}

10.3学生信息包括学号、姓名及入学成绩。输入一组学生的信息,按姓名字典序排序。

#include

#include

#define N 3

void main()

{

struct

{

int num;

char name[13];

float score;

}stu[N],temp;

int i,j,min;

printf("请输入各个学生的信息:n");

for(i=0;i

scanf("%d%s%f",&stu[i].num,stu[i].name,&stu[i].score);

for(i=0;i

{

min=i;

for(j=i+1;j

if(strcmp(stu[min].name,stu[j].name)>0)

min=j;

if(min!=i)

{

temp=stu[min];

stu[min]=stu[i];

stu[i]=temp;

}

}

printf("排序后为:n");

for(i=0;i

printf("%d %s %6.1fn",stu[i].num,stu[i].name,stu[i].score);

}

10.4学生信息包括学号、姓名、入学成绩。输入一组学生信息并将成绩最低的学生删

除。

#include

#define N 3

void main()

{

struct

{

int num;

char name[13];

float score;

}stu[N];

int i,min;

printf("请输入各个学生的信息:n");

for(i=0;i

scanf("%d%s%f",&stu[i].num,stu[i].name,&stu[i].score);

min=0;

for(i=1;i

if(stu[i].score

min=i;

for(i=min;i

stu[i]=stu[i+1];

printf("删除后为:n");

for(i=0;i

printf("%d %s %6.1fn",stu[i].num,stu[i].name,stu[i].score);

}

10.5编写函数统计链表中结点的个数。

#include

struct student

{

int num;

float score;

struct student *next;

};

int getlen(struct student *head)

{

int len=0;

struct student *p=head;

while(p!=NULL)

{

len++;

p=p->next;

}

return(len);

}

10.6编写函数查找指定学号的结点在链表中第一次出现的位置,找不到则返回0

#include

struct student

{

int num;

float score;

struct student *next;

};

int locate(struct student *head,int num)

{

struct student *p=head;

int i=0;

while(p!=NULL)

{

i++;

if(p->num==num)break;

p=p->next;

}

if(p->num==num)

return(i);

else

return(0);

}

10.7编写函数删除链表中指定位置的结点

#include

struct student

{

int num;

float score;

struct student *next;

};

struct student *dele(struct student *head,int k)

{

int i=1;

struct student *p=head;

if(k<=0)

{

printf("位置错!n");

return(head);

}

if(head==NULL)

{

printf("未找到!n");

return(NULL);

}

else

{

if(k==1)

{

head=head->next;

free(p);

return(head);

}

else

{

while(p!=NULL&&p->next!=NULL)

{

i++;

if(i==k)

{

p->next=p->next->next;

return(head);

}

}

printf("未找到!n");

return(head);

}

}

}

10.8将两个链表头尾相连,合并为一个链表

#include

struct student

{

int num;

float score;

struct student *next;

};

struct student *link(struct student *head1,struct student *head2)

{

struct student *p=head1;

if(head1==NULL)

return(head2);

else

{

while(p->next!=NULL)

p=p->next;

p->next=head2;

return(head1);

}

}

10.9将链表中各个结点逆置。

#include

struct student

{

int num;

float score;

struct student *next;

};

struct student *inverse(struct student *head)

{

struct student *p1=head,*p2,*newhead;

int i,j,len;

if(head==NULL)return(NULL);

len=1;

while(p1->next!=NULL)

{

len++;

p1=p1->next;

}

newhead=p1;

for(i=1;i

{

p2=head;

for(j=1;j

p2=p2->next;

p2->next=NULL;

p1->next=p2;

p1=p2;

}

return(newhead);

}

10.10 3,3

10.11 #include

struct

{

int num;

char name[10];

char sex;

char job;

union

{

int banji;

char position[10];

}category;

}person[2];/*先设人数为2*/

void main()

{

int i;

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

{

scanf("%d%s%c%c",&person[i].num,&person[i].name,&person[i].sex,&person[i].job);

if(person[i].job == 'S')

scanf("%d", &person[i].);

else if(person[i].job == 'T')

scanf("%s", person[i].on);

else

printf("Input error!");

}

printf("n");

printf("No. name sex job class/positionn");

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

{

if (person[i].job == 'S')

printf("%-6d%-10s%-3c%-3c%-6dn",person[i].num,person[i].name,

person[i].sex, person[i].job,person[i].);

else

printf("%-6d%-10s%-3c%-3c%-6sn",person[i].num,person[i].name,person[i].sex,

person[i].job,person[i].on);

}

}

10.12

习题11参考答案

11.1选择题。

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

11.2填空题。

(1)文本文件 二进制文件

(2)pf=fopen(" A:", "w");

(3)文本文件 二进制 文件尾 非0值

11.3编程题。

(1)

(2)

#include "stdio.h" FILE *fp;

void main( )

{ int c, d;

if((fp = fopen("d:tcstud.c","r")) == NULL)

exit(0);

while((c=fgetc(fp)) != EOF)

if( c=='/' ) //如果是字符注释的起始字符'/'

if((d=fgetc(fp)) == '*') //则判断下一个字符是否为'*'

in_comment(); //调用函数处理(删除)注释

else //否则原样输出读入的两个字符

{ putchar(c);

putchar(d);

}

else

if( c==''' || c=='"') //判断是否是字符'或"

echo_quote(c); //调用函数处理字符'或"包含的字符

else putchar(c); } in_comment()

{ int c, d;

c=fgetc(fp);

d=fgetc(fp);

while( c!='*' || d!='/' )

{ //连续的两个字符不是 * 和 / 则继续处理注释

c = d;

d = fgetc(fp);

}

}

echo_quote (c)

int c; //c中存放的是定界符'或"

{ int d;

putchar(c);

while(( d=fgetc(fp))!=c) //读入下一个字符判断是否是定界符c

{ putchar(c); //当不是定界符c时继续循环

if(d=='') //若出现转义字符

putchar( fgetc(fp)); //则下一个字符不论是何均原样输出

}

putchar(d);

}

#include "stdio.h"

struct time

{ int hour;

int minute;

int second;

};

void main()

{ struct time now;

printf("Please enter now time(HH,MM,SS)=n");

scanf("%d,%d,%d",&,&,&);

++;

if(==60)

(3)解法1

{ =0;

++;

}

if(==60)

{ =0;

++;

}

if(==24)

=0;

printf("nNow is %02d:%02d:%02d",,,);

}

#include "stdio.h"

struct student

{ int n;

int mk;

};

void main()

{ int i,j,k,count=0,no;

struct student stu[100],*s[100],*p;

printf("nPlease enter mark(if mark<0 is end)n");

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

{ printf("No.%04d==",i+1);

scanf("%d",&stu[i].mk);

s[i]=&stu[i];

stu[i].n=i+1;

if(stu[i].mk<=0) break;

for(j=0;j

for(k=j+1;k<=i;k++)

if(s[j]->mkmk)

{ p=s[j]; s[j]=s[k];s[k]=p;

}

}

for(no=1,count=1,j=0;j

{ if(s[j]->mk > s[j+1]->mk)

{ printf("nNo.%3d==%4d%4d : ",no,s[j]->mk,count);

for(k=j-count+1;k<=j;k++)

{ printf("%03d ",s[k]->n);

if((k-(j-count))%10==0&&k!=j)

printf("n ");

}

count=1;

no++;

}

else count++;

}

}

解法2

#include "stdio.h"

#define N 5

struct student

{ int number;

int score;

int rank;

int no;

}stu[N];

void main( )

{ int i, j, k, count, rank, score;

struct student temp;

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

{ printf("Enter N.o %d=", i );

scanf("%d%d", &, & );

for( j=i-1; j>0; j-- )

if( stu[j-1].score < )

stu[j]=stu[j-1];

else break;

stu[j]=temp;

}

stu[0].rank=1;

count = 1;

k = 0;

for( i=0; i

{ score = stu[i].score;

rank = stu[i].rank;

if( stu[i+1].score == stu[i].score )

{ stu[i+1].rank = stu[i].rank;

count++;

}

else

{ for( j=0; j

stu[k+j].no = count-j;

stu[i+1].rank = stu[i].rank+1;

count = 1;

k = i+1;

}

if( i==N-2 )

for( j=0; j

stu[k+j].no = count-j;

}

for( i=0; i

{ rank = stu[i].rank;

count = stu[i].no;

printf ( "n%3d (%3d)-%d: ", rank, stu[i].score, count );

for( k=1; k<=count; k++ )

if( (k-1)%3 !=0 )

printf( "%d ", stu[i+k-1].number );

else printf ( "n %d ", stu[i+k-1].number );

i+=count-1;

}

}


本文标签: 函数 程序 输入 元素 变量