版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
任务4.1开发学生成绩管理系统(一)主讲:陈静教学目标知识目标1.理解数组的基本概念与特点,掌握一维数组的定义、初始化(完全/部分/不指定长度)及元素访问方法。2.掌握使用循环结构遍历数组的方法,理解数组下标从0开始及越界访问的危害。3.掌握数组作为函数参数的传递方式(地址传递),理解其与普通变量值传递的本质区别。能力目标1.能运用一维数组批量存储同类型数据,通过循环遍历实现数据的统计(平均分、最高分、最低分)。2.能将数组作为函数参数编写模块化程序,实现数组的排序、查找、反转等常见操作。3.能独立开发学生成绩管理系统,实现成绩输入、统计、排序和查询四大核心功能。素养目标1.培养"严谨务实"的工作态度,认真处理每一条数据,确保统计与计算结果准确无误。2.树立"开拓进取"的创新意识,在掌握基本功能基础上思考算法优化与效率提升。3.学习华罗庚先生脚踏实地、服务集体的精神,理解个体发展与集体协作的辩证关系。树立"开拓进取"的创新意识教学目标与重难点提示:难点需要重点突破,建议结合调试工具观察内存变化理解数组概念理解一维数组的基本概念和内存存储特点掌握定义初始化掌握一维数组的定义、初始化和元素访问方法循环遍历数组能够使用循环结构遍历数组元素函数参数传递理解数组作为函数参数的传递机制解决实际问题能够运用数组解决实际数据处理问题定义与初始化一维数组的定义与初始化方法访问与遍历数组元素的访问与遍历操作下标从0开始数组下标从0开始的索引机制,这是C语言数组的核心特性,也是初学者最容易出错的地方地址传递特性数组作为函数参数时的地址传递特性,理解传址与传值的本质区别目录一维数组的基本概念一维数组的定义与初始化数组元素的访问与遍历数组作为函数参数数组的常见操作任务实施——学生成绩管理系统010203040506一维数组的基本概念01一维数组的基本概念数组是相同类型数据元素的有序集合类型统一所有元素的类型必须相同连续存储各个元素在内存中连续存储,彼此相邻长度固定数组的长度在定义时即固定,无法动态改变下标访问访问元素时通过下标进行,且下标从0开始应用场景学生成绩温度记录字符序列课堂互动为什么不能为每个学生单独定义变量(score1,score2,...score50)?代码冗长需要定义50个变量名,重复代码量大,书写繁琐难以批量处理计算平均分、排序等操作无法通过循环统一实现维护困难扩展性差,学生人数变化时需大量修改代码数组如何解决?用一个数组名+下标即可统一管理,循环遍历高效处理一维数组的定义与初始化02一维数组的定义intscores[5];定义包含5个整数的数组floattemperatures[7];定义包含7个浮点数的数组charletters[26];定义包含26个字符的数组语法格式数据类型
数组名[数组长度];拓展要点命名规则数组名的命名规则和变量名相同,遵循标识符命名规则方括号含义方括号中的常量表达式表示元素的个数,即数组长度常量表达式限制常量表达式中可以包括常量和符号常量,不能包含变量一维数组的初始化1完全初始化intnumbers[5]={1,2,3,4,5};数组所有元素均被显式赋值,每个位置都有确定的初始值2部分初始化intvalues[5]={10,20};未显式初始化的元素自动置0,结果为[10,20,0,0,0]3不指定长度intdays[]={31,28,31,30,31,30,31,31,30,31,30,31};编译器自动计算数组长度,此处确定为12个元素4指定初始化器intarr[10]={[3]=5,[7]=9};C99特性:索引3和7初始化为指定值,其他元素自动为0训练项目7天温度数据一周温度数组浮点型数组使用float类型定义数组,存储带小数的温度数值完全初始化采用花括号{}在声明时一次性完成所有元素的赋值温度值列表23.5,25.0,22.8,24.1,26.3,25.5,23.9参考代码floatweek_temp[7]={23.5,25.0,22.8,24.1,26.3,25.5,23.9};存储周一至周日共7天的温度记录数组下标0-6对应每一天的数据访问动手实践,巩固一维数组初始化语法数组元素的访问与遍历03数组元素的访问访问语法数组名[下标]重要特性下标从0开始第一个元素的下标是0最后一个元素下标=长度-1数组长度为n时,末元素下标为n-1越界访问风险下标超出合法范围引发未定义行为数组元素索引与值映射访问示例scores[0]=85//访问第一个元素scores[2]=78//访问第三个元素scores[1]=95//修改第二个元素,原值92→95数组元素的遍历数组遍历过程示意循环变量i从0到size-1的迭代过程访问点遍历顺序越界边界遍历概念按照一定的顺序,依次访问数组中的每一个元素for(inti=0;i<size;i++){printf("学生%d:%d分\n",i+1,scores[i]);}遍历要点通常使用循环结构实现遍历逻辑,for循环最常用循环变量作为下标,从0开始自增,循环条件设置i<n到数组长度减1为止,防止越界⚠️
关键警告i<=n
会导致数组越界访问,引发程序错误课堂互动错误代码1234intarr[5]={10,20,30,40,50};for(inti=0;i<=5;i++){printf("%d\n",arr[i]);}问题分析循环条件i<=5会导致i取值为0,1,2,3,4,5当i=5时,arr[5]越界访问(数组只有arr[0]到arr[4])可能导致程序崩溃或输出错误数据修正方法1234intarr[5]={10,20,30,40,50};for(inti=0;i<5;i++){printf("%d\n",arr[i]);}边界条件对比错误i<=5访问arr[5]越界正确i<5仅访问arr[0]~arr[4]正确i<=4等效写法,同样安全数组作为函数参数04数组作为函数参数传递机制传递的是首元素地址非整个数组副本数组作为函数参数时,实际上传递的是数组首元素的地址,而不是整个数组的副本重要特性函数中对数组元素的修改会直接影响到原始数组形参可以写成数组形式intarr[]或指针形式int*arr,两者等价函数内部无法通过数组名直接获取数组大小,需额外传递长度参数函数原型格式数组形式返回值类型
函数名(数据类型arr[],int数组长度);指针形式返回值类型
函数名(数据类型*arr,int数组长度);两种写法完全等价数组作为函数参数函数定义float
calculate_average(intarr[],intsize){intsum=0;for(inti=0;i<size;i++){sum+=arr[i];}return(float)sum/size;}调用示例intscores[5]={85,92,78,96,88};intsize=sizeof(scores)/sizeof(scores[0]);floatavg=calculate_average(scores,size);printf("平均分:%.2f\n",avg);数组名作为参数传递首地址数组名在传参时自动退化为指向首元素的指针,函数内通过下标访问可遍历整个数组需额外传递数组长度size数组传参后无法获取原数组长度,必须通过第二个参数传入元素个数函数内可修改原数组元素由于传递的是地址,函数内部对数组元素的修改会直接影响原数组输出结果平均分:87.80数组的常见操作05数组的常见操作查找最大值int
find_max(intarr[],intsize){intmax=arr[0];//初始化:假设首元素最大for(inti=1;i<size;i++){//从第二个元素开始遍历if(arr[i]>max){//发现更大值max=arr[i];//更新最大值}}returnmax;}时间复杂度:O(n)—需遍历整个数组空间复杂度:O(1)—仅用单个变量存储查找最小值int
find_min(intarr[],intsize){intmin=arr[0];//初始化:假设首元素最小for(inti=1;i<size;i++){//从第二个元素开始遍历if(arr[i]<min){//发现更小值min=arr[i];//更新最小值}}returnmin;}时间复杂度:O(n)—需遍历整个数组空间复杂度:O(1)—仅用单个变量存储数组的常见操作数组反转voidreverse_array(intarr[],intsize){intstart=0;intend=size-1;while(start<end){inttemp=arr[start];arr[start]=arr[end];arr[end]=temp;start++;end--;}}双指针法:首尾交换,向中间靠拢冒泡排序voidbubble_sort(intarr[],intsize){for(inti=0;i<size-1;i++){for(intj=0;j<size-i-1;j++){if(arr[j]>arr[j+1]){inttemp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}}外层循环控制轮数,内层循环相邻比较交换1反转执行流程1初始化双指针:start指向首元素(0),end指向尾元素(size-1)2交换arr[start]与arr[end]的值,借助temp临时变量3start++右移,end--左移,向中间靠拢4当start≥end时停止,数组完成反转2冒泡执行流程1外层循环i控制排序轮数,共需size-1轮2内层循环j遍历未排序区间,范围逐轮缩小(size-i-1)3相邻元素比较:若arr[j]>arr[j+1]则交换位置4每轮将当前最大元素"冒泡"到正确位置训练项目编程练习训练项目定义数组定义一个包含10个整数的数组,为后续操作准备数据存储空间循环输入使用循环结构输入10个整数,掌握数组元素的批量录入方法调用函数调用函数计算并输出最大值、最小值和平均值,实现数据统计功能排序输出对数组进行排序后输出,巩固冒泡排序或选择排序算法的应用技术提示一使用
sizeof(arr)/sizeof(arr[0])
计算数组长度,提高代码通用性技术提示二复用本节课学习的查找函数和排序函数,避免重复造轮子任务实施:学生成绩管理系统06任务实施——学生成绩管理系统利用C语言数组批量存储和处理同类型数据的特点,设计学生成绩管理系统成绩输入从键盘依次获取每个学生的成绩,存入数组中成绩统计遍历数组,计算所有学生的平均分,并找出最高分和最低分成绩排序对数组中的成绩按从高到低的顺序进行排列成绩查询根据用户输入的学号(数组下标),输出对应学生的成绩任务实施——学生成绩管理系统===学生成绩管理系统===请输入5名学生的成绩:学生1:85学生2:92学生3:78学生4:96学生5:88原始成绩列表:学生1:85学生2:92学生3:78学生4:96学生5:88成绩统计:平均分:87.80最高分:96最低分:78任务实施——学生成绩管理系统排序后成绩(从高到低)学生1:96学生2:92学生3:88学生4:85学生5:78成绩查询示例请输入要查询的学号(1-5):
3学生3的成绩:88一维数组存储使用一维数组存储成绩数据,实现数据的集中管理与高效访问循环结构遍历通过循环结构实现数组遍历和批量输入,简化重复操作函数模块化设计采用函数封装核心功能,提高代码复用性与可维护性输入验证机制增加输入验证确保数据有效性,防止非法输入导致程序异常教学总结数组概念相同类型数据元素的有序集合,连续存储,下标从0开始数组定义数据类型
数组名[数组长度];数组初始化完全初始化、部分初始化、自动计算长度、指定初始化器元素访问通过下标运算符[]访问,注意避免越界数组遍历使用循环结构,循环条件为i<size函数参数传递数组首元素地址,需额外传递数组长度严谨务实:确保统计结果准确团队意识:从整体角度分析数据任务4.2开发学生成绩管理系统(二)主讲:陈静目录教学目标与重难点二维数组基础知识二维数组进阶操作任务实施与综合应用教学总结0102030405教学目标与重难点01教学目标知识目标掌握二维数组的基本概念、定义与初始化方法理解二维数组在内存中的存储方式与访问机制掌握二维数组作为函数参数的传递方法能力目标能够正确使用二维数组存储和处理表格数据能够运用嵌套循环遍历和操作二维数组能够开发基于二维数组的学生成绩管理系统素养目标培养"全面发展"的成长观念,从多维度评价学习情况树立"整体观念"的系统思维,统筹兼顾个体与集体教学重难点重点教学重点二维数组的定义、初始化与元素访问使用嵌套循环遍历二维数组二维数组作为函数参数的传递方法掌握声明语法、初始化方式及下标访问规则理解双重循环与行列索引的对应关系掌握形参声明格式及调用时的实参写法难点教学难点理解二维数组在内存中的行优先存储方式行优先vs列优先,地址计算与物理布局二维数组作为函数参数时列数必须指定的原因编译器需要列宽计算元素地址偏移量避免数组越界访问,防止程序崩溃边界检查、合法索引范围与调试技巧二维数组基础知识02二维数组的基本概念二维数组是"数组的数组",由行和列组成的表格结构,每个元素由行索引和列索引共同确定主要特点元素类型相同所有元素类型相同行优先存储内存中按行优先顺序连续存储行列固定行数和列数在定义时即固定双下标访问访问元素需通过行下标和列下标使用注意事项避免硬编码行列大小,建议使用#define或const定义常量严格检查数组索引是否越界,防止访问非法内存大型二维数组应考虑使用动态内存分配作为函数参数传递时必须指定列数二维数组的定义整型二维数组intmatrix[3][4];定义3行4列的整型数组,共12个元素,适用于存储整数矩阵数据成绩存储数组floatgrades[5][3];5行3列浮点型数组,存储5名学生3门课程的成绩,支持小数精度语法格式数据类型
数组名[行数][列数];行数与列数必须用常量或常量表达式指定,定义时确定数组的二维结构课堂互动请学生思考:如果要存储一个班级40名学生6门课程的成绩,应如何定义二维数组?二维数组的初始化按行初始化每行数据用大括号分组结构清晰直观连续初始化所有元素连续排列按行优先顺序存储部分初始化未赋值元素自动为0适用于稀疏矩阵场景省略行数编译器自动计算为3行列数必须显式指定intmatrix[2][3]={{1,2,3},{4,5,6}};intmatrix[2][3]={1,2,3,4,5,6};intmatrix[3][4]={{1},{2,3},{4,5,6}};intmatrix[][3]={{1,2,3},{4,5,6},{7,8,9}};二维数组元素的访问二维数组访问语法数组名[行下标][列下标]0行下标起始行数-1行下标上限列数-1列下标上限⚠越界警告重要特性行下标从0开始,最后一行下标=行数-1列下标从0开始,最后一列下标=列数-1越界访问将导致未定义行为或程序崩溃访问示例intgrades[3][2]={{85,90},{92,88},{78,85}};intscore1=grades[0][1];//访问学生1的第2门课成绩:90grades[1][1]=95;//修改学生2的第2门课成绩为95二维数组的遍历遍历原理使用嵌套循环依次访问每个元素,外层循环控制行下标,内层循环控制列下标遍历要点外层循环for(i=0;i<行数;i++)内层循环for(j=0;j<列数;j++)访问元素数组名[i][j]边界条件必须是
i<行数
和
j<列数,不能使用
<=训练项目二维数组遍历实践编写程序,定义一个3行4列的二维数组并初始化,使用嵌套循环输出所有元素的值代码框架提示://1.
定义intarr[3][4]并初始化//2.
外层循环i从0到2//3.
内层循环j从0到3//4.
输出arr[i][j]数组结构示意:[0][0][0][1][0][2][0][3][1][0][1][1][1][2][1][3][2][0][2][1][2][2][2][3]实践进度0%二维数组进阶操作03二维数组作为函数参数列数必须指定函数声明时必须指定列数,行数可省略编译器计算偏移编译器需要知道每行有多少元素才能计算偏移地址需额外传递参数函数内无法直接获取行数和列数,需额外传递函数原型返回值类型
函数名(数据类型数组名[][列数],int
行数,int列数);核心技术规范·语法高亮展示重要提示函数中对二维数组元素的修改会直接影响原始数组内存空间操作的是同一块内存空间,形参与实参共享数据二维数组的常见操作矩阵转置dest[j][i]=src[i][j]将矩阵的行和列互换矩阵加法result[i][j]=a[i][j]+b[i][j]两个矩阵对应元素相加矩阵乘法a的列数=b的行数result[i][j]为a的第i行与b的第j列的点积查找最大值及位置遍历所有元素记录最大值及其行列下标任务实施与综合应用04任务分析开发学生成绩管理系统,使用二维数组存储多名学生多门课程的成绩成绩输入从键盘输入每名学生的多门课程成绩学生统计计算每名学生的平均分、最高分、最低分课程统计计算每门课程的平均分、最高分、最低分成绩查询根据学号和课程号查询对应成绩成绩排序按学生平均分从高到低排序实施思路数据结构设计使用二维数组存储学生成绩数据grades[学生数][课程数]行—代表学生(第i行=第i个学生)列—代表课程(第j列=第j门课程)模块化设计input_grades()print_grades()student_statistics()course_statistics()search_grade()sort_by_average()六大功能模块构成完整系统架构关键技术嵌套循环遍历二维数组二维数组作为函数参数传递输入验证确保成绩在0-100之间程序实现要点输入成绩模块使用双重循环,外层控制学生,内层控制课程添加输入验证确保数据有效性学生统计模块对每行数据进行统计处理求和、找最大值最小值、计算平均分课程统计模块对每列数据进行统计处理求和、找最大值最小值、计算平均分排序模块先计算每个学生平均分使用选择排序按平均分降序排列,同时交换整行数据课堂互动问题一为什么二维数组作为函数参数时,列数必须指定而行数可以省略?作答区域问题二在成绩排序时,为什么需要同时交换整行数据,而不是只交换平均分?作答区域问题三如果要扩展系统功能,增加"查找某门课程不及格学生"的功能,应如何实现?作答区域教学总结05知识要点回顾二维数组本质数组的数组,按行优先顺序在内存中连续存储定义格式数据类型
数组名[行数][列数]四种初始化按行、连续、部分、省略行数元素访问数组名[行下标][列下标],下标从0开始遍历方式嵌套循环,外层控制行,内层控制列函数传递必须指定列数,需额外传递行数和列数矩阵转置矩阵加法矩阵乘法查找最大值素养提升全面发展观念二维数组用行和列全面反映每个学生的多门课程表现,启示我们不能只看某一门课的成绩,要追求多维度均衡发展教育意义:打破"单科优秀=优秀"的片面评价,建立立体化成长视角整体观念思维每一行代表个体的多维度表现,每一列代表群体在某一方面的整体水平既要关注个体的全面发展,也要关注集体的共同进步——这是核心素养中的系统思维与责任意识的体现知行合一在多维评价中树立整体观念与公平意识,成长为德才兼备的人才行动升华:将数据思维转化为价值判断能力,实现从"会算"到"会做人"的素养跃迁任务4.3开发学生成绩管理系统(三)主讲:陈静目录字符数组与字符串基础字符串数组的应用任务实施010203教学目标知识目标理解字符数组与字符串的概念及区别掌握字符数组的定义、初始化方法掌握字符串的输入输出函数使用能力目标能够使用字符数组存储和处理文本信息能够运用字符串处理函数解决实际问题能够实现字符串数组的排序与查询功能素养目标培养科学组织数据的逻辑思维树立责任担当的服务意识践行"知行合一"的编程实践精神教学重难点教学重点字符数组的定义与初始化方法掌握数组声明语法与多种初始化方式字符串的输入输出操作熟练运用scanf/printf及专用函数字符串数组的应用二维字符数组存储多组字符串数据教学难点字符串以空字符\0作为结束标志的理解隐含结束符对字符串长度与操作的影响fgets函数的安全使用及换行符处理缓冲区大小控制与换行符残留问题字符串排序算法的实现strcmp比较与交换逻辑的循环设计任务导入学生成绩管理系统:文本信息的存储与处理遇到的问题使用字符数组存储学生姓名"张三"时出现输出乱码无法正确比较姓名问题根源对C语言中字符数组和字符串的理解不足。C语言没有专门的字符串类型,而是使用字符数组表示字符串,以空字符\0作为结束标志课堂互动请同学们思考:为什么字符数组存储字符串时会出现乱码?如何避免?字符数组与字符串基础01字符数组的定义与初始化字符数组定义charstr[10];//定义可存储9个字符+1个结束符的字符数组方法1字符列表初始化charname1[6]={'Z','h','a','n','g','\0'};逐个字符列出,需手动添加结束符方法2字符串字面量初始化
★常用charname2[6]="Zhang";//自动添加'\0'编译器自动在末尾添加'\0',最常用方式方法3省略数组大小
★常用charname3[]="ZhangSan";//大小为10编译器根据字符串长度自动计算数组大小方法4部分初始化charstr[10]="Hello";//剩余元素为'\0'未显式初始化的元素自动置为'\0'字符串的输入输出字符串输入输出函数安全性对比scanf:存在缓冲区溢出风险fgets:安全输入(推荐)训练项目使用fgets安全输入学生姓名并正确输出printfprintf("%s\n",greeting);格式化输出,需手动添加换行符\nputsputs(greeting);自动添加换行,代码更简洁fgets安全输入fgets(name,sizeof(name),stdin);指定缓冲区大小,防止溢出,推荐使用for(inti=0;name[i]!='\0';i++)if(name[i]=='\n'){name[i]='\0';break;}换行符处理:去除末尾\n字符串数组的应用02字符串数组的定义方法1:二维字符数组charnames[5][20]={"张三","李四","王五","赵六","钱七"};内存布局连续分配5×20=100字节,每行固定20字节,可能产生内存碎片适用场景字符串长度相近、数据量固定、需随机访问方法2:指针数组char*cities[]={"北京","上海","广州","深圳","杭州"};核心特点各字符串长度灵活,指针数组存地址,字符串常量存储于数据区,节省内存适用场景字符串长度差异大、数据量动态变化、需灵活增删选择建议:字符串长度相近用二维数组,长度差异大用指针数组固定长度灵活长度连续存储离散存储VS字符串数组的操作1输入学生姓名使用fgets循环输入2去除换行符students[i][strcspn(students[i],"\n")]='\0';3按字母顺序排序使用strcmp比较、strcpy交换4输出排序结果循环输出排序后的姓名排序算法核心代码for(inti=0;i<count-1;i++){for(intj=i+1;j<count;j++){if(strcmp(students[i],students[j])>0){//交换字符串}}}训练项目编写程序,实现5名学生姓名的输入、按字典序排序并输出码上思悟小课堂数据有序,管理有方在系统开发中培养科学精神与责任意识关键素养科学组织的逻辑思维合理设计数组与字符串,保证数据存储的有序性与完整性责任担当的服务意识确保查询结果准确、排序规则清晰、系统运行可靠案例启示李小缘先生借鉴杜威十进分类法,研制中国特色图书分类工具,使万千册图书有序排列,读者可快速查找课堂互动如何将"追求有序、精准管理"的理念应用到学生成绩管理系统中?任务实施03实施思路系统升级目标基于学生成绩管理系统(一)(二)扩展存储学生姓名字符串类型存储,支持中文姓名管理按姓名查询成绩顺序查找算法实现姓名检索按姓名排序选择排序算法实现姓名字典序排列课程名称动态输入运行时动态指定课程名称,增强灵活性综合运用知识字符数组字符串处理函数选择排序顺序查找版本演进路径系统(一)基础结构系统(二)成绩计算系统(三)姓名管理任务分析序号功能模块详细说明1输入课程名称提示用户输入课程名称(语文、数学、英语)2录入学生成绩提示用户输入学生人数,依次录入姓名及各科成绩3输出成绩报告表格形式显示姓名、各科成绩及平均分4按姓名查询实现按姓名查询功能,输出该学生的各科成绩及平均分5按姓名排序实现按姓名排序功能,按字典序升序排序并输出核心数据结构学生结构体定义structStudent{charname[MAX_NAME_LEN];intscores[MAX_COURSES];};关键宏定义5MAX_STUDENTS30MAX_NAME_LEN3MAX_COURSES20MAX_COURSE_NAME结构体作用封装学生基本信息与成绩数据,实现数据聚合与类型安全访问字段含义name存储学生姓名(字符数组),scores存储多门课程成绩(整型数组)宏定义用途通过编译期常量控制数组边界,便于统一修改与内存预分配内存布局示意name[30]占30字节+scores[3]占12字节→单个Student结构体约44字节(考虑对齐可能为48字节)核心功能模块1输入学生信息input_student_info录入学生基本信息及各科成绩数据→2打印成绩报告print_grade_report输出格式化学生成绩单报表→3学生查询search_student按条件检索特定学生成绩信息→4按姓名排序sort_students_by_name实现学生记录按姓名字典序排列→5课程平均分calculate_course_averages统计计算各门课程的平均成绩input_student_info输入学生信息:实现学生姓名、学号及多门课程成绩的录入功能print_grade_report打印成绩报告:格式化输出学生成绩单,包含总分、平均分统计search_student查询学生成绩:支持按学号或姓名检索单个学生完整成绩信息sort_students_by_name按姓名排序:使用字符串比较算法实现学生记录字典序排列calculate_course_averages计算课程平均分:遍历统计全班各门课程的平均成绩数据按姓名排序实现冒泡排序实现voidsort_students_by_name(structStudentstudents[],intnum_students){
//外层循环:控制比较轮数for(inti=0;i<num_students-1;i++){//内层循环:每轮比较次数递减for(intj=0;j<num_students-i-1;j++){
//字符串比较:升序排列if(strcmp(students[j].name,students[j+1].name)>0){
//交换整个结构体structStudenttemp=students[j];students[j]=students[j+1];students[j+1]=temp;}}}}时间复杂度O(n²)稳定排序原地排序算法解析双重循环结构外层循环控制轮数(n-1轮),内层循环每轮比较次数递减,总比较次数为n(n-1)/2次结构体整体交换使用临时变量temp完成整个Student结构体的赋值交换,确保所有字段同步移动strcmp字符串比较返回值>0表示前字符串字典序更大,触发交换实现升序排列训练项目修改排序算法为降序排列,并测试验证结果思考提示:strcmp返回值如何变化?交换条件应如何调整?教学总结如何优化排序算法以提高效率?如何实现模糊查询功能?字符数组定义核心概念:字符数组是存储字符序列的数据结构关键特性:字符串以空字符\0结尾初始化方法字符列表初始化字符串字面量初始化省略大小初始化部分初始化输入输出输出:printf/puts输入:scanf/fgets推荐:fgets安全输入字符串数组方式一二维字符数组方式二指针数组处理函数strcmp—字符串比较strcpy—字符串复制strcspn—查找字符位置实践要点使用fgets安全输入,注意去除换行符字符串排序使用strcmp比较结构体整体交换实现排序任务4.4开发学生成绩管理系统(四)主讲:陈静目录教学目标与重难点任务导入字符串处理函数字符串处理应用案例任务实施教学总结010203040506教学目标与重难点01教学目标知识目标字符串函数掌握常用字符串处理函数的功能与用法核心原理理解字符串长度、复制、连接、比较、查找的原理安全处理了解安全字符串处理的重要性能力目标核心文本信息处理查询与排序安全编码能够使用字符串函数处理学生姓名等文本信息能够实现按姓名查询和排序功能能够编写安全的字符串处理代码素养目标严谨态度培养精准复制、公正比较的严谨态度诚信规范树立数据管理中的诚信与规范意识教学重难点常用字符串函数掌握
strlen()
、
strcpy()
、
strcat()
、
strcmp()等函数的基本语法与功能,能够正确计算字符串长度、复制字符串、连接字符串及比较字符串大小实际应用能力能够将字符串函数灵活运用于学生成绩管理系统的开发中,实现学生姓名的录入、查询、排序等核心功能,理解字符串操作与结构体数组的结合方法安全字符串处理理解strncpy、strncat等安全函数的使用场景,掌握缓冲区溢出的防范机制,能够根据目标缓冲区大小限制复制与连接的长度返回值理解与应用深入理解strcmp()返回值的含义(负数、零、正数分别代表小于、等于、大于),能够正确运用返回值进行条件判断与排序算法设计数据同步交换掌握按姓名排序时姓名与成绩的同步交换机制,理解结构体整体交换与成员分别交换的区别,确保排序后学生信息的一致性任务导入02任务导入1问题情境在开发学生成绩管理系统时,需要处理学生姓名、课程名称等文本信息→2遇到问题使用==运算符无法正确比较两个学生姓名输出学生信息时遇到格式问题→3问题根源C语言没有内置的字符串类型,而是通过字符数组和一系列标准库函数来处理字符串→4解决方向系统学习C语言中常用的字符串处理函数,掌握高效、安全的文本处理技术字符串处理函数03字符串处理函数概览函数功能示例安全等级strlen()获取字符串长度strlen("Hello")返回5安全strcpy()字符串复制strcpy(dest,src)风险strncpy()安全字符串复制strncpy(dest,src,n)安全strcat()字符串连接strcat(str1,str2)风险strncat()安全字符串连接strncat(str1,str2,n)安全strcmp()字符串比较strcmp(str1,str2)风险strncmp()安全字符串比较strncmp(str1,str2,n)安全strchr()查找字符首次出现位置strchr(str,'a')安全strstr()查找子串首次出现位置strstr(str,"abc")安全字符串长度与复制函数strlen()获取字符串长度计算字符串长度(不包括结束符'\0')charname[]="Alice";intlen=strlen(name);//返回5strcpy()字符串复制将src字符串复制到dest(包括结束符),存在缓冲区溢出风险charsrc[]="Hello";chardest[10];strcpy(dest,src);//dest内容为"Hello"strncpy()安全字符串复制复制最多n个字符,需手动确保结束符charsrc[]="Thisislongtext";chardest[10];strncpy(dest,src,sizeof(dest)-1);dest[sizeof(dest)-1]='\0';//确保结束符字符串连接与比较函数strcat()字符串连接功能:将src字符串追加到dest末尾示例代码charstr1[20]="Hello";charstr2[]="World!";strcat(str1,str2);//str1变为"HelloWorld!"注意:存在缓冲区溢出风险strncat()推荐安全字符串连接示例代码chardest[20]="Hello";charsrc[]="World,howareyou?";strncat(dest,src,7);//dest变为"HelloWorld"安全方案:限制最大追加长度功能:追加最多n个字符,防止缓冲区溢出strcmp()字符串比较功能:按字典序比较两个字符串返回值解读<0str1<str2=0str1==str2>0str1>str2示例代码intresult=strcmp("apple","banana");//返回负数(a<b)字符串查找函数strchr()正向查找//查找字符首次出现char*strchr(constchar*str,intc);//返回指向第一次出现位置的指针查找方向→正向strrchr()反向查找//查找字符最后出现char*strrchr(constchar*str,intc);//返回指向最后一次出现位置的指针查找方向←反向strchr()正向查找从字符串起始位置开始向后扫描,返回字符c在字符串str中首次出现的位置指针;若未找到则返回NULLstrrchr()反向查找从字符串末尾位置开始向前扫描,返回字符c在字符串str中最后出现的位置指针;若未找到则返回NULL示例可视化字符串:"Hello"查找字符:'l'Hello↑strchr指向第一个'l'↑strrchr指向第二个'l'字符串处理应用案例04字符串长度与复制实现my_strlen()实现size_tmy_strlen(constchar*str){size_tlen=0;while(*str!='\\0'){len++;str++;}returnlen;}通过指针遍历字符串,遇到结束符
'\0'
停止,累计字符个数my_strcpy()实现char*my_strcpy(char*dest,constchar*src){char*start=dest;while(*src!='\\0'){*dest=*src;dest++;src++;}*dest='\\0';returnstart;}逐字符复制源字符串到目标地址,最后补结束符,返回目标首地址strlen()执行流程str指向首字符len=0*str!='\0'?是:len++,str++*str=='\0'?返回lenstrcpy()执行流程保存start=destsrc指向源串*src!='\0'?*dest=*src,双指针++*src=='\0'?*dest='\0',返回start字符串比较与反转my_strcmp()字符串比较intmy_strcmp(constchar*str1,constchar*str2){while(*str1&&(*str1==*str2)){str1++;str2++;}return*(unsignedchar*)str1-*(unsignedchar*)str2;}逐字符比较过程演示str1apple"apple"===≠—str2banan"banana"发现'l'≠'a',返回差值(108-97=11>0,表示str1<str2)比较逻辑相等时继续:当前字符相同则指针同步后移不等时返回:返回两字符ASCII差值遇
'\0'
终止,返回最后差值双指针交换原理头尾指针:str
指向首字符,end
指向尾字符向中间移动:交换后
str++、end--,直到相遇交换示意"Hello"→"olleH"str→Hello←endo↕交换后指针内移单词计数与字符串分割单词计数函数1234567891011121314intcount_words(constchar*text){intcount=0;intin_word=0;while(*text){if(isspace(*text)){in_word=0;}elseif(!in_word){in_word=1;count++;}text++;}returncount;}字符串分割函数123456789101112131415161718192021voidsplit_string(constchar*str,chardelimiter){charbuffer[100];intindex=0;while(*str){if(*str==de
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 扶梯动图素材课件
- 发送2026年市场推广计划通知函5篇
- 事业单位综合岗面试易错题专项考题2026试卷及解析
- 建筑行业施工进度监测与控制指导书
- 服饰招商bd述职课件
- 零售店店长销售业绩与团队管理发展考核表
- 防晒衣讲解课件
- 网络游戏用户体验评估表
- 软件开发工程师代码管理标准管理员绩效考核表
- 防晒衣封面图课件
- 人力资源薪酬绩效主管笔试题及答案
- 2025年陕煤澄合矿业有限公司招聘(570人)笔试备考题库附答案解析
- 脐灸面碗灸课件
- 2025年西藏自治区中考化学真题
- 119全国消防日班会《掌握消防技能安全守护有我》课件
- 第8章浓度极化
- GB/T 4995-2025平托盘性能要求和试验选择
- 学堂在线 现代生活美学-花香茶之道 章节测试答案
- 大学生职业规划大赛《环境艺术设计专业》生涯发展展示
- 石油开采合作合同三篇
- 1输变电工程施工质量验收统一表式(线路工程)-2024年版
评论
0/150
提交评论