2026/1/1 9:16:37
网站建设
项目流程
徐州网站设计师,网站改版301设置,商务网站开发实训体会,网站商务建设实训的意义前言
你们的CMZ要趋势了#xff0c;所以她请来了她的“助理”其实就是AI来帮忙写作#xff0c;都懒得搞Markdown了
第三章终于开始写代码啦#xff01;
四、数据的容器——数组
一、初识数组
AAA小剧场——
A#xff1a;叮铃铃#xff01;上课啦#xff01;今天我们要学习…前言你们的CMZ要趋势了所以她请来了她的“助理”其实就是AI来帮忙写作都懒得搞Markdown了第三章·终于开始写代码啦四、数据的容器——数组一、初识数组AAA小剧场——A叮铃铃上课啦今天我们要学习一个非常重要的概念——数组。数组就像是一个可以存放多个相同类型数据的容器。想象一下如果你有100个学生的成绩需要存储难道要定义100个不同的变量吗T那太麻烦了我之前试过这样写intscore1,score2,score3,...,score100;光是定义变量就写了好长一行C老师我知道数组可以解决这个问题。数组的基本格式是数据类型 数组名[数组大小];比如int scores[100];这样就一次性定义了100个整型变量。A非常正确但是要注意数组的下标索引是从0开始的而不是1。所以scores[0]代表第一个元素scores[99]代表第100个元素。Q老师我有点懵…为什么从0开始计数呢S这个嘛和计算机内存的寻址方式有关。简单来说数组名代表数组第一个元素的地址而数组名索引值就能直接计算得到对应元素的地址。如果从0开始scores[0]的地址就是数组首地址0scores[1]的地址就是首地址1*元素大小这样计算起来更直接。二、数组的基本操作A让我们看一个简单的例子。假设我们要存储5个学生的成绩并计算平均分#includebits/stdc.husingnamespacestd;intmain(){intscores[5];// 定义一个可以存储5个整数的数组// 输入5个学生的成绩cout请输入5个学生的成绩endl;for(inti0;i5;i){cinscores[i];// scores[i]表示数组的第i1个元素}// 计算总分intsum0;for(inti0;i5;i){sumscores[i];// 累加每个学生的成绩}// 计算并输出平均分doubleaveragesum/5.0;cout平均分是averageendl;// 输出所有成绩cout所有成绩为;for(inti0;i5;i){coutscores[i] ;}coutendl;return0;}T我注意到一个细节在计算平均分时用的是sum / 5.0而不是sum / 5这是为什么呢C因为如果两个整数相除结果会向下取整变成整数。比如7/23而不是3.5。用5.0可以让除法变成浮点数除法得到正确的小数结果。三、数组的初始化A数组在定义时可以直接初始化。有几种不同的初始化方式#includebits/stdc.husingnamespacestd;intmain(){// 方式1完全初始化intarr1[5]{1,2,3,4,5};// 方式2部分初始化未指定的元素自动为0intarr2[5]{1,2,3};// arr2[3]和arr2[4]都是0// 方式3不指定大小让编译器自己计算intarr3[]{1,2,3,4,5};// 数组大小自动确定为5// 方式4所有元素初始化为0intarr4[5]{0};// 所有5个元素都是0// 错误示例不能这样写// int arr5[5];// arr5 {1, 2, 3, 4, 5}; // 错误只能在定义时这样初始化return0;}Q老师如果我想在程序运行过程中给数组的所有元素赋值该怎么办呢S那就要用到循环啦看我的例子#includebits/stdc.husingnamespacestd;intmain(){intarr[10];// 使用循环给数组赋值for(inti0;i10;i){arr[i](i1)*10;// 赋值10, 20, 30, ..., 100}// 输出数组for(inti0;i10;i){coutarr[i] arr[i]endl;}return0;}四、数组与循环的完美结合A数组和循环简直是天生一对让我们来看几个实际应用的例子。例子1寻找最大值#includebits/stdc.husingnamespacestd;intmain(){intn;cout请输入数字的个数;cinn;intnumbers[n];// 注意有些编译器可能不支持这种动态大小的数组// 更好的写法int numbers[1000]; 然后确保n不超过1000cout请输入n个整数endl;for(inti0;in;i){cinnumbers[i];}// 寻找最大值intmax_valuenumbers[0];// 假设第一个元素是最大的for(inti1;in;i){if(numbers[i]max_value){max_valuenumbers[i];}}cout最大值是max_valueendl;return0;}例子2数组逆序输出C老师我可以用数组和循环来实现倒序输出#includebits/stdc.husingnamespacestd;intmain(){intn;cout请输入数组大小;cinn;intarr[n];cout请输入n个整数endl;for(inti0;in;i){cinarr[i];}cout正序输出;for(inti0;in;i){coutarr[i] ;}coutendl;cout逆序输出;for(intin-1;i0;i--){// 注意从n-1开始到0结束coutarr[i] ;}coutendl;return0;}例子3统计各个分数段的人数T我想到一个实际的应用统计一个班级的成绩分布#includebits/stdc.husingnamespacestd;intmain(){intscores[10]{85,92,78,90,65,88,72,95,60,82};intcount[5]{0};// 0:优秀(90-100), 1:良好(80-89), 2:中等(70-79), 3:及格(60-69), 4:不及格(60)for(inti0;i10;i){if(scores[i]90){count[0];// 优秀人数1}elseif(scores[i]80){count[1];// 良好人数1}elseif(scores[i]70){count[2];// 中等人数1}elseif(scores[i]60){count[3];// 及格人数1}else{count[4];// 不及格人数1}}cout成绩分布情况endl;cout优秀(90-100): count[0]人endl;cout良好(80-89): count[1]人endl;cout中等(70-79): count[2]人endl;cout及格(60-69): count[3]人endl;cout不及格(60): count[4]人endl;return0;}五、数组的边界问题A非常重要的一点数组不能越界访问。C不会检查数组下标是否越界但如果访问了不属于数组的内存可能会导致程序崩溃或产生不可预料的结果。#includebits/stdc.husingnamespacestd;intmain(){intarr[5]{1,2,3,4,5};// 正确的访问for(inti0;i5;i){coutarr[i] ;}coutendl;// 危险的越界访问可能会导致程序崩溃// cout arr[5] endl; // arr[5]不存在最大下标是4// cout arr[-1] endl; // 负下标也是错误的// 同样越界赋值也是危险的// arr[10] 100; // 错误return0;}Q老师如果我确实不知道需要多大的数组怎么办A这时候可以定义一个足够大的数组然后用一个变量记录实际使用了多少#includebits/stdc.husingnamespacestd;intmain(){constintMAX_SIZE1000;// 定义最大容量intarr[MAX_SIZE];intn;// 实际元素个数cout请输入元素个数不超过MAX_SIZE;cinn;if(nMAX_SIZE){cout输入的数量太大endl;return1;// 非0返回值通常表示程序异常结束}cout请输入n个整数endl;for(inti0;in;i){cinarr[i];}// ... 其他操作return0;}六、字符数组A字符数组是一种特殊的数组用来存储字符串。在C中字符串实际上就是字符数组。#includebits/stdc.husingnamespacestd;intmain(){// 方式1字符数组charstr1[10]{H,e,l,l,o,\0};// \0是字符串结束标志charstr2[10]Hello;// 自动添加\0coutstr1endl;coutstr2endl;// 输入字符串charname[20];cout请输入你的名字;cinname;// 注意遇到空格会停止cout你好nameendl;// 使用循环处理字符数组charword[]Programming;intlength0;// 计算字符串长度不包括\0while(word[length]!\0){length;}cout单词\word\的长度是lengthendl;// 逆序输出字符串cout逆序输出;for(intilength-1;i0;i--){coutword[i];}coutendl;return0;}C老师我发现字符数组和普通数组有一点不同我们可以直接输出整个字符数组但不能直接输出整个整数数组。A观察得很仔细这是因为cout对字符数组有特殊处理它会一直输出字符直到遇到’\0’为止。而对于其他类型的数组cout只会输出数组第一个元素的地址。七、二维数组A有时候我们需要表格形式的数据这时候就需要二维数组了。想象一下一个班级的成绩表有多个学生每个学生有多门成绩。#includebits/stdc.husingnamespacestd;intmain(){// 定义一个3行4列的二维数组intmatrix[3][4];cout请输入3行4列的矩阵endl;// 输入二维数组for(inti0;i3;i){// 行循环for(intj0;j4;j){// 列循环cinmatrix[i][j];}}cout你输入的矩阵是endl;// 输出二维数组for(inti0;i3;i){for(intj0;j4;j){coutmatrix[i][j]\t;// 用制表符对齐}coutendl;// 每输出完一行换行}// 计算每行的和cout\n每行的和endl;for(inti0;i3;i){introw_sum0;for(intj0;j4;j){row_summatrix[i][j];}cout第i1行的和row_sumendl;}// 计算每列的和cout\n每列的和endl;for(intj0;j4;j){intcol_sum0;for(inti0;i3;i){col_summatrix[i][j];}cout第j1列的和col_sumendl;}return0;}T二维数组的初始化也和一维数组类似吧A是的可以这样初始化#includebits/stdc.husingnamespacestd;intmain(){// 二维数组初始化intarr1[2][3]{{1,2,3},{4,5,6}};// 也可以写成一行intarr2[2][3]{1,2,3,4,5,6};// 部分初始化未指定的为0intarr3[3][4]{{1},{2,3},{4,5,6}};// 输出arr3for(inti0;i3;i){for(intj0;j4;j){coutarr3[i][j] ;}coutendl;}return0;}课堂练习A现在我们来几个练习巩固今天学到的知识1.编写程序输入10个整数找出其中的最小值和最大值。2.编写程序输入一个字符串不超过100个字符统计其中字母、数字和其他字符的个数。3.编写程序输入一个5×5的矩阵计算两条对角线上的元素之和。作业作业编写程序输入n个学生的成绩n由用户输入存储到数组中然后计算平均分找出最高分和最低分统计及格≥60分的人数编写程序实现冒泡排序输入n个整数使用冒泡排序算法将它们从小到大排序后输出。提示冒泡排序通过多次比较和交换相邻元素来实现排序编写程序输入一个5×5的矩阵将其转置行列互换后输出。挑战题编写程序输入一个字符串判断它是否是回文正读反读都一样。例如“level”、radar是回文hello不是回文。下节预告A今天我们一起学习了数组这个强大的工具。下节课我们将学习函数它可以让我们的代码更加模块化、可重用。请大家提前预习函数的定义和声明参数传递值传递、引用传递返回值递归函数函数是结构化程序设计的基础也是减少代码重复的关键技术番外结语编程就像搭积木数组就是那一盒整齐的积木块循环就是你的双手一遍遍搭建心中的城堡函数将是你的蓝图让建筑有章可循指针会是你的魔法直接与内存对话对象则是你的团队分工合作各司其职算法乃是你的大脑思考最高效的路径调试便是你的耐心查找每一处不完美编程路上不孤单我们都是筑梦师一行代码一世界半屏程序半人生记住数组越界是程序员最常见的错误之一写循环时一定要仔细检查边界条件完结撒花✿✿ヽ(°▽°)ノ✿你就说这次撒的花多不多吧是不是比上次更详细更系统了快关注我学习更多编程知识没想到吧后面还有。不是快元旦了吗提前祝大家新年快乐最近要搞那什么元旦文艺汇演还有老师给的一堆作业所以懒懒的CMZ准备停更这一期毕竟字数要求太高了。好啦我们寒假再见本期课程暂时停更于2025/12/16作者放假日期为2026/1/31ヾ(▽)Bye~