课课通C语言(计算机类)(第2版)课件 第5章 数组_第1页
课课通C语言(计算机类)(第2版)课件 第5章 数组_第2页
课课通C语言(计算机类)(第2版)课件 第5章 数组_第3页
课课通C语言(计算机类)(第2版)课件 第5章 数组_第4页
课课通C语言(计算机类)(第2版)课件 第5章 数组_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课课通C语言(第2版)TALK第5章数组考纲要求★掌握一维数组与二维数组的定义、初始化和引用。★掌握常用算法(排序、查找、复制、移动、删除和插入等)的基本思想。★掌握矩阵的运算、转置、旋转和构造的基本思想。★重点掌握排序、查找等算法的基本思想。考纲要求LEARNINGOBJECTIVES数组基础构建深入掌握一维数组与二维数组的核心概念,包括其定义规范、初始化方式及元素的引用方法。常用算法思想系统掌握排序、查找、复制、移动、删除和插入等基础算法的逻辑框架与基本实现思想。矩阵核心操作重点理解矩阵的数学运算、矩阵转置、矩阵旋转以及特殊矩阵构造的底层逻辑与算法实现。核心重点突破本章节的重中之重是排序与查找算法,需深入掌握其时间复杂度分析与多种场景下的灵活应用。本章目录CONTENTS015.1一维数组的定义及初始化掌握一维数组的定义、初始化和引用,建立数组基本概念。025.2一维数组的应用一—排序掌握比较交换法、选择法、冒泡法、插入法等常用排序算法。035.3一维数组的应用二—查找深入理解并掌握顺序查找和折半查找算法的核心逻辑与实现。045.4一维数组的应用三—元素操作熟练掌握数组元素的复制、移动、删除和插入等基本操作。055.5二维数组的定义及初始化掌握二维数组的定义、初始化和引用,理解多维数据存储结构。065.6二维数组的应用一—极值与排序掌握二维数组的极值查找、行列排序以及数据移动等核心算法。075.7二维数组的应用二—矩阵操作深入学习矩阵的基本运算、矩阵转置以及顺时针/逆时针旋转操作。085.8二维数组的应用三—矩阵构成掌握利用循环结构构造特殊矩阵(如三角矩阵、对称矩阵)的方法。5.1一维数组的定义及初始化CHAPTER05/ARRAYLEARNING5.1一维数组的定义及初始化1.理解数组的概念。2.掌握一维数组的定义及初始化方法。3.掌握一维数组元素的引用方法。4.运用一维数组解决一些简单问题(如求最大值、求最小值、统计等)。5.1.1数组的概念核心定义:数组是若干具有相同数据类型变量的有序集合。▍核心特点共用同一名称

数组中所有元素共享一个数组名,便于统一管理。通过下标区分

使用非负整数下标来唯一确定集合中的某一个元素。内存连续存储

数组元素在内存空间中占据一片连续的存储单元。▍常见维数一维数组(Linear)

逻辑上呈线性排列,每个元素仅需一个下标即可确定位置(如a[0],a[1])。多维数组(Multi-dimensional)

每个元素需要多个下标确定,常见的有二维数组(矩阵形式)、三维数组等。5.1.2一维数组的定义与初始化📝数组定义格式类型说明符数组名[常量表达式];例:intscore[10];//定义一个包含10个int元素的数组⚠️核心规则:长度必须是“常量”数组的大小在编译时必须确定,不能使用变量作为长度。intn=5;intarr[n];//❌错误:n是变量,非常量⚙️三种初始化方式01完全初始化(AllValues)inta[5]={1,3,5,7,9};//5个元素一一对应02部分初始化(Partial)inta[5]={1,3};//未赋值元素自动补003省略长度(Inferred)inta[]={1,2,3};//长度由列表元素个数决定5.1.3一维数组元素的引用💡核心语法规则标准形式:数组名[下标表达式]📌下标构成:允许使用常量、变量或算术表达式进行计算⚠️有效范围:必须满足0≤下标<数组长度,否则触发越界错误🔄数组遍历最佳实践推荐使用for循环配合整型变量作为动态下标,实现对数组所有元素的有序访问。💡优势:逻辑清晰、执行效率高,是工程代码中最常用的遍历手段💻代码示例演示inta[5]={1,2,3,4,5};printf("%d",a[0]);//输出:1(第1个元素)a[2]=10;//修改第3个元素的值printf("%d",a[3]);//输出:4(变量/表达式均可)//使用for循环遍历数组所有元素for(inti=0;i<5;i++){printf("%d",a[i]);//输出:110345}例题解析【例5-1-2】:进制转换📝题目描述编写程序,将一个输入的十进制整数,通过算法逻辑转换为八进制整数。请阅读程序框架,补全关键代码。🧠核心思路:除基取余法循环取余:使用n%8计算余数,并将结果存入数组中。更新商值:执行n=n/8,作为下一次循环的被除数。逆序输出:从数组最后一个元素开始,反向遍历打印结果。💻关键代码填空do{

bin[k++]=n%8;//①取余存入数组

n=n/8;//更新商

}while(n);

for(j=k-1;j>=0;j--)//②逆序遍历

printf("%d",bin[j]);举一反三·思考拓展如果需要将程序功能修改为**十进制转二进制**,上述代码中哪些地方需要进行调整?5.2一维数组的应用——排序ARRAYSORTINGALGORITHMS数据有序化处理的核心逻辑,是构建高级算法的基石。5.2一维数组的应用——排序1.进一步理解一维数组的定义及初始化方法。2.熟练掌握一维数组的4种常用排序算法。3.运用一维数组的排序算法编程解决一些实际问题。5.2.2排序的方法01.比较交换法原理:每一轮用当前元素与后方所有元素比较,发现更小的元素则立即交换位置。特点:边比较边交换,交换次数多,算法整体效率较低。02.选择法排序原理:每一轮先找出当前范围内最小值的下标,遍历结束后,仅进行一次位置交换。特点:先比较后交换,大幅减少交换次数,算法效率相对较高。03.冒泡法排序原理:每一轮进行相邻元素两两比较,若顺序不对则交换,使较大的数逐渐“沉”到数组末尾。特点:形象如气泡上浮,过程直观但数据移动次数多,效率较低。04.插入法排序原理:将数组分为已排序和未排序区,每次从未排序区取一个元素,插入到已排序区的正确位置。特点:类似日常打牌理牌的逻辑,在数据基本有序时,排序效率较高。例题解析【例5-2-2】:选择法排序核心思路拆解Step1.外循环控制轮次遍历数组,确定每一轮要放置最小值的“目标位置”。Step2.内循环查找最小值从目标位置的下一个元素开始,找到本轮中的最小值下标min。Step3.交换元素将找到的最小值与当前轮次的起始位置元素进行交换。关键代码填空解析for(i=0;i<10;i++){min=i;//②假设当前位置是最小值for(j=i+1;j<10;j++)//③向后扫描比较if(a[min]>a[j])min=j;//④更新下标swap(a[i],a[min]);//执行交换操作}算法优势提示每轮排序最多只进行一次数据交换,显著减少了数据移动的次数,效率优于冒泡排序。5.3一维数组的应用二——查找SEARCHINGINONE-DIMENSIONALARRAYDATASTRUCTURE&ALGORITHMCOURSE5.3一维数组的应用二——查找1.进一步理解一维数组的定义及初始化方法。2.熟练掌握一维数组的查找算法。3.运用一维数组的查找算法解决一些实际问题。学习目标基础巩固深入理解一维数组的定义与内存存储结构,重点掌握静态初始化与动态初始化的具体语法规则及使用场景。算法核心熟练掌握一维数组的核心查找算法。透彻理解顺序查找(线性查找)的通用性,以及折半查找(二分查找)的高效性与适用条件。实战应用能够将理论知识转化为实践能力,运用数组查找算法解决成绩统计、数据检索、元素定位等实际编程问题,培养逻辑思维。5.3.1查找的定义查找(Search),又称为检索,是指从一组数据集合中,根据给定的条件,查找并获取一个或多个符合条件的数据项的过程。它是数据处理中最基本、最重要的操作之一,广泛应用于日常生活与计算机系统中。生活中的查找场景•在超市的货架上,根据商品名称寻找特定零食。

•在图书馆书架中,按分类号查找需要借阅的图书。计算机系统中的查找•在电脑文件夹中,通过文件名快速定位目标文档。

•使用文档编辑器的“查找”功能定位特定关键词。查找的核心关键:必须首先明确要查找的“目标”,即明确我们要寻找的数据项具体是什么样的(如特定的值、特定的特征)。5.3.2查找的方法顺序查找(SequentialSearch)▍核心原理从第一个元素开始,按顺序逐个与目标值比较,直到找到目标元素或查找完整个数组为止。▍算法特点实现逻辑简单,易于理解和编写代码。但在数据量较大时,平均查找效率较低。▍适用场景适用于任何数据结构,特别是数据量较小或未排序的数组。折半查找(BinarySearch)▍核心原理(分治法)1.取中间元素比较;2.目标小则查左半区,目标大则查右半区;3.重复直到找到或区间为空。▍算法特点利用“有序”特性大幅缩小查找范围,时间复杂度低,查找速度远快于顺序查找。▍适用场景仅适用于已排序的线性表(如有序数组),且数据需支持随机访问。例题解析【例5-3-1】顺序查找📝题目描述某校8名选手初赛成绩如下,查找并输出成绩在85分及以上者进入复赛的名单。学号:103231141123341219224108成绩:8286917390789689🎯筛选目标

遍历数组,筛选score[i]≥85💡核心思路分析给定的成绩数组是无序的,无法使用二分查找等高效算法。

因此,我们只能采用顺序查找(SequentialSearch)策略。执行流程:

1.循环遍历每一个元素

2.条件判断(≥85)

3.满足则输出对应数据💻C语言代码实现#include<stdio.h>

intmain(){

intnum[8]={103,231,141,123,341,219,224,108};

intscore[8]={82,86,91,73,90,78,96,89},i;

printf("学号\t成绩\n");

for(i=0;i<8;i++)

if(score[i]>=85)

printf("%d\t%d\n",num[i],score[i]);

return0;

}💡代码通过for循环实现顺序遍历,if语句进行条件判断,直观输出结果。例题解析【例5-3-2】折半查找📝题目描述给定一个已按升序排列的整数数组,请输入一个待查找的整数x,使用折半查找法判断x是否存在于数组中。要求输出查找结果:若找到,输出其下标;若未找到,输出提示信息。💡核心思路:利用数组有序特性,通过不断比较中间元素,将查找区间折半缩小,直到找到目标或区间为空。💻C语言代码实现#include<stdio.h>intmain(){inta[11]={11,12,13,14,15,16,17,18,19,20,21};intleft=0,right=10,mid,f=0,x;printf("请输入要查找的数x:");scanf("%d",&x);while(left<=right&&f==0){mid=(left+right)/2;//取中间位置if(x<a[mid])right=mid-1;elseif(x>a[mid])left=mid+1;elsef=1;//找到目标,置标志位}if(f==1)printf("找到,下标:%d\n",mid);elseprintf("未找到。\n");return0;}例题解析【例5-3-3】程序填空题目要求:输入一个整数,查找数组num中是否存在该数。若存在,输出其在排序后数组中的对应位置。#include<stdio.h>main(){

intlow=0,high,m,len=11,x;

intnum[11]={21,12,19,18,13,16,17,14,15,20,11};

//1.冒泡排序预处理

for(i=0;i<len-1;i++)

for(j=__①__;j<len;j++)//需填写内层循环起点

if(num[i]>num[j]){t=num[i];num[i]=num[j];num[j]=t;}

//2.折半查找核心逻辑

scanf("%d",&x);high=__②__;

m=(low+high)/2;

while(low<=high&&__③__){//查找终止条件

if(x>num[m])low=__④__;//调整查找区间

elsehigh=m-1;m=(low+high)/2;

}

if(low<=high)printf("Foundat:%d",m+1);

elseprintf("Notfound.");

}①冒泡排序·内层循环起点答案:i+1(从i的下一位开始比较交换)②折半查找·初始化上界答案:len-1(指向数组最后一个元素的下标)③循环持续·查找条件答案:x!=num[m](未找到目标值时继续循环)④区间调整·目标值偏大答案:m+1(在中点右侧的子区间继续查找)巩固练习-程序填空📝题目描述查找输入的数据x在数组num中是否存在。若存在,输出首次出现的索引位置;若遍历结束仍不存在,则输出“NoFound!”。#include<stdio.h>

#defineN8

main(){

intnum[N]={3,9,4,6,7,1,5,8},i=0,x;

printf("Inputaintnum:");

①;//请补全输入语句

while(num[i]!=x&&②)//请补全循环条件

i=③;//请补全循环变量更新

if(④)//请补全判断条件

printf("%dinposition%d.\n",num[i],i);

else

printf("NoFound!\n");

}💡参考答案解析①输入数据x:scanf("%d",&x)②循环边界条件:i<N(防止数组越界)③索引自增,遍历数组:i+1④判断是否找到(未越界):i<N巩固练习-程序改错01/题目代码(C语言)#include<stdio.h>

#defineN10

main(){

inta[N]={190,130,99,67,56,33,19,17,4,-3};

intleft=0,right=N-1,mid,f=0,x;

scanf("%d",&x);

while(left<=right&&f==0){

mid=(left+right)/2;

if(x<a[mid])right=mid-1;

elseif(x>a[mid])left=mid+1;

elsef=1;

}

//====错误位置====

if(f==1)printf("NotFound!\n");

elseprintf("x=%d,idx=%d\n",x,mid);

}02/核心错误分析排序逻辑矛盾数组是降序排列的,但代码逻辑是按升序写的。需互换比较符号的处理逻辑。输出条件写反f==1代表找到元素,应输出成功信息;f==0时才应输出“未找到”。03/关键代码修正//1.修正比较逻辑(降序)

if(x>a[mid]){

right=mid-1;//去左边找

}elseif(x<a[mid]){

left=mid+1;//去右边找

}elsef=1;------------------------

//2.修正输出条件

if(f==1){

printf("Found:idx=%d\n",mid);

}else{

printf("NotFound!\n");

}巩固练习-编程题03/顺序查找(Sequential)📝题目核心要求1.随机生成10个互不相同的两位正整数存入数组a。2.输入一个待查数x,使用顺序查找法遍历数组。3.若找到则输出下标位置;否则输出“NOFOUND”。💡核心逻辑:从头至尾逐一比对,“地毯式”搜索,无需预处理。04/折半查找(Binary)📝题目核心要求1.随机生成10个互不相同的两位正整数存入数组a。2.输入一个待查数x,使用折半查找法进行检索。3.若找到则输出下标位置;否则输出“NOFOUND”。⚠️必备前提:折半查找仅适用于有序数组。请务必在查找前对数组进行排序!5.4一维数组的应用三——数组元素的操作COPY·MOVE·DELETE·INSERTDATASTRUCTUREANDALGORITHMS5.4一维数组的应用二——数组元素的操作1.进一步理解一维数组的定义及初始化方法。2.熟练掌握一维数组元素的复制、移动、删除和插入等操作。3.运用一维数组元素的复制、移动、删除和插入等操作解决一些实际问题。5.4.1-5.4.4数组元素的操作复制操作(Copy)将源数组的所有元素,通过循环逐个赋值给目标数组的对应下标。for(inti=0;i<n;i++){b[i]=a[i];}平移操作(Move)将数组元素整体向左或向右平移指定位置,核心是防止数据被覆盖。向右移:从后往前移动(防覆盖)\n向左移:从前往后覆盖删除操作(Delete)核心逻辑是“覆盖”,用待删除位置后的元素依次向前填充,从而移除目标元素。1.找到待删下标p\n2.从p开始,执行b[i]=b[i+1]插入操作(Insert)核心逻辑是“腾位”,先将插入点后的元素后移,为新元素预留出位置。1.定位p,从数组末尾开始向前移\n2.新元素赋值给b[p],完成插入5.5二维数组的定义及初始化CHAPTER05/DATASTRUCTURE5.5二维数组的定义及初始化1.掌握二维数组的定义及初始化方法。2.掌握二维数组元素的引用方法。3.运用二维数组解决一些基本问题。5.5.1-5.5.3二维数组的定义、初始化与引用定义格式类型说明符数组名[M][N];//例如:intarr[3][4];核心参数解析:[M]:代表二维数组的行数[N]:代表二维数组的列数初始化方式01分行初始化(推荐)inta[2][3]={{1,2,3},{4,5,6}};02顺序初始化inta[2][3]={1,2,3,4,5,6};03部分初始化inta[2][3]={{1},{4,5}};//缺省补004省略行数(自动识别)inta[][3]={1,2,3,4,5,6};元素引用数组名[行下标][列下标]例如:arr[i][j]💡核心技巧:通常使用双重循环遍历二维数组。外层循环控制行,内层循环控制列。5.6二维数组的应用(一)极值·排序·移动DATASTRUCTURESANDALGORITHMS5.6二维数组的应用一——极值、排序和移动1.掌握二维数组的极值、排序和移动算法。2.运用二维数组的极值、排序和移动算法解决一些实际问题。例题解析【例5-6-1】:寻找鞍点💡核心解题逻辑STEP01.遍历每行找最大值逐行扫描二维数组,定位该行数值最大的元素,并记录其列下标`p`。STEP02.验证该列最小值锁定列下标`p`,遍历该列所有元素,判断之前找到的“行最大值”是否同时也是“列最小值”。STEP03.判定并输出结果若同时满足两个条件,即为鞍点并输出坐标与数值;否则继续循环检查下一行。C语言核心实现代码//遍历每一行寻找鞍点for(inti=0;i<M;i++){intp=0;//假设首元素为该行最大

for(intj=1;j<N;j++)

if(a[i][p]<a[i][j])p=j;

intis_saddle=1;//标记是否为鞍点

for(intk=0;k<M;k++)

if(a[k][p]<a[i][p]){is_saddle=0;break;}

if(is_saddle)printf("鞍点:a[%d][%d]=%d\\n",i,p,a[i][p]);}5.7二维数组的应用二

——矩阵操作MATRIXOPERATIONSWITH2DARRAY5.7二维数组的应用二——矩阵操作1.掌握矩阵相加、相减和相乘运

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论