第四节数组
1.整体框架
#include <iostream>
using namespace std;
int a[1000000]={0};或int a[1000];//函数外面的变量,是在堆里面的,没有大小限制,但有内存限制64兆
int main()
{
int a[数组的长度];//数组下标一定从0开始
int a[3]={0,1,2};//定义一共长度为3的数组
int a[]={0,3,2};//定义一共长度为3的数组
int c[7]={2,4,5};//定义一共长度为5的数组,没有给出的值,默认是0
char d[]={'a','b','c'};//定义一共长度为3的数组
int f[10]={0};//将数组全部初始化为0的写法
float c[11];
double e[23];
char e[9];
const int a=10; 等价的书写方式: int const a=10;
const int arr[3]={1,2,3}; int const arr[3]={1,2,3};
//const修饰一般常量及数组 、const 是 constant 的缩写,本意是不变的,不易改变的意思。在 C++ 中是用来修饰内置类型变量,自定义对象,成员函数,返回值,函数参数。
string m[3];
return 0;
}
2.基础知识
2.1多维数组
数组初始化:
int b[3][4]={
{1,2,3,4},
{2,3,4,5},
{3,2,5,1}
};
#include <cstring>//清空数组
1byte=8bit;1KB=1024B,1MB=1024KB,1GB=1024MB.一兆带宽=1Mb
memset(a,0,40)//将函数初始化,时间更快
复制数组
int main()
{
int a[10],b[10];
for (int i=0;i<10;i++) a[i]=i;
memcpy(b,a,sizeof a);//sizeof是复制多长
for (int i=0;i<10;i++) cout << b[i] << ' ';
return 0;
}
结果输出0 1 2 3 4 5 6 7 8 9
3.例题
1.数组实现2的n次方输出,有精度限制
#include <iostream>
using namespace std;
const int N=3010;
int main()
{
int a[N]={1};
int n;
cin >> n;
int m=1;
for(int i=0;i<n;i++)
{
int t=0;
for(int j=0;j<m;j++)
{
t=t+a[j]*2;
a[j]=t%10;
t=t/10;
}
if(t) a[m++]=1;
}
for (int i=m-1;i>=0;i--) cout<<a[i];
cout<<endl;
}
2.输入n,输入n个数,逆序输出
#include <iostream>
using namespace std;
int main()
{
int a[100];
int n;
cin >> n;
for(int i=0;i<n;i++)cin>>a[i];
for(int i=n-1;i>=0;i--)cout<<a[i]<<' ';
cout<<endl;
return 0;
}
3..输入n,输入n个数,旋转k次输出(1 2 3 4 5 旋转两次为4 5 1 2 3)
#include <iostream>
using namespace std;
int main(){
int a[100];
int n,k;
cin >> n >>k;
for(int i=0;i<n;i++) cin >> a[i];
while(k--)
{
int t=a[n-1];
for(int i=n-2;i>=0;i--)
a[i+1]=a[i];// 依次后移
a[0]=t;//最后一个放在第一个
}
for (int i=0;i<n;i++) cout << a[i] <<' ';
return 0;
}
//第二种做法
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int a[100];
int n,k;
cin >> n >>k;
for (int i=0;i<n;i++)cin >> a[i];
reverse(a,a+n);
reverse(a,a+k);
for(int i=0;i<n;i++) cout << a[i]<< ' ';
return 0;
}
4.数组和循环的结合运用,先读入数据再判断(忘记读入)
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
double A[100];
for(int i=0;i<100;i++)
cin>> A[i];
for(int i=0;i<100;i++)
{
if(A[i]<=10)
printf("A[%d] = %.1lf\n",i,A[i]);
}
return 0;
}
5.输入数组的数据
输入格式
第一行输入一个大写字母,若为 S
,则表示需要求出左方区域的元素的和,若为 M
,则表示需要求出左方区域的元素的平均值。
接下来 1212 行,每行包含 1212 个用空格隔开的浮点数,表示这个二维数组,其中第 i+1i+1 行的第 j+1j+1 个数表示数组元素 M[i][j]M[i][j]。
输出格式
输出一个数,表示所求的平均数或和的值,保留一位小数。
数据范围
−100.0≤M[i][j]≤100.0
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
char q;
scanf("%c", &q);
double a[12][12];
for (int i = 0; i < 12; i ++ )
for (int j = 0; j < 12; j ++ )
scanf("%lf", &a[i][j]);
int c = 0;
double s = 0;
for (int i = 1; i <= 5; i ++ )
for (int j = 0; j <= i - 1; j ++ )
{
s += a[i][j];
c += 1;
}
for (int i = 6; i <= 10; i ++ )
for (int j = 0; j <= 10 - i; j ++ )
{
s += a[i][j];
c += 1;
}
if (q == 'S') printf("%.1lf\n", s);
else printf("%.1lf\n", s / c);
return 0;
}
6.平方矩阵输出
#include <cstdio>//用到了到上下左右四条边的最小值,不好计算
#include <iostream>
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;
}
7.数组前后变换
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
int a[20],b[20];
for(int i=0;i<20;i++)cin>>a[i];//读入数据
for(int i=19,j=0;i>=0;i--,j++)
{
b[j]=a[i];
}//变换
for(int i=0;i<20;i++)
{
printf("N[%d] = %d\n",i,b[i]);
}
return 0;
}
8.求平方矩阵
#include <cstdio>
#include <iostream>
using namespace std;
int q[100][100];
int main()
{
int n;
while(cin>>n,n)
{
for (int i = 0; i < n; i ++ )
{
q[i][i] = 1;
for (int j = i + 1, k = 2; j < n; j ++, k ++ ) q[i][j] = k;
for (int j = i + 1, k = 2; j < n; j ++, k ++ ) q[j][i] = k;
}
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < n; j ++ ) cout << q[i][j] << ' ';
cout << endl;
}
cout << endl;
}
return 0;
}
9.
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
int n;
while (cin>>n,n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
int v=1;
for(int k=0;k<i+j;k++) v*=2;
cout << v <<' ';
}
cout << endl;
}
cout << endl;
}
return 0;
}
10.蛇形矩阵:难难:偏移量
//输出样例:
//1 2 3
//8 9 4
//7 6 5
#include <iostream>
using namespace std;
int res[100][100];
int main()
{
int n,m;
cin >> n >> m;
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
for(int x=0,y=0,d=0,k=1;k<=n*m;k++)
{
res[x][y]=k;
int a=x+dx[d],b=y+dy[d];
if(a<0||a>=n||b<0||b>=m||res[a][b])
{
d=(d+1)%4;
a=x+dx[d],b=y+dy[d];
}
x=a,y=b;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++) cout<<res[i][j]<<' ';
cout<<endl;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下