C语言程序设计案例教程(四)ppt.ppt_第1页
C语言程序设计案例教程(四)ppt.ppt_第2页
C语言程序设计案例教程(四)ppt.ppt_第3页
C语言程序设计案例教程(四)ppt.ppt_第4页
C语言程序设计案例教程(四)ppt.ppt_第5页
已阅读5页,还剩128页未读 继续免费阅读

下载本文档

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

文档简介

Date March26 2020 C语言程序设计案例教程 四 Date March26 2020 第五章C语言程序设计常用算法 冒泡排序 授课要点 冒泡排序的思想及实现排序算法的应用 假设您是一位营养师 有顾客向您索取一份减肥菜谱 前提条件 您熟悉各种食物的热量 问题 保持身材之道 列出各种食物的热量对各种食物的热量进行排序选择热量低的食物 问题分析 问题解决 冒泡排序 排序过程 假设元素存放在a 0 a n 1 中 按递减排序 1 比较第一个数与第二个数 若为逆序a 0 a 1 则交换 然后比较第二个数与第三个数 依次类推 直至第n 1个数和第n个数比较为止 第一趟冒泡排序 结果最小的数被安置在最后一个元素位置上 2 对前n 1个数进行第二趟冒泡排序 结果使次小的数被安置在第n 1个元素位置 3 重复上述过程 共经过n 1趟冒泡排序后 排序结束 冒泡排序算法过程 采用两重计数型循环 步骤1 将待排序的数据放入数组中 步骤2 置i为0 步骤3 让j从0到4 i 比较a j 与a j 1 如果a j a j 1 位置不动 如果a j a j 1 位置交换 即temp a j a i a j 1 a j 1 temp 步骤3结束后a 5 i 中的数为最小的数步骤4 让i i 1 只要i 4就返回步骤3 将a 5 i 的值排好 当i 5时执行步骤5步骤5 输出排序结果 冒泡排序算法分析 includevoidmain 主函数 inti j temp a 6 整型变量 for i 0 ia i 1 temp a j 让a i 与a i 1 交换 a j a j 1 a j 1 temp 循环体结束 printf 食物按热量从高到低的顺序显示为 n for i 0 i 5 i 输出排序结果 printf d n a i 格式输出a i 若将题目改为按从小到大的顺序输出 如何修改程序 若排序的个数由用户指定 如何修改程序 小组讨论并总结 在数组排序的基础上 进一步将一个数据插入一个有序数组中 学生进阶练习 问题分析 提示 数据初始化 输入 排序 输入待插入数据找到待插入位置将待插入位置空出插入数据输出结果 includevoidmain 主函数 inti j temp a 6 x 定义整型变量 for i 0 ia j 1 如果a i a i 1 temp a j 让a i 与a i 1 交换 a j a j 1 a j 1 temp 循环体结束 for i 0 ia i 循环查找插入的位置 i for j 5 j i j 循环实现元素后移 a j 1 a j a i x 插入元素x printf 插入后的序列是 n for i 0 i 6 i 输出排序结果 printf d n a i 格式输出a i 实现 寻找你身边的一个实际问题 编写解决问题的程序 用到冒泡排序 例如 有N个国家参加运动会 从键盘输入代表各国运动队的国名 国名用英文名 和出场秩序名单 然后按出场名次从小到大的顺序输出各运动队的国名 学以致用 完成 学生成绩管理系统 的 排序 功能 按成绩从高到低的顺序显示按学号从小到大的顺序显示完成 学生成绩管理系统 的 信息插入 功能 作业 每人必做 学以致用 到网上搜索资料 找出日常生活中会用到排序的例子 用C语言实现 例如 可以搜索一些大学图书馆的藏书量 然后按照递增或递减的顺序输出 作业 小组必做 Date 2020年3月26日星期四 第四章模块化程序设计 授课要点 数组元素作函数参数数组名作函数参数 n 0m 0k 0 a和b为有10个元素的整型数组比较两数组对应元素变量n m k记录a i b i a i b i a i k 认为数组a b若n k 认为数组a b若n k 认为数组a b 数组元素作函数参数和普通变量作函数参数效果和用法一样问题1 假设有两个整型数组 试编程实现数组间关系 大于 等于或小于 的输出 问题1解决方案 模仿练习 1 把8 9 5 8 6 4 2 8和9 6 2 3 6 2 1 3这两组数保存在两个一维数组中 主函数实现 再把两个数组对应元素的值相减后 自定义函数实现 显示出来 主函数实现 2 实现两个整型变量的值的互换 假设两个整型变量是一个长度为2的整型数组的元素 模仿1答案 includeintsub intx inty voidmain inta 8 9 5 8 6 4 2 8 intb 9 6 2 3 6 2 1 3 intresult i for i 0 i 8 i result sub a i b i printf d n result intsub intx inty returnx y includevoidswap2 intx inty intz z x x y y z main inta 2 1 2 swap2 a 0 a 1 printf a 0 d na 1 d n a 0 a 1 值传递 模仿2答案 授课要点 数组元素作函数参数数组名作函数参数 模仿1改进 includevoidsub intx inty intn voidmain inta 8 9 5 8 6 4 2 8 intb 9 6 2 3 6 2 1 3 sub a b 8 voidsub intx inty intn inti result for i 0 i n i result x i y i printf d n result 问题2 定义一个函数 求全班学生的某门课程总分 并将总分返回到主函数中输出 问题2解决 自定义函数求总分 intsum intstu intn inti inttotal 0 for i 0 i n i total stu i returntotal 形参用数组定义 intstu n为数组长度 includefloatsum intstu intn voidmain intscore 10 i inttotal printf Input10scores n for i 0 i 10 i scanf d intsum intstu intn inti inttotal 0 for i 0 i n i total stu i returntotal 实参用数组名 问题2解决 形参用数组定义 intstu 数组名作函数参数总结 地址传递在主调函数与被调函数分别定义数组 且类型应一致 实参用数组名 形参用数组定义形参 实参数组名是地址变量 模仿练习 1 实现两个整型变量的值的互换 假设两个整型变量是一个长度为2的整型数组的元素 2 在主函数输入8个整数保存到数组中 自定义函数对数组元素排序 并在主函数中将排序后的数组输出 3 在主函数输入10个整数保存到数组中 分别定义三个函数求和 平均值和最大值并返回到主函数输出 includevoidswap2 intx intz z x 0 x 0 x 1 x 1 z main inta 2 1 2 swap2 a printf a 0 d na 1 d n a 0 a 1 地址传递 模仿1答案 小组讨论并总结 数组元素作函数参数时 实参和形参间的传递方式是什么 数组名作函数参数时 实参和形参的写法有什么不同 数组元素作函数参数是 实参与形参间发生值传递 结论1 数组名作函数参数时 实参和形参间发生地址传递 在主调函数与被调函数分别定义数组 且类型应一致 形参数组大小 多维数组第一维 可不指定 形参数组名表示地址 结论2 学以致用 寻找你身边的一个实际问题 用到数组名作函数参数 例如 定义一个函数 实现10个同学身高的比较 从中找出最高身高 并返回到主函数中输出 作业 每人必做 将 学生成绩管理系统 中的 学生 变量定义成结构体数组 学生信息的输入 输出代码做出相应的修改 Date 2020年3月26日星期四 第四章模块化程序设计 二维数组 授课要点 二维数组的定义和引用二维数组的初始化和赋值二维数组的简单应用 问题1 有如下表 在C程序中如何表示和存储 假定某班有3名学生期末考试共5门课程 要求输入每名学生各门成绩 计算出每名学生的总分并输出 问题2 以上两个例子有什么共同之处 分析 1 每行都是4个整数 类型一致2 每名学生都有5门课程 成绩类型一致 问题解决 二维数组 如何定义二维数组 如何为数组元素赋值 如何引用数组元素 二维数组的定义和引用 二维数组 有两个下标的数组类型说明符数组名 常量表达式1 常量表达式2 例如 inta 4 4 数组元素的存放顺序原因 内存是一维的二维数组 按行序优先 行数 列数 元素个数 行数 列数 二维数组理解 每个元素a i 由包含4个元素的一维数组组成 二维数组a是由3个元素组成 因此 二维数组中的每一行 相当于一个一维数组 或者说 一维数组是由多个简单变量组成 而二维数组是由多个一维数组组成 二维数组的初始化 二维数组元素的初始化分行初始化 定义一二维数组 存放下表数据 模仿练习 数组的赋值只能对数组元素单独操作 不能对数组整体操作 赋值的两种方式 inta 5 4 赋值运算符如 a 3 0 8 输入函数如 for i 0 i 5 i for j 0 j 4 j scanf d 单独为每个元素赋值对数组的整体赋值只能在初始化时进行 二维数组的赋值 二维数组的遍历 数组的遍历一般用二重循环实现注意下标的取值范围 不能越界 编译系统对下标的越界不做检查 假定某班有3名学生期末考试共5门课程 要求输入每名学生各门成绩 计算出每名学生的总分并输出 问题2 includevoidmain inta 3 6 i j for i 0 i 3 i a i 5 0 为每位学生的总分赋初值0 for i 0 i 3 i 控制多少学生 多少行 printf 请输入第 d个学生5门课程成绩 i 1 for j 0 j 5 j 控制每个学生的课程 每行的列 scanf d 假设第i个学生的学号为i 问题2解决 定义3行6列的二维数组存放学生每门课程成绩和总分 每行的最后一列存放总分 学生模仿练习 1 定义一个二维数组存放如下图形 并输出 1234513579543213 某班 假设有2人 期中考试3门成绩 1 从键盘输入每个学生成绩 2 求每个学生的总分和平均分 3 按每个学生的总分求出最高分 小组讨论并总结 如何保证数组不越界 有二维数组 inta 5 5 其中a 0 a 1 a 2 a 3 a 4 表示什么 结论1 保证数组不越界 C语言编译系统并不检查数组是否越界 它只给已定义的数组元素分配内存 超过的部分则依次往后排 至于那些位置的用途是什么 系统是不管的 读出那些单元一般不会出问题 但如果往那里面写入数据会导致不可预料的错误 时刻注意数组的起始元素下标值和最后元素的下标值 结论2 二维数组中a 0 a 1 a 2 a 3 a 4 表示什么 a 0 为二维数组a的第1行起始地址a 1 为二维数组a的第2行起始地址a 2 为二维数组a的第3行起始地址a 3 为二维数组a的第4行起始地址a 4 为二维数组a的第5行起始地址因此 二维数组中的每一行 相当于一个一维数组 或者说 一维数组是由多个简单变量组成 而二维数组是由多个一维数组组成 学以致用 寻找你身边的一个实际问题 用到二维数组 例如 编写程序实现功能 求一个3 4矩阵的所有靠外侧的元素值之和 设矩阵为 38910a 25 3570 14 作业 每人必做 将 学生成绩管理系统 中的 学生 变量定义成数组 学生信息的输入 输出代码做出相应的修改 Date 2020年3月26日星期四 第四章模块化程序设计 授课要点 字符数组的定义及初始化字符串的定义及初始化字符串处理函数 如何在屏幕上显示如下信息 abcdefghij 问题 字符数组的定义 char字符数组名称 字符数组的长度 特点 字符数组的每个存储单元只能存储1个字符 如 charstr 10 则 数组str中可以存放10个字符 假设存入的字符分别为 a b c d e f g h i j 则这组字符在内存的存储可能如下 str 字符数组的初始化 与一维数组的初始化类似 我们也可以在定义字符数组的同时就对它进行赋值 即初始化 如 chars 5 a b c d e 则 数组元素在内存中的存储如下 s 数组名s是常量 代表数组所占内存单元的首地址 字符串的定义及初始化 字符串是用一对双引号括起来的字符序列 双引号中可以是一个字符 也可以是多个字符 在C中 没有专门的字符串变量 它只能通过字符数组来进行操作 可用如下形式定义一个字符串charstr1 10 hellotom 字符串在内存中的表示 在C中 每个字符串的末尾系统都会自动加上一个特殊字符 0 以方便进行字符串处理 0 是字符串结束标记 如上面定义的字符串charstr 12 hellotom 在内存中的存储如下 str 数组名str是常量 代表数组所占内存单元的首地址 字符串的输入与输出 1 用printf和scanf来进行输入输出 includemain myfunc myfunc charstr 100 定义一个较大的字符数组用来存储字符串printf Inputastring n scanf s str printf thestringis n printf s str 字符串的输入与输出 2 用gets和puts来进行输入输出 includemain myfunc myfunc charstr 100 定义一个较大的字符数组用来存储字符串printf Inputastring n gets str printf thestringis n puts str 小组讨论并总结 gets和scanf输入字符串时的差别 puts和printf输出字符串的差别 gets和scanf输入字符串时的差别 gets是能够接收到空格的字符串 到回车字符为止 scanf不能接收空格 一般遇到空格或回车即停止 如在执行时输入字符串 IwanttolearnClanguagewell 用gets可以接收所有字符串 用scanf只能接收I 故 对于字符串的处理常用字符串处理函数来操作 puts和printf输出字符串的差别 puts在输出字符串时 遇到 0 会自动终止输出 并且将 0 转换为 n 来输出 而printf在输出字符串时 遇到 0 只是终止输出 并不会将 0 转换为 n 来输出 观察以下代码的运行结果 voidmain chars hello puts s puts s printf s s printf s s 字符串处理函数 1 输入函数 gets语法形式 gets str str为已定义好的字符数组 功能 从键盘接收一个字符串 存储到数组str中 并在末尾自动添加上字符串结束标志 0 2 输出函数 puts语法形式 puts str str为已定义好的字符数组 功能 输出字符串str的内容 并将字符串结束标志 0 转换成 n 输出 模仿练习 从键盘输入一个字符串 输出该字符串 字符串处理函数 3 求字符串长度函数 strlen语法形式 strlen str str为已定义好的字符数组 功能 求字符串str的有效元素的个数 不包括 0 在内 如 charstr 100 study intlength length strlen str printf d length 则输出为 5 要注意字符串的长度与数组的长度的区别 模仿练习 从键盘输入一个字符串 求该字符串的长度 字符串处理函数 4 字符串连接函数 strcat语法形式 strcat strSource strTarget strSource和strTarget为已定义好的两个字符数组 功能 将字符串strTarget连接到strSource字符串的尾部 并在新串末尾自动添加 0 如 charstrSource 100 study charstrTarget 20 CLanguage strcat strSource strTarget puts strSource 则输出为 studyCLanguage 模仿练习 从键盘输入两个字符串保存到数组a b中 将字符串b连接到字符串a的末尾 然后输出连接后的字符串 字符串处理函数 5 字符串拷贝函数 strcpy语法形式 strcpy strSource strTarget strSource和strTarget为已定义好的两个字符数组功能 将字符串strTarget拷贝到strSource字符串中 如 charstrSource 100 study charstrTarget 20 CLanguage strcpy strSource strTarget puts strSource 则输出为 CLanguage 模仿练习 从键盘输入一个字符串保存到数组a中 定义字符串b 其值与字符串a相同 然后输出a b两个字符串 字符串处理函数 6 字符串比较函数 strcmp语法形式 strcmp str1 str2 str1和str2为已定义好的两个字符数组 功能 将str1与str2进行比较 若str1大于str2 则返回正值 若str1与str2相等 则返回0 若str1小于str2 则返回负值 如 charstr1 20 study charstr2 20 student intresult result strcmp str1 str2 printf result d result 则输出为 20 模仿练习 从键盘输入两个字符串保存到数组a b中 比较这两个字符串的大小 如果a b 显示 a大于b 如果a b 显示 a小于b 如果a b 显示 a等于b 进阶训练 不使用系统提供的函数实现以下功能 1 从键盘输入一个字符串 求该字符串的长度 2 从键盘输入两个字符串保存到数组a b中 将字符串b连接到字符串a的末尾 然后输出连接后的字符串 3 从键盘输入一个字符串保存到数组a中 定义字符串b 其值与字符串a相同 然后输出a b两个字符串 学以致用 寻找你身边的一个实际问题 编写解决问题的程序 用到字符串函数 例如 网站的登录系统 密码的长度是有限制的 可以通过字符串处理函数判断用户输入的密码是否在有效长度之内 Date 2020年3月26日星期四 第六章指针指针基础 本章知识点 指针的概念指针变量指针与数组 授课要点 指针变量的定义及使用变量的地址和指针结构体与指针 问题1 变量有三要素 变量名 变量值 变量地址 通过变量名 可以访问变量值 如果想访问该变量的地址呢 变量的地址存放在哪里 程序中 shorti floatk 内存中每个存储单元都有一个编号 地址 i k 编译或函数调用时为其分配内存单元 变量是对程序中数据存储空间的抽象 认识指针 指针的概念 变量的地址 变量对应存储单元的首地址 指针 即变量的地址 指针变量 专门存放变量地址的变量即指针变量 变量地址与指针 指针 变量地址 变量i pointer 指针变量 指针变量 2000 2004 2006 2005 短整型变量i 10 2001 2002 2003 2000 指针 变量的内容 变量的地址 变量i pointer 指针变量的定义 类型说明符 变量名 例如 int p1 对指针变量的定义包括三个内容 1 指针类型说明 即定义变量为一个指针变量 2 指针变量名 p1 3 变量值 指针 所指向的变量的数据类型 int 学生模仿练习 定义整型指针变量 定义单精度浮点型指针变量 定义双精度浮点型指针变量 定义字符型指针变量 问题2 定义指针变量之后 如何访问该指针变量的值呢 对比思考 定义整型变量之后 如何访问该整型变量的值呢 结论 访问变量值之前 必须先赋值 例1 如何给指针变量值 方式一 初始化intx 3 int p 方式二 赋值语句intx 3 int p p x p 例2 将例1补充成完整的程序 观察指针变量的引用 voidmain intx 3 int p 问题3 找人 因为有门牌号 我们找人就有两种办法 直接找 由物业管理员直接带到朋友家里间接找 先通过物业管理员了解朋友的门牌号 然后自己找变量有地址 也有指向该地址的指针变量 因此 变量的访问也有两种方式直接访问 按照变量的地址进行存取间接访问 先访问变量的地址 得到变量的地址值以后再去访问该变量 变量的访问方式 按变量地址存取变量值 通过存放变量地址的变量去访问变量 i pointer i i pointer i i pointer i i pointer i i pointer i i pointer i 指针变量的引用 和 运算符 指针运算符 间接访问运算符 取指针所指向的变量的内容 取地址运算符 取变量的地址 例3 利用指针进行输入输出 inta int p 定义指针变量 scanf d 输出p的内容 学生模仿练习 分别定义浮点数 字符型变量及其指针 并采用指针进行输入输出 使用指针变量 定义指针变量时应初始化或赋空值在C语言中用来表示一个空值是使用NULL 它是ASCII码值中的第一个字符 所以以下几公式等价 P NULL P 0 或者p 0 指针变量作为函数参数 地址传递特点 共享内存 双向 传递 voidswap intx inty inttemp temp x x y y temp main inta b scanf d d 例在内存中交换两个数 值传递 5 9 运行结果 5 9 voidswap int p1 int p2 intp p p1 p1 p2 p2 p main inta b int pointer 1 pointer 2 scanf d d 5 9 2000 2002 5 9 例在内存中交换两个数 运行结果 9 5 地址传递 授课要点 指针变量的定义及使用变量的地址和指针结构体与指针 定义指向结构体的指针 定义形式 struct结构体名 结构体指针名 例 structstudent p 存放结构体变量在内存的起始地址 structstudent intnum charname 20 charsex intage structstudentstu structstudent p p structstudent malloc sizeof structstudent 通过指针引用成员变量 结构体指针名 成员名 结构体变量名 成员名 结构体指针名 成员名 小组讨论并总结 指针定义后为什么必须要赋值才能使用为什么指向变量的指针必须同变量的类型一致int p 与 p 10中的 有什么区别使用指针的意义 结论1 指针定义后为什么必须要赋值才能使用 指针如果没有赋值 则指向一个任意的地址 如果使用没有初始化的指针 很危险 会发生一些不可预料的后果 结论2 为什么指向变量的指针必须同变量的类型一致 指针变量用来存放地址 使用前要进行初始化 因此要知道其存放什么类型的地址 一个指针必须指向某一个确定的数据类型定义的变量 而不能随便更改一个指针变量所指向的数据类型 具体地说 一个整型指针变量只能指向一个整型变量 一个实型指针只能指向一个实型变量 更不能定义一个万能型的指针变量 void 既可以指向一种数据类型 又可以指向另一种数据类型 结论3 int p 与 p 10中的 有什么区别 int p中的 表示定义指针变量p p 10中的 表示访问指针变量p指向地址处存放的值 结论3 使用指针的意义 使程序简洁 紧凑 高效有效地表示复杂的数据结构动态分配内存得到多于一个的函数返回值 作业 每人必做 1 从键盘输入5个整数到动态内存区域 求出其中偶数之和 2 定义一个指向 学生 结构体的指针 通过函数malloc 为一个学生的信息分配空间 通过指针为学号 姓名 4门成绩赋值并输出 Date 2020年3月26日星期四 第六章指针 指针与数组 授课要点 指向数组元素的指针变量指针的运算用指针表示数组元素 引入 数组和指针的关系 数组名是表示数组首地址的地址常量 指针变量是存放变量地址的变量 指向数组元素的指针变量 例intarray 10 int p p 授课要点 指向数组元素的指针变量指针的运算用指针表示数组元素 指针的运算 指针变量的赋值运算p 指针变量p2值 p1 不能把一个整数 p 也不能把p的值 整型变量 如inti p p 1000 i p 指针的算术运算 指针的算术运算 p i i为整型数 p p p i p i p i p i等若p1与p2指向同一数组 p1 p2 两指针间元素个数 p1 p2 dp1 p2无意义 指针的算术运算 例p指向shortint型数组 且p 则p 1指向

温馨提示

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

评论

0/150

提交评论