L1 第9次课 数组进阶
课堂回顾
数组
数组就是一组数据,是由一组具有相同数据类型的变量组成的。
数组中元素的本质是变量。
数组的定义和初始化
数组元素下标
数组中的元素是有顺序的,每个元素都有对应的下标。
数组下标是一个整数,范围是[0,长度-1]
语法格式:数组名[下标];
下标也可以是变量或者表达式
数组易错点
设置数组长度:
建议使用大于0的整数,不建议使用变量或变量表达式。
数组下标越界:
访问数组时,下标的取值要在已定义好的数组下标范围内。
遍历数组元素
练一练
数组中插入元素
现有长度为7的数组,数组中已存储6个数据。编写程序:在下标为3的位置插入数据105,输出插入后数组中的元素。
数组指定位置插入元素的步骤
实现数组指定位置插入元素
从最后一个元素开始移动的原因
实现数组指定位置插入元素
#include <iostream>
using namespace std;int main(){//定义数组a进行初始化int a[7]={100,80,120,93,134,99};//使用for循环,将下标5~3的数组元素依次向后移动一位for(int i=5;i>=3;i--){a[i+1]=a[i];}//将要插入的数据保存到指定位置a[3]=105;//输出查看数组中所有元素for(int i=0;i<=6;i++){cout<<a[i]<<" ";}return 0;
}
#include <iostream>
using namespace std;int main(){//创建长度为10的数组a,进行初始化int a[10]={100,80,120,93,134,99,65,105,124};//使用for循环,将下标8~2的数组元素依次向后移动一位for(int i=8;i>=2;i--){a[i+1]=a[i];}//将要插入的数据保存到指定位置a[2]=90;//输出查看数组中所有元素for(int i=0;i<=9;i++){cout<<a[i]<<" ";}return 0;
}
删除数组中的元素
删除数组指定位置元素的步骤
#include <iostream>
using namespace std;
int main(){//定义数组a进行初始化int a[7]={100,80,120,105,93,134,99};//使用for循环将下标从3~6的元素依次前移一位for(int i=3;i<=6;i++){a[i-1]=a[i];}//输出数组中的元素for(int i=0;i<=5;i++){cout<<a[i]<<" ";}return 0;
}
const关键字
定义常量的同时需要进行赋值!
常量表示数组长度
常量的好处
课堂训练
3509 中间同学的身高
描述
根据学生学号顺序(学号从1开始),输入 n 名学生的身高(身高无重复),找出其中最高和最矮的同学。按照键盘输入顺序,输出最高与最矮同学之间的所有学生的学号与身高。
【说明】
1)身高最高和最矮的同学不相邻
2)身高最高同学排在最矮同学的前面
输入描述
一行一个正整数 n,代表学生人数。
一行 n 个正整数,代表学生身高,数字之间使用空格分隔。
输出描述
多行,每行两个正整数,分别代表学生学号和其对应的身高,数值之间使用空格分隔。
样例输入 1
8 112 116 160 154 144 111 159 137
样例输出 1
4 154 5 144
提示
5≤n≤100,110≤身高≤200
中间同学的身高
//#include<bits/stdc++.h>//万能头文件
//using namespace std;
//int main(){
// int n,a[105]={};//创建数组,尽可能放大一点,避免数组越界
//
// cin>>n;
// for(int i=1;i<=n;i++){//输入数组数据
// cin>>a[i];
//
// }
// int maxi=1,mini=1;//定义最大值、最小值的下标
// for(int i=1;i<=n;i++){
// if(a[maxi]<a[i]){//找最大值
// maxi=i;
// }
// }
// for(int i=1;i<=n;i++){
// if(a[mini]>a[i]){//找最小值
// mini=i;
// }
//
// }
// for(int i=maxi+1;i<mini;i++){//输出最大和最小值之间的所有元素
// cout<<i<<" "<<a[i]<<endl;
//
// }
//
// return 0;
//}
//中间同学的身高
#include<bits/stdc++.h>//万能头文件
using namespace std;
int main(){int n,a[105]={};//创建数组,尽可能放大一点,避免数组越界cin>>n;int maxi=1,mini=1;//定义最大值、最小值的下标for(int i=1;i<=n;i++){cin>>a[i];//输入元素if(a[maxi]<a[i]){//找最大值maxi=i;}if(a[mini]>a[i]){//找最小值mini=i;}}for(int i=maxi+1;i<mini;i++){//输出最大和最小值之间的所有元素cout<<i<<" "<<a[i]<<endl;}return 0;
}
3510 找出谁是第二高
描述
根据学生学号顺序(学号从1开始),输入n名学生的身高(身高无重复),找出其中身高第二高的同学。输出身高第二高的学生身高以及他的学号。
输入描述
一行一个正整数 n,代表学生人数。
一行 n 个正整数,代表学生身高h,数字之间使用空格分隔。
输出描述
一行两个正整数,代表第二高同学的学号,以及他的身高。内容之间使用空格间隔。
样例输入 1
8 110 116 144 134 160 105 159 137
样例输出 1
7 159
提示
5≤n≤100,110≤h≤200
//找第二大的数
#include<bits/stdc++.h>//万能头文件
using namespace std;
int main(){int n,a[105]={};//创建数组,尽可能放大一点,避免数组越界cin>>n;int maxi=1,mini=1;//定义最大值、最小值的下标for(int i=1;i<=n;i++){cin>>a[i];//输入元素if(a[maxi]<a[i]){//找最大值maxi=i;}}a[maxi]=1;for(int i=1;i<=n;i++){cin>>a[i];//输入元素if(a[maxi]<a[i]){//找最大值maxi=i;}}
cout<<maxi<<" "<<a[maxi];return 0;
}
#include <iostream>
using namespace std;int main(){//接收输入的学生人数int n;cin>>n;//第一轮找出身高最高的同学,他的身高及学号int h[101]={};int maxi=1;for(int i=1;i<=n;i++){cin>>h[i];if(h[maxi]<h[i])maxi=i;}//第二轮找到第二高的同学,他的身高及学号int twoi=1;for(int i=1;i<=n;i++){if(i==maxi) continue;if(h[twoi]<h[i])twoi=i;}//输出cout<<twoi<<" "<<h[twoi];return 0;
}
3511 分数查询程序
描述
某次考试成绩出来以后,考生想知道自己成绩排名情况,同分数采用并列排名占用名次的规则。
请编写一个分数查询程序,考生输入分数,即可知道自己的排名及同分数的人有多少。
输入描述
第一行,一个正整数 n,表示考生人数。
第二行,n 个正整数,表示每位考生分数,分数之间使用空格分隔。
第三行,一个正整数 x,表示考生要查询的分数。
输出描述
两个正整数,分别代表他的排名、与他同分的人数,中间用空格隔开。
样例输入 1
10 88 99 98 97 92 100 82 99 78 99 99
样例输出 1
2 3
提示
1≤n≤100,1≤分数≤100,1≤x≤100
#include <iostream>
using namespace std;
int main(){//接收考生人数int n;cin>>n;//保存每名考生的分数int s[100]={};for(int i=0;i<n;i++)cin>>s[i];//接收输入的要查询的分数int x;cin>>x;int h=1;//假设x是第一名int cnt=0;//保存同分数人数for(int i=0;i<n;i++){if(s[i]>x)h++;if(s[i]==x)cnt++;}//输出名次和同分数的人cout<<h<<" "<<cnt;return 0;
}
3512 最大的字符
描述
编写程序:输入 n 个大小写字母(输入字母无重复),找出其中ASCII码最大的字母,在该字母前插入字符’0’作为标志。输出插入操作后数组中所有的字符。
输入描述
一行一个正整数 n,代表大小写字母的个数。
一行 n 个大小写字母,字母之间使用一个空格分隔。
输出描述
一行 n+1 个字符,插入操作后数组中所有的字符,字符之间使用空格分隔。
样例输入 1
10 d b S C n e Q L a R
样例输出 1
d b S C 0 n e Q L a R
提示
1≤n≤52
#include <iostream>
using namespace std;
int main(){//输入字符数量int n;cin>>n;//循环输入大小写字母,并找出其中最大的字符char c[53]={0};int maxi=0;for(int i=0;i<n;i++){cin>>c[i];if(c[maxi]<c[i])maxi=i;}//在最大字符前插入字符0for(int i=n-1;i>=maxi;i--){c[i+1]=c[i];}c[maxi]='0';//输出插入操作后数组中所有的字符for(int i=0;i<=n;i++){cout<<c[i]<<" ";}return 0;
}
3513 淘汰赛
描述
业余滑冰社团举办滑冰比赛,有 n 名选手参赛,编号为 1∼n。比赛中需要淘汰得分最低的选手。请编写程序:输入 n 名选手的得分(每个人得分不同),找出其中的最低分,将其删除。按照输入顺序,输出其余选手分数。
输入描述
一行一个正整数 n,代表参赛选手人数。
一行 n 个整数,代表每名选手得分,分数之间使用空格分隔。
输出描述
一行 n−1 个整数,代表剩余选手的分数,分数之间使用空格分隔。
样例输入 1
10 99 80 44 78 86 82 96 60 73 58
样例输出 1
99 80 78 86 82 96 60 73 58
提示
5≤n≤50,0≤分数≤100
#include <iostream>
using namespace std;
int main(){//输入选手人数int n;cin>>n;//循环输入每名选手分数,并寻找最低分和它的下标int a[51]={0};int mini=1;for(int i=1;i<=n;i++){cin>>a[i];if(a[mini]>a[i])mini=i;}//删除最低分for(int i=mini+1;i<=n;i++)a[i-1]=a[i];//输出剩余选手分数for(int i=1;i<=n-1;i++)cout<<a[i]<<" ";return 0;
}
3129 邮件分类
描述
我国的邮政编码采用四级六位数编码结构。前两位数字表示省/直辖市/自治区;第三位数字表示邮区,第四位数字表示县(市),最后两位数字表示投递局。例如北京的邮政编码的前两位数字为10,上海为20,天津为30。 童童有来自北京、上海、天津三个城市的朋友写来的n封信件,现将这些信件按北京、上海、天津的顺序分类输出,相同城市的信件按原序输出。
输入描述
共两行,第一行有一个整数n(0≤n≤10000),表示信件的数量;第二行是n封信件的邮政编码,数与数之间以空格隔开。
输出描述
Beijing
北京地区的信件邮政编码,以空格隔开,如果没有则空着;
Shanghai
上海地区的信件邮政编码,以空格隔开,如果没有则空着;
Tianjin
天津地区的信件邮政编码,以空格隔开,如果没有则空着;
样例输入 1
4 101400 200030 102100 101300
样例输出 1
Beijing 101400 102100 101300 Shanghai 200030 Tianjin
样例输入 2
6 300017 201100 201200 101404 100031 100034
样例输出 2
Beijing 101404 100031 100034 Shanghai 201100 201200 Tianjin 300017
#include <iostream>
using namespace std;int main(){// 创建三个数组用于存储北京,上海,天津的邮件const int N = 10000;int a[N] = {};int b[N] = {};int c[N] = {};int n;cin>>n;// 邮政编码,六位数int x;int a_cnt=0,b_cnt=0,c_cnt=0;//循环接收,并判断是哪个城市的邮件for(int i=0;i<n;i++){cin>>x;switch (x/10000) {case 10:a[a_cnt]=x;a_cnt++;break;case 20:b[b_cnt]=x;b_cnt++;break;case 30:c[c_cnt]=x;c_cnt++;break;}}//输出cout<<"Beijing"<<endl;for(int i=0;i<a_cnt;i++){cout<<a[i]<<" ";}cout<<endl<<"Shanghai"<<endl;for(int i=0;i<b_cnt;i++){cout<<b[i]<<" ";}cout<<endl<<"Tianjin"<<endl;for(int i=0;i<c_cnt;i++){cout<<c[i]<<" ";}return 0;
}
课后作业
3130 童程好声音
描述
童程学院举办"好声音选拔赛",有n名学生报名参赛,编号为1~n。已知每名学生的最终得分(每名学生最终得分不同)。请编写程序:输入n名学生的最终得分,输出最高分与最低分,以及获得最高分和最低分同学的编号。
输入描述
一行一个正整数n,代表学生人数 (5≤n≤100);
一行n个整数,代表每名学生的最终得分,分数之间使用一个空格分隔(0≤分数≤100)。
输出描述
一行两个整数,代表最高分数,以及该同学对应的编号;
一行两个整数,代表最低分数,以及该同学对应的编号。
样例输入 1
10 98 90 88 87 79 92 91 83 77 68
样例输出 1
98 1 68 10
#include <iostream>
using namespace std;
int main() {//童程好声音int n;cin >> n;int s[101] = {0};for (int i = 1; i <= n; i++) {cin >> s[i];}int max = s[1], maxi = 1;int min = s[1], mini = 1;for (int i = 2; i <= n; i++) {if (s[i] > max) {max = s[i];maxi = i;}if (s[i] < min) {min = s[i];mini = i;}}cout << max << ' ' << maxi << endl;cout << min << ' ' << mini;return 0;
}