C++一维数组的排序
- 格式:docx
- 大小:40.82 KB
- 文档页数:12
以下作业编程练习,每个主题至少选择4道题作为作业题(各主题中所列题目不足4题的按实际数量选做)。
每次作业计2分,作为平时成绩。
另外,此练习题作为C 语言上机考试的考题来源之一(共49题)。
一、 顺序结构程序设计========================================1 已知三角形的三边长为a ,b ,c ,计算三角形面积的公式为: area = ))()((c s b s a s s ---,s =)(21c b a ++ 要求编写程序,从键盘输入a ,b ,c 的值,计算并输出三角形的面积。
2 编程从键盘输入圆的半径r ,计算并输出圆的周长和面积。
二、 选择结构程序设计==========================================1 从键盘任意输入一个年号,判断它是否是闰年。
若是闰年,输出“Yes ”,否则输出“No ”。
已知符合下列条件之一者是闰年:能被4整除,但不能被100整除。
能被400整除。
2 通过键盘输入一个字符,判断该字符是数字字符、大写字母、小写字母、空格还是其他字符。
3 华氏和摄氏温度的转换公式为C =5/9×(F -32)。
其中,C 表示摄氏温度,F 表示华氏温度。
要求:华氏0℉~300℉,每隔20℉输出一个华氏温度对应的摄氏温度值。
4 编程判断输入整数的正负性和奇偶性。
5 编程计算分段函数e 1exx y -⎧⎪=⎨⎪-⎩ 000x x x >=< 输入x ,打印出y 值。
流程图如图1-2所示。
6 输入三角形的三条边a ,b ,c ,判断它们能否构成三角形。
若能构成三角形,指出是何种三角形(等腰三角形、直角三角形、一般三角形)。
7 在屏幕上显示一张如下所示的时间表:*****Time*****1 morning2 afternoon3 nightPlease enter your choice:操作人员根据提示进行选择,程序根据输入的时间序号显示相应的问候信息,选择1时显示"Good morning", 选择2时显示"Good afternoon", 选择3时显示"Good night",对于其他选择显示"Selection error!",用switch 语句编程实现。
第三节数值型一维数组的应用一、数值型一维数组在递推中的应用【例5-3】斐波拉契数列:前两项为0和1,从第三项开始,各项均为前相邻两项之和:0,1,1,2,3,5,8,11,19,……。
写C程序,输出该数列前N项。
【简要分析】显然这是一个典型的递推问题,结合数组,从第三个数开始,其递推公式是:x[i]=x[i-1]+x[i-2],其中i=2,3, …,N-1。
利用循环结构,用N-S流程图描述的程序逻辑如图5-2所示。
参考源代码:/* 例5-3,5-3.cpp */#include <stdlib.h>#define N 20void main(){long i, x[N];x[0] = x[1] = 0; /* 赋初值*/for ( i = 2; i < N; i++ ) /* 尚剩18项*/x[i] = x[i - 1] + x[i - 2]; /* 产生各项*/for ( i = 0; i < N; i++ ) /* 输出数列*/cout<< "\t" << x[i];system(“pause”);}【思考验证】如果将x数组定义为整型int,程序是否能正常运行?【模仿训练】某数列前三项为0、1、1,以后各项均为前相邻三项之和,输出该数列前N项。
二、排序【例5-4】键盘输入N个战士的身高,将其升序排列。
【简要分析】排序是数组的经典应用,现实生活中用得太多,请读者务必掌握。
排序的方法很多,《数据结构》中有详细介绍,请读者自己查阅,本例用比较法。
具体实现逻辑是:将数组元素a[i](i=0,1,2…,N-2)与它后边的每一个元素a[j](j=i+1,…,N-1)逐个比较,凡有a[j]<a[i]者则对调之(以保证a[i]比任何a[j]都小)。
重复这个过程N-1次,最后a数组中元素便被升序排列。
用N-S图描述的程序逻辑如图5-3所示。
参考源代码:/* 例5-4,5-4_1.cpp */#include <stdlib.h>#define N 10void main(){int a[N], t, i, j;for ( i = 0; i < N; i++ ) /* 本循环输入N个原始数据*/cin>> a[i];for ( i = 0; i < N -1; i++ ) /* 本循环完成排序*/for ( j = i + 1; j < N; j++ ) /* x[i]与它后边所有元素逐一比较,大则交换*/ if ( a[j] < a[i] ){ temp = a[j]; a[j] = a[i]; a[i] = temp; }for ( i = 0; i < N; i++ ) /* 输出排序后的数组*/cout<< a[i];system(“pause”);}【思考验证】怎样修改本程序以实现降序排列?还有一种排序方法称为冒泡法。
这种方法可形象描述为:使较小的值象水中的空气泡一样逐渐“上浮”到数组的顶部,而较大的值则逐渐“下沉”到数组的底部。
这种技术要排序好几轮,每轮都要比较连续的数组元素对。
如果某一对元素的值本身是升序排的,那就保持原样,否则交换其值。
排序过程的N-S流程如图5-4所示。
参考源代码:/* 例5-4,5-4_2.cpp */ #include <stdlib.h>#define N 10void main(){int a[N], t, i, j;for ( i = 0; i < N; i++ ) /* 输入N个原始数据*/cin>> a[i];for ( i = 0; i < N -1; i++ ) /* 本循环完成排序*/for ( j = 0; j < N - i; j++ ) /* x[i]与它后边所有元素逐一比较,大则交换*/if ( a[j] > a[j + 1] ){ temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; }for ( i = 0; i < N; i++ ) /* 输出排序后的数组*/cout<< " \t" << a[i];system(“pause”);}三、定位与插入【例5-5】输入一个数,插入到某升序一维数组中,使插入后的数组仍然升序。
如设原数组x[6]:-123,-2,2,15,23,45。
假设待插入的新数为 7 ,则该数应插入到数2与15之间,数组长度增加1。
插入后的数列为x[7]:-123,-2,2,7,15,23,45。
【简要分析】先将a置于数组最后,然后将a与它前边的元素逐一比较,如果a小于某元素x[i],则后移x[i]一个位置,否则将a置于x[i+1]的位置,结束。
x[0] x[1] x[2] x[3] x[4] x[5] x[6]-123, -2, 2, 15, 23, 45, 7 /* 设x[6]=7 */-123, -2, 2, 15, 23, 45, 45 /* x[5]后移一个位置 */-123, -2, 2, 15, 23, 23, 45 /* x[4]后移一个位置 */-123, -2, 2, 15, 15, 23, 45 /* x[3]后移一个位置 */-123, -2, 2, 7, 23, 45, 65 /* a>x[2],将a赋给x[3] */用自然语言描述的程序逻辑为:①①设置环境,定义变量。
②②输出原始数组x和待插入的新元素a。
③③先假设新数a是最大的,作为数组的最后一个元素x[N-1]。
④④若a<x[i](i=N-2,N-3,N-4,…,0),则后移x[i]:x[i]→x[i+1],转⑤;否则a到位:a→x[i+1],转⑥。
⑤⑤i自减1,转④。
⑥⑥输出新x数组,结束。
参考源代码:/* 例5-5,5-5.cpp */#include <stdlib.h>#define N 7void main(){int x[N] = {-123, -2, 2, 15, 23, 45}, i, k, a;for ( i = 0; i < N - 1; i++ )cout<< "\t" << x[i];cout<< "\n请输入待插入的新数a:");cin>> a;x[N - 1] = a;for ( i = N - 2; i >= 0; i-- )if ( a < x[i] )x[i + 1] = x[i];else{ x[i + 1] = a; break; }for ( i = 0; i < N; i++ )cout<< "\t" << x[i];system(“pause”);}【思考验证】本例难点有二,其一定位该在什么位置查找;其二插入前怎样腾出一个空位(将指定位置开始的各元素依次后移)。
这个算法与排队类似:设有10名同学已按身高排成一排,现要插入一名新同学进去,办法就是先找好位置,把这个位置以后的同学往后挪动一个位置,再让新同学站进去。
注意最先挪动位置的同学是最后的那个同学!下边的代码能否完成同样的工作?#include <stdlib.h>void main(){int x[11] = { -123, -2, 2, 15, 23, 45, 65, 99, 123, 344};int i, k, a;for ( i = 0; i < 10; i++ )cout<< " " << x[i]; /* 输出原数组*/cout<< "\nPlease a:";cin>> a; /* 输入待插入元素*/k = 9;for ( i = 0; i < 10; i++ )if ( a < x[i] ) { k = i; break; } /* 定位k */if ( k == 9 ) x[10] = a; /* a放在最后*/else /* a不是最后一个元素*/{for ( i = 9; i >= k; i-- )x[i+1] = x[i]; /* 从x[k]开始后移*/x[k] = a; /* a作为第k个元素*/}for ( i = 0; i < 11; i++ ) /* 输出新数组*/cout<< " " << x[i];system(“pause”);}【模仿训练】输入一个数,插入到降序一维数组中,使插入后的数组仍然降序。
四、查找与删除【例5-6】假定某数组已经存放有互不相同的正整数。
现从键盘输入一个数,要求从数组中删除与该值相等的元素,并将其后的元素逐个向前递补,并将最后一个元素置0。
输出删除后的数组。
如原数组中无此数,则输出“无此数”。
【简要分析】从数组中删除一个元素主要做两个工作:定位与移动。
定位指确定被删除元素的位置;移动指某元素被删除后,跟在它后边的元素将逐个“向前递补”。
设一标志变量flag,其作用是表示原数组中是否存在用户要删除的元素。
用N-S流程图描述的程序逻辑如图5-5所示,变量表见表5-3,。
参考源代码:/* 例5-6,5-6.cpp */#include <stdlib.h>void main(){int x[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, i, a, k, flag;for ( i = 0; i < 10; i++ )cout<< " " << x[i];cout<< "\n请输入要删除的数:");cin>> a;flag = 0; /* 设原数组中不包含被输入的元素*/ for ( i = 0; i < 10; i++ )if ( x[i] == a ) { k = i; flag = 1; break; }if ( flag == 0 ) /* x数组中包含a */{cout<< “\n无此数!“; exit(0);}if ( k == 9 ) x[9] = 0; /* a刚好是x的末尾元素*/else /* a不是x的末尾元素*/{for ( i = k; i < 9; i++ )x[i] = x[i + 1]; /* x各元素向前递补*/x[i] = 0; /* x最后元素置0 */}for ( i = 0; i < 10; i++ )cout<< " " << x[i];system(“pause”);}【思考验证】当要删除的数在数组中多次出现时,要求全部删除之。