数组的定义
一维数组
/*
数组:相同数据类型的有序集合
一维数组定义:元素类型 数组名[元素个数];
元素个数可以是常量,常量表达式,常量
*/
#include <stdio.h>
int main(void)
{
int arr[5]; //常量 随机值
int n;
scanf("%d",&n);
int arr1[n]; //变量
int arr2[]={};//通过初始化,限定数组的长度
int arr3[5]={0,1,2,3,4};
int arr4[5]={1};//剩下的值都为0;
int arr5[]={1,2,3,4,5,6,7,8,9};//根据初始化值,限定数组长度
char arr6[3]={'a','b'};//剩下的值0=> '\0'
return 0;
}
数组使用
/*
数组的使用
元素的使用:数组名[下标]
下标从0开始,到(数组长度-1)结束
*/
#include <stdio.h>
int main(void)
{
int a[5] = {1,2,3};
//输入
for(int i=0; i<5; i++)
{
scanf("%d",&a[i]);
}
//输出
for(int i = 0; i < 5; i++)
printf("%d\n",a[i]);
return 0;
}
数组逆序
//
// 求数组逆序
//
#include<stdio.h>
#define N 10 //定义长度
int main(void)
{
int a[N],i,temp;
printf("请输入一组数:\n");
for (i=0; i<N; i++) {
scanf("%d",&a[i]);
}
for (i=0; i<N/2; i++) { //将对称元素值互换
temp=a[i];
a[i]=a[N-i-1];
a[N-i-1]=temp;
}
printf("逆序数组为:");
for (i=0; i< N; i++) {
printf("%d",a[i] );
}
printf("\n");
return 0;
}
二维数组
/*
二维数组:元素类型 数组名[行数][列数]
*/
#include <stdio.h>
int main(void)
{
char arr1[3][4];
int n=3,m=4;
char arr2[n][m];
//只能省略行,不能省略列,根据初始化值的个数和列数,确定有几行
char arr3[][4]={1,2,3,4,5,6,7,8,9,0};
char arr4[][3]={{0},{},{1},{1,2,3}};
printf("arr1=%lu\n",sizeof(arr1)); //char[3][4] 12
printf("arr1[0]=%lu\n",sizeof(arr1[0])); //char[4] 4
printf("arr1[0][0]=%lu\n",sizeof(arr1[0][0])); //char 1
printf("arr4[0][0]=%lu\n",sizeof(arr4[0][0]));
printf("arr4[0]=%lu\n",sizeof(arr4[0]));
printf("arr4=%lu\n",sizeof(arr4));
return 0;
}
二维数组元素的引用
//二维数组元素的引用
//元素的引用 数组名[行数][列数]
//
#include <stdio.h>
#define N 5
#define M 10
int main(void)
{
char a[N][M];
int row=sizeof(a)/sizeof(a[0]); // 50/10=5 row
int col=sizeof(a[0])/sizeof(a[0][0]); //10/1=10 col
//遍历二维数组的每一行
for (int i=0; i<row; i++) {
//遍历第i行的每一列
for (int j=0; j<col; j++) {
scanf("%c",&a[i][j]);
printf("%c",a[i][j]);
}
printf("\n");
}
}
数组与矩阵
矩阵的转置
//
// 矩阵的转置
//
#include <stdio.h>
int main(void)
{
int n,m;
printf("请输入矩阵的长度和宽度:\n");
scanf("%d,%d",&n,&m);
char a[n][m];
//输入
for (int i=0; i<n; i++) {
for (int j=0; j<m; j++) {
scanf("%c",&a[i][j]);
printf("%c",a[i][j]);
}
printf("\n");
}
//转置
char b[m][n];
for (int i=0; i<n; i++) {
for (int j=0; j<m; j++) {
b[j][i]=a[i][j];
}
}
//输出
for (int i=0; i<n; i++) {
for (int j=0; j<m; j++) {
printf("%c",b[i][j]);
}
printf("\n");
}
}
矩阵的主对角线,辅对角线之和
//
// 求矩阵的主对角线,辅对角线之和
//
#include <stdio.h>
int main(void)
{
int a[4][4]={1,2,3,4,
5,6,7,8,
9,10,11,12,
13,14,15,16};
int sum1=0;
int sum2=0;
for (int i=0; i<4; i++) {
for (int j=0; j<4; j++) {
if (i==j) {
sum1+=a[i][j];
}
if (i+j==3) {
sum2+=a[i][j];
}
}
}
printf("sum1=%d,sum2=%d\n",sum1,sum2);
return 0;
}
数组与函数
数组作为函数参数
//
//数组与函数
//数组作为函数参数
//1.数组元素作为函数参数,函数形参定义为数组元素的类型
//2.数组名作为函数参数,传递的实参是数组地址,接收形参是指针类型
//3.为了在被调函数中体现出实参是数组,形参使用数组类型接收
//4.使用其他的整型变量将数组长度传给被调函数
//5.使用数组名做函数参数,可以实现在被调函数中间间接访问主调中值
//
#include <stdio.h>
int max(int,int);
int main(void)
{
int a[] ={1,2,3,4,5};
int p1,p2;
scanf("%d,%d",&p1,&p2);
printf("max=%d\n",max(a[p1],a[p2]));
return 0;
}
//求比较大的值
int max(int a,int b)
{
return a>b?a:b;
}
#include <stdio.h>
void input(int [],int);//声明可以不加变量名
void output(int [],int);
void change(int [],int);
int main(void)
{
int a[5];
//sizeof(a)=>sizeof(int[5])
unsigned long len=sizeof(a)/sizeof(a[0]);
printf("数组的长度是:%lu\n",len);
input(a,len);
output(a,len);
change(a,len);
return 0;
}
void change(int a[],int len)
{
int t;
for (int i=0; i<len/2; i++) {
t=a[i];
a[i]=a[len-1-i];
a[len-1-i]=t;
}
for (int i=0; i<len; i++) {
printf("%d",a[i]);
}
printf("\n");
}
void input(int arr[],int len)
{
for (int i=0; i<len; i++) {
scanf("%d",&arr[i]);
}
}
void output(int b[],int len) //相当于 (int *b,int len)指针
{
for (int i=0; i<len; i++) {
printf("%d",b[i]);
}
printf("\n");
}
二维数组做函数参数
/*
*二维数组做函数参数
*1.数组名做函数参数,实参是二维数组名,形参是指向二维数组一行的指针
2.二维数组降维成一维数组,将行列都传递
*
*/
#include <stdio.h>
void input(int [][4],int);
void sum(int [],int,int);
void most(int [],int,int);
void change(int [],int,int,int []);
void sort(int [],int);
int main(void)
{
int a[3][4];
int value;
input(a,3); //输入二维数组
sum(a[0],3,4); //求二维数组每行的和
most(a[0],3,4); //求二维数组中最值
int b[4][3];
change(a[0],3,4,b[0]);
//输出降维转置后数组
for(int i=0;i<4; i++){
for(int j=0; j<3; j++){
printf("%d ",b[i][j]);
}
printf("\n");
}
//输出每行排序后的结果
printf("此二维数组每行排序后的结果为:\n");
sort(a[0],3);
for(int i=0;i<3; i++){
sort(a[i],3);
printf("%d ",a[i]);
printf("\n");
}
return 0;
}
void input(int a[][4],int len) //指针 int (*)[4]
{
printf("输入3行4列数组:\n");
for (int i=0 ; i<len; i++) {
for (int j=0; j<4; j++) {
scanf("%d",&a[i][j]);
}
}
}
//降维成一维数组求二维数组每行的和
void sum(int b[],int row,int col)
{
int sum=0;
for (int i=0; i<row; i++) {
sum=0;
for (int j=0; j<col; j++) {
sum+=b[i*col+j]; //b[i*row+j]等同于a[i][j]
}
printf("第%d行的和是:%d\n",i,sum);
}
}
//求二维数组最大值
void most(int b[],int row,int col)
{
int maxValue=b[0];
int minValue=b[0];
for (int i=0; i<row*col; i++) {
if (maxValue<b[i]) {
maxValue=b[i];
}
if (minValue>b[i]) {
minValue=b[i];
}
}
printf("此二维数组最大值是:%d\n",maxValue);
printf("此二维数组最小值是:%d\n",minValue);
}
//转置二维数组
void change(int a[],int row,int col,int b[])
{
for (int i=0; i<row; i++) {
for (int j=0; j<col; j++) {
b[j*row+i]=a[i*col+j];
}
}
printf("转置后的数组为:\n");
}
//选择排序
void sort(int a[],int len)
{
int min=0; //最小值下标位置
int temp;
for (int i=0; i<len-1;i++) {
min=i;
for (int j=i+1; j<len; j++) {
if (a[min]>a[j]) {
min=j;
}
}
temp=a[min];
a[min]=a[i];
a[i]=temp;
}
}
二维数组的转置
//
//数组返回给主调函数,保证返回的地址有用且有效
//
//
//二维数组的转置
#include <stdio.h>
void change(int[],int,int,in[]);
int main(void)
{
int a[3][4]={1,2,3,4,
5,6,7,8,
9,10,11,12};
int b[4][3];
change(a,3,4,b);
for (int i=0; i<4; i++) {
for (int j=0; j<3; j++) {
printf("%d ",b[i][j]);
}
printf("\n");
}
}
void change(int a[],int row,int col,int b[])
{
for (int i=0; i<row; i++) {
for (int j=0; j<col; j++) {
b[j*row+i]=a[i*col+j];
}
}
}
三维数组
//
//三维数组
//
#include <stdio.h>
int main(void)
{
int a[2][3][4]={{,,,},{,,,},{},{}};
return 0;
}