文章目录
1、一维数组初认识
数组的意思:数组相等于一排座椅,可以坐很多人。每个座椅的位置都不一样。
数组存数据,就相当座椅做了人。
数组的定义:
数据类型 数组名[长度];
int a[3]; // 有三个空间,存三个整数
float b[100]; //有100个空间,存100个浮点数
数组的初始化:
int a[5]={1,2}; //有5个空间,但只存两个数,其余计算机会自动补0
int b[] ={1,3,50}; //不定义长度,计算机通过存的个数来定
输出数组值:cout<<a[索引];
#include <iostream>
using namespace std;
int main() {
int a[10]={1,2,3,4,1100,6};
// 索引从0开始,0代表数组第一个元素
cout<<a[0]<<" "; // 输出1
cout<<a[2]<<" "; // 输出3
cout<<a[4]<<" "; // 输出1100
return 0;
}
输入数值值:cin>>a[索引];
数组可以存很多个值,那怎么输出全部与输入全部值?
循环解决
#include<iostream>
using namespace std;
int main(){
//输入全部值?
int a[5];
for(int i=0;i<5;i++){
cout<<"输入:";
cin>>a[i];
}
//输出全部值?
for(int i=0;i<5;i++){
cout<<a[i]<<" ";
}
return 0;
}
2、一维数组计算:求和、平均、极差
求总和
- 定义一个长度为7的数组c,
- 把7个数值存到数组c里面,
- 统计数组c所有元素的偶数和 。
#include<iostream>
using namespace std;
int main(){
int c[7];
for(int i=0;i<7;i++){
cin>>c[i];
}
int sum=0;
for(int i=0;i<7;i++){
if(c[i]%2==0){
sum += c[i];
}
}
cout<<"数组偶数和:"<<sum;
return 0;
}
请倒序输出数组 a。
#include<iostream>
using namespace std;
int main(){
float a[10] = {3.14,77.88,66.88,3,9,5,22.5};
// 倒序1
for(int i=6;i>=0;i--){
cout<<a[i]<<" ";
}
cout<<endl;
// 倒序2
for(int i=0;i<7;i++){
cout<<a[6-i]<<" ";
}
return 0;
}
最大值与最小值
1.定义一个长度为10的数组a并赋值;
2.求数组元素最大值与最小值,求极差(最大值-最小值)。
#include<iostream>
using namespace std;
int main(){
float a[10] = {3.14,77.88,66.88,3,9,5,22.5};
float max,min;
for(int i=0;i<7;i++){
//判断最大最小值
if(i==0){ //假设第一个元素为最大值
max = a[i];
min = a[i];
}
else{ // 从第二、三个..第n个比较大小
if(max<a[i]){ // 如果第一个元素小于后面数组元素
max=a[i]; // 进行交换元素,保证 max为最大值
}
if(min>a[i]){
min=a[i];
}
}
}
cout<<"最大值:"<<max<<endl;
cout<<"最小值:"<<min<<endl;
cout<<"极差:"<<max-min<<endl; // 极差
return 0;
}
3、一维数组的增删改查
查找值
输入一个值,判断数组a是否有这个值,
输出这个值的位置。
#include<iostream>
using namespace std;
int main(){
int a[10]={9,5,1,7,8,2,3};
int n;
cout<<"查找n:";
cin>>n;
bool flag=0; // 没找到,状态为0
for(int i=0;i<7;i++){
if(n==a[i]){ // n等于数组元素
flag=1; // 找到,状态为1
cout<<"第"<<i+1<<"个位置";
return 0;
}
}
if(flag==0){ // 如果状态0
cout<<"没有找到";
}
return 0;
}
在数组中插入一个元素。
- 将我们准备插入的位置给空出来,将所有元素往后移动一位
- 将元素插入到空出来的位置中去
#include<iostream>
using namespace std;
int main(){
int a[6]={1,2,4,5}; //插入3,a[2]
for(int i=4;i>2;i--){ //使数组值往后移一位
a[i] = a[i-1];
}
a[2] = 3; //插入3
for(int i=0;i<5;i++){ //输出数组值
cout<<a[i]<<" ";
}
return 0;
}
删除数组的某一个元素
确定准备删除的位置,将位置之后的所有元素往前移动一位,覆盖掉前面的元素。
#include<iostream>
using namespace std;
int main(){
int a[6]={1,2,3,4,5}; //删除2
for(int i=1;i<4;i++){ //删除操作
a[i]=a[i+1];
}
for(int i=0;i<4;i++){ //输出结果
cout<<a[i]<<" ";
}
return 0;
}
拼接两个数组,使之成为一个新的数组
#include<iostream>
using namespace std;
int main(){
//简单版合并
int a[3]={1,2,3};
int b[4] = {3,4,5,6};
// 合并成数组c
int c[7],len=0;
for(int i=0;i<3;i++){ // 把数组a存到c去
c[len]=a[i];
len++;
} // len=3
for(int i=0;i<4;i++){ // 把数组b存到c去
c[len]=b[i];
len++;
}
for(int i=0;i<len;i++){
cout<<c[i]<<" ";
}
}
4、合并数组:控制长度
合并两个有序的数组,使之成为一个新的有序数组。
重复比较 a b 数组的元素存到数组c,直到其中一个数组的所有元素比完。
还剩下个别元素,就依次存进数组c。
#include<iostream>
using namespace std;
int main(){
int a[3] = {35, 72, 96};
int b[4] = {29, 33, 56, 87};
int c[7]; // {29,33,35,56,72,87}
int lena=0,lenb=0,lenc=0;
while(lena<3 && lenb<4){ // 循环直到 a或b数组已经存给c
if(a[lena]<b[lenb]){ //判断哪个数组小
c[lenc] = a[lena]; // 把小的赋给c
lenc++; // 每次循环次数+1
lena++;
}
else{
c[lenc++]=b[lenb++];
}
}
// 上面循环完毕,还剩下a数组的96还没存,lena是1
while(lena<3){
c[lenc++]=a[lena++];
}
while(lenb<4){
c[lenc++]=b[lenb++];
}
// 输出值
for(int i=0;i<7;i++){
cout<<c[i]<<" ";
}
return 0;
}
五、应用题
5.1 斐波那契数列
斐波那契数列:第一项、第二项都是1,第3项为前两项的和,以此类推第4项就是 第2、3项的和。 1 1 2 3 5 8 13 21
#include<iostream>
using namespace std;
int main(){
int n;
cout<<"项数:";
cin>>n;
int a[n];
for(int i=0;i<n;i++){
if(i==0 || i==1){
a[i] = 1;
}
else{
a[i] = a[i-1]+a[i-2];
}
cout<<"第"<<i+1<<"项值:"<<a[i]<<endl;
}
return 0;
}
5.2 找重复值
找重复值,例如:[9,1,3,4,5,6,1,8] 数组元素有两个1,代表1是重复的。那我们怎么找到重复的值?
- 从数组第一值 跟后面的值比较。例如 9 跟[1,3,4,5,6,1,8] 比,有无相等;没有就从 1 跟[3,4,5,6,1,8] 比,有相等就输出结果程序结束。
- 以此类推直到 1 跟 [8] 比,比完就循环结束。
#include<iostream>
using namespace std;
int main(){
// 数组里面找重复的值。
int n;
cout<<"n个数:";
cin>>n;
int a[n]; // 多少人存在数组里面
for(int i=0;i<n;i++){ //存数值
cin>>a[i];
}
//解决:第一个元素 与第二、三...最后元素判断比较
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(a[i]==a[j]){
cout<<"重复的值是:"<<a[j]<<endl;
cout<<"在第"<<j+1<<"个位置";
return 0;
}
}
}
return 0;
}
5.3 翻纸牌游戏
五年级一班全体学生做一个游戏,有 nn 张纸牌,每张纸牌上分别标注着 1、2、3、4…n个数字,初始时纸牌数字面朝上。全班同学先将 1的倍数的纸牌翻过来,然后再将 2 的倍数的纸牌再翻过来,一直翻到 n 的倍数的纸牌。统计翻到最后数字面向下的纸牌分别是哪些?
例如,有 1、2、3 张纸牌,开始时纸牌数字面朝上,第一次翻转 1 的倍数,将所有序号为 1 的倍数的纸牌翻转;第二次翻转 2 的倍数,将所有序号是 2 的倍数的纸牌再翻转;第三次翻转 3 的倍数,将所有序号是 3 的倍数纸牌再翻转,翻牌到此结束。最后数字面向下的纸牌是序号为 1 的那张。
输入格式
输入第一行输入数字为 n,表示有 n 张纸牌。
#include <iostream>
using namespace std;
int main() {
int n;
cout<<"n张纸牌 :";
cin >> n; // n张纸牌
int a[1000];
for(int i = 1; i <= n; i++) {
a[i] = 1; // 朝上
}
for(int i=1;i<=n;i++){ //i代表倍数
for(int j=1; j*i<=n; j++){ // j代表第几张牌
a[i*j] *= -1 ;
}
}
//输出:是反面的纸牌
for(int i=1;i<=n;i++){
if(a[i] == -1)
cout<<i<<" ";
}
return 0;
}
5.4 判断数组元素是否存在某两个元素之和为 k。
- 判断 第一个元素+第二个元素==K?,没有就 第一个元素+ 第3、5、6个元素到最后一个。
- 完了之后,判断 第二个跟后面元素相加再比较,以此类推 第3个元素跟后面比,直到最后一个元素停止。
#include<iostream>
using namespace std;
int main(){
// 数组里面找重复的值。
int n;
cout<<"n个数:";
cin>>n;
int a[n]; // 多少人存在数组里面
for(int i=0;i<n;i++){ //存数值
cin>>a[i];
}
//解决:第一个元素 与第二、三...最后元素判断比较
int k;
cout<<"k值:";
cin>>k;
for(int i=0;i<n;i++){ // i 第一个元素
for(int j=i+1;j<n;j++){ // j跟i相加
if(a[i]+a[j]==k){
cout<<a[i]<<"+"<<a[j]<<"="<<k<<endl;
}
}
}
return 0;
}