6.4 实验六 数组
一、 实验目的与要求
1. 掌握一维数组的定义、赋值和输入输出的方法。
2. 理解一维数组的存储方法及下标的表示方法。
3. 掌握与数组有关的算法(特别是排序算法)。
4. 掌握二维数组的定义、赋值和输入输出的方法。
5. 理解二维数组的存储方法及下标的表示方法。
6. 实验4学时。
二、实验内容
(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]<0,count计数+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)程序改错题
编程题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+1,j-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);
}
编程题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");
}
编程题2:有15个整数(已排序)存放在一个数组中,输入一个数,要求用折半查找法找出该数在数组中的下标值,如果该数不在数组中,则输出“无此数”。这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,再比较x和a[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
文档为doc格式