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;
}
posted @ 2024-11-11 09:48  gdyyx  阅读(39)  评论(0)    收藏  举报