大学生C语言程序设计(第四版 谭洪强)实验4 答案
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
printf("\n 输出交换后数组的值:"); for(i=0;i<10;i++)
printf("%3d",a[i]); printf("\n");
return 0; }
运行结果:
3、设计程序 sy4-3.c,输入 10 个整数,找出其中的最大数及其所在的下标。 算法分析:
首先:把下标为 0 的数看成最大数,即 max=a[0],k=0; 然后:逐一遍历 a[0]后面的每个 元素,如果当前元素值比 max 大,就改写 max,并记录其下标。
if(a[j]<a[k]) k=j;
if(k!=i)
{ t=a[k]; a[k]=a[i]; a[i]=t; }
}
printf("\n 排序后的数为:");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
}
运行结果:
6、设计程序 sy4-6.c,计算 scroe 数组中 10 个人的平均成绩 aver,将低于 aver 的成 绩放在 below 数组中。输出 aver 和 below 数组中的数据。 算法分析:
所有元素都向后移动一个位置;3)在下标为 p 的位置写入 x 的值。
参考答案:
# include <stdio.h>
void main()
{
int a[10],i,x,p;
printf("Input 5 numbers:"); /*5 个数按由小到大的顺序输入*/
for(i=0;i<5;i++)
scanf("%d",&a[i]);
printf("Input insert number:");
scanf("%d",&x);
for(i=4;i>=0;i--) //从最后一个元素开始往前找插入位置
if(a[i]>x) //若元素值大于 x
a[i+1]=a[i]; //则该元素往后移
else
//否则
break;
//退出循环,找到插入位置在 i+1 位置
if(score[i]<aver)
//如果比平均值小
{ below[ j ]=score[i]; j++; } //就把该成绩放入到数组 below 中
printf("\n 平均成绩是:%g \n",aver); //输出平均值
printf("低于平均成绩的数据有 :");
for(i=0;i< j ;i++)
前提:数组中的元素已递增有序; 折半查找基本思路:查找过程中采用跳跃式方式查找,首先确定查找范围的下限为第一 个元素的下标( low=0; ),上限为最后一个元素的下标( high=N-1; ),再折半计算出在此范围 内的中间元素下标( mid=(low+high)/2; ) ;比较该中间元素 a[mid]和查找数据 m 的关系有三 种可能:若等于( m==a[mid] ),则找到结果,用 k 记其位置( k=mid; ),并结束查找 ( break; ) ;若大于( m>a[mid] ),则查找数据可能在中间元素的后半部分,修改查找范 围的下限为 mid+1(low=mid+1; );若小于( m<a[mid] ),则查找数据可能在中间元素的 前半部分,修改查找范围的上限为 mid-1(high=mid-1; )。若新确定的查找范围仍然是 low<=high,则继续折半查找,否则该范围内没有要查找的数据。 参考答案:
printf("10 个同学成绩为:");
for(i=0;i<10;i++)
//输出数组中 10 个成绩
printf("%g ",score[i]);
for(i=0;i<10;i++) //求 10 个成绩之和
sum=sum+score[i];
aver=sum/10;
// 求出平均值
for(i=0,j=0;i<10;i++) //遍历每个成绩
实验四 参考答案
1、设计程序 sy4-1.c,输入 10 个整数存入一个数组 a,输入 x,使数组 a 中各元素值都乘以 x 后输出。 算法分析:
用循环输入 10 个数,分别赋给 a[0],a[1],------a[9],然后再输入 x 的值,重新给每个元 素 a[0],a[1],------,a[9]赋值为他们乘以 x 的值;最后结果输出。 参考答案: #include<stdio.h> int main() { int a[10], x , i ;
下标
0
1
2
3
4
5
元素的值
5
9
15
20
24
1)从最后一个元素往前找插入位置( for(i=4;i>=0;i--) ),若元素值大于 x( if(a[i]>x) ),
则 x 应该在该元素之前插入,该元素应该后移一个位置(a[i+1]=a[i]; ), 若元素值小于 x
则找到插入位置在当前元素之后,退出查找(else break; )。2)在退出循环后的 i+1 位置
#include < stdio.h >
#define N 10
void main( )
{ int i,a[N]={-3,4,7,9,13,24,67,89,100,180},k,m,low,high,mid;
//low,high-查找数组元素范围的下标
printf("a 数组中的数据如下:");
if(m==a[mid])
//如果中间元素等于被查找数,找到,跳出循环
{ k=mid; break; }
else if(m<a[mid]) //m 比中间元素小
high=mid-1; //m 应该在中间元素的左边,修改查找范围
else low=mid+1; //m 应该在中间元素的右边,修改查找范围
printf("Input insert number:");
scanf("%d",&x);
for(p=5,i=0;i<5;i++) //p 的初值为 5,找查找的位置
Hale Waihona Puke Baidu
if(x<a[i]) //找到第一个比 x 大的元素,该位置即为要插入的位置
{ p=i;
break;
}
for(i=4;i>=p;i--) //从最后一个元素到找到的插入位置移动数据,空出位置
printf("请输入 10 个整数:"); for(i=0;i<10;i++)
scanf("%d",&a[i]); printf("输出数组中原来的值:"); for(i=0;i<10;i++)
printf("%5d",a[i]); printf("\n 请给 x 输入值:"); scanf("%d",&x); for(i=0;i<10;i++)
插入 x( a[i+1]=x; )。
参考答案:
# include <stdio.h>
void main()
{ int a[10],i,x,p;
printf("Input 5 numbers:"); /*5 个数按由小到大的顺序输入*/
for(i=0;i<5;i++)
scanf("%d",&a[i]);
//输出 j 个 below 数组中的成绩
printf("%g ",below[i]);
printf("\n");
}
运行结果:
(7) 请完善程序 sy4-7.c,N 个有序整数数列已放在一维数组中,利用“折半查找算法” 查找整数 m 在数组中的位置。若找到,则返回其下标值;反之,则返回"Not be found!"。 算法分析:
# include <stdio.h>
void main()
{ int a[10],k,i,j,t;
printf("Input 10 numbers:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++)
//选择排序法
{ k=i;
for(j=i+1;j<10;j++)
4、设计程序 sy4-4.c,在一个 5 个整数的升序排列的序列中,任意输入一个数插入其中, 要求保持原来的排列顺序。输出结果。
算法分析:(方法一)
分析: 假如 int a[6]初值如下表,需插入的数据 x=10;插入算法如下:
下标
0
1
2
3
4
5
元素的值
5
9
15
20
24
1)首先应遍历数组找到插入的位置 p=2;2)然后应从数组最后一个元素到下标为 p 的
for(i=0;i< N;i++) printf("%4d",a[i]);
printf("\n");
printf("Enter m: "); scanf("%d",&m);
low=0;high=9; //设置初始查找范围
while(low<=high) //有查找范围,进入循环
{ mid=(low+high)/2; //求 mid,查找范围的中间元素下标
a[i+1]=a[i];
a[p]=x;
//写入待插入的数据
printf("The after insert score:\n");
for(i=0;i<6;i++)
printf("%6d",a[i]);
printf("\n");
}
运行结果:
算法分析:(方法二)
分析: 假如 int a[6]初值如下表,需插入的数据 x=10;插入算法如下:
a[i+1]=x;
//写入待插入的数据
printf("The after insert score:\n");
for(i=0;i<6;i++)
printf("%6d",a[i]);
printf("\n");
}
运行结果:
5、设计程序 sy4-5.c,用选择法对 10 个整数实现递增排序。 算法分析:
用“对折交换”的方法:首先输入 10 个数给每个元素;设置两个下标变量,i=0(第 一个元素下标),j=9(最后一个元素下标);交换 a[0],a[9],然后 i++,j--,再交换 a[1],a[8] 的值,直到 i>=j,结束;最后输出交换后数组的值。 参考答案: #include<stdio.h> int main() { int a[10]={1,2,3,4,5,6,7,8,9,10}, i, j , t ;
最后:输出结果。 参考答案: #include<stdio.h> int main() { int a[10]={12,21,35,10,54,31,24,58,43,11},i,k,max; //max 存放最大值,k 记最大值的下标
printf("输出数组的每个元素:"); for(i=0;i<10;i++)
printf("输出交换前数组的值:");
for(i=0;i<10;i++) printf("%3d",a[i]);
for(i=0, j=9 ; i<j ; i++ , j--) //逐一交换 a[0]和 a[1],a[1]和 a[8], … a[4]和 a[5] { t=a[i]; a[i]=a[j]; a[j]=t; }
printf("%3d",a[i]); max=a[0]; k=0; //首先把 a[0]看成最大值,k 记它的下标 for(i=1;i<10;i++) //逐一遍历其后的每个元素
if(max<a[i]) //如果当前值比最大值大 { max=a[i] ; k=i; } //就改写最大值和最大值的下标 printf("\n 最大值=%d,最大值的下标=%d\n",max, k); return 0; } 运行结果:
首先用循环求出 10 同学的成绩总和,成绩总和除以总人数得到平均值 aver,
参考答案:
#include<stdio.h>
int main()
{ float score[10]={78,98,65,45,68,94,81,86,57,96},below[10],sum=0,aver;
int i,j=0;
外循环:10 个数,需要 9 趟循环,第 i 趟从未排序数列(a[i],a[i+1],---a[9])里找出最小 数和 a[i]交换。内循环:(第 i 趟里找最小数的方法)1)首先把第 i 个数看成最小数记下它 的下标(k=i);2)然后从下标为 j=i+1 的元素开始一直到 j=9,逐一去比较,如果当前的元素 a[j]比最小数 a[k]还小,就用它的下标去改写 k;3)如果 k 的值发生了变化,就交换最小值 a[k]和未排序元素里的第一个元素 a[i]。 参考答案:
a[i]=a[i]*x; printf("数组每个元素乘以 x 后的值为:"); for(i=0;i<10;i++)
printf("%5d",a[i]); printf("\n"); return 0; } 运行结果:
2、设计程序 sy4-2.c,对输入的 10 个整数按倒序存放后输出结果。 算法分析:
printf("%3d",a[i]); printf("\n");
return 0; }
运行结果:
3、设计程序 sy4-3.c,输入 10 个整数,找出其中的最大数及其所在的下标。 算法分析:
首先:把下标为 0 的数看成最大数,即 max=a[0],k=0; 然后:逐一遍历 a[0]后面的每个 元素,如果当前元素值比 max 大,就改写 max,并记录其下标。
if(a[j]<a[k]) k=j;
if(k!=i)
{ t=a[k]; a[k]=a[i]; a[i]=t; }
}
printf("\n 排序后的数为:");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
}
运行结果:
6、设计程序 sy4-6.c,计算 scroe 数组中 10 个人的平均成绩 aver,将低于 aver 的成 绩放在 below 数组中。输出 aver 和 below 数组中的数据。 算法分析:
所有元素都向后移动一个位置;3)在下标为 p 的位置写入 x 的值。
参考答案:
# include <stdio.h>
void main()
{
int a[10],i,x,p;
printf("Input 5 numbers:"); /*5 个数按由小到大的顺序输入*/
for(i=0;i<5;i++)
scanf("%d",&a[i]);
printf("Input insert number:");
scanf("%d",&x);
for(i=4;i>=0;i--) //从最后一个元素开始往前找插入位置
if(a[i]>x) //若元素值大于 x
a[i+1]=a[i]; //则该元素往后移
else
//否则
break;
//退出循环,找到插入位置在 i+1 位置
if(score[i]<aver)
//如果比平均值小
{ below[ j ]=score[i]; j++; } //就把该成绩放入到数组 below 中
printf("\n 平均成绩是:%g \n",aver); //输出平均值
printf("低于平均成绩的数据有 :");
for(i=0;i< j ;i++)
前提:数组中的元素已递增有序; 折半查找基本思路:查找过程中采用跳跃式方式查找,首先确定查找范围的下限为第一 个元素的下标( low=0; ),上限为最后一个元素的下标( high=N-1; ),再折半计算出在此范围 内的中间元素下标( mid=(low+high)/2; ) ;比较该中间元素 a[mid]和查找数据 m 的关系有三 种可能:若等于( m==a[mid] ),则找到结果,用 k 记其位置( k=mid; ),并结束查找 ( break; ) ;若大于( m>a[mid] ),则查找数据可能在中间元素的后半部分,修改查找范 围的下限为 mid+1(low=mid+1; );若小于( m<a[mid] ),则查找数据可能在中间元素的 前半部分,修改查找范围的上限为 mid-1(high=mid-1; )。若新确定的查找范围仍然是 low<=high,则继续折半查找,否则该范围内没有要查找的数据。 参考答案:
printf("10 个同学成绩为:");
for(i=0;i<10;i++)
//输出数组中 10 个成绩
printf("%g ",score[i]);
for(i=0;i<10;i++) //求 10 个成绩之和
sum=sum+score[i];
aver=sum/10;
// 求出平均值
for(i=0,j=0;i<10;i++) //遍历每个成绩
实验四 参考答案
1、设计程序 sy4-1.c,输入 10 个整数存入一个数组 a,输入 x,使数组 a 中各元素值都乘以 x 后输出。 算法分析:
用循环输入 10 个数,分别赋给 a[0],a[1],------a[9],然后再输入 x 的值,重新给每个元 素 a[0],a[1],------,a[9]赋值为他们乘以 x 的值;最后结果输出。 参考答案: #include<stdio.h> int main() { int a[10], x , i ;
下标
0
1
2
3
4
5
元素的值
5
9
15
20
24
1)从最后一个元素往前找插入位置( for(i=4;i>=0;i--) ),若元素值大于 x( if(a[i]>x) ),
则 x 应该在该元素之前插入,该元素应该后移一个位置(a[i+1]=a[i]; ), 若元素值小于 x
则找到插入位置在当前元素之后,退出查找(else break; )。2)在退出循环后的 i+1 位置
#include < stdio.h >
#define N 10
void main( )
{ int i,a[N]={-3,4,7,9,13,24,67,89,100,180},k,m,low,high,mid;
//low,high-查找数组元素范围的下标
printf("a 数组中的数据如下:");
if(m==a[mid])
//如果中间元素等于被查找数,找到,跳出循环
{ k=mid; break; }
else if(m<a[mid]) //m 比中间元素小
high=mid-1; //m 应该在中间元素的左边,修改查找范围
else low=mid+1; //m 应该在中间元素的右边,修改查找范围
printf("Input insert number:");
scanf("%d",&x);
for(p=5,i=0;i<5;i++) //p 的初值为 5,找查找的位置
Hale Waihona Puke Baidu
if(x<a[i]) //找到第一个比 x 大的元素,该位置即为要插入的位置
{ p=i;
break;
}
for(i=4;i>=p;i--) //从最后一个元素到找到的插入位置移动数据,空出位置
printf("请输入 10 个整数:"); for(i=0;i<10;i++)
scanf("%d",&a[i]); printf("输出数组中原来的值:"); for(i=0;i<10;i++)
printf("%5d",a[i]); printf("\n 请给 x 输入值:"); scanf("%d",&x); for(i=0;i<10;i++)
插入 x( a[i+1]=x; )。
参考答案:
# include <stdio.h>
void main()
{ int a[10],i,x,p;
printf("Input 5 numbers:"); /*5 个数按由小到大的顺序输入*/
for(i=0;i<5;i++)
scanf("%d",&a[i]);
//输出 j 个 below 数组中的成绩
printf("%g ",below[i]);
printf("\n");
}
运行结果:
(7) 请完善程序 sy4-7.c,N 个有序整数数列已放在一维数组中,利用“折半查找算法” 查找整数 m 在数组中的位置。若找到,则返回其下标值;反之,则返回"Not be found!"。 算法分析:
# include <stdio.h>
void main()
{ int a[10],k,i,j,t;
printf("Input 10 numbers:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++)
//选择排序法
{ k=i;
for(j=i+1;j<10;j++)
4、设计程序 sy4-4.c,在一个 5 个整数的升序排列的序列中,任意输入一个数插入其中, 要求保持原来的排列顺序。输出结果。
算法分析:(方法一)
分析: 假如 int a[6]初值如下表,需插入的数据 x=10;插入算法如下:
下标
0
1
2
3
4
5
元素的值
5
9
15
20
24
1)首先应遍历数组找到插入的位置 p=2;2)然后应从数组最后一个元素到下标为 p 的
for(i=0;i< N;i++) printf("%4d",a[i]);
printf("\n");
printf("Enter m: "); scanf("%d",&m);
low=0;high=9; //设置初始查找范围
while(low<=high) //有查找范围,进入循环
{ mid=(low+high)/2; //求 mid,查找范围的中间元素下标
a[i+1]=a[i];
a[p]=x;
//写入待插入的数据
printf("The after insert score:\n");
for(i=0;i<6;i++)
printf("%6d",a[i]);
printf("\n");
}
运行结果:
算法分析:(方法二)
分析: 假如 int a[6]初值如下表,需插入的数据 x=10;插入算法如下:
a[i+1]=x;
//写入待插入的数据
printf("The after insert score:\n");
for(i=0;i<6;i++)
printf("%6d",a[i]);
printf("\n");
}
运行结果:
5、设计程序 sy4-5.c,用选择法对 10 个整数实现递增排序。 算法分析:
用“对折交换”的方法:首先输入 10 个数给每个元素;设置两个下标变量,i=0(第 一个元素下标),j=9(最后一个元素下标);交换 a[0],a[9],然后 i++,j--,再交换 a[1],a[8] 的值,直到 i>=j,结束;最后输出交换后数组的值。 参考答案: #include<stdio.h> int main() { int a[10]={1,2,3,4,5,6,7,8,9,10}, i, j , t ;
最后:输出结果。 参考答案: #include<stdio.h> int main() { int a[10]={12,21,35,10,54,31,24,58,43,11},i,k,max; //max 存放最大值,k 记最大值的下标
printf("输出数组的每个元素:"); for(i=0;i<10;i++)
printf("输出交换前数组的值:");
for(i=0;i<10;i++) printf("%3d",a[i]);
for(i=0, j=9 ; i<j ; i++ , j--) //逐一交换 a[0]和 a[1],a[1]和 a[8], … a[4]和 a[5] { t=a[i]; a[i]=a[j]; a[j]=t; }
printf("%3d",a[i]); max=a[0]; k=0; //首先把 a[0]看成最大值,k 记它的下标 for(i=1;i<10;i++) //逐一遍历其后的每个元素
if(max<a[i]) //如果当前值比最大值大 { max=a[i] ; k=i; } //就改写最大值和最大值的下标 printf("\n 最大值=%d,最大值的下标=%d\n",max, k); return 0; } 运行结果:
首先用循环求出 10 同学的成绩总和,成绩总和除以总人数得到平均值 aver,
参考答案:
#include<stdio.h>
int main()
{ float score[10]={78,98,65,45,68,94,81,86,57,96},below[10],sum=0,aver;
int i,j=0;
外循环:10 个数,需要 9 趟循环,第 i 趟从未排序数列(a[i],a[i+1],---a[9])里找出最小 数和 a[i]交换。内循环:(第 i 趟里找最小数的方法)1)首先把第 i 个数看成最小数记下它 的下标(k=i);2)然后从下标为 j=i+1 的元素开始一直到 j=9,逐一去比较,如果当前的元素 a[j]比最小数 a[k]还小,就用它的下标去改写 k;3)如果 k 的值发生了变化,就交换最小值 a[k]和未排序元素里的第一个元素 a[i]。 参考答案:
a[i]=a[i]*x; printf("数组每个元素乘以 x 后的值为:"); for(i=0;i<10;i++)
printf("%5d",a[i]); printf("\n"); return 0; } 运行结果:
2、设计程序 sy4-2.c,对输入的 10 个整数按倒序存放后输出结果。 算法分析: