二维数组
初始化:
int arr[2][2]={{0}};//注意需要两个花括号
或者
memset(arr,-1,sizeof(arr));
memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的;
包含在<string.h>头文件中,可以用它对一片内存空间逐字节进行初始化;
原型为 :
_void *memset(void *s, int v, size_t n);_
这里s可以是数组名,也可以是指向某一内在空间的指针;
v为要填充的值;
n为要填充的字节数;
注意,memset是逐字节拷贝的。
在memset使用时要千万小心,在给char以外的数组赋值时,只能初始化为0或者-1。
1,memset() 函数常用于内存空间初始化。
2,memset()可以方便的清空一个结构类型的变量或数组。
更多可查看:
[C 库函数 - memset()]https://www.runoob.com/cprogramming/c-function-memset.html
案例1:输入学生成绩
输入6个学生的5门成绩,输出他们的成绩表,包含各科成绩,总分和平均分。
#include<stdio.h>
#define ROW 6
#define COL 8
#define SIZE (ROW*COL)
int input(void);
void output(int score[ROW][COL],int size);
int main(){
int score[ROW][COL]={{0}};
printf("成绩录入系统!");
printf("请输入%d个学生的学号和对应成绩:\n\n",ROW);
int i=0,j=0;
for(i=0;i<ROW;i++){
printf("请输入学号:");
score[i][0]=input();
printf("请输入数学成绩:");
score[i][1]=input();
printf("请输入英语成绩:");
score[i][2]=input();
printf("请输入语文成绩:");
score[i][3]=input();
printf("请输入物理成绩:");
score[i][4]=input();
printf("请输入化学成绩:");
score[i][5]=input();
score[i][6]=score[i][1]+score[i][2]+score[i][3]+score[i][4]+score[i][5];
score[i][7]=score[i][6]/5;
printf("***********************\n");
}
printf("班级学生成绩表:\n");
printf("学号\t数学\t英语\t语文\t物理\t化学\t总分\t平均分\n");
output(score,SIZE);
printf("\n");
return 0;
}
int input(void){
int num=0;
while(1){
int check=scanf("%d",&num);
while(getchar()!='\n');
if(check<=0){
printf("输入错误请重新输入:");
continue;
}else break;
}
return num;
}
void output(int score[ROW][COL],int size){
int i=0,j=0;
for(i=0;i<ROW;i++){
for(j=0;j<COL;j++){
printf("%d\t",score[i][j]);
}
putchar('\n');
}
}
案例2:输入3行3列个整数,求其对角线所有数之和
思路:
- 输入一个3阶矩阵。对角线分为主对角线和副对角线。
- 利用二维数组实际存储为有序的的概念,使用指针,化二维为一维数组想法:
- 主对角线元素:从下标0开始每隔ROW个元素则为对角线上元素,如3阶的主对角线下标为:0,4,8
- 副对角线元素:从下标COL-1开始每隔ROW-2个元素则为对角线上元素,如3阶的副对角线下标为:2,4,6
#include<stdio.h>
#define ROW 3
#define COL 3
#define SIZE (ROW*COL)
void output(int*p);
void math_input(int*);
int main_diagonal_line(int*);
int sub_diagonal_line(int*);
int main(){
int num;
int shuzu[ROW][COL]={{0}};
int *ptr=shuzu[0];
printf("请输入%d阶矩阵:",ROW);
math_input(ptr);
printf("输入的矩阵为:\n");
output(ptr);
num=main_diagonal_line(ptr);
printf("主对角线上数的和为:%d\n",num);
num=sub_diagonal_line(ptr);
printf("副对角线上数的和为:%d\n",num);
return 0;
}
void math_input(int*p){
int i=0,num=0;
for(i=0;i<SIZE;i++){
if(!scanf("%d",&num)){
getchar();
i--;
}else *(p+i)=num;
}putchar('\n');
return;
}
void output(int*p){
int *p1;
for(p1=p;p1<p+SIZE;p1++){
printf("%d\t",*p1);
if((p1-p+1)%COL==0)putchar('\n');
}
}
int main_diagonal_line(int*p){
int num=0,i=0;
for(i=0;i<SIZE;i+=ROW+1)num+=*(p+i);
return num;
}
int sub_diagonal_line(int*p){
int num=0,i=0;
for(i=ROW-1;i<SIZE-1;i+=ROW-1)num+=*(p+i);
return num;
}
/*
请输入3阶矩阵:1 3 5 2 4 6 3 5 7
输入的矩阵为:
1 3 5
2 4 6
3 5 7
主对角线上数的和为:12
副对角线上数的和为:12
*/
案例3:从键盘输入一组数据存入数组a[4][4]中,求其四周元素之和
思路:若下标包含边界的值则他就是边界。
#include<stdio.h>
#define ROW 4
#define COL ROW
#define SIZE (ROW*COL)
void output(int*p);
void matrix_input(int*);
int add_around(int(*p)[COL]);
int main(){
int num;
int shuzu[ROW][COL]={{0}};
printf("请输入%d阶矩阵:\n",ROW);
matrix_input(*shuzu);
printf("输入的矩阵为:\n");
output(*shuzu);
num=add_around(shuzu);
printf("矩阵四周的和为:%d\n",num);
return 0;
}
void matrix_input(int*p){
int i=0,num=0;
for(i=0;i<SIZE;i++){
if(!scanf("%d",&num)){
getchar();
i--;
}else *(p+i)=num;
}putchar('\n');
return;
}
void output(int*p){
int *p1;
for(p1=p;p1<p+SIZE;p1++){
printf("%d ",*p1);
if((p1-p+1)%COL==0)putchar('\n');
}
}
int add_around(int(*p)[COL]){
int i,j,num=0;
for(i=0;i<ROW;i++){
for(j=0;j<COL;j++){
if(i==0||i==ROW-1||j==0||j==COL-1)num+=*(*(p+i)+j);
}
}
return num;
}
/*
请输入4阶矩阵:
1 1 1 1 1 2 3 1 1 4 5 1 1 1 1 1
输入的矩阵为:
1 1 1 1
1 2 3 1
1 4 5 1
1 1 1 1
矩阵四周的和为:12
*/