2019-12-24

第五单元 数组
第一课 一维数组的定义
格式
类型标识符 数组名[常量表达式]
类型标识符可以是任何基本数据类型,也可以是结构体等构造类型,相同类型的数组可以一起定义。数组名必须是合法的标识符。常量表达式的值即为数组元素的个数。
例如,“int d[50]”表示定义一个一维数组h,共有50个元素,它们的编号从0到49,每个元素都是int类型。
2.一维数组的元素引用
下接越界是大忌!
数组定义好后,就可以“引用”数组中的任意一- 个元素。引用格式为“数组名[下标]”,如h[5]、h[i*2+1 ]等。其中,下标只能为整型常量或整型表达式,值必须在数组定义的下标范围内,否则会出现“下标越界错误”。
需要注意的是,不能一次引用整个数组,只能逐个引用数组的单个元素。例如,对于一个数组a来说,语句“cout<<a;"是不合法的。
3. 一维数组的存储结构
数组在计算机内存单元中是连续存储的。程序-旦执行到数组的定义语句,就会开辟出若干字节的内存单元。例如,对于已定义的数组“int h [ 50 ];”,假设系统给它分配的内存单元地址从1000开始,则“1000”就称为该数组
在内存中的“首地址”。由于每个元素都
是int类型,占用4个字节。
size of函数可直接求出一个数组所占的内存空间。
第二课 一维数组的输入与输出
一维数组的输入输出等操作,都是采用循环语句结合下标变化逐个元素进行。
批量数据一次性输入到一维数组
(1)键盘读入
(2)直接赋值
C++还提供了2个函数给数组“整体”赋值
(1)memset函数
memset函数是给数组“按字节”进行赋值,般用在char型数组中,如果是int类型的数组,一般赋值为0和 -1。使用前需要包含头文件:#inelude 。
例如, “memset (h,0, sizeof(h));“就是将h数组所有元素均赋值为0。
(2) fill函数
fill函数是给数组“按元素”进行赋值,可以是整个数组,也可以是部分连续元素,可以赋任何值。使用前需要包含头文件: #include 。例如,fill(a,a+10,5);” 就是将a数组的前10个元素赋值为5。
例如:

  # include<iostream>
  #include<cstring>

  using namespace std;

  int main() {

    int a[10],b[10],c[10],a[10],i;

  memset (a, 0,sizeof(a));//将a数组所有元素均赋值为0

for(i = 0; i<9;i++)cout<<a[i]<<“ ”;
cout << a[9] << end1;
fill(d,d+5,8);//将d数组前5个元素都赋值为8
其它元素不确定
for(i=0;i<9;i++) cout<<d[i]<<" ";
cout<<d[9]<<endl;
第三课 一维数组的插入删除
在实际应用中,经常需要在数组中插人一一个元素,或者删除数组中的某一个元素,称为数组的“插入”操作或者“删除”操作。插人一-个元素,需要先找到插人的位置(假设下标为x),将这个元素及其之后的所有元素依次往后移一-位 (注意要从后往前进行操作),再将给定的元素插入(覆盖)到位置x,删除某一个元素 ,也需 要先找到删除的位置 (假设下标为x),将下标为x+1及其之后的所有元素依次向前移一位 ,覆盖原来位置上的元素,如图5.3-2所示。

  插人或者删除一一 个区间(连续若干个数),只要重复以上单个元素的操作即可。另外,插入操作需要注意把数组下标定义的足够大。

例子:插队问题
#include
using namespace std;
int main(){
int n,i,x,q[102];
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&q[i]);
scanf("%d",&x);
for(i=n;i>=x;i–) q[i+1]=q[i];
q[x]=q[n+1];
for(i=1;i<n;i++)
printf("%d",q[i]);
printf("%d\n",q[n]);
return 0;
}
例二 队伍调整
#include
using namespace std;
int main(){
int n,i,x,q[102];
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d",&q[i]);
scanf("%d",&x);
for(i=x;i<n;i++) q[i]=q[i+1];
n–;
for(i=1;i<n;i++) printf("%d",q[i]);
printf("%d\n",q[n]);
return 0;
}
第四课 一维数组的查找统计
顺序查找 二分查找(递增或递减)
例如:抽奖
#include
using namespace std;
int main(){
int n,i,win,f,left,right,mid,g[101];
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d",&g[i]);
scanf("%d",&win);
f=0;
left=1;right=n;
while(left<=right){
mid=(left+right)/2;
if(g[mid]==win) {f=mid;break;}
if(win<g[mid]) right=mid-1;
if(g[mid]<win) left=mid+1;}
printf("%d\n",f);
return 0;
}
第五课 一维数组的元素排序
选择排序、冒泡排序、插入排序;
函数sort(a,a+n)按照升序
第六课 一维数组的应用举例
1 商品排序(桶排序)
#include
using namespace std;
int n,i,j,number,num[1001];
int main(){
cin>>n;
for(i=1;i<=n;i++){
cin>>number;
num[number]++;//记录整数number出现的次数

for(i=0;i<1001;i++)
for(j=1;j<=num[i];j++)
cout<<i<<endl;//输出num[i]次i
return 0;
}
第七课 二维数组的定义和操作
1.二维数组的一般格式
类型标识符 数组名[常量表达式1][常量表达式2]
2二维数组的输入输出
例如:会型方阵
#invlude
using namespace std;
int n,i,j,k,a[10][10];
int main(){
cin>>n;
for(k=1;k<=(n+1)/2;k++)
for(i=k;i<=n+1-k;i++)
for(j=k;j<=n+1-k;j++)
a[i][j]=k;
for(i=1;i<=n;i++){
for(j=1;j<n;j++)
cout<<a[i][j]<<" ";
cout<<a[i][n]<<endl;
}
return 0;
}
第八课 二维数组应用举例
例:杨辉三角形
#include<iostream
#include
#include
using namespace std;
int n,i,j,tr[21][21];
int main() {
cin >> n;
for(i=1;i<=n;i++){
tri[i][1] = 1;
tri[i][i] = 1;
for(j=2;j<i;j++)
tri[i][j]=tri[i-1][j-1]+tri[i-1][i];

for(i=1;i <= n; i++){
for(j= 1;j<i;j++)
cout<< setw(6)<< tri[i] [j] <<" ";
cout<< setw(6)<< tri[i] [i] <<endl;
}
return 0;
}

第九课 数字方阵

  数字方阵就是-个行列数 相等的 二维数组,其中的每个元素 都是数字。解决数字方阵问题,一般有 两种方法:解析法和模拟法。
  解析法就是找出每一一个 方阵元素f[i][j]与i、j和数组规模n的通项公式,然后直接用两重循环给数组元素赋值,相对比较容易,一般用在初始化等场合。
  模拟法就是把数字方阵看成个动态的填数过程 ,把n2个数依次填入 数组中,每填好一 个数,就定位好下一个数的位置i和j。
  例子:蛇形方阵
  #include<iostream>
  #include<iomanip>
  #include<cstring>
  using namespace std;
  int main(){
  int n,i,j,k,t=0,a[21][21];
  cin>>n;
  for(k=1;k<=n;k++)
  if(k%2)
  for(j=1;j<=k;j++)
  i=k+1-i;
  t++;
  a[i][j]=t;
  a[n+1-i][n+1-i]=n*n+1-t;}
  else
  for(j=k;j>=1;j--){
  i=k+1-i;
  t++;
  a[i][j]=t;
  a[n+1-i][n+1-i]=n*n+1-t;
  }
  for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
  cout<<setw(5)<<a[i][j;
  cout<<endl;
  }
  return 0;
  }
  第10课  字符数组
 给字符数组赋值的方法很多,例如:

用字符常量逐个初始化:char letter[ 5 ]={‘a’,‘e’ ,T’,‘o’,‘u’};用赋值语句逐个元素赋值:letter[ 0 ]=‘a’;…
用scanf读入整个数组:scanf ( “%s”,letter);
用scanf逐个元素读人:scanf("%c",&letter[ 0 ]);…
用cin输人整个数组:cin >> letter;
用cin逐个元素输人:cin >> letter[ 0 ];
用gets读入整个数组: gets (letter)
用getchar逐个读人: letter[ 0 ]=getchar( );…

字符数组的输出方法也很多,例如:
用cout输出整个数组:cout >> letter;
用cout逐个元素输出:cout >> letter[0」;
用printf输出整个数组:printf("%os",letter);
用printf逐个元素输出:printf("%oc",letter[ 0] );…
用puts输出整个数组:puts (letter);
用putchar逐个元素输出:putchar(letter[ 0]);
例如:数字和
#include
#include
#include
using namespace std;
char n[201];
int main(){
int i,sum=0;
scanf("\s",n);
for(i=0;i<strlen(n);i++) sum=sum+n[i]-‘0’;
//strlen(n) 表示求字符串的长度
printf("%\n",sum);
return 0;
}
数组是一组具有相同类型的变量的集合,可以使程序变得简单,memset 函数,fill函数,数组的插入删除,数组的查找:顺序查找,二分查找。数组元素排序:选择排序,冒泡排序,插入排序,sort函数。swap交换元素。元素下标尽量弄大一点,防止下标越界。感觉学了数组之后,写的程序都很难,要注意更多的点,如果没有思路,肯定是写不出来的,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值