目录
一、一维数组认识与使用
1.4 数组的输入与输出
1.5 最大值与最小值的求解
二、一维数组的操作用法
2.1 数组的插入与删除
2.2 数组某个值的查找
2.3多个数组的合并
2.4多个数组的有序合并
三、一维数组的应用
3.1 斐波那契数列
3.2 淘淘摘苹果
3.3 翻纸牌游戏
3.4 判断数组元素是否存在某两个元素之和为 k。
一、一维数组认识与使用
数组的意思:数组相等于一排座椅,可以坐很多人。每个座椅的位置都不一样。
数组存数据,就相当座椅做了人。
1.1 定义数组: int b[10] // 意思是a数组最多可存10个整数。
1.2 数组赋值: int a[10]={1,2,3,4,5,6}; //还剩下的空间,默认补0。
1.3 数组的索引/下标:从0开始。
问a[0]值 ; a[2]值 ; a[4]值 ; a[6]值 ;
1.4 数组的输入与输出
输入很多个值存到数组里面,那需要在循环里面操作。
例如:1.先定义数组,在循环输入。
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n; // 输入n个数
int a[n+1];
for(int i=0;i<n;i++){
cin>>a[i]; // 数组的输入
}
cout<<endl;
for(int i=0;i<n;i++){
cout<<a[i]<<" "; // 数组的输出
}
return 0;
}
问,当输出的循环i不从0开始,改成i=1,那输出结果会怎么样?
炼1:请实现数组中所有元素的和,并且输出总和结果。
炼2:请实现数组中所有元素是偶数的和,并且输出总和结果。
炼3:请实现数组的倒序输出,例如输入 1 2 3 4; 输出 4 3 2 1。
/*
1. 定义一个长度为7的数组c,
2. 把7个数值存到数组c里面,
3. 统计数组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;
}
// 3.请倒序输出数组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.5 最大值与最小值的求解
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;
}
二、一维数组的操作用法
2.1 数组的插入与删除
#include<iostream>
using namespace std;
int main(){
//实现数组的插入操作
int a[6]={1,2,3,5,6};
for(int i=5;i>3;i--){ //循环为什么要倒序?
a[i]=a[i-1]; //让后面数组值往后挪了
}
// 插入4到索引3的位置{1,2,3,4,5,6}
a[3]=4;
//删除索引1的值
for(int i=1;i<5;i++){ //循环是正序?
a[i]=a[i+1]; //让后面数组值往前挪,覆盖掉前的值
}
// 输出
for(int i=0;i<5;i++){
cout<<a[i]<<" ";
}
return 0;
}
2.2 数组某个值的查找
1.在数组存了15个值。 需要先定义数组变量,再循环输入15个值。
2.输入一个值用变量a存储,循环里面逐个判断数组元素值跟a是否相等,是就输出该数组元素的索引位置!并循环结束。
#include<iostream>
using namespace std;
int main(){
int arr[15];
for(int i=0;i<15;i++){
cin>>arr[i];
}
int a;
cin>>a;
for(int i=0;i<15;i++){
if(a==arr[i]){
cout<<"索引位置:"<<i<<endl;
return 0;
}
}
return 0;
}
2.3多个数组的合并
将数组a[]和数组b[]合并到数组c[]。
#include <iostream>
using namespace std;
int main(){
int a[3] = {35, 72, 96};
int b[4] = {29, 33, 56, 87};
int c[7];//将数组a[]和数组b[]合并到数组c[]
int len=0;
for(int i=0;i<3;i++){
c[len]=a[i];
len++;
}
for(int j=0;j<4;j++){
c[len]=b[j];
len++;
}
for(int i=0;i<len;i++){
cout<<c[i]<<" ";
}
return 0;
}
2.4多个数组的有序合并
将有序的的数组a,b合并到c数组,并且c数组也是有序数组。
#include <iostream>
using namespace std;
int main(){
int a[3] = {1, 3, 5};
int b[4] = {4, 5, 6, 7};
int c[10];
int lena = 0, lenb = 0, lenc = 0;
// 因为 a, b 数组是有序的,所以最小的元素一定是数组最左边的数字,
// 所以我们只要比较当前 a, b 数组的头,选择小的放入 c 数组即可
while (lena < 3 && lenb < 4){
if (a[lena] < b[lenb]){
c[lenc] = a[lena];
lena++;
lenc++;
} else {
c[lenc] = b[lenb];
lenb++;
lenc++;
}
}
//接下来考虑一件事,必然有一个数组中的元素先被放完,
//那另外一个数组中剩下的元素我们只要依次放进 c 数组就可以了
cout<<"------"<<endl;
cout<<"a:"<<lena<<" b:"<<lenb<<" c:"<<lenc<<endl;
cout<<"------"<<endl;
while (lena < 3){
c[lenc] = a[lena];
lena++;
lenc++;
}
while (lenb < 4){
c[lenc] = b[lenb];
lenb++;
lenc++;
}
// 此时 c数组中的元素为
for(int i=0;i<lenc;i++){
cout<<c[i]<<" ";
}
return 0;
}
2.5查找数组元素有重复的值。
输入n个值存到数组里面,请找出数组元素有重复的值。
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
int a[n+1];
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]<<" ";
}
}
}
return 0;
}
三、一维数组的应用
3.1 斐波那契数列
斐波那契数列:第一项、第二项都是1,第3项为前两项的和,以此类推第4项就是 第2、3项的和。 1 1 2 3 5 8 13 21
#include<iostream>
using namespace std;
int main(){
int k;
cin>>k;
long long a[k+1];
for(int i=0;i<k;i++){
if(i<2){
a[i] = 1;
cout<<a[i]<<" ";
}
else{
a[i] = a[i-1] + a[i-2];
cout<<a[i]<<" ";
}
}
return 0;
}
3.2 淘淘摘苹果
#include<iostream>
using namespace std;
int main(){
int a[10];
int cnt=0;
for(int i=0;i<10;i++){
cin>>a[i];
}
int h;
cin>>h;
for(int i=0;i<10;i++){
if(h+30>=a[i]){
cnt++;
}
}
cout<<cnt;
return 0;
}
3.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;
cin>>n;
int a[10000];
for(int i=1;i<=n;i++){
a[i]=1; //初始 牌朝上为 1
}
for(int i=1;i<=n;i++){ //遍历所有牌
for(int j=i;j<=n;j++){ //第几张牌进行判断
if(j%i==0){//倍数判断
a[j] *= -1;
}
}
}
for(int i=1;i<=n;i++){
if(a[i]==-1){ //对朝下的牌进行输出
cout<<i<<" ";
}
}
return 0;
}
3.4 判断数组元素是否存在某两个元素之和为 k。
- 1. 判断 第一个元素+第二个元素==K?,没有就 第一个元素+ 第3、5、6个元素到最后一个。
- 2. 完了之后,判断 第二个跟后面元素相加再比较,以此类推 第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; }