写给新手的 二维数组所总结
所有用到的的数组是:a[3][3]={{23,46,11},{99,45,82},{72,90,21}};
一:遍历打印输出二维数组的元素
#include <stdio.h>
void main(){
int a[3][3]={{23,46,11},{99,45,82},{72,90,21}};
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
}
思路:【1:每一个下标号对应的元素值是唯一的;
2:因为是二维数组,必须要遍历行,列所以需要两个循环变量;
3:在每一次循环遍历列数后,就用换行语句,可以打印输出标准的行列格式】
二:逆序输出二维数组的元素
#include <stdio.h>
void main(){
int a[3][3]={{23,46,11},{99,45,82},{72,90,21}};
for(int i=2;i>=0;i--){
for(int j=2;j>=0;j--){
printf("%d ",a[i][j]);
}
}
}
思路:【1:每一个下标号对应唯一的元素值;
2:当下标号发生顺序改变的时候,他们所代表的元素值也发生顺序变化。】
三:求二维数组的最值,每一行最值,每一列最值
#include <stdio.h>
void main(){
int a[3][3]={{23,46,11},{99,45,82},{72,90,21}};
int max=a[0][0];
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(max<a[i][j]){
max=a[i][j];
}
}
}
printf("%d \n",max);
}
思路:【1:必须声明一个临时的最大值,最好是二维数组中的任何一个元素值,不能比二维数组中的最小值还要小,比最大值还要大!
2:循环遍历二维数组的每一个元素值,一一比较,比临时最大值还大的话,就覆盖掉。】
#include <stdio.h>
void main(){
int a[3][3]={{23,46,11},{99,45,82},{72,90,21}};
int max=a[0][0];
for(int i=0;i<3;i++){
max=a[i][0];
for(int j=0;j<3;j++){
if(max<a[i][j]){
max=a[i][j];
}
}
printf("第 %d 行的最大值是:%d\n",(i+1),max);
}
}
思路:【1:求每一行的最值,先临时设置一个值是二维数组里面的一个元素值;
2:遍历每一列,再遍历行的总数次,并且每遍历下一次的时候,最值要归位。不能将以前的最值拿下来比较】
#include <stdio.h>
void main(){
int a[3][3]={{23,46,11},{99,45,82},{72,90,21}};
int max=a[0][0];
int i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
printf("\n");
for(j=0;j<3;j++){
max=a[0][j];
for(i=0;i<3;i++)
if(max<a[i][j]){
max=a[i][j];
}
printf("第 %d 列的最大值是:%d \n",(j+1),max);
}
}
三:求二维数组的总和和平均值,每行每列的和还有平均值
#include <stdio.h>
void main(){
int a[3][3]={{23,46,11},{99,45,82},{72,90,21}};
int s=0,s1=0,s2=0;
int i,j;
printf("输出的标准格式如下:\n");
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
printf("\n");
for(i=0;i<3;i++){
for(j=0;j<3;j++){
s=s+a[i][j];
}
}
printf("该二维数组的和:%3d 平均值是:%d\n",s,s/9);
printf("\n");
for(i=0;i<3;i++){
s1=0;
for(j=0;j<3;j++){
s1=s1+a[i][j];
}
printf("第 %d 行的和是: %3d 平均值是: %d\n",(i+1),s1,s1/3);
}
printf("\n");
for(i=0;i<3;i++){
s2=0;
for(j=0;j<3;j++){
s2=s2+a[j][i];
}
printf("第 %d 列的和是: %3d 平均值是: %d\n",(i+1),s2,s2/3);
}
}
思路:【1:求累加之和的固定模式是:int s=0;s=s+变化的值,就是指循环遍历的数组元素值;
2:在求每行,每列的和的时候,也是采用求累加之和的固定模式,求每一行的和就遍历每一列,求每一列。就遍历每一行;
3:在求每一行,每一列的和是时,记住要清0】
四:求该数组的对角线之和
#include <stdio.h>
void main(){
int a[3][3]={{23,46,11},{99,45,82},{72,90,21}};
int s1=0,s2=0;
int i,j;
printf("输出的标准格式如下:\n");
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
for(i=0;i<3;i++){
for(j=0;j<3;j++){
if(i+j==2){
s1=s1+a[i][j];
}
}
}
printf("该数组的左对角线和是:%3d \n\n",s1);
for(i=0;i<3;i++){
for(j=0;j<3;j++){
if(i==j){
s2=s2+a[i][j];
}
}
}
printf("该数组的右对角线和是:%3d \n",s2);
}
思路:【1:任何行列都相等的的二维数组,都有两条线和;
2:左对角线之和判断条件是:行列加和绝对等于当前数组的最大长度减一;
3:右对角线之和判断条件是:行列都相等】
五:将数组进行行列互换【矩阵互换】
#include <stdio.h>
void main(){
int a[3][3]={{23,46,11},{99,45,82},{72,90,21}};
int b[3][3];
int i,j;
printf("输出的标准格式如下:\n");
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
for(i=0;i<3;i++){
for(j=0;j<3;j++){
b[i][j]=a[j][i];
}
}
printf("\n行列互换后:\n");
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d ",b[i][j]);
}
printf("\n");
}
}
思路:【1:必须要申请一个数组,要求长度不变,行列是互换的;
2:在遍历原数组的时候,只要保证行列的循环变量颠倒位置即可】
六:将该数组的进行从小到大排序,每行,每列从小到大排序
#include <stdio.h>
void main(){
int a[3][3]={{23,46,11},{99,45,82},{72,90,21}};
int i,j,m,n;
printf("二维数组的标准形式如下:\n");
for ( i = 0; i < 3; i++) {
for ( j = 0; j < 3; j++) {
printf("%d ",a[i][j]);
}
printf("\n");
}
printf("\n");
for ( i = 0; i < 3; i++) {
for ( j = 0; j < 3; j++) {
for (int m = 0; m < 3; m++) {
for (int n = 0; n <3; n++) {
if (a[i][j] < a[m][n]) {
int t = a[i][j];
a[i][j] = a[m][n];
a[m][n] = t;
}
}
}
}
}
printf("二维数组从小到大排序是:\n");
for ( i = 0; i < 3; i++) {
for ( j = 0; j < 3; j++) {
printf("%d ",a[i][j]);
}
printf("\n");
}
}
#include <stdio.h>
void main(){
int a[3][3]={{23,46,11},{99,45,82},{72,90,21}};
int i,j,k;
printf("二维数组的标准形式如下:\n");
for ( i = 0; i < 3; i++) {
for ( j = 0; j < 3; j++) {
printf("%d ",a[i][j]);
}
printf("\n");
}
printf("\n");
for(k=0;k<3;k++){
for(i=0;i<2;i++){
for(j=0;j<2-i;j++){
if(a[k][j]>a[k][j+1]){
int t=a[k][j];
a[k][j]=a[k][j+1];
a[k][j+1]=t;
}
}
}
}
printf("二维数组每一行从小到大排序是:\n");
for ( i = 0; i < 3; i++) {
for ( j = 0; j < 3; j++) {
printf("%d ",a[i][j]);
}
printf("\n");
}
}
只对没行列排序:
思路:【1:将每一行,列都看作是一维数组,利用一维数组排序的规则进行排序即可;
2:遍历的总次数是:最大长度减一;
3:遍历的趟数是总数减去次数的循环变量即可;】
对整个二维数组:
#include <stdio.h>
void main(){
int a[3][3]={{23,46,11},{99,45,82},{72,90,21}};
int i,j,m;
int b[9];
//输出标准形式
printf("标准形式如下:\n");
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
//按照一维数组模式进行存储值
printf("\n一维数组排序后:\n");
for(i=0;i<3;i++){ //i=0
m=i*3; //m=0 m=3 m=6
for(j=0;j<3;j++){
b[m]=a[i][j]; //b[0] [1] [2] [3] [4] [5] [6] [7] [8]
m++; //1 2 3 4 5 6 7 8 9
printf("%d ",m);
}
}
printf("\n");
//对一维数组排序
for(i=0;i<8;i++){
for(j=0;j<8-i;j++){
if(b[j]>b[j+1]){
int t=b[j];
b[j]=b[j+1];
b[j+1]=t;
}
}
}
//按照二维数组形式输出
for(m=0;m<9;m++){
printf("%d ",b[m]);
if((m+1)%3==0){
printf("\n");
}
}
}
思路:【1:将二维数组转为为一维数组,对一维数组进行排序;再按照二维数组格式进行输出;
2:在里面一层循环的外面要进行重新设值。】