数据结构论坛

首页 » 分类 » 定义 » L2数据结构第02课数组
TUhjnbcbe - 2020/11/24 15:56:00
L2-数据结构-第02课数组数组

输入两个学生的成绩,我们可以定义两个变量来存储,可是如果输入全班的学生的成绩,怎么存放呢?全校学生的成绩呢?这时,我们需要用到数组.

数组:是相同数据类型组成的集合。

一维数组

声明:数据类型数组名[大小]

声明和定义:数据类型数组名[大小]={数组元素}

例子:

inta[6]={10,20,30,40,};数组下标数组元素随机值取数组值a[0]a[1]a[2]a[3]a[4]a[5]a[x]越界

测试代码:

#includeiostreamusingnamespacestd;intmain(){  inta[6]={10,20,30,40};  for(inti=0;i=10;i++){    couta"";  }  return0;}

最重要特性:连续!连续!连续!的一块内存

这样对吗?

intn;cinn;inta[n];//对吗?

constintN=;inta[N];

c++不支持变量定义数组长度,虽然c支持

选择题:

c++中数组a[10],下面表述正确的是()

A:a代表了是a[1]的地址B:a代表了整个数组的元素C:a代表了数组的首地址D:a的值可以改变一维数组的初始化

依次赋值inta[3]={1,2,3};

部分赋值inta[3]={1,};

单个赋值inta[3];a[0]=1;a[1]=2;

这样对吗?为什么

inta[10]={10,1,};intb[10];b=a;//对吗?c++为什么不支持呢?数组大小

sizeof(a)//返回a占用内存的字节数.注意不是数组元素的个数.

数组的越界

数组下标不能是负数

下标应该在数组长度之内

inta[N];//数组元素的下标值为0-(N-1)for(inti=0;in;i++){if(aa[i-1]){//不小心就越界了,还有可能是a[n+1];}}

每次写完数组的循环,都要带入数组下标的边界值确认是否越界

内存操作函数

memcpy

void*memcpy(void*destin,void*source,unsignedn);

从存储区source复制n个字节到存储区destin

inta[10]={10,1,};intb[10];memcpy(b,a,sizeof(b));

memset

void*memset(void*buffer,intch,size_tn);

buffer是指针或者数组,ch是要初始化的变为的字符,count是buffer的长度

//清零inta[];memset(a,0,sizeof(a));//极大值memset(a,0x7f,sizeof(a));//-1memset(a,-1,sizeof(a));数组类型

inta[];charstr[];longlonglla[];

一维数组的应用模板

输入,输出和遍历

inta[0];intn;scanf("%d",n);for(inti=0;in;i++){scanf("%d",a);//依次读入每个元素}for(inti=0;in;i++){printf("a[%d]=%d",i,a);//打印数组,用于调试}

删除

删除第i个,后面的元素要前移

插入

i下标插入x,原来i和i之后的元素要后移动.

例题1

题目描述一个学校有个教室,每个教室有一盏灯,开关控制,拉一下,是开,再拉一下是关.教室编号从1-.开始时,所有的灯都是关的.第一个学生把所有的灯的开关都拉一下,第二个学生把所有编号是2的倍数的教室的灯开关都拉1下.第三个学生把所有编号是3的倍数的灯都拉1下...以后每个学生都是如此.当第个学生拉完开关后,哪些灯是亮的呢?

分析灯开关状态怎么表示?教室怎么表示?

#includeiostream#includecstringusingnamespacestd;intmain(){  inta[];  memset(a,0,sizeof(a));  for(inti=1;i=;i++){    for(intj=1;j*i=;j++){      if(a[i*j]==1)        a[i*j]=0;      else        a[i*j]=1;    }  }  for(inti=1;i=;i++){    if(a==1)      couti"";  }  return0;}例题2

P旗鼓相当的对手

题目描述现有N(N≤0)名同学参加了期末考试,并且获得了每名同学的信息:语文、数学、英语成绩(均为不超过的自然数)。如果某对学生i,j的每一科成绩的分差都不大于5,且总分分差不大于10,那么这对学生就是“旗鼓相当的对手”。现在想知道这些同学中,有几对“旗鼓相当的对手”?同样一个人可能会和其他好几名同学结对。

输入格式第一行一个正整数N。

接下来N行,每行三个整数,其中第i行表示第i名同学的语文、数学、英语成绩。最先读入的同学编号为1。

输出格式输出一个个整数,表示“旗鼓相当的对手”的对数。

输入输出样例

08091

输出2

输入

分析数据怎么存储呢?怎么进行两两比较呢?

参考代码

#includeiostream#includecstdio#includecmathusingnamespacestd;constintMAXN=2;intn,a[MAXN],b[MAXN],c[MAXN],sum[MAXN];intans;intmain(){  cinn;  for(inti=1;i=n;i++){    cinabc;    sum=a+b+c;  }  for(inti=1;i=n;i++){    for(intj=i+1;j=n;j++){      if(abs(a-a[j])=5        abs(b-b[j])=5        abs(c-c[j])=5        abs(sum-sum[j])=10)          ans++;    }  }  coutans;  return0;}作业

作业1:

P小鱼比可爱

P校门外的树

P梦中的统计

P珠心算测验

作业2:

P小鱼的数字游戏

P旗鼓相当的对手

P[AHOI]彩票摇奖

P开灯

云帆编程老师联系方式:

云帆老师

1
查看完整版本: L2数据结构第02课数组