《C语言程序设计》(江宝钏著)实验六答案

发布时间:2012-04-29 16:13:24   来源:文档文库   
字号:

6.4 实验六 数组

一、 实验目的与要求

1. 掌握一维数组的定义、赋值和输入输出的方法。

2. 理解一维数组的存储方法及下标的表示方法。

3. 掌握与数组有关的算法(特别是排序算法)

4. 掌握二维数组的定义、赋值和输入输出的方法。

5. 理解二维数组的存储方法及下标的表示方法。

6. 实验4学时。

二、实验内容

1.程序验证题与改错题

1)程序验证题

给定一个整型数组a,要求求出其中小于0的元素的个数。请验证下面的程序是否符合题目要求。

#define N 10

void main()

{

int a[N]={11,2,4,-1,5,-3,-66,0,10,-5};

int i; /*变量i用于for循环*/

int count=0; /*变量count用于技术,初始化为0*/

for (i=0;i

if(a[i]<0)

count++; /*如果元素a[i]<0count计数+1*/

printf("%d\n",count);

}

给定一个整型二维数组a(3,3),要求求出对角线元素的和。请验证下面的程序是否符合题目要求。

#include

#define N 3

void main()

{

int a[N][N]={{1,2,3},{4,5,6},{7,8,9}};

int i,j; /*变量i,j用于for循环*/

int sum=0; /*变量sum用于求和,初始化为0*/

for (i=0;i

for(j=0;j

if (i==j)sum+=a[i][j]; /*如果是对角线元素,sum+a[i][j]*/

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

return 0;

}

1:在程序验证题的基础上,修改程序,求出数组a中大于a[0]的元素之和。

;

#include

#define N 10

void main()

{

int a[N]={11,2,4,-1,5,-3,-66,0,10,-5};

int i,sum=0;

int count=0;

for (i=0;i

{

if(a[i]<0)

count++;

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

sum+=a[i];

}

printf("小于0元素的个数为:%d\n",count);

printf("大于a[0]的元素之和为:%d\n",sum);

}

2:对上述程序进行优化,消除内循环,实现同样的效果。在的基础上,修改程序,求出数组a中反对角线元素之和。提示:内循环用逆序;i+j==N-1

答:

#include

#define N 3

void main()

{

int a[N][N]={{1,2,3},{4,5,6},{7,8,9}};

int i,j;

int sum=0;

for (i=0;i

{

j=i;

sum+=a[i][j];

}

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

}

#include

#define N 3

void main()

{

int a[N][N]={{1,2,3},{4,5,6},{7,8,9}};

int i,j;

int sum=0;

for (i=0;i

{

for(j=0;j

if (i+j==N-1)

sum+=a[i][j];

}

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

return 0;

}

2)程序改错题

2.一般编程题

编程题1从键盘输入10个整型数据,放入数组a 中,求其最大值、最小值及其所在元素的下标位置,并输出。

程序提示:定义10个元素的数组,用for循环语句逐一输入数据;定义最大值变量和最小值变量,用for循环语句遍历所有数组元素,逐一比较查找最大值和最小值。

答:

#include

void main()

{

int a[10],max,min,t,p;

int i;

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

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

max=a[0];

min=a[0];

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

{

if(a[i]>max)

{

max=a[i];

t=i;

}

if(a[i]

{

min=a[i];

p=i;

}

}

printf("最大值及其下标为:%d,%d\n",max,t);

printf("最小值及其下标为:%d,%d\n",min,p);

}

编程题2给定一个字符数组a要求将数组的内容倒置。如:

执行前数组的内容为{'1','2','3','4','5','6','7','8'}

执行后数组的内容为{'8','7','6','5','4','3','2','1'}

提示:用i表示数组的第一个元素的下标;用j表示数组最后一个元素的下标。

交换a[i]a[j],当i<=j时交换完毕。

交换一个元素后,i+1j-1

答:

#include

void revstr(char *i)

{

char *j=i;

char t;

while(*j)

j++;

j--;

for(;i

{

t=*i;

*i=*j;

*j=t;

}

}

main(void)

{

char str[100];

gets(str);

revstr(str);

puts(str);

}

编程题3

给定一个二维数组a,要求将数组的内容逆置。如:

执行前数组的内容为{{1,2,3},{4,5,6},{7,8,9}},

执行后数组的内容为{{1,4,7},{2,5,8},{3,6,9}}

提示:用i表示数组的行下标;用j表示数组的列下标。以对角线元素为界,交换a[i][j]a[j][i]

答:

#include

#define N 3

int a[N][N];

void convert(int a[3][3])

{

int i,j,t;

for(i=0;i

for(j=i+1;j

{

t=a[i][j];

a[i][j]=a[j][i];

a[j][i]=t;

}

}

void main()

{

int i,j;

printf("Input a[N][N]:\n");

for(i=0;i

{

for(j=0;j

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

}

printf("\noriginal a[N][N]:\n");

for(i=0;i

{

for(j=0;j

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

printf("\n");

}

convert(a);

printf("convert a[N][N]:\n");

for(i=0;i

{

for(j=0;j

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

printf("\n");

}

}

编程题4

一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。

提示:可设一个二维数组a[5][3]存放五个人三门课的成绩。再设一个一维数组v[3]存放所求得各分科平均成绩,设变量average 为全组各科总平均成绩。

答:

#include

void main()

{

int a[3][5];

int i,j;

double sum1,sum2=0,v[3],average;

printf("\t\t\t\t\t\n");

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

{

switch(i)

{

case 0:printf(" math:");break;

case 1:printf(" c :");break;

case 2:printf("English:");break;

}

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

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

}

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

{

sum1=0;

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

sum1+=a[i][j];

v[i]=(double)sum1/5;

sum2+=v[i];

}

average=sum2/3;

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

{

switch(i)

{

case 0:printf("math average :%.2lf\n",v[i]);break;

case 1:printf("chinese average :%.2lf\n",v[i]);break;

case 2:printf("English average :%.2lf\n",v[i]);break;

}

}

printf("totle average:%.2lf\n",average);

}

3.较难编程题

编程题1给定一个整型数组a,要求将数组a中的元素进行从小到大的排序(用冒泡法排序)

【算法描述】

从第一个数开始依次对相邻两数进行比较,如次序对则不做任何操作;如次序不对则使这两个数交换位置。第一遍的(N-1)次比较后,最大的数已放在最后;第二遍只需考虑(N-1)个数,即不用考虑最后一个数;以此类推每次少考虑一个数,直到第(N-1)遍比较后就可以完成排序。

答:

#include

#define N 1000

void main()

{

int a[N],n;

int i,j,t;

printf("请输入数组中元素的个数:");

scanf("%d",&n);

printf(" 输入数组:");

for(i=0;i

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

for(i=0;i

{

for(j=0;j

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

{

t=a[j];

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

a[j+1]=t;

}

}

printf(" 排序后的数列为:");

for(i=0;i

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

printf("\n");

}

编程题215个整数(已排序)存放在一个数组中,输入一个数,要求用折半查找法找出该数在数组中的下标值,如果该数不在数组中,则输出“无此数”。这15个数用赋初值的方法在程序中给出。要找的数用scanf函数输入。

提示:折半查找法:在一个已从小到大排序的数组a中,用b(begin)表示数组首元素的下标,用e(end)表示数组末元素的下标,需查找的数x首先和处于数组最中间的下标为m=b+e/2的元素比较,若x和该数组元素相等,则找到位置,返回m;否则,若x大,则x可能落在下半区中,令b=m+1,若x小,则x可能落在上半区中,令e=m-1。重新计算m,再比较xa[m];重复上述操作直到找到相等元素或b>e。若找到相等元素,则返回元素下标,否则返回-1表示无此数。

答:

#include

#define N 15

void f(int s[],int n);

void main()

{

int s[N]={1,2,3,5,9,10,20,23,45,56,66,70,80,90,100},b=0,e=N,mid,x;

printf("input anumber to search:");

scanf("%d",&x);

while(b<=e)

{

mid=(b+e)/2;

if(x==s[mid])

{

printf("The position in array is %d\n",mid+1);

f(s,mid);break;

}

else if(x

e=mid-1;

else

b=mid+1;

}

if(b>e)

printf("%d not be foud\n",x);

}

void f(int s[],int n)

{

int i;

for(i=n;i

s[i]=s[i+1];

printf("output the array after deleting the number\n");

for(i=0;i

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

printf("\n");

}

本文来源:https://www.2haoxitong.net/k/doc/b66dfeb9f121dd36a32d824a.html

《《C语言程序设计》(江宝钏著)实验六答案.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式