Lab1:数据组织基础方法及创新应用(基础)
1.数组定义及简单使用
1)分别定义一个 int 型一维数组和二维数组,并通过输出验证各种初始化方法;
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int INF = 0x3f3f3f3f,N=5;
int a[15],b[15][15];
void work1() //循环初始化数组
{
for(int i=1;i<=N;i++) a[i]=1;
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++) b[i][j]=2;
for(int i=1;i<=N;i++) printf("a[%d]=%d\n",i,a[i]);
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++) printf("b[%d][%d]=%d\n",i,j,b[i][j]);
}
void work2() //memset函数初始化数组
{
memset(a,-1,sizeof(a));
memset(b,0,sizeof(b));
for(int i=1;i<=N;i++) printf("a[%d]=%d\n",i,a[i]);
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++) printf("b[%d][%d]=%d\n",i,j,b[i][j]);
}
void work3() //直接初始化数组
{
int t[15]={0};
int x[15][15]={0,0,1,1,1,1};
for(int i=1;i<=N;i++) printf("t[%d]=%d\n",i,t[i]);
for(int i=0;i<=N;i++)
for(int j=0;j<=N;j++) printf("x[%d][%d]=%d\n",i,j,x[i][j]);
}
int main()
{
work1();
work2();
work3();
return 0;
}
分别用三种方法初始化数组,详见注释。
其中需要注意的是,a[10]={}
这种初始化方法只能在定义数组的时候使用,已经声明的数组不可以这样赋值。
其中第三种初始化方法,二维数组初始化若不全部给出,则后面的数组元素均为 \(0\)
部分输出如下:
2)定义 int,char 一维数组,键盘输入并输出。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int INF = 0x3f3f3f3f;
inline ll read()
{
ll ret=0;char ch=' ',c=getchar();
while(!(c>='0'&&c<='9')) ch=c,c=getchar();
while(c>='0'&&c<='9') ret=(ret<<1)+(ret<<3)+c-'0',c=getchar();
return ch=='-'?-ret:ret;
}
int a[11];
char c[11];
int main()
{
for(int i=1;i<=10;i++) a[i]=read(); //快速读入
cin>>c;
for(int i=1;i<=10;i++) cout<<a[i]<<' ';
cout<<c;
return 0;
}
使用了快速读入
输出如下:
2.结构体定义及简单使用
1)定义结构体,初始化,输出验证
2)定义结构体,输入数据,输出验证
#include<bits/stdc++.h>
using namespace std;
struct edge{int nxt,to,w;}a;
int main()
{
//初始化结构体
a.nxt=1,a.to=2,a.w=3;
printf("%d %d %d\n",a.nxt,a.to,a.w);
//输入结构体
cin>>a.nxt>>a.to>>a.w;
printf("%d %d %d\n",a.nxt,a.to,a.w);
return 0;
}
3指针定义及简单使用
1)定义 int 指针和引用,验证各种初始化方法
2)针对指针,输入数据并输出数据和指针本身
#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline ll read()
{
ll ret=0;char ch=' ',c=getchar();
while(!(c>='0'&&c<='9')) ch=c,c=getchar();
while(c>='0'&&c<='9') ret=(ret<<1)+(ret<<3)+c-'0',c=getchar();
return ch=='-'?-ret:ret;
}
int main()
{
int a=1,*p=&a;//*p是指针
int b=2,&r=b; //r是引用
cout<<a<<' '<<*p<<endl<<r<<endl;
int c=read(),*q=&c;//输入c并设置指针q
cout<<*q;
return 0;
}
输出:
指针和引用的区别:
- 指针可以更改赋值,引用一经确定不可更改
- 指针不一定要初始化,引用一定要初始化
- 指针额外占用空间,引用不额外占用空间
4结构体指针
#include<bits/stdc++.h>
using namespace std;
struct edge{int nxt,to,w;}a;
edge *p=&a;
int main()
{
//初始化结构体
a.nxt=0,a.to=0,a.w=0;
p->nxt=1,p->to=2,p->w=3; //指针改变数值
printf("%d %d %d\n",p->nxt,a.to,a.w);
return 0;
}
这里需要注意,指针 \(*p\) 和原来的 a 结构体是双向的对应关系。改变 a,*p随之改变;改变 *p,a随之改变。
输出:1 2 3
5.定义int型指针并指向int型一维数组,通过指针输出数组(分析数组名和数组第一个元素地址的关系)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline ll read()
{
ll ret=0;char ch=' ',c=getchar();
while(!(c>='0'&&c<='9')) ch=c,c=getchar();
while(c>='0'&&c<='9') ret=(ret<<1)+(ret<<3)+c-'0',c=getchar();
return ch=='-'?-ret:ret;
}
int main()
{
int a[6]={1,2,3,4,5,6};
int *q=&a[0],*r=a;
for(int i=0;i<6;i++) cout<<q[i];
cout<<endl;
for(int i=0;i<6;i++) cout<<r[i];
return 0;
}
输出:
数组名和数组第一个元素的地址是等价的