目录
数组 | 04
程序 = 逻辑 + 数据,数组是存储数据的强而有力的手段.
数组的定义
数组的定义非常简单,就是一个变量后面加上一个[]
,中括号中写上数组长度.
int a[100],b[10]; // int数组
float c[11];
double d[13];
char e[14]; // 字符数组,本质上就是字符串
string g[25]; //字符串数组
数组的初始化
一般的数组初始化尝试如下,定义的时候进行初始化,后面加上一个大括号.
int a[3] = {0,1,3}; // 长度为3的数组,给了3个值
int a[5] = {0,1,3}; // 定义了一个长度为5的数组,给了3个值,后面两个没有给值得默认为0
int a[] = {0,1,3}; // 不指定数组长度,给3个值,则数组长度为3
常用技巧,定义一个初始都为0的数组,需要进行初始化,在函数内部数组未初始化,里面的值是随机值. 而在函数外的数组,也就是全局数组,默认都是0,可以不进行初始化.
int b[100]; // 全局数组,默认都为0
int main(){
int a[100] = {0}; // 定义一个初值都为0的数组
int b[100] = {1}; // 定义一个初值都为1的数组
}
还有一个知识点: 在函数内开的数组都是存放在栈空间的,一般默认就是1M,也就是说不能在函数内开很大的数组,否则就容易爆栈. 在函数外的数组是存放在堆中,这个就没有内存限制,上限取决于计算机的内存大小.
细节补充
常量声明const
, 声明了const
的变量就不能在被重新赋值,否则会报错
memset(数组,初始化数值,数组长度)
,这个是在#include<cstring>
中的, 需要注意是最后的一个参数是以字节B为单位的,如果是int
需要乘4,double
和long long
需要乘8.
需要注意的, 这个memset
一般是用来赋值0, 还有一个情况就是-1,这个是需要记住的.
然后数组的字节数量也不需要自己计算,可以使用运算符sizeof
,不用括号的
memset(a,-1,sizeof a)
还有一点就是效率的问题,memeset
给数组赋初值比循环赋值要快很多.
还有就是数组和复制函数memcpy(目标数组,源数组,sizeof xxx)
两个数组常用的函数就是memset
和memcpy
习题四
数组替换
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
int x[10];
for(int i=0;i<10;i++) cin >> x[i];
for(int i=0;i<10;i++){
if(x[i]<=0){
x[i] = 1;
}
printf("X[%d] = %d
",i,x[i]);
}
return 0;
}
数组填充
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int x;
cin >> x;
int a[10];
a[0] = x;
for(int i=1;i<10;i++){
a[i] = a[i-1]*2;
}
for(int i=0;i<10;i++){
printf("N[%d] = %d
",i,a[i]);
}
return 0;
}
数组选择
#include<cstdio>
#include<iostream>
using namespace std;
int main(){
double a[100];
for(int i=0;i<100;i++){
scanf("%lf",&a[i]);
if(a[i]<=10){
printf("A[%d] = %.1lf
",i,a[i]);
}
}
return 0;
}
数组中的行
#include<iostream>
using namespace std;
double M[12+10][12+10];
int main(){
int n;
char c;
cin >> n >> c;
for(int i=0;i<12;i++){
for(int j=0;j<12;j++){
cin >> M[i][j];
}
}
double res=0;
for(int i=0;i<12;i++)res+=M[n][i];
if(c=='M'){
printf("%.1lf",res/12);
}else{
printf("%.1lf",res);
}
return 0;
}
数组的右上半部分
#include<iostream>
using namespace std;
double M[12+10][12+10];
int main(){
char c;
cin >> c;
for(int i=0;i<12;i++)
for(int j=0;j<12;j++)
cin >> M[i][j];
double res = 0;
int cnt=0;
for(int i=0;i<12;i++)
for(int j=i+1;j<12;j++)
res += M[i][j],cnt++;
if(c=='M')printf("%.1lf",res/cnt);
else printf("%.1lf",res);
return 0;
}
数组的左上半部分
#include<iostream>
using namespace std;
double M[12+10][12+10];
int main(){
char c;
cin >> c;
for(int i=0;i<12;i++)
for(int j=0;j<12;j++)
cin >> M[i][j];
double res = 0;
int cnt=0;
for(int i=0;i<12;i++)
for(int j=0;j<=10-i;j++)
res += M[i][j],cnt++;
if(c=='M')printf("%.1lf",res/cnt);
else printf("%.1lf",res);
return 0;
}
数组的上方区域
#include<iostream>
using namespace std;
double M[12+10][12+10];
int main(){
char c;
cin >> c;
for(int i=0;i<12;i++)
for(int j=0;j<12;j++)
cin >> M[i][j];
double res = 0;
int cnt=0;
for(int i=0;i<5;i++)
for(int j=i+1;j<=10-i;j++)
res += M[i][j],cnt++;
if(c=='M')printf("%.1lf",res/cnt);
else printf("%.1lf",res);
return 0;
}
数组的左方区域
这里最好就划分为上下两部分区域.
#include<iostream>
using namespace std;
double M[12+10][12+10];
int main(){
char c;
cin >> c;
for(int i=0;i<12;i++)
for(int j=0;j<12;j++)
cin >> M[i][j];
double res = 0;
int cnt=0;
for(int i=1;i<=5;i++)
for(int j=0;j<i;j++)
res += M[i][j],cnt++;
for(int i=6;i<=10;i++)
for(int j=0;j<11 - i;j++)
res += M[i][j],cnt++;
if(c=='M')printf("%.1lf",res/cnt);
else printf("%.1lf",res);
return 0;
}
平方矩阵I
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int n;
while(cin >> n,n){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int up=i,down=n-i+1,left=j,right=n-j+1;
cout << min(min(up,down),min(left,right)) << " ";
}
cout << endl;
}
cout << endl;
}
return 0;
}
数组变换
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a[20];
for(int i=0;i<20;i++)cin>>a[i];
reverse(a,a+20);
for(int i=0;i<20;i++)printf("N[%d] = %d
",i,a[i]);
return 0;
}
斐波那契数列
#include<iostream>
using namespace std;
long long fib(int n){
long long a=0,b=1;
for(int i=0;i<n;i++){
long long c = a+b;
a=b,b=c;
}
return a;
}
int main(){
int n;
cin >> n;
while(n--){
int x;
cin >> x;
printf("Fib(%d) = %lld
",x,fib(x));
}
return 0;
}
最小数和它的位置
#include<iostream>
using namespace std;
const int N = 1100;
int a[N];
int main(){
int n;
int m=0x7fffffff,idx=-1;
cin >> n;
for(int i=0;i<n;i++){
cin>>a[i];
if(a[i]<m)m=a[i],idx=i;
}
printf("Minimum value: %d
Position: %d
",m,idx);
return 0;
}
数组中的列
#include<iostream>
using namespace std;
double M[12+10][12+10];
int main(){
int n;
char c;
cin >> n >> c;
for(int i=0;i<12;i++){
for(int j=0;j<12;j++){
cin >> M[i][j];
}
}
double res=0;
for(int i=0;i<12;i++)res+=M[i][n];
if(c=='M'){
printf("%.1lf",res/12);
}else{
printf("%.1lf",res);
}
return 0;
}
数组的右下半部分
#include<iostream>
using namespace std;
double M[12+10][12+10];
int main(){
char c;
cin >> c;
for(int i=0;i<12;i++)
for(int j=0;j<12;j++)
cin >> M[i][j];
double res = 0;
int cnt=0;
for(int i=0;i<12;i++)
for(int j=12-i;j<12;j++)
res += M[i][j],cnt++;
if(c=='M')printf("%.1lf",res/cnt);
else printf("%.1lf",res);
return 0;
}
数组的左下半部分
#include<iostream>
using namespace std;
double M[12+10][12+10];
int main(){
char c;
cin >> c;
for(int i=0;i<12;i++)
for(int j=0;j<12;j++)
cin >> M[i][j];
double res = 0;
int cnt=0;
for(int i=0;i<12;i++)
for(int j=0;j<i;j++)
res += M[i][j],cnt++;
if(c=='M')printf("%.1lf",res/cnt);
else printf("%.1lf",res);
return 0;
}
数组的下方区域
![1604819519638](C:UsersRowry ChoAppDataRoamingTypora ypora-user-images1604819519638.png)
数组的右方区域
#include<iostream>
using namespace std;
double M[12+10][12+10];
int main(){
char c;
cin >> c;
for(int i=0;i<12;i++)
for(int j=0;j<12;j++)
cin >> M[i][j];
double res = 0;
int cnt=0;
for(int i=0;i<=5;i++){
for(int j=12-i;j<12;j++){
res += M[i][j],cnt++;
}
}
for(int i=6;i<12;i++){
for(int j=11;j>i;j--){
res += M[i][j],cnt++;
}
}
if(c=='M')printf("%.1lf",res/cnt);
else printf("%.1lf",res);
return 0;
}
平方矩阵II
可以看看对角线的规律.
#include<iostream>
using namespace std;
const int N = 110;
int a[N][N];
int main(){
int n;
while(cin>>n,n){
for(int i=1;i<=n;i++){
int x=1,y=i;
while(x<=n && y<=n){
a[x][y]=a[y][x]=i;
x+=1,y+=1;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout << a[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
return 0;
}
平方矩阵III
#include<iostream>
using namespace std;
const int N = 110;
int a[N][N];
int main(){
int n;
while(cin>>n,n){
int t=1;
for(int i=0;i<n;i++){
a[i][0]=t,t*=2;
}
for(int i=0;i<n;i++){
t = a[i][0];
for(int j=0;j<n;j++){
a[i][j]=t,t*=2;
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout << a[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
return 0;
}
蛇形矩阵
#include<iostream>
using namespace std;
const int N = 110;
int a[N][N];
int dr[] = {0,+1,0,-1};
int dc[] = {1,0,-1,0};
int main(){
int n,m;
cin >> n >> m;
int t=1;
int r=0,c=0,d=0;
while(t<=n*m){
// 先写在改
a[r][c] = t++;
int tr=r+dr[d],tc=c+dc[d];
if(tr>=0 && tr<n && tc>=0 && tc<m && !a[tr][tc]){
r=tr,c=tc;
}else{
d = (d+1)%4;
r+=dr[d],c+=dc[d];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}