基本知识:
第1课、一维数组的定义
1.数组就是一组相同类型的变量。他们往往都是为了表示同一批对象的统一属性,如一个班级所有同学的身高,全球所有国家的人口数等。
2.数组可以是一维的,也可以是二维或者多维的.
3.在数学中可以用hi表示第i个同学的身高,i为编号,在c++中,使用一维数组时,一般是从0开始编号。,h[i]就表示第i+1个同学的身高,i称为下标变量。
4.读入50个同学的身高,语句就可以这样写:
for(i=0;i<=49;i++) cin>>h[i];
5.数组经常应用在大批量、同一类型的数据处理任务中。
6.定义一维数组的格式如下:
类型标识符 数组名[常量表达式];
7.其中类型标识符可以是任何基本数据类型,也可以是结构体等构造类型,相同类型的数组可以一起定义.数组名必须是合法的标识符,常量表达式的值即为数组元素的个数。
8.注意:int h[50] 就表示定义一个一维数组h共有50个元素,它们的编号从0开始到49,每个元素都是int类型。
9.还有几种特殊的定义:
int d[50],g[100];
int a[5*10];
#define N 50int b[N]
10.假设要储存10000个人的中考成绩和性别,可以定义两个数组:
int score[10000];//或者float score [10000];
bool xb[10000];//或者char xb[10000];
11.数组定义好后,就可以引用数组中的任意一个元素,引用格式为数组名[下标],如h[5]、h[i*2+1]等.其中下标只能为整型常量或者整形表达式,值必须在数组定义的下标范围内,否则会出现下标越界错误。
12.需要注意的是不能一次引用整个数组,只能逐个引用数组的单个元素。
13.数组名本身就是其首地址。
14.数组大小必须是值为正的常量,不能是变量,一旦定义不能改变大小。
15.数组定义后的初值仍然是随机数。
16.一般需要我们自己来初始化。
17.下标为0~n-1,不能越界。
18.i不是整形自动取整,下标既可能是常量,以可能是常量表达式。
19.定义数组元素一般要定义大一点,一般定义在函数以外。
第2课、一维数组的输入与输出
1.批量数据一次性输入到一维数组中,一般有以下两种方法:
(1)键盘读入
int h[100]
for(i=0; i<100; i++) cin>> h[i];
(2)直接赋值
int h[100],a[20];
for (i=0; i<100; i++) h[i]=0;
for(i=0; i<20; i++) a[i]=i*2+1;
2.C++里还提供了两个函数给数组整体赋值:
(1)memset函数
memset函数是给数组按字节进行赋值,一般用在char型数组中,如果是int类型的数组,一般赋值为0和-1,使用前需要包含头文件#include <cstring>.
例如memset(h,0,sizeof(h))就是将h数组所有元素均赋值为0。
(2)fill函数
fill函数是给数组按元素进行赋值,可以是整个数组,也可以是部分连续元素,可以赋任何值,使用前需要包含头文件#include<algorithm>,例如fill(a,a+10,5)就是将a数组的前10个元素赋值为5。
3.C++还支持在定义数组的同时,给所有或者部分元素赋值。
4.
第3课一维数组的插入删除
1.在实际应用中经常需要在数组中插入一个元素,或者删除数组中的某一个元素,称为数组的插入操作或者删除操作
2.插入一个元素需要先找到插入的位置,假设下标为x,将这个元素及其之后的所有元素依次往后移一位,注意要从后往前进行操作,再将给定的元素插入,到位置x删除某一个元素,也需要先找到删除的位置,将下标为x+1及其之后的所有元素依次向前移一位,覆盖原来位置上的元素。
3.插入或者删除一个区间,连续若干个数,只要重复以上单个元素的操作即可,另外插入操作需要注意把数组下标定义的足够大。
举例:
问题描述:有n个人在一个水龙头前排队准备接水,现在第n个人有特殊情况,经过协商大家允许他插队到第x位置,输入第n个人插队后的排队情况。
输入格式:第1行一个正整数n表示有n个人,第2行包括n个正整数,之间用一个空格隔开,表示排在队伍中的第一到第n个人的编号,第3行包含一个正整数x表示第n个人插队的位置。
第4课、一维数组的查找统计
1.一维数组的查找操作就是在一维数组中查找有没有某个元素,它的值等于指定的值x,查找操作的结果可能是一个没找到,找到一个或者找到很多个,常见的查找算法,有顺序查找和二分查找,顺序查找就是按照从前往后的顺序,将数组中的元素依次与要查找的数x进行比较。如果数组中的元素是有序的,也可以采用二分查找,二分查找又称为折半查找,其优点是比较次数少,查找速度快。
2.
第5课、一维数组的元素排序
1.排序就是按照某个关键字的大小,将若干对象从小到大或者从大到小进行重新排列,关键字是对象的某一属性,它可以是任何基本数据类型。
2.而且它可以将所有单词按照字典序倒过来排序,就是降序排列,关键字的类型就是字符串。
3.本课学习其中最基本的三种,选择排序,冒泡排序和插入排序,它们本质上都是通过数组中的元素比较和交换来实现的,所以关键是数组下标的分析。
4.举例:给出n个同学的身高,请根据他们的身高升序排列并输出排序结果。
(1)选择排序
选择排序的基本思想是每一趟从待排序的数据中,通过打擂台比较选出最小的元素放在这些数据的最前面,这样第1趟把n个元素中最小的一个放在第1个位置,第2趟把剩余的n-1个数中,最小的放在第2个位置,通过这样子排序。
(2)
冒泡排序的基本思想是从第1个数开始依次不断比较相邻的两个元素,如果逆序就交换,这样一趟排序结束最后最大的元素就放在了第n个位置了。
(3)插入排序
插入排序的基本思想是把所有带排序元素分成前后两段,前一段是已经排好序的,后一段是带排序的,每一趟都是把后一段的第1个数插入到前一段的某一个位置,保证前一段仍然是有序的。
第6课、一维数组的应用举例
1.新方法:桶排序
举例:某商场的仓库中有n件商品,每件商品的价格在0~1000之间,现在商场经理要求将这n件商品按价格由高到低排序。请编程输出n件商品排序后的情况。
5.有时我们也可以用穷举法和筛选法的方法来进行操作。
第7课、二维数组的定义和操作
1.:一维数组的元素可以是任何基本数据类型,也可以是结构体,如果一维数组的每一个元素又是一个一维数组,则称这种数组为二维数组。
2.定义二维数组的一般格式为
类型标识符 数组名[常量表达式1][常量表达式2];
3.常量表达式一的值表示第一维大小,常量表达式二的值表示第二维大小,常量表达式一和常量表达式2的乘积就是二维数组的元素个数。
4.二维数组整体不可用。
5.在二维数组定义的同时可以进行初始化赋值,也可以给数组中的部分元素初始化。
第8课、二维数组应用举例
1.举例
输入正整数n,输出杨辉三角形的前n行。
采用了递推法,逐行逐列给每个数组元素赋值。
第10课、字符数组
1.如果数组中的每个元素都是一个字符,这样的数组称为字符数组,有时把一维字符数组又称为字符串,定义字符数组的方法与定义其他类型数组的方法类似。
2.字符串的末尾都会有一个空字符\0
3.
4.数字数组可以存一串数字,一个字符数组只能存一段文字,多串能用多个字符,或者二维数组。
5.注意上图整个数组和逐个数组,不带下标,整体字符一串文字,带下标一个。
6.用sscanf,cin输入要求:空格作为间隔符不作为内容。
7.用gets还有getchar,可以输入带空格的文字。
8.需要注意的是,再用scanf的%s格式或者gets读入字符串时,会在字符串末尾自动添加一个空字符\0,而使用getchar等方法读入字符串时,则需要在字符串后手工加。
9.数字和字符混输时可能会出错。
10.有关字符数组的输入方式总结如下:gets函数用来输入一行字符串,仅以回车键结束输入,gets没有限制读取的字符串长度,如果输入的字符串太长,可能会导致堆栈溢出,scanf函数用来读取一个字符串时,字符串中不能出现空格,因为scanf是以空格符,回车符,Tab符结束一次输入,但需要输入输出大量数据的时候,尽量不要用scanf,因为效率很低容易超时而getchar是非常高效的,所以实际使用时能用scanf getchar就别用gets。
重点注意:
1.数组名本身就是其首地址。
2.数组大小必须是值为正的常量,不能是变量。
3.一旦定义,不能改变大小。
4.数组定义后的初值仍然是随机数。
5.一般需要我们来初始化。
6.下标0~n-1不能越界。
7.i不是整形自动取整,下标既可能是常量,也可能是常量表达式。
8.定义数组元素一般要定义大一点,一般定义在函数以外。
9.二分查找只能适用于递增或递减,从中点找。
10.局部统计要在统计开始之前赋值,在一开始赋值是不可以的,全局统计可以在定义变量时赋初值。
11.当数据量大,但数据取值范围很小的时候,可以用桶排序。
12.二维数组也是从0开始算起。
13.数字和字符混输时可能会出错。
14.数字数组可以存一串数字,一个字符数组只能存一段文字,多串能用多个字符或者二维数组。
15..有关字符数组的输入方式总结如下:gets函数用来输入一行字符串,仅以回车键结束输入,gets没有限制读取的字符串长度,如果输入的字符串太长,可能会导致堆栈溢出,scanf函数用来读取一个字符串时,字符串中不能出现空格,因为scanf是以空格符,回车符,Tab符结束一次输入,但需要输入输出大量数据的时候,尽量不要用scanf,因为效率很低容易超时而getchar是非常高效的,所以实际使用时能用scanf getchar就别用gets。
我的心得:
在这一段学习过程中,我感觉到了c++的难度,也发现了在算法中的灵活性,我们应该改变在数学中固有的计算方法,寻求新的解决问题的途径。这一段学习的过程让我更加能够深有体会,就是要在整体上把握c++的课程,也让我认识到了前面某些部分上学习的不足。当我们在寻求一些新的算法的时候,我们会学到很多东西,而这些新的东西能够扩展到更加广阔的方面,从而让我学到更多。我希望我能够在c++的困难面前积极判断,积极解决,把难关攻克。
来源:CSDN
作者:李Rachel
链接:https://blog.csdn.net/weixin_45795490/article/details/103684823