【你不能错过的数组基础知识整理】(学习笔记9--数组下)
目录
- 一、二维数组
- 1.二维数组的定义
- 2.二维数组的初始化
- 3.二维数组元素的访问
- 4.二维数组作为函数参数
- 5.数组的数组
- 二、数组应用实例
- 1.数组排序
- 2.转置矩阵
前言
新星计划第三篇博文,整理不易,点赞支持一下吧!!!
一、二维数组
1.二维数组的定义
定义二维数组的格式
数据类型 数组名[整型常量表达式1][整型常量表达式2];
float score[3][4];
第一维的大小看成表格中的行数,第二维大小看成表格中的列数
二维数组的大小,即为元素的个数与元素大小的乘积,可以通过sizeof运算符来获得二维数组的大小
printf("Size of the score:%u Bytes.\n",sizeof(score));
结果:
Size of the score:48 Bytes.
二维数组在内存存储上属于线性存储方式,这是它的物理结构。而将二维数组视为有行有列的表格,这是它的逻辑结构,目标是更方便地对二维数组中的元素进行访问和管理
2.二维数组的初始化
(1)普通初始化方式
可以像一维数组的初始化一样,将表格中的所有成绩都放入初始值列表中
float score[3][4] = {88.5,86.5,95,87,68,70,98.5,92.5,75.5,69.5,96.5,84}
可以省略数组定义中的第一维大小,即采用空括号的形式,而由编译器根据初始化列表中初始值的个数来确定第一维的大小
float score[][4] = {88.5,86.5,95,87,68,70,98.5,92.5,75.5,69.5,96.5,84}
(2)行初始化方式
所谓行初始化方式,就是在初始值列表中,以行为单位,将对应的各行的初始值再次使用大括号括起来
float score[3][4] = {{88.5,86.5,95,87},{68,70,98.5,92.5},{75.5,69.5,96.5,84}}
这样做的好处是,编译器会严格依照初始值列表中的各个大括号来初始化二维数组中所对应的那一行中的数组元素,即编译器总会将第一对大括号中的初始值初始化给数组中第1行的数组元素,将第二对大括号中的初始值初始化给数组中第2行的数组元素,将第三对大括号中的初始值初始化给数组中第3行的数组元素
(3)指定初始化方式
第一个下标可以指定数组元素所对应的行,第二个下标可以指定数组元素所对应的列
float score[3][4] = {[0][1] = 86.5,[1][1] = 70,[2][1] = 69.5}
0 86.5 0 0
0 70 0 0
0 69.5 0 0
3.二维数组元素的访问
二维数组元素的访问格式:
二维数组名[下标1][下标2];
float f = score[0][1];//将第一行第二列的数组元素值赋给float类型变量f
score[2][2] = 99;//将第三行第三列的数组元素重新赋值为99
例:
#include <stdio.h>
int main()
{float score[3][4] = {{88.5,86.5,95,87},{68,70,98.5,92.5},{75.5,69.5,96.5,84}}//计算每个学生的总分和平均分float total;int i,j;printf("Student total and average scores:\n");for(i = 0;i < 4;++i)//循环各列{total = 0;for(j =0;j < 3;++j)total += score[j][i];printf("%d.total:%.2f,average:%.2f\n",i+1,total,total/3);}//计算每门课程的总分和平均分,依然使用total来累加同一行的各列成绩printf("Course total and average scores:\n");for(i = 0;i < 3;++i)//循环各列{total = 0;for(j = 0;j < 4;++j)total += score[i][j];printf("%d.total:%.2f,average:%.2f\n",i+1,total,total/4);}return 0;
}
Student total and average scores:
1.total:232.00,average:77.33
2.total:226.00,average:75.33
3.total:290.00,average:96.67
4.total:263.50,average:87.83
Course total and average scores:
1.total:357.00,average:89.25
2.total:329.00,average:82.25
3.total:325.50,average:81.38
4.二维数组作为函数参数
定义一个函数printScore,并将第一个形式参数s定义为二维数组类型,该函数的功能为打印形参s所对应的二维数组中的所有元素
void printScore(float s[][4],int len)
{for(int i = 0;j < len;++j)printf("%6.2f",s[i][j]);printf("\n");
}
结果:
88.50 86.50 95.00 87.00
68.00 70.00 98.50 92.50
75.50 69.50 96.50 84.00
5.数组的数组
就是二维数组,每一个元素是一个数组
二、数组应用实例
1.数组排序
编写程序,在数组中保存1~100的10个随机数,对数组进行升序排列,并将排序后的数组元素打印输出。
步骤:
1、定义数组
2、获取随机数
3、使用冒泡排序算法
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//冒泡排序
void bubbble(int a[],int len)
{int i,j,tmp;//外层循环会执行len-1次,表示共进行len-1轮的比较过程for(i = 0;i < len - 1;++i){/*内层循环用于完成每一轮的比较过程。它会从待排序序列中的第一个元素开始,逐个和后面的元素开始,逐个和后面的元素进行比较。另外,随着外层循环中i值的不断自增,表达式len-1-i会使内层循环的执行次数减少,这相当于每轮完成后的最大值元素从待排序序列中排除*/for(j = 0;j <len - 1 - i;++j){if(a[j] > a[j + 1]){tmp = a[j];a[j] = a[j + 1];a[j + 1] = tmp;}}}
}
int main()
{int i,arr[10];//设置随机数种子srand(time(NULL));//通过循环获取10个随机数,并将其保存到数组arr中for(i = 0;i < 10;++i)arr[i] = rand() % 100 + 1;//调用bubble函数进行,冒泡排序,参数1为数组arr,参数2为数组arr的长度bubble(arr,10);//打印输出排序后数组中的各元素值for(i = 0;i < 10;++i)printf("%d ",arr[i]);return 0;
}
结果:
12 21 53 56 57 74 76 79 81 90
由于程序中使用的是随机值,所以测试的时候和这不对是正常的,但结果必须是按升序排列的
2.转置矩阵
编写程序,对如下3行4列的矩阵实现转置,并将转置结果打印输出。
1 2 3 4
5 6 7 8
9 10 11 12
#include <stdio.h>
int main()
{//定义3行4列的二维数组,保存原始矩阵数据int raw_matrix[3][4] = {{1,2,3,4}{5,6,7,8}{9,10,11,12}};//定义4行3列的二维数组,用于保存转置后的新矩阵数据int new_matrix[4][3];int i,j;//进行转置矩阵for(i = 0;i < 4;++i)for(j = 0;j < 3;++j)new_matrix[i][j] = raw_matrix[j][i];//打印原始矩阵puts("Print raw matrix:");for(i = 0;i < 3;++i){for(j = 0;j < 4;++j)printf("%5d",raw_matrix[i][j]);puts("");}//打印转置后的新矩阵puts("Print new matrix:");for(i = 0;i < 4;++i){for(j = 0;j < 3 ;++j)printf("%5d",new_matrix[i][j]);puts("");}return 0;
}
结果:
Print raw matrix:
1 2 3 4
5 6 7 8
9 10 11 12
Print new matrix:
1 5 9
2 6 10
3 7 11
4 8 12
最后原始矩阵中的行变成了新矩阵中的列,而原始矩阵中的列变成了新矩阵中的行,完成了矩阵转置的功能
【你不能错过的数组基础知识整理】(学习笔记9--数组下)相关推荐
- Python基础知识_学习笔记(20200629更新)
Python学习笔记 本人跟随pythonav武老师视频课学习 侵权删! 瞎哔哔区: 2020-04-19:跟随武老师视频整理了第一版笔记,计划每周末都将这一周的学习笔记整理出来,供大家分享讨论 20 ...
- linux基础知识复习学习笔记
其实有些东西长久不用就会忘记 疫情期间被隔离在家,把一些基础再复习一下,希望自己能够加深记忆. #20220108-RPM 20220109-yum包管理 20220110-用户组 20220111- ...
- 《uniapp基础知识》学习笔记Day38-(Period2)全局文件一些常用的配置
如果进行开发的话,首先要配置路由页面 page.json 页面路由 pages.json 文件用来对 uni-app 进行全局配置,决定页面文件的路径.窗口样式.原生的导航栏.底部的原生tabbar ...
- 基础知识---汇编学习笔记
第一章 1.1 机器语言 电子计算机的机器指令是一列二进制数字.计算机将之转变成一列高低电平,以使计算机的电子器件受到驱动,进行运算. 1.2 汇编语言的产生 在这里我们发现一个问题:用0和1来描述程 ...
- html表单基础知识,【学习笔记】html基础知识第四更/与用户交互!(表单标签)...
使用表单标签--与用户交互 网站怎样与用户进行交互? 答案是使用HTML表单(form). 表单可以把浏览者输入的数据传送到服务器端,这样服务器端程序就可以处理表单传过来的数据. 语法: 讲解: 1. ...
- CGAL 基础知识(学习笔记)
文章目录 一.简介 二.鲁棒性 三.内核表示 四.谓语与构造 五.小结 参考资料 一.简介 CGAL,是一个C++计算几何算法库,其由三个主要部分组成.第一部分是内核(kernal),它由不变大小不可 ...
- python---pandas基础知识(学习笔记)
pandas是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.Pandas 纳入 了大量库和一些标准的数据模型,提供了高效地操作大型结构化数据集所需的工具. import panda ...
- centos7创建asm磁盘_Oracle ASM 磁盘组基础知识整理(收藏版)
为什么要写这么一篇基础知识呢?还是有那么一点点原因的,不是胡编乱造还真是有真实存在的事件的,前两周里因一套生产环境数据库磁盘不足无法对其进行表空间扩容,需要向存储岗申请存储资源,当存储岗划好资源加完存 ...
- Web前端基础知识整理
1. 前端基础知识 文件分类 XML(扩展标记语言) 装载有格式的数据信息,用于各个框架和技术的配置文件描述 特点: 扩展名为.xml 内容区分大小写 标签要成对出现,形成容器,只能有一个 标签按正确 ...
最新文章
- 改变gazebo背景颜色
- 2022 408 大纲变动
- liunx上安装nacos
- ggplot2绘图入门系列之二:图层控制与直方图
- 页面加载完后立刻执行JS的两种方法
- 几何画板200个经典课件_动态几何画板 Geogebra
- 11g新特性-自动sql调优(Automatic SQL Tuning)
- c语言随机抽取小程序_C语言整人小程序,慎用,谨记!
- jQuery框架学习第九天:jQuery工具函数介绍与使用
- rnn神经网络模型_ICLR 2019 | 与胶囊网络异曲同工:Bengio等提出四元数循环神经网络...
- 最新eclipse国内镜像站,比ustc等站点资源新。
- Ajax02 什么是json、json语法、json的使用、利用jQuery实现ajax
- 移动CMPP2.0封装
- 贾俊平统计学blog整理
- GooglePlay商店如何优化
- JS的Date函数Date方法的相关汇总
- Scipy 学习 第1篇:插补
- windows linux 共享鼠标,在Ubuntu/Windows下配置Synergy-键盘鼠标共享
- PHP实现word文档转html以及pdf
- STA(静态时序分析) 详解:如何计算最大时钟频率,以及判断电路是否出现时钟违例(timing violation)?