黑马程序员技术交流社区
标题: 今日的收获 [打印本页]
作者: 赵安庆 时间: 2016-5-7 00:42
标题: 今日的收获
/*
1. 思考一个问题
某公司 有3个销售小组.每1组有4个人.
将上个月的每一个人的销售成绩保存起来.
1). 声明12个变量.
2). 声明1个长度为12的数组.
int chengJi[12];
不好定位.第2组第2个人
3). 声明3个长度为4的数组.
int arr1[4];
int arr2[4];
int arr3[4];
4). 如果自己不是1个程序,是公司的秘书.
使用1个Excel表格来存储数据.
使用Excel表格来保存数据的优点
a. 相当直观.
b. 方便定位数据.
2. 天马行空.
C语言中是否有像Excel那样的有行有列的表格结构的数据呢?
可以不可以在内存中创建1个N行N列的1个表格.
二维数组就是这样的1个东西.
二维数组就是1个有行有列的1个表格.
我们声明1个二维数组,就相当于在内存中创建了指定行指定列的1个表格来存储数据.
3. 二维数组的声明.
1). 二维数组首先是1个数组.所以它符合数组的特点
a. 元素的类型相同.
b. 存储的数据的个数固定.
c. 方便管理数据.
2). 二维数组的独有的特点:
二维数组是1个有行有列的表格.
使用单元格来存储数据.
单元格就是二维数组的元素.
3). 声明二维数组的语法.
元素类型 数组名[行数][列数];
int arr[3][4];
表示在在内存中声明了1个二维数组,这个二维数组的名字叫做arr
这个二维数组表示1个3行4列的表格.
每1个单元格 就是这个二维数组的1个元素.
每1个元素的类型是int
4). 几个术语.
a. 元素: 元素就是这个表格的每1个单元格. 所以二维数组真正存储数据的是表格中的每一个单元格.
b. 下标: 元素的下标. 二维数组的每1个元素的下标有两个.
1个是行下标 1个是列下标.
c. 长度: 我们一般认为就是单元格的个数. 行 * 列
4. 如何往二维数组中存储数据?
1). 二维数组中真正存储数据的是表格中的每1个单元格.元素.
所以,在存储数据的时候 必须要确定 到底要存储到哪1个元素之中.
使用下标来确定二维数组中的元素. 二维数组的元素的下标有两个. 行下标 列下标.
二维数组名[行下标][列下标] = 数据;
int arr[3][4];
arr[1][2] = 100;
将100存储到arr数组的第1行的第2列的那个元素中.
2). 为二维数组的元素赋值的数据的类型要和元素的类型一致
否则就会做自动类型转换.
3). 行列下标请不要越界.
否则就有可能会造成程序崩溃的问题.
5. 如何从二维数组中取出数据
1).二维数组中真正存储数据的是表格中的每1个单元格.元素.
所以,你要取数据就要先确定到底要取那1个元素的数据.
通过下标来确定. 而二维数组的元素的下标有2个.
二维数组名[行下标][列下标];
2).行列下标不要越界.
6. 遍历二维数组的元素.
for(int i = 0; i < 行数; i++)
{
for(int j = 0; j < 列数; j++)
{
arr[j];
}
}
-------目前为止-------
1. 二维数组是个什么东西?
2. 声明
3. 存储数据
4. 取出数据和遍历.
作者: 赵安庆 时间: 2016-5-7 00:43
7. 使用二维数组要注意的地方.
1). 关于二维数组的行数和列数
a. 在声明二维数组的时候 必须要指定行数和列数.
b. 并且这个行数和列数: 可以是变量、常量、宏、表达式.也可以是1也可以是0
行数和列数不能是小数、负数.
2). 关于二维数组的元素的默认值.
如果我们声明1个二维数组 没有为这个二维数组的元素.
这个二维数组的元素是有值的 值是1个垃圾值.
8. 二维数组的元素的初始化.
1). 全部初始化.
a. 先声明,再使用下标来初始化.
b. 在声明的同时,就初始化数组的每一个元素. *****
int arr[3][4] =
{
{10,20,30,40},//第0行的数据
{50,60,70,80},//第1行的数据
{90,100,110,120}//第2行的数据.
};
里面的大括弧,就表示1行.
10 20 30 40
50 60 70 80
90 100 110 120
c. 上面这种方式初始化的时候.可以省略行数. ********
int arr[][4] =
{
{10,20,30,40},//第0行的数据
{50,60,70,80},//第1行的数据
{90,100,110,120}//第2行的数据.
};
根据大括弧的个数,编译器来自动确定行数.
d. 直接省略里面的大括弧.编译器根据行数和列数自动判断哪些属于哪1行的.
int arr[3][4] = {10,20,30,40,50,60,70,80,90,100,110,120};
e. 上面的那种初始化方式 可以省略行数.编译器根据列数和数据的个数自动计算行数.
int arr[][4] = {10,20,30,40,50,60,70,80,90,100,110,120};
2). 部分初始化.
a. int arr[3][4] = {{10},{20},{30}};
初始化指定行的数据. 那么其他的元素就会被自动初始化为0.
10 0 0 0
20 0 0 0
30 0 0 0
b. int arr[3][4] = {10,20,30,40,50}; *****
按照顺序去初始化每1个元素 其他的元素的值就会被自动初始化为0
10 20 30 40
50 0 0 0
0 0 0 0
c. int arr[][4] = {10,20,30,40,50};
省略行数,自动根据后面的元素的个数来计算行.
其他的元素自动初始化为0
10 20 30 40
50 0 0 0
d. int arr[3][4] = {[1]={10,20,30,40},[2]={50,60,70,80}};
给指定的行初始化,其他的元素自动初始化为0
0 0 0 0
10 20 30 40
50 60 70 80
e. int arr[3][4] = {[0][1] = 20, [1][3] = 60};
给指定的元素赋值.其他的元素自动初始化为0
0 20 0 0
0 0 0 60
0 0 0 0
9. 案例.
某公司 有3个销售小组.每1组有4个人.
将上个月的每一个人的销售成绩保存起来.
1). 找出销售之王.
2). 求每1组的平均销售成绩.
10. 什么时候要使用二维数组?
特点:有行有列的表格. 当你有类似于表格形状的数据的时候.就可以使用二维数组.
5 10
2D 地图的游戏.
*/
#include <stdio.h>
#define ROW 3
#define COL 4
int main(int argc, const char * argv[])
{
int arr[3][4] =
{
{45,67,78,12},
{78,14,56,15},
{78,12,101,4}
};
int sum = 0;
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 4; j++)
{
sum += arr[i][j];
}
printf("第%d组的平均销售成绩是:%d万\n",i+1,sum/4);
sum = 0;
}
// int max = INT32_MIN;
//
// for(int i = 0; i < 3; i++)
// {
// for(int j = 0; j < 4; j++)
// {
// if(arr[i][j] > max)
// {
// max = arr[i][j];
// }
// }
// }
//
// printf("销售之王的销售成绩是:%d万\n",max);
//int arr[][4] = {10,20,30,40,50,60,70,80,90,100,110,120};
//
// int arr[][4] =
// {
// {10,20,30,40},//第0行的数据
// {50,60,70,80},//第1行的数据
// {90,100,110,120}//第2行的数据.
// };
//
// int row = 3;
// int col = 4;
// int arr[3][4];
//
// arr[0][0] = 10;
// arr[0][1] = 20;
// arr[0][2] = 30;
// arr[0][3] = 40;
//
// arr[1][0] = 100;
// arr[1][1] = 200;
// arr[1][2] = 300;
// arr[1][3] = 400;
//
//
// arr[2][0] = 1000;
// arr[2][1] = 2000;
// arr[2][2] = 3000;
// arr[2][3] = 4000;
//
for(int i = 0; i < 3; i++)//外层循环控制行数.
{
for(int j = 0; j < 4; j++)
{
printf("%d\t",arr[i][j]);
}
printf("\n");
}
// printf("%d\n",arr[1][2]);
return 0;
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |