C++及数据结构复习笔记(三)(数组)

1.5 数组

1.5.1 一维数组

格式:

       类型标识符 数组名[常量表达式];

       inta[10];  //数组名为a,有10个元素

       数组的下标是从0开始的,a[10]的10个元素非别是a[0],a[1],…a[9]。且常量表达式中不能包含变量。

只能逐个引用数组元素的值而不能一次引用整个数组中的全部元素的值。

初始化:

       int a[10]={0,1,2,3,4,5,6,7,8,9};

       int a[10]={0,1,2,3,4};//后面5个元素的值默认为0

       int a[]={1,2,3,4,5};//在对全部数组元素赋值时,可以不指定数组长度

1.5.2 冒泡排序与选择排序

冒泡排序

直接选择排序

冒泡排序是每次将乱序中的最大数字通过两两比较方式向后移动,直到序列有序为止。该算法一共执行n次,每次执行n-i次比较。

选择排序简单地说就是每次找到序列中的最小值,然后将该值与有序序列的第一个元素对换位置,然后在剩下的序列中找到最小值,再与第二个元素对换位置。

算法复杂度:O(n^2)

空间复杂度:O(1)

算法复杂度:O(n^2)

空间复杂度:O(1)

#include<iostream>
using namespace std;
int main()
{
  int a[11],i,j,t;
  cout<<”input 10 numbers:”<<endl;
  for (i=1;i<=11;i++)
    cin>>a[i];//输入a[1]到a[10]
  cout<<endl;
  for (j=1;j<=9;j++)//共进行9躺比较
    for (i=1;i<=10-j;j++)
    //每趟比较中要进行(10-j)次两两比较
    if (a[i]>a[i+1])
    {
      t=a[i];a[i]=a[i+1];a[i+1]=t;
    }
    cout<<”the sorted numbers:”<<endl;
  for (i=1;i<11;i++)
    cout<<a[i]<<” “<<endl;
  return 0;
}
#include<iostream>
using namespace std;
int main()
{
  void select_sort(int array[], int n);
  //声明排序函数,array[]表示是个数组
  int a[10],i;
  cout<<”enter the original array:”<<endl;
  for (i=0;i<10;i++)
    cin>>a[i];
  cout<<endl;
  select_sort(a,10);//数组名作实参
  cout<<”the sorted array:”<<endl;
  for (i=0;i<10;i++)
    cout<<a[i]<<” “;
  cout<<endl;
  return 0;
}
void select_sort(int array[],int n)
{
  int i,j,k,t;
  for (i=0;i<n-1;i++)
  {
    k=i;//假定第i个数是最小的,k用于存储最小元素的位置
    for (j=i+1;j<n;j++)
    if (array[j]<array[k])
    {
    t=array[k];
    array[k]=array[i];
    array[i]=t;
    }
  }
}

缺点:当序列部分有序时,基本的冒泡排序算法会做很多无用功。

 

改进:①如果在某一趟循环中,没有任何数据交换发生,则表明已经排序完毕,剩下的循环不必进行。②在每一次扫描中,记录最后一次发生交换的位置,缩小无序区范围。

 

1.5.3 二维数组

定义二维数组的一般形式:

       类型标识符 数组名[常量表达式][常量表达式]

       float a[3][4],b[5][9];//a是一个3行4列的单精度数组

       C++将二维数组看成一种特殊的一维数组,例如将a看作一个一维数组,a[0],a[1],a[2]是它的三个元素,每个元素又是包含4个元素的一维数组。二维数组中元素的排列顺序是按行存放。

初始化:

       int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};//第i个花括号内的数据赋值给第i行元素

       int a[3][4]={{1},{5},{9}};//相当于只给第一列元素赋值

       int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};//可以省略第一维长度,但是第二维不能省略

1.5.4 用数组名作函数参数

例 1.5.1 见选择法排序,给10个数从小大到排序,且使用数组名作为函数参数。

       形参不能声明为普通变量,上例中voidselect_sort(int array, int n);是错误的,[ ]内的值并无实际作用,只是用来说明array是一个一维数组名。且数组名代表数组元素的首地址,并不代表数组中的全部元素。对于二维数组来说,a[3][4]中a代表其首元素(第一行)的起始地址。

1.5.5 字符数组

       用于存放字符数据的数组是字符数组,其中每一个元素存放一个字符。

       初始化:

             char c[10]={‘I’,’ ‘,’a’,’m’,’ ‘,’h’,’a’,’p’,’p’,’y’};

             char c[]={‘I’,’ ‘,’a’,’m’,’ ‘,’h’,’a’,’p’,’p’,’y’};

             char str[]={“I am happy”};//用字符串常量来初始化字符数组。

       若初值个数小于数组长度,则多余的元素自动定为空字符(即’\0’)。

       char str[12]={‘I’,’ ‘,’a’,’m’,’‘,’h’,’a’,’p’,’p’,’y’};

       上述数组中第11个字符为’\0’,字符串“I am happy”共有10个字符,但它在内存中共占11个字节。但字符数组并不要求它的最后一个字符为’\0’。

       字符数组的输入输出可以住个字符进行也可以一次将整个字符串输入输出。

char str[20];
cin>>str;
cout<<str;//输出一个字符串
cout<<str[4];//输出一个字符
1.5.6 字符串处理函数

字符串连接函数strcat

strcat (char [], const char[]);

将第二个字符数组中的字符串连接到前面字符数组的字符串的后面。第二个字符数组被指定为const,以保证该数组中的内容不会在函数调用期间修改。

字符串复制函数strcpy

strcpy (char [],const char[])

将第二个字符数组中的字符串复制到第一个字符数组中去,将第一个字符数组中的相应字符覆盖。第二个参数也可以是字符串常量。只能调用该函数将字符串赋值给一个字符数组,而不能用赋值语句。

str=”China”;

str1=str2;

字符串比较函数strcmp

strcmp (const char[],const char[])

由于2个字符串仅作比较,而不改变内容,因此2个参数均声明为const。若2个字符串相等,返回0。

字符串长度函数strlen

strlen(const char[])

测试字符串的实际长度,不包括’\0’。

1.5.7 字符串变量

       C++提供了一种新的数据类型,字符串变量(string),用一个名字代表一个字符序列。

初始化:

#include<string>//使用string类功能时,需要包含string头文件
string string1;//定义string1为字符串变量
string1=”Canada”;
string string2=”China”;//定义string2时对其初始化
string2=string1;//可以把一个字符串变量赋值给另一个字符串变量,区别于字符数组的strcpy。

       可以定义字符串数组,数组元素为字符串:

string name[5]={“Zhang”,”Li”,”Fun”,”Wang”,”Tan”};//每一个字符串元素不包括’\0’

       可以直接用==,>,<,!=,>=,<=等关系运算符直接对字符串进行比较。

例 1.5.2一个班有n个学生,需要把每个学生的简单材料(姓名和学好)输入计算机保存。然后可以通过输入某一学生的姓名查找其相关资料。要求:当输入一个姓名后,程序就查找该班有无此学生,如有则输出姓名和学好,否则输出“本班查无此人”。

#include<iostream>
#include<string>
using namespace std;
string name[50],num[50];//定义2个字符串数组,分别存放name和num,且它们是全局变量
int n;//实际学生数
int main()
{
  void input_date();//声明函数,该函数完成数据的输入
  void search(string find_name);
  string find_name;
  cout<<”please input number of this class:”;
  cin>>n;//输入学生数
  input_data();\\调用input_data函数,输入学生的数据
  cout<<”please input the name you want to find: “;
  cin>>find_name;
  search(find_name);//调用serach函数,寻找学生姓名
  return 0;
}
void input_data()
{
  int i;
  for (i=0;i<n;i++)
{
  cout<<”input name and NO. of student<<i+1<<”:”;
  cin>>name[i]>>num[i];
}
}
void search(string find_name)
{
  int i;
  bool flag=false;
  for (i=0;i<n;i++)
if (name[i])==find_name)
{
  cout<<name[i]<<” has been found, his number is “<<num[i]<<endl;//若输入姓名与本班某一学生姓名一致
  flag=true;
  break;
}
if (flag==false) cout<<”can’t find this name”;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值