数组

数组:
一、知识点:
⒈数组的定义与初始化
⑴一维数组的定义与初始化:
①数组的概念:
按顺序排列的一组同种类型的数据构成的集台。(一个数组在内存中占一片连续的存储单元。)
②定义及初始化:
Ⅰ.格式:数据类型  数组名[整数]
例如:int a[5]//定义个有5个int型数据。(下标从0开始)
系统在内存分配连续的5个int空间给此数。直接对a的访问,就是访问此数组的首地址
Ⅱ.初始化:
用循环语句实现初始化
例如:
#include<iostream>
#define N 1000
using namespace std;
int main()
{
    int a[N]
    for (i=0;i<=n;i++)
    {
        cin>>a[i];
    }
}
注意:一维数组的定义中数组大小必须是值为正的常量,不能为变量。且一旦定义,不能改变大小。
数组大小最好用宏来定义,以适应未来可能的变化。
例如:#define N 5
int a[N] ;
③数组的引用:
数组名[下标]
数组下标(index)都是从o开始。使用a[O]、a[1]、a[2]、a[3]、a[4]这 样的形式访问每个元素。下标既可是常量,也可是整型表达式,允许快速随机访问,如a[i]可以像使用普通变量一样使用它们
注意:下标越界是大忌!编译程序不检查是否越界。下标越界,将访问数组以外的空间。那里的数据是未知的,不受我们掌控,可能带来严重后果。
⑵二维数组
①二维数组定义的一般格式:
数据类型数组名[常量表达式门[常量表达式2] ;例如: int a[4][1O] ;
该数组数组实质上是一个有4行、10列的表格,表格中可储存40个元素。
  说明:当定义的数组下标有多个时,我们称为多维数组,下标的个数并不局限在一个或二个,可以任意多个。并且 多维的数组引用赋值等操作与二维数组类似。
②二维数组元素的引用
二维数组的数组元素引用与一维数组元素引用类似,区别在于二维数组元素的引用必须给出两个下标。
 引用的格式为:
人数组名>[下标1][下标2]例: int a[3][5];
a是二维数组(相当于一个3*5的表格), 共有3*5=15个元素,它们是:
a[O][o] a[0][1] a[0][2] a[0][3] a[0] [4]a[l][o] a[1][1] a[1][2] a[1J[3] a[I] [4]a[2][0] a[2][1] a[2][2] a[2][3] a[2][4]
因此可以看成一个矩阵(表格),a[2J[3]即表示 第3行第4列的元素。
③初始化:
二维数组的初始化和一维数组类似。可以将每一行分开来写在各自的括号里,也可以把所有数据写在一个括号里。
⒉字符数组
 字符数组是指元素为字符的数组。字符数组是用来存放字符序列或字符串的。
①字符数组的定义格式:
   字符数组定义格式同于一般数组,所不同的是数组类型是字符型,第一个元素同样是从ch1[0]开始,而不是chI[I]。
 具体格式如下:
[存储类型] char数组名[常量表达式1] .例如:
char ch1[5];  //数组ch1是一个具有5个字符元素的一维字符数组
char ch2[3][5];  //数组ch2是一个具有15个字符元素的二维字符数组
②字符数组的赋值
  (1).用字符初始化数组例如: char chr1[5]={‘a’,‘b’,‘c’,‘d’, ‘e’};字符数组中也可以存放若干个字符,也可以来存放字符串。两者的区别是字符串有一结束符(‘\0’)。反过来说,在一维字符数组中存放着带有结束符的若干个字符称为字符串。字符串是一维数组,但是一维字符数组不等于字符串。
 例如: char chr2[5]={‘s’,‘b’,‘c’,‘d’,“\0’ };即在数组chr2中存放着一个字符串“abcd”。
字符常量和字符串常量的区别
①两者的定界符不同,字符常量由单引号括起来,字符串常量由双引号括起来。
②字符常量只能是单个字符,字符串常量则可以是多个字符。
③可以把一个字符常量赋给一个字符变量,但不能把一个字符串常量赋给一个字符变量。
 ④字符常量占一个字节,而字符串常量占用字节数等于字符串的字节数加1。增加的一个字节中存放字符串结束标志”。例如:字符常量‘a’占一个字节,字符串常量“a”占二个字节。
⒊字符串的输入与输出
 Ⅰ输入
  从键盘输入一个字符数组可以使用scanf语句或gets语句。
(I)scanf语句
格式: scanf( "%s”,字符数组名);说明:
①系统会自动在输入的字符串常量后添加‘\0’标志,因此输入时,仅输入宇符串的内容即可。
 ②输入多个字符串时,以空格分隔。
 例如: scanf( "%s%s%s”, s1, s2, s3);从键盘分别输入Let us go,则三个字符串分别获取了三个单词。
例如: scanf( "%s”, sI);从键盘分别输入Let us go,则仅有第一个单词被获取,即s1变量仅获取第一个单词Let。
(2)gets语句
格式: gets(字 符数组名) ;
说明:使用getsR能输∩一个字符串。读入的是一整行,包括空格。
例如: scanf( “%s”, s1); gets(s2); 对于相同的输ηHello World!。sI 获取的结果仅仅是Hello,而s2获取的结果则是Hell。World!
Ⅱ输出:
向屏幕输出一个字符串可以使用printf语句或puts语句
(I)printf语句
格式: printf( "%s”,字符数组名);
(2) puts语句
格式:  puts(字符串名称) ;
说明: puts语句输出一个字符串和一个换行符。对于已经声明过的串,printf( “%s\n”,a) 和puts(a)是一样的。
⒋选择排序
⑴冒泡排序
⑵折半排序
二、应用
计算平均分,最高分,成绩排序与查找等学生成绩管理问题
例如:用筛法求出100以内的全部素数,并按每行五个数显示。
#incl ude<iostream>
#include<math. h>
#incl ude<iomanip>
using namespace std;
const int n=100;
int t;
bool a[n+1];
int main ()
{
    for (int i=O; i<=n; ++i)
a[i]=true;a[1]=false;
    for (int i=2; i=sqrt(n); ++i)
    if (a[i])
    for (int j=2; j<=n/i; ++j)
    a[i]=false;

数组相等问题处理:
方法1:逐个元素赋值b[0]=a[O];b[1]=a[1];b[2]=a[2] ;b[4]=a[4];
方法2:通过循环赋值int i;
for (i=0;i<5;i++)
{
    b[i]= a[i];
}
打印杨辉三角(二维数组)
1
1 1
1    2    1
1     3    3    1
1     4    6    4    1

int numbs[5][5];
for(i=0;i<5;i++){
numbs[i][]=1;
numbs[i][i]=1;
}
for(i=2;i<5;i++)
{
for(j=1;j<i;j++)
{
numbs[i][j]=numbs[i-1][j]+numbs[i-1][j-1];
}
}
for(i=0;i<5;i++)
{
for(j=0;j<=i;j++)
{
printf("%d\t",numbs[i][j]);
}
printf("\n");
}
三、学习心得
①实际解决问题中数组应用范围更广,尤其是处理大量相同类型的数据时,优势更为突出。
②在数组排序中方法是多样的,例如交换法,选择法,冒泡法,利用sort函数…但是这些排序算法的理解个人觉得由易到难的顺序会更好一点儿,更便于理解。但是这些都应掌握以便在处理不同问题时得到最优算法。
③数组的定义与初始化和之前学过的简单赋值运算对比分析比较,一边从不同角度理解数组。
④数组虽然解决问题范围相对较广,但是应用更为复杂,对于一些复杂的问题的处理借助于函数解决会更好,但是由于函数部分应用更为多变,所以在应用时应仔细些。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值