C二维数组练习

本文介绍了二维数组的初始化方法,包括使用 memset 函数进行内存初始化,并提供了三个案例:输入并展示学生成绩、计算矩阵对角线元素之和以及求矩阵四周元素之和。这些案例展示了数组操作在实际编程中的应用。
摘要由CSDN通过智能技术生成

二维数组

初始化:
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

*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值