20C++数组(1)
一、什么是数组
尼克、格莱尔等5位同学进行了一次信息学测试,试编一程序,实现查分功能。先输入成绩,然后输入学号输出相应的成绩。
按以前方法:可以用al~a5分别保存1~5号同学的成绩,然后进行判断,若输入的学号是1则输出a1的值,若输入的学号是2则输出a2的值,以此类推。
#include <iostream>
using namespace std;
int main()
{
int a1,a2,a3,a4,a5,n;
cout<<"1-5号的成绩:";
cin>>a1>>a2>>a3>>a4>>a5;
cout<<"输入学号1-5:";
cin>>n;
switch(n)
{
case 1:cout<<a1; break;
case 2:cout<<a2; break;
case 3:cout<<a3; break;
case 4:cout<<a4; break;
case 5:cout<<a5; break;
default:cout<<"输入的学号不存在!";
}
return 0;
}
若全班45位同学都进行了语文测试,那就需要45个变量来保存成绩,而且输出时需要判断46种情况,有没有简便的方法?有的,C+提供了数组的功能,来处理像成绩这样具有内在联系、相同属性的数据。
定义一维数组的一般形式为:
类型名 数组名[常量表达式];
如“int a[10];”就定义了一个数组a,其包含a[0],a[1],a[2],·,a[9]10个数组元素。
数组名的命名规则和变量名相同,遵循标识符命名规则;在数组定义时用方括号括起来的常量表达式的值表示元素的个数,即数组的长度,下标从0开始,如上例中最后一个元素是a[9],而不是a[10];在数组元素访问时,用方括号括起来的表达式表示元素的下标;数组往往与循环语句结合使用。前面的查分程序如果用数组来写,程序如下。
#include <iostream>
using namespace std;
int main()
{
int a[6],n,i; //为了使用a[5]
for(i=1;i<=5;i++)
{
cout<<i<<"号成绩:";
cin>>a[i];
}
cout<<"输入学号1-5:";
cin>>n;
if(n>=1&&n<=5)
cout<<a[n];
else
cout<<"输入的学号不存在!";
return 0;
}
练习

3.完善程序。
输入5个整数,输出最小的数。
#include <iostream>
using namespace std;
int main()
{
int a[5], min, i;
for(i=0;i<5;i++)
{
cin>>a[i];
——————————;
for(i=l;i<5;i++)
if(a[i]<min)min=a[i];
cout<<"最小的数:"<<______;
return 0;
}
二、数组越界
一座山上有10个山洞。一天,格莱尔和尼克在山上玩捉迷藏游戏。尼克说:“我先把10个山洞从1~10编上号,你从10号洞出发,先到1号洞找我,第二次隔1个洞找我,第三次隔2个洞找我,如图62.1所示。以后以此类推,次数不限。”格莱尔同意了,但她从早到晚进洞1000次,也没找到尼克。试编一程序,算一算兔子尼克可能躲在几号洞里。

试编一程序,算一算兔子尼克可能躲在几号洞里。
用数组a记录格莱尔进10个洞的情况,首先把a[1]至a[10]的值初始化为true,表示格莱尔未进1~10号洞。当格莱尔进过i号洞时,a[i]标记为false。变量cishu表示进洞的次数。用“i=(i+cishu)%10”来确定每次格菜尔进的是哪个洞。最后,输出没进过的洞即可。流程图如图下两图:


#include <iostream>
using namespace std;
int main()
{
bool a[11];
int i,cishu;
for(i=1;i<=10;i++)
a[i]=true;
i=10;
a[i]=false;
cishu=1;
while(cishu<=1000)
{
i=(i+cishu)%10;
if(i==0) i=10;
a[i]=false;
cishu++;
}
for(i=1;i<=10;i++)
if(a[i]) cout<<i<<endl;
return 0;
}
在本例中,定义数组时使用“bool a[i];”语句,程序编译时会开辟一片连续的存储单元供数组元素a[0]、a[1] 、a[2]、····、a[10]使用。若在序中使用了a[11]、a[12]····,就会发生数组越界出错。所谓数越界,就是程序运行时访问的数组元素并不在数组的存储空间内,但是数组越界在编译、运行时系统并不会示出错,不易发现。数组越界,会让程序访问超出数组边界的存储单元,造成内存的混乱,程序运行结果错误。
练习
(1)数组a有5个下标变量,各个下标变量的赋值情形如表62.1所示,求a[a[2]]的值是( )。
A.2 B.3 C.4 D.0

(3)完善程序。
输入5个整数,输出最小的数。
#include <iostream>
using namespace std;
int main()
{
int a[5], min, i;
for(i=0; i<5;i++)
cin>>a[i];
__________;
for(i=1; i<5;i++)
if(a[i]<min)min=a[i];
cout<<"最小的数:"<<_______;
return 0;
}
三、循环移位
狐狸老师和格莱尔等5位小朋友玩老鹰捉小鸡游戏,狐狸老师当“老鹰”,排在第1位的小朋友当“母鸡”,其他4位小朋友当“小鸡”。但是“母鸡”很辛苦,所以过一段时间“母鸡”需要排到队伍最后成为“小鸡”,让第2位小朋友当“母鸡”······。
试编一程序,模拟10次位置的变化过程。




#include <iostream>
using namespace std;
int main()
{
int i,j,a[6],n;
for(i=1;i<6;i++)
a[i]=i;
//输出第1次的位置
i=1;
cout<<i<<": ";
for(j=1;j<6;j++)
cout<<a[j]<<" ";
cout<<endl;
for(i=2;i<=10;i++)
{
//移动位置
for(j=0;j<=4;j++)
a[j]=a[j+1];
a[5]=a[0];
//输出位置
cout<<i<<": ";
for(j=1;j<=5;j++)
cout<<a[j]<<" ";
cout<<endl;
}
return 0;
}
练习
(1)在线性表的两种存储结构中,下列描述不正确的是( )。
A.如果需要快速访问数据又很少或不插入和删除元素,就用数组
B.如果需要经常插入和删除元素就用链表
C.链表能动态地进行存储分配,可以适应数据动态地增减
D.数组能动态地进行存储分配,可以适应数据动态地增减


四、冒泡排序
风之巅小学举行1分钟跳绳比赛,5人一小组。试编一程序,输入小组内同学的跳绳次数,按次数由多到少的顺序输出。
如输入: 126 80 98 158 204
输出: 204 158 126 98 80
我们先来学习一下用冒泡排序算法解决这个问题的思路:依次比较相邻的两个数,将大数放在前面,小数放在后面。即依次比较第1个数和第2个数,第2个数和第3个数,…,第n-1个数和第n个数,每次比较时都将大数放在前面,小数放在后面,经过第一趟比较后,最后一个数就是最小的数了;然后再从第1个数开始到第n-1个数,重复以上操作后,第n-1个数就是第二小的数了…直到第4趟比较后,将后面的4个数排好序了,剩下的第1个数就是最大的。为了使数据由大到小(降序)排序,在比较和交换的过程中,越大的数就会像气泡一样慢慢“浮”到数列的顶端,所以把这种算法称为冒泡排序,如图所示:



#include <iostream>
using namespace std;
int main()
{
int a[6],i,j,t;
cout<<"输入5个整数:"<<endl;
for(i=1;i<=5;i++)
cin>>a[i];
for(i=1;i<=4;i++)
for(j=1;j<=5-i;j++)
if(a[j]<a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
for(i=1;i<=5;i++)
cout<<a[i]<<" ";
return 0;
}
排序是计算机中经常进行的一种操作,常用的排序算法还有选择排序、桶排序、归并排序、希尔排序、插入排序、快速排序等。
如要使数据由大到小排序,用选择排序的思路是:按顺序先用第1个数与后面的所有数进行比较,找出最大数的位置,只要最大数的位置不是1,就把最大数与第1个数进行交换,第1趟比较后可将最大数换到第1个位置;接着,第2个数与后面的所有数进行比较,找出剩下数中最大数的位置,只要当前最大数的位置不是2,就把当前的最大数与第2个数进行交换;以此类推,最后得到的就是排序后的结果。因为我们总是持续选择剩下数中的最大的数(最小的数),选择排序由此得名。
练习

3.完善程序。
输入5个数,排序后按由大到小的顺序输出(选择排序)。
#include <iostream>
using namespace std;
int main()
{
int a[6], i, j, t;
cout <<"输入5个整数:" <<endl;
for(i=1; i<=5; i++)
cin>>a[i];
for(i=1; i<=4; i++)
{
t=i;
for(j=i+1; j<=5; j++)
if(a[i]>a[t]) ________;
if(t!=i)
{
a[0]=a[i];
__________;
a[t]=a[0];
}
}
for(i=l; i<=5; i++)
cout <<_______<<"";
return 0;
}

浙公网安备 33010602011771号