day12 二维数组

二维数组的引入

1> 当程序中需要使用多个一维数组时,定义多个一维数组不方便时,我们可以引入二维数组。可以实现一条语句定义成百上千个一维数组

2> 二维数组是由两个下标表示的数组,有行有列

3> 定义格式: 数据类型 数组名[行数][列数];

例如:int arr[3][4];

解读:站在一维数组的角度:定义了三个一维数组,每个一维数组的数组名为 arr[0]、arr[1]、arr[2]

站在变量的角度来说:定义了12个变量,这12个变量分别如下:

arr[0][0] 、arr[0][1] 、arr[0][2] 、arr[0][3]

arr[1][0] 、arr[1][1] 、arr[1][2] 、arr[1][3]

arr[2][0] 、arr[2][1] 、arr[2][2] 、arr[2][3]

4> 注意事项

1、定义二维数组时,第一个中括号中表示二维数组的行数,第二中括号中表示二维数组的列数 ---> 符合定义数组时中括号的四不准

2、使用数组元素时,如果只有一个下标,表示的是当前行所在的一维数组的起始地址,不表示元素 arr[0] <===> &arr[0][0]

3、如果使用两个下标表示时,使用的是数组元素。 定义二维数组时,中括号中的数字表示的是行数和列数。使用二维数组元素时,中括号中表示的是行标和列标

4、当定义的一个二维数组为M行N列时,那么其行标的范围[0,M-1] 列标的范围是[0,N-1]

5、arr[i][j]表示的是第i+1行j+1列的那个变量; 第x行y列的元素对应的为 arr[x-1][y-1]

6、没有初始化的二维数组中,每个变量都是随机值

二维数组的初始化

1.按行全部初始化:将每一行的值放入到一个花括号中包裹i

nt arr[3][4] = {{1,1,1,1}, {2,2,2,2}, {3,3,3,3}};

2.按行部分初始化:当前行内,没有初始化的部分用0补齐

int arr[3][4] = {{1,1}, {}, {3}};

3.按分布方式全部初始化:每行元素不需要使用括弧包裹起来,每选择一行数据放入当前行内

int arr[3][4] = {1,1,1,1,2,2,2,2,3,3,3,3};

4.按分布方式部分初始化:会将数据先填满前面行的数据,后面没有初始化的部分使用0补齐

int arr[3][4] = {1,1,1,1,2,2};

5.特殊初始化:定义二维数组并初始化时,第一维可以省略,由初始化元素个数和每一行的列数确定行数  行数 = (元素个数/列数 向上取整)

int arr[][4] = {1,1,1,1,2,2,2,2,3};

注意:定义二维数组并初始化时,第一维可以省略,第二维一定不能省略

二维数组的输入输出

1> 需要找到二维数组中的任意一个元素 arr[i][j]

2> 输出一个一维数组,需要使用一层循环。而二维数组是由多个一维数组组成,所以输出多个一维数组,需要外面再嵌套一层循环搞定

二位整型数组的相关操作

1> 整体求和、求最值:将任意一个数据进行累加求和即可

2> 求每一行的和、最值:

先将第一个元素当做最值,拿着当前的最值跟任意一个进行比较,如果比较成功,更新最值

3> 转置

二维字符数组

1> 存储一个字符串,只需要一个一维字符数组即可,但是,如果想要存储多个字符串,就需要引入二维字符数组了

2> 定义格式: char 数组名[行数][列数];

3> 使用格式:

数组名[行标] :表示的是当前行的整个字符串

数组名[行标][列标]:表示的是 第i+1个字符串的第j+1位置上的那个字符

4> 初始化:

1、使用字符填充:跟整形数组一致

2、使用字符串填充

作业:

完成一个班级成绩管理系统

1> 完成系统的注册和登录功能

2> 登录成功后,现在菜单

3> 功能1:完成信息的录入(姓名(二维字符数组)和成绩(一维整形数组))

4> 功能2:展示学生信息

张三 100

李四 90

王五 98

5> 功能3:求最高分和最低分学生的信息

最高分是张三,成绩100

最低分是李四,成绩90

6> 功能4:查找,提示并输入一个姓名,输出该学生对于的成绩

7> 功能5:将所有学生按照成绩的降序进行排序

张三 100

王五 98

李四 90

8> 功能6:修改信息,提示并输入一个学生姓名,更改该学生的成绩

9> 功能7:添加学生,提示并输入一个学生姓名及成绩,添加到最后

10> 功能8:提示并输入一个学生的姓名,从系统中将该学生的信息删除

11> 功能9:求班级总成绩及平均分

12> 功能10:提示并输入一个范围,将成绩在该范围内的学生信息全部输出

思维导图

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include<ctype.h>
int main(int argc, const char *argv[])
{
	//准备容器存储注册账号和注册密码
	char regest_usr[20]="";//注册名称
	char regest_pwd[20]="";//注册密码

	char arr[20][10];
    int  brr[20];
	int menu1=0;//菜单1的选择
	int menu2=0;//菜单2的选择
	//int flag =0;
	while(1)
	{
	printf("\t\t1.注册\n");
	printf("\t\t2.登录\n");
	printf("请输入选项:");

	scanf("%d",&menu1);
   
		switch(menu1){
	case 1:{    //注册
			   printf("请输入注册账号:");
			   scanf("%s",regest_usr);
			   printf("请输入注册密码:");
			   scanf("%s",regest_pwd);
			   printf("注册成功\n");
		   }break;
		   
	case 2:{
			   char usrname[20]="";//登录账号
			   char pwd[20]="";//登录密码
				   printf("请输入登录账号:");
			   scanf("%s",usrname);
			   printf("请输入登录密码:");
			   scanf("%s",pwd);
			   //判断登录是否成功
			   if (strcmp(usrname,regest_usr)==0&&strcmp(pwd,regest_pwd)==0)
			   {
					      printf("登陆成功\n");

						  int num=0;
						  printf("请输入班级人数:\n");
						  scanf("%d",&num);

						  
		while(1) { 
				          printf("请输入你想要实现的功能:\n");
				          printf("功能1:完成信息录入\n");
				  		  printf("功能2:展示学生信息\n");
						  printf("功能3:求最高分和最低分学生信息\n");
				          printf("功能4:查找学生信息\n");
				          printf("功能5:将序排列\n");
				  		  printf("功能6:修改信息\n");
						  printf("功能7:添加学生信息\n");
				  		  printf("功能8:删除学生信息\n");
						  printf("功能9:总分及平均分\n");
                          printf("功能10:求范围内的学生信息");
						  scanf("%d",&menu2);
						  switch(menu2)
						  {
						  case 1:{
									   
									 for(int i=0;i<num;i++)
									 {
										 printf("请输入第%d个学生的姓名:",i+1);
										 scanf("%s",arr[i]);
			
										 printf("请输入对应的成绩:");
                                         scanf("%d",&brr[i]);
									 
									 }	
								 }break;
						  case 2:{
									 //输出学生成绩

                                    	for(int j=0;j<num;j++)
										 {
											 printf("%s  %d\n",arr[j],brr[j]);
						 				 }
		
								 }break;
						  case 3:{
									 //求最低分学生的信息
									int max=0;
										int min=0;

									 //将第一个数初定为最大最小值
									 for (int i=0;i<num;i++)
									 {
									 if(brr[i]>brr[max])
										  {
                                         max=i;
										  }if(brr[i]<brr[min])
										  {
										  min=i;
										  }
									 }printf("最高分是%s,成绩%d\n",arr[max],brr[max]);
									 printf("最低分是%s,成绩%d\n",arr[min],brr[min]);

								 
								 }break;
							case 4:{
									   char xm[8]="";
									   //定义一个字符数组存储姓名
								   //查找学生成绩
								   printf("请输入学生的姓名:\n");
								   scanf("%s",xm);
								   int i=0;
								   for (int i=0;i<num;i++)
								   {
								   if(strcmp(xm,arr[i])==0)
								   {
								   printf("%d\n",brr[i]);
								   }
								   }if(i==num)
								   {
								   printf("查无此人\n");

								   }
								   }break;
							case 5:{
								   //降序排列
								   char t[8]="";
								   for (int i=1;i<num;i++)
								   {
								   	for (int j=0;j<num-i;j++)
								   	{
								   	if(brr[j]<=brr[j+i])
									{
                                       
										int temp=brr[j];
									   brr[j]=brr[j+1];
									   brr[j+1]=temp;
                                       strcpy(t,arr[j] );
									   strcpy(arr[j],arr[j+1]);
									   strcpy(arr[j+1],t);

									}
									}
									}
									for(int i=0;i<num;i++)
									{
									printf("姓名:%s,成绩%d\n",arr[i],brr[i]);

									}		
								   }break;
							case 6:{
								   //修改成绩
								   char ll[8]="";
								   int cg;
								   //定义一个字符数组存姓名
									printf("请输入要修改学生的姓名:");
									scanf("%s",ll);
									for (int i=0;i<num;i++)
									{
									if(strcmp(ll,arr[i])==0)
									{
									printf("请输入修改之后的成绩:");
									scanf("%d",&cg);
									brr[i]=cg;

									}
									}
								   
								   
								   
								   }break;
							case 7:{
								   //添加学生
                                   char mm[8]="";
                                   int q;
								   printf("请输入你要添加的学生姓名");
                                  scanf("%s",mm);
								  printf("他的成绩是:");
								  scanf("%d",&q);

								   if(num>=20){
								   printf("操作失败\n");
								   break;
								   }strcpy(arr[num],mm);
								   brr[num]=q;
                                  num++;
								   
								   }break;
							case 8:{
								  // 删除学生信息
								  char w[8]="";
								  //用于存储学生姓名
								  printf("请输入删除学生的姓名:");
								  scanf("%s",w);
								  int i=0;
								  for (int i=0;i<num;i++)
								  {
								   if(strcmp(w,arr[i])==0)
									  {
									  for (int j=i;j<num-1;j++)
									  {
									  strcpy(arr[j],arr[j+1]);
									  brr[j]=brr[j+1];
									  }num--;
									  
									  }
								  } if(i==num){
									  printf("查无此人\n");

								  
								  }
								   
								   }break;
							case 9:{

									   int all=0;
									   double avg;
								   for (int i=0;i<num;i++)
								   {
								    all += brr[i];
								   }
								   avg=(double)all/num;
								   printf("总成绩为%d,平均成绩为%lf",all,avg);

								   
								   }break;
							case 10:{
										int small;
										int big;
									printf("请输入一个范围:");
									scanf("%d%d",&small,&big);
									for (int i=0;i<num;i++)
									{
									if(brr[i]>=small&&brr[i]<=big)
									{
									printf("%s,%d\n",arr[i],brr[i]);
									}
									}
									
									
									}break;


						  } 
				
			   	}

			    }else {
				   printf("登录失败\n");

			   }
		   }
		   break;

	case 0:exit(0);//退出
	default:
		   printf("您输入的功能有误请重新输入:\n");
	
		}
	}		
	return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值