1、第五章 数组,第一节 一维数组 第二节 二维数组 第三节 字符数组和字符串类型,第一节 一维数组,一、为什么要使用数组通过前面几章的学习,我们已经可以编写程序来解决各种相当复杂的问题了,但是当需要处理的数据比较多时,仅依靠前面的知识是不够的,即使简单的问题也可能需要比较复杂的程序来处理。请看下面的例子:例题:输入50个学生的某门课程的成绩,打印出低于平均分的学生序号与成绩。【分析】在解决这个问题时,虽然可以通过一个变量来累加读入的50个成绩求出学生的总分,进而求出平均分。但因为只有读入最后一个学生的分数后才能求得平均分,并且要求打印出低于平均分的学生序号和成绩,故必须把50个学生的成绩都保留起
2、来,然后逐个和平均分比较,把低于平均分的成绩打印出来。如果,用简单变量a1,a2,,a50存储这些数据,要用50个变量保存输入的数据,程序片断如下:cina1a2a10;cina41a42a50; 注意,如果真正要像上面这样编写程序,则上面的所有省略号必须用完整的语句写出来。可以看出,这样的程序是多么繁琐。如果说处理的数据规模达到成千上万,上面的例子单单读入就会异常复杂,电脑的优势没有得到体现。从以上的讨论可以看出,如果只使用简单变量处理大量数据,就必须使用大量只能单独处理的变量,即使是简单问题也需要编写冗长的程序。选手们可能已经看出,我们需要把一大批具有相同性质的数据组合成一个新类型的变量,
3、可以用简单的程序(比如循环50次)对这个新变量的各个分量进行相同的处理,每个分量仍然保留单个变量的所有性质(在上面的例子中,各分量是整型变量或实型变量的性质)。,如果能像数学中使用下标变量ai形式表示这50个数,则问题就容易实现。在C+语言中,具有下标性质的数据类型是数组。如果使用数组,上面的问题就变得十分简单、清晰。例如,读入50个学生的成绩,只需写如下语句即可:for (int i=1;iai;在这里引用了带下标的变量(分量变量称为数组元素)ai来代替a1,a2,a50,方括号中的i称为下标,当循环变量i=1时ai就是a1;当i=2时ai就是a2;当i=50时ai就是a50。输入的时候,让
4、i从1变化到50,循环体内输入语句中的ai也就分别代表了a1,a2,a50这50个带下标的变量。这样上述问题的程序可写为:tot = 0; / tot存储50个学生的总分for (int i=1;iai;tot+=ai;ave= tot/50; /计算平均分for (int i=1;i=50;+i)if (aiave) cout“No. “i“ “ai;/如果第i个同学成绩小于平均分,则将输出这个学生的序号和成绩。要在程序中使用下标变量,必须先说明这些下标变量的整体为数组,即数组是若干个同名(如上面的下标变量的名字都为a)下标变量的集合,这些变量的类型全部一致。,二、一维数组的定义当数组中每个
5、元素只带有一个下标时,我们称这样的数组为一维数组。数组的定义格式如下:类型标识符 数组名常量表达式说明:数组名的命名规则与变量名的命名规则一致。常量表达式表示数组元素的个数。可以是常量和符号常量,但不能是变量。例如:int a10; /数组a定义是合法的int bn; /数组b定义是非法的三、一组数组的引用通过给出的数组名称和这个元素在数组中的位置编号(即下标),程序可以引用这个数组中的任何一个元素。一维数组元素的引用格式:数组名下标例如:int a10;其中,a是一维数组的数组名,该数组有10个元素,依次表示为:a0,a1,a2,a3,a4,a5,a6,a7,a8,a9。需要注意的是:a10
6、不属于该数组的空间范围。,当在说明部分定义了一个数组变量之后,C+编译程序为所定义的数组在内存空间开辟一串连续的存储单元。例如: 上例中的a数组在内存的存储如表所示:,a数组共有10个元素组成,在内存中10个数组元素共占10个连续的存储单元。a数组最小下标为0,最大下标9。按定义a数组所有元素都是整型变量。再次提醒注意:类型和变量是两个不同概念,不能混淆。就数组而言,程序的执行部分使用的不是数组类型而是数组变量。 说明:(1)下标可以是整型常量或整型表达式。如果使用表达式作为下标,就要计算表达式的值以确定下标。(2)C+语言中,每个数组第一个元素的下标都是0,因此第一个元素为第0个数组元素。(
7、3)C+语言只能逐个引用数组元素,而不能一次引用整个数组。例如:int a100,b100; a=b;这样的写法是非法的。(4)数组元素可以像同类型的普通变量那样使用,对其进行赋值和运算的操作,和普通变量完全相同。 例如: c10=34;实现了给c10赋值为34。,四、一维数组的初始化数组的初始化可以在定义时一并完成。格式:类型标识符 数组名常量表达式=值1,值2,例如:int a5=1,2,3,4,5说明:(1)在初值列表中可以写出全部数组元素的值,也可以写出部分。例如,以下方式可以对数组进行初始化:int x10=0,1,2,3,4;该方法一次仅对数组的前5个元素依次进行初始化。(2)对数
8、组元素全部初始化为0,可以简写为:0。例如:int a5=0; 将数组a的5个元素都初始化为0。,五、一维数组的应用例5.1 输入n个数,要求程序按输入时的逆序把这n个数打印出来,已知整数不超过100个。也就是说,按输入相反顺序打印这n个数。【分析】我们可定义一个数组a用以存放输入的n个数, 然后将数组a中的内容逆序输出。 #include int a100; int main() int x,n=0;while(scanf(“%d“, 【说明】:语句int a100声明了一个包含100个整型变量的数组,它们是:a0,a1,a2,a99。注意,没有a100。在上述程序中,数组a被声明在main
9、函数的外面。只有放在外面时,数组a才可以开得很大;放在main函数内时,数组稍大就会异常退出。它的道理将在后面讨论,只需要记住规则即可。数组不能够进行赋值操作:如果声明的是int aMAXN,bMAXN,是不能赋值b=a的(Pascal语言可以的)。如果要从数组a复制k个元素到数组b,可以这样做:memcpy(b,a,sizeof(int)*k)。当然了,如果数组a和b都是浮点型的,复制时要写成memcpy(b,a,sizeof(double)*k)。如果需要把数组a全部复制到数组b中,可以写得简单一些:memcpy(b,a,sizeof(a)。使用memcpy函数要包含头文件cstring。
10、,例5.2 将a数组中第一个元素移到数组末尾,其余数据依次往前平移一个位置。【分析】为完成题目所要求的操作,其算法应该包括以下几个主要步骤: 把第一个元素的值取出放在一个临时单元 temp中; 通过 a2a1, a3a2, a4a3, anan-1,实现其余元素前移 将 temp值送入an. #include #include /调用setw函数需注明使用该库 const int n=10; using namespace std; int an,temp; int main() coutai;temp=a0;for (int i=0; in-1; +i) ai=ai+1;an-1=temp;
11、cout“Result:“endl;for (int i=0; in; +i) coutsetw(3)ai; /setw函数控制输出场宽return 0; 运行结果 : read 10 datas: 1 2 3 4 5 6 7 8 9 10 Result: 2 3 4 5 6 7 8 9 10 1,例5.3 宾馆里有一百个房间,从1-100编了号。第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是2的倍数的房间“相反处理”,第三个服务员把所有编号是3的倍数的房间作“相反处理”,以后每个服务员都是如此。当第100个服务员来过后,哪几扇门是打开的。(所谓“相反处理”是:原来开着的门关上,
12、原来关上的门打开。)【分析】此题较简单,用a1,a2,an表示编号为1,2,3,,n的门是否开着。模拟这些操作即可,参考程序如下: #include #include #define MAXN 100+10 int aMAXN; int main() int n,k,first=1;memset(a,0,sizeof(a);for (int i=1;i=100;+i)for (int j=1;j=100;+j)if (j%i=0) aj=!aj;,for (int i=1;i=100;+i)if (ai)if(first) first=0; else printf(“ “);printf(“%
13、d“,i); printf(“n“); return 0; 运行结果: 1 4 9 16 25 36 49 64 81 100 【说明】:memset(a,0,sizeof(a)的作用是把数组a清零,它在cstring中定义。虽然也能用for循环完成相同的任务,但是用memset又方便又快捷。另一个技巧在输出:为了避免输出多余空格,设置了一个标志变量first,可以表示当前要输出是否为第一个。第一个变量前不应该有空格,但其他都有。,例5.4 约瑟夫问题:N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人开始报数,数到M的人出圈;输出依次出圈的人的编号。N,M由键盘输入。【分析】
14、(1)由于对于每个人只有出圈和没有圈两种状态,因此可以用布尔型标志数组存储游戏过程中每个人的状态。不妨用true表示出圈,false 表示没有出圈。(2)开始的时候,给标志数组赋初值为false,即全部在圈内。(3)模拟报数游戏的过程,直到所有的人出圈为止。程序如下:#includeusing namespace std;int n,m,s,f,t;bool a101; /根据题意开出数组大小int main()cinnm; /共n人,报到m出圈coutendl;for (t=1;t=n;+t) at=false; /等同于memset(a,0,sizeof(a),要调用cstring库f=0
15、; t=0; s=0; /刚开始所有变量默认值也是0,或者用f=t=s=0;do+t; /逐个枚举圈中的所有位置if (t=n+1) t=1; /数组模拟环状,最后一个与第一个相连if (at=false) +s; /第t个位置上有人则报数if (s=m) /当前报的数是ms=0; /计数器清零coutt“ “; /输出出圈人的编号at=true; /此处的人已出圈,设置为空f+; /出圈的人数增加一个 while(f!=n); /直到所有的人都出圈为止return 0;运行结果:输入: 8 5输出: 5 2 8 7 1 4 6 3这是一个在算法设计上很有名气的经典约瑟夫(Josephu)问题
16、,它有很多变例。如猴子选大王、持密码报数、狐狸追兔子等(见上机练习)。,例5.5 输入十个正整数,把这十个数按由大到小的顺序排列。(选择排序 )将数据按一定顺序排列称为排序,排序的算法有很多,其中选择排序是一种较简单的方法。 【问题分析】要把十个数按从大到小顺序排列,则排完后,第一个数最大,第二个数次大,。因此,我们第一步可将第一个数与其后的各个数依次比较,若发现,比它大的,则与之交换,比较结束后,则第一个数已是最大的数。同理,第二步,将第二个数与其后各个数再依次比较,又可得出次大的数。如此方法进行比较,最后一次,将第九个数与第十个数比较,以决定次小的数。于是十个数的顺序排列结束。如对5个进行
17、排序,这个五个数分别为8 2 9 10 5。按选择排序方法,过程如下:初始数据 :8 2 9 10 5第一次排序:8 2 9 10 59 2 8 10 510 2 8 9 510 2 8 9 5第二次排序:10 8 2 9 510 9 2 8 510 9 2 8 5第三次排序:10 9 8 2 510 9 8 2 5第四次排序:10 9 8 5 2对于十个数,则排序要进行9次。,程序如下:#include#includeusing namespace std;int t,a11;int main()coutai;coutendl;for (int i=1; i=9; +i) /进行9次排序fo
18、r (int j=i+1; j=10; +j) /将第i个数与其后所有数比较if (aiaj) t=ai; ai=aj; aj=t;/若有比ai大,则与之交换for (int i=1;i=10;+i)coutsetw(5)ai;return 0;运行结果: 输入: 8 67 52 189 74 5 58 9 23 41 输出: 189 74 67 58 52 41 23 9 8 5,例5.6 编程输入十个正整数,然后自动按从大到小的顺序输出。(冒泡排序) 【问题分析】用循环把十个数输入到A数组中;从A1到A10,相邻的两个数两两相比较,即:A1与A2比,A2与A3比,A9与A10比。只需知道两
19、个数中的前面那元素的标号,就能进行与后一个序号元素(相邻数)比较,可写成通用形式Ai与Ai+1比较,那么,比较的次数又可用1( n-i )循环进行控制(即循环次数与两两相比较时前面那个元素序号有关) ;在每次的比较中,若较大的数在后面,就把前后两个对换,把较大的数调到前面,否则不需调换位置。下面例举5个数来说明两两相比较和交换位置的具体情形:5 6 4 3 7 5和6比较,交换位置,排成下行的顺序;6 5 4 3 7 5和4比较,不交换,维持同样的顺序;6 5 4 3 7 4和3比较,不交换,顺序不变6 5 4 3 7 3和7比较,交换位置,排成下行的顺序;6 5 4 7 3 经过(1(n-1
20、)次比较后,将3调到了末尾经过第一轮的1 (N-1)次比较,就能把十个数中的最小数调到最末尾位置,第二轮比较1 (N-2)次进行同样处理,又把这一轮所比较的“最小数”调到所比较范围的“最末尾”位置;每进行一轮两两比较后,其下一轮的比较范围就减少一个。最后一轮仅有一次比较。在比较过程中,每次都有一个“最小数”往下“掉”,用这种方法排列顺序,常被称之为“冒泡法”排序。,程序如下:#include#includeusing namespace std;const int n=10;int t,an+1; /定义数组int main()for (int i=1; iai; /输入十个数for (int
21、 j=1; j=n-1; +j) /冒泡法排序for (int i=1; i=n-j; +i) /两两相比较 if (aiai+1) /比较与交换t=ai; ai=ai+1; ai+1=t;for (int i=1; i=n; +i) coutsetw(5)ai;/输出排序后的十个数coutendl;return 0;运行结果: 输入: 2 5 8 6 12 34 65 22 16 55 输出: 65 55 34 22 16 12 8 6 5 2,例5.7 用筛法求出100以内的全部素数,并按每行五个数显示。 【问题分析】 把2到100的自然数放入a2到a100中(所放入的数与下标号相同);
22、在数组元素中,以下标为序,按顺序找到未曾找过的最小素数minp,和它的位置p(即下标号); 从p+1开始,把凡是能被minp整除的各元素值从a数组中划去(筛掉),也就是给该元素值置 0; 让p=p+1,重复执行第、步骤,直到minpfloor(sqrt(N) 为止; 打印输出a数组中留下来、未被筛掉的各元素值,并按每行五个数显示。用筛法求素数的过程示意如下(图中用下划线作删去标志): 2 3 4 5 6 7 8 9 10 11 12 13 14 1598 99 100 /置数 2 3 4 5 6 7 8 9 10 11 12 13 14 1598 99 100 /筛去被2整除的数 2 3 4
23、5 6 7 8 9 10 11 12 13 14 1598 99 100 /筛去被3整除的数2 3 4 5 6 7 8 9 10 11 12 13 14 1598 99 100 /筛去被整除的数,程序如下:#include#include /在Dev C+中可调用数学函数库cmath#includeusing namespace std;const int n=100;int t;bool an+1;int main()for (int i=0; i=n; +i) ai=true; /等同于memset(a,1,sizeof(a) ,要调用cstrin库a1=false;for (int i=
24、2; i=sqrt(n); +i)if (ai)for (int j=2; j=n/i; +j)ai*j=false;t=0;for (int i=2; i=n; +i)if (ai) coutsetw(5)i;t+;if (t%5=0) coutendl;return 0;,【上机练习】 1、与指定数字相同的数的个数【1.6编程基础之一维数组01】输出一个整数序列中与指定数字相同的数的个数。 输入:输入包含三行:第一行为N,表示整数序列的长度(N = 100);第二行为N个整数,整数之间以一个空格分开;第三行包含一个整数,为指定的数字m。 输出:输出为N个数中与m相同的数的个数。 样例输入:
25、32 3 22 样例输出:2,【上机练习】 2.陶陶摘苹果【1.6编程基础之一维数组02】Noip2005普及组第1题陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。 输入:包括两行数据。第一行包含10个100到200之间(包括100和200)的整数(以厘米为单位)分别表示10个苹果到地面的高度,两个相邻的整数之间用一个空格隔
26、开。第二行只包括一个100到120之间(包含100和120)的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。 输出:包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。 样例输入:100 200 150 140 129 134 167 198 200 111110 样例输出:5,【上机练习】 3.计算书费【1.6编程基础之一维数组03】下面是一个图书的单价表:计算概论 28.9元/本 数据结构与算法 32.7元/本数字逻辑 45.6元/本 C+程序设计教程 78元/本人工智能 35 元/本 计算机体系结构 86.2元/本编译原理 27.8元/本 操作系统 43元/本
27、计算机网络 56元/本 JAVA程序设计 65元/本给定每种图书购买的数量,编程计算应付的总费用。 输入:输入一行,包含10个整数(大于等于0,小于等于100),分别表示购买的计算概论、数据结构与算法、数字逻辑、C+程序设计教程、人工智能、计算机体系结构、编译原理、操作系统、计算机网络、JAVA程序设计的数量(以本为单位)。每两个整数用一个空格分开。 输出:输出一行,包含一个浮点数f,表示应付的总费用。精确到小数点后一位。 样例输入:1 5 8 10 5 1 1 2 3 4 样例输出:2140.2,【上机练习】 4.数组逆序重【1.6编程基础之一维数组04】将一个数组中的值按逆序重新存放。例如
28、,原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8。输入:输入为两行:第一行数组中元素的个数n(1n100),第二行是n个整数,每两个整数之间用空格分隔。 输出:输出为一行:输出逆序后数组的整数,每两个整数之间用空格分隔。 样例输入:58 6 5 4 1 样例输出:1 4 5 6 8,【上机练习】 5.年龄与疾病【1.6编程基础之一维数组05】某医院想统计一下某项疾病的获得与否与年龄是否有关,需要对以前的诊断记录进行整理,按照0-18、19-35、36-60、61以上(含61)四个年龄段统计的患病人数占总患病人数的比例。输入:共2行,第一行为过往病人的数目n(0n=100),第二行为
29、每个病人患病时的年龄。 输出:按照0-18、19-35、36-60、61以上(含61)四个年龄段输出该段患病人数占总患病人数的比例,以百分比的形式输出,精确到小数点后两位。每个年龄段占一行,共四行。 样例输入:101 11 21 31 41 51 61 71 81 91 样例输出:20.00%20.00%20.00%40.00%,【上机练习】 6.校门外的树【1.6编程基础之一维数组06】Noip2005普及组第2题某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,L,
30、都种有一棵树。由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。 输入:第一行有两个整数L(1 = L = 10000)和 M(1 = M = 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。对于20%的数据,区域之间没有重合的部分;对于其它的数据,区域之间有重合的情况。 输出:包括
31、一行,这一行只包含一个整数,表示马路上剩余的树的数目。 样例输入: 样例输出:500 3 298150 300100 200470 471,【上机练习】 7.向量点积计算【1.6编程基础之一维数组07】在线性代数、计算几何中,向量点积是一种十分重要的运算。给定两个n维向量a=(a1,a2,.,an)和b=(b1,b2,.,bn),求点积ab=a1b1+a2b2+.+anbn。输入:第一行是一个整数n(1=n=1000)。第二行包含n个整数a1,a2,.,an。第三行包含n个整数b1,b2,.,bn。相邻整数之间用单个空格隔开。每个整数的绝对值都不超过1000。 输出:一个整数,即两个向量的点积
32、结果。 样例输入:31 4 62 1 5 样例输出:36,【上机练习】 8.开关灯【1.5编程基础之循环控制28】假设有N盏灯(N为不大于5000的正整数),从1到N按顺序依次编号,初始时全部处于开启状态;有M个人(M为不大于N的正整数)也从1到M依次编号。第一个人(1号)将灯全部关闭,第二个人(2号)将编号为2的倍数的灯打开,第三个人(3号)将编号为3的倍数的灯做相反处理(即将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和3号一样,将凡是自己编号倍数的灯做相反处理。请问:当第M个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,其间用逗号间隔。输入:输入正整数N和M,以单个
33、空格隔开。 输出:顺次输出关闭的灯的编号,其间用逗号间隔。 样例输入:10 10 样例输出:1,4,9,【上机练习】 9. 查找特定的值【1.9编程基础之顺序查找01】在一个序列(下标从1开始)中查找一个给定的值,输出第一次出现的位置。输入:第一行包含一个正整数n,表示序列中元素个数。1 =n= 10000。第二行包含n个整数,依次给出序列的每个元素,相邻两个整数之间用单个空格隔开。元素的绝对值不超过10000。第三行包含一个整数x,为需要查找的特定值。x的绝对值不超过10000。输出:若序列中存在x,输出x第一次出现的下标;否则输出-1。样例输入:52 3 6 7 33 样例输出:2,【上机
34、练习】 9. 查找特定的值【1.9编程基础之顺序查找01】在一个序列(下标从1开始)中查找一个给定的值,输出第一次出现的位置。输入:第一行包含一个正整数n,表示序列中元素个数。1 =n= 10000。第二行包含n个整数,依次给出序列的每个元素,相邻两个整数之间用单个空格隔开。元素的绝对值不超过10000。第三行包含一个整数x,为需要查找的特定值。x的绝对值不超过10000。输出:若序列中存在x,输出x第一次出现的下标;否则输出-1。样例输入:52 3 6 7 33 样例输出:2,【上机练习】 10.不高兴的津津【1.9编程基础之顺序查找03】Noip2004普及组第1题津津上初中了。妈妈认为津
35、津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。 输入:包括七行数据,分别表示周一到周日的日程安排。每行包括两个小于10的非负整数,用空格隔开,分别表示津津在学校上课的时间和妈妈安排她上课的时间。 输出: 包括一行,这一行只包含一个数字。如果不会不高兴则输出0,如果会则输出最不高兴的是周几(用1, 2, 3,
36、 4, 5, 6, 7分别表示周一,周二,周三,周四,周五,周六,周日)。如果有两天或两天以上不高兴的程度相当,则输出时间最靠前的一天。 样例输入: 样例输出:5 3 36 27 25 35 40 40 6,【上机练习】 11.最大值和最小值的差【1.9编程基础之顺序查找05】输出一个整数序列中最大的数和最小的数的差。输入:第一行为M,表示整数个数,整数个数不会大于10000;第二行为M个整数,以空格隔开,每个整数的绝对值不会大于10000。输出:输出M个数中最大值和最小值的差。样例输入:52 5 7 4 2样例输出:5,【上机练习】 12.不与最大数相同的数字之和【1.9编程基础之顺序查找0
37、7】输出一个整数数列中不与最大数相同的数字之和。输入:输入分为两行:第一行为N(N为接下来数的个数,N = 100);第二行N个整数,数与数之间以一个空格分开,每个整数的范围是-1000,000到1000,000。输出:输出为N个数中除去最大数其余数字之和。样例输入:31 2 3样例输出:3,【上机练习】 13.白细胞计数【1.9编程基础之顺序查找08】医院采样了某临床病例治疗期间的白细胞数量样本n份,用于分析某种新抗生素对该病例的治疗效果。为了降低分析误差,要先从这n份样本中去除一个数值最大的样本和一个数值最小的样本,然后将剩余n-2个有效样本的平均值作为分析指标。同时,为了观察该抗生素的疗
38、效是否稳定,还要给出该平均值的误差,即所有有效样本(即不包括已扣除的两个样本)与该平均值之差的绝对值的最大值。 现在请你编写程序,根据提供的n个样本值,计算出该病例的平均白细胞数量和对应的误差。 输入:输入的第一行是一个正整数n(2 n= 300),表明共有n个样本。以下共有n行,每行为一个浮点数,为对应的白细胞数量,其单位为109/L。数与数之间以一个空格分开。 输出:输出为两个浮点数,中间以一个空格分开。分别为平均白细胞数量和对应的误差,单位也是109/L。计算结果需保留到小数点后2位。 样例输入: 样例输出:5 11.00 1.0012.013.011.09.010.0,【上机练习】 1
39、4.直方图【1.9编程基础之顺序查找09】给定一个非负整数数组,统计里面每一个数的出现次数。我们只统计到数组里最大的数。 假设 Fmax(Fmax10000)是数组里最大的数,那么我们只统计0,1,2.Fmax里每个数出现的次数。输入:第一行n是数组的大小。1 = n = 10000。紧接着一行是数组的n个元素。 输出:按顺序输出每个数的出现次数,一行一个数。如果没有出现过,则输出0。对于例子中的数组,最大的数是3,因此我们只统计0,1,2,3的出现频数。样例输入:51 1 2 3 1 样例输出:031 1,【上机练习】 15.最长平台【1.9编程基础之顺序查找12】已知一个已经从小到大排序的
40、数组,这个数组的一个平台(Plateau)就是连续的一串值相同的元素,并且这一串元素不能再延伸。例如,在 1,2,2,3,3,3,4,5,5,6中1,2-2,3-3-3,4,5-5,6都是平台。试编写一个程序,接收一个数组,把这个数组最长的平台找出 来。在上面的例子中3-3-3就是最长的平台。输入:第一行有一个整数n,为数组元素的个数。第二行有n个整数,整数之间以一个空格分开。输出:输出最长平台的长度。 样例输入:101 2 2 3 3 3 4 5 5 6样例输出:3,【上机练习】 16.整数去重【1.9编程基础之顺序查找13】给定含有n个整数的序列,要求对这个序列进行去重操作。所谓去重,是指
41、对这个序列中每个重复出现的数,只保留该数第一次出现的位置,删除其余位置。输入:输入包含两行:第一行包含一个正整数n(1 = n = 20000),表示第二行序列中数字的个数;第二行包含n个整数,整数之间以一个空格分开。每个整数大于等于10、小于等于100。 输出:输出只有一行,按照输入的顺序输出其中不重复的数字,整数之间用一个空格分开。样例输入:510 12 93 12 75 样例输出:10 12 93 75,【上机练习】 17.铺地毯【1.9编程基础之顺序查找14】Noip2011提高组第1题为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩
42、形地毯。一共有n张地毯,编号从1到n。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。 输入输出样例1说明:如下图,1号地毯用实线表示,2号地毯用虚线表示,3号用双实线表示,覆盖点(2,2)的最上面一张地毯是3号地毯。 输入输出样例2说明:如下图,1号地毯用实线表示,2号地毯用虚线表示,3号用双实线表示,覆盖点(4,5)的最上面一张地毯是3号地毯。,【上机练习】 输入:第一行,一个整数n,表示总共有n张地毯。接下来的n行中,第
43、i+1行表示编号i的地毯的信息,包含四个正整数a,b,g,k,每两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的坐标(a,b)以及地毯在x轴和y轴方向的长度。第n+2行包含两个正整数x和y,表示所求的地面的点的坐标(x,y)。 输出:输出共1行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出-1。 样例输入: 样例输出: 样例 #1: 样例 #1: 3 3 1 0 2 3 0 2 3 3 2 1 3 3 2 2 样例 #2: 样例 #2: 3 -1 1 0 2 3 0 2 3 3 2 1 3 3 4 5,第二节 二维数组,一、二维数组的定义当一维数组元素的类型也是一维数组时,
44、便构成了“数组的数组”,即二维数组。二维数组定义的一般格式:数据类型 数组名常量表达式1 常量表达式2 ;例如:int a410;a数组实质上是一个有4行、10列的表格,表格中可储存40个元素。第1行第1列对应a数组的a00,第n行第m列对应数组元素an-1m-1。说明:当定义的数组下标有多个时,我们称为多维数组,下标的个数并不局限在一个或二个,可以任意多个,如定义一个三维数组a和四维数组b:int a10035;int b10010035;多维的数组引用赋值等操作与二维数组类似。二、二维数组元素的引用二维数组的数组元素引用与一维数组元素引用类似,区别在于二维数组元素的引用必须给出两个下标。引
45、用的格式为:下标1下标2说明:显然,每个下标表达式取值不应超出下标所指定的范围,否则会导致致命的越界错误。例如,设有定义:int a35;则表示a是二维数组(相当于一个3*5的表格),共有3*5=15个元素,它们是:a00 a01 a02 a03 a04a10 a11 a12 a13 a14a20 a21 a22 a23 a24因此可以看成一个矩阵(表格),a23即表示第3行第4列的元素。,三、二维数组的初始化二维数组的初始化和一维数组类似。可以将每一行分开来写在各自的括号里,也可以把所有数据写在一个括号里。例如:int direct42 = 1,0,0,1,-1,0,0,-1int dire
46、ct42 = 1,0,0,1,-1,0,0,-1 /尽量不要用四、二维数组程序设计 例5.8 设有一程序,#include #include #include const int n=3; using namespace std; int an+1n+1; int main() for (int i=1; iaij;for (int i=1; i=n; +i)for (int j=1; j=n; +j) coutsetw(5)aji;coutendl;return 0; ,程序的输入: 2 1 3 3 3 1 1 2 1程序的输出: 2 3 1 1 3 2 3 1 1,例5.9 已知一个6*6
47、的矩阵(方阵),把矩阵二条对角线上的元素值加上10,然后输出这个新矩阵。【分析】 矩阵即表格,是一个二维数组,有6行6列共36个元素,每个矩阵都有二条对角线,本题难点在于对角线的元素怎么确定。#include#includeusing namespace std;int a77;int main()for (int i=1; iaij;for (int i=1; i=6; +i) /更改对角线上元素的值for (int j=1; j=6; +j)if (i=j)|(i+j=7) aij+=10; /寻找对角线的特征for (int i=1; i=6; +i) /输出6行6列的矩阵元素for (int j=1; j=6; +j)coutsetw(5)aij;coutendl;return 0;,