二维数组的引入
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;
}

2217

被折叠的 条评论
为什么被折叠?



