




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2/762/72面向实践能力培养的C程序设计教学实践哈尔滨工业大学计算机科学与技术学院苏小红sxh@3/76内容提要程序设计教材和教学中存在的问题教材内容的组织教学内容的组织4/76程序设计教材和教学中存在的问题存在问题语法堆砌,只见树木不见森林忽视错误程序的分析与讲解实例不实,为解释语法而设计5/76教材编写与出版情况70所院校先后使用发行10万册以上收到读者上千封来信6/76《C语言大学实用教程(第2版)》章节内容的组织——第11章常见错误及解决方案程序设计ABC数据类型运算符表达式简单输入输出基本控制结构1234函数5数组指针结构体共用体递归函数指针6789文件操作107/76《C语言大学实用教程(第2版)》教材特点顺应时代发展,提升实验平台VC++Code::Blocks+MinGW(gcc)TurboC8/76《C语言大学实用教程(第2版)》教材特点内容紧密结合实践,实例兼趣味性和实用性游戏类:猜数游戏,文曲星猜数游戏,扑克牌游戏趣味智力题类:国王的许诺,马克思手稿中的数学题,爱因斯坦数学题,韩信点兵,鸡兔同笼,汉诺塔,骑士游历,八皇后问题实际生活问题:体型判断,身高预测,学生成绩管理,大奖赛现场统分,抓交通肇事犯,计算礼炮声响次数,存款预算9/76《C语言大学实用教程(第2版)》教材特点强调软件开发过程、算法设计、程序设计方法与编程技巧【编程提示】、【思考题】注重程序测试与调试技术,错误案例分析和排错,程序的健壮性使用assert()查错使用const修饰指针变量常见的内存错误,动态数组的实现每章小结中增加常见错误的总结一个程序多种编程方法,注重代码规范10/76《C语言大学实用教程学习指导(第2版)》学习指导修订内容错误案例分析(【错误分析】、【编程提示】
)优秀案例分析程序优化及解决方案课程设计综合应用实例OnlineJudge——在线评判,利用OnlineJudge编程的注意事项趣味ACM编程实例C99简介11/76变量初始化错误死循环与死语句与0比较问题。复杂情形的关系判断问题。遗漏边界条件测试非所有控制分支都有返回值错误类型溢出错误类型匹配错误越界访存错误缓冲区溢出问题内存泄漏问题使用野指针的问题参数非法问题不良代码风格问题《学习指导(第2版)》常见错误案例分析《C语言大学实用教程学习指导(第2版)》12/76教学内容的组织以语法为核心?以程序设计为核心?如何落实?案例驱动和习题课如何区分?如何举一反三、精讲多练?13/76重点和难点的解决思路
1.循环掌握循环的三种常见的控制方式2条件控制的循环3标记控制的循环1计数控制的循环前100项之积直到最后1项的绝对值<10e-4为止1-1/2+1/3-…+1/99-1/100+…到输入数据为负数或0时为止14/76重点和难点的解决思路累加求和的关键寻找累加项的构成规律(通项)累加项较复杂时,需专门求2前后项有关1前后项无关1m+3m+5m+7m+.…x0+x1+x2+x3+.…15/76循序渐进编程——猜数游戏想一个1-100之间的数猜对:right猜错:wrong并提示大小16/76只猜1次直到猜对为止最多猜10次猜多个数10次猜不对就猜下一个数循序渐进编程——猜数游戏#include<stdlib.h>#include<stdio.h>#include
<time.h>main(){
intmagic;
intguess;
intcounter;
srand(time(NULL)); magic=rand()%100+1; counter=0;
do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess); counter++;
if(guess>magic) printf("Wrong!Toohigh!\n");
elseif(guess<magic) printf("Wrong!Toolow!\n"); }while(guess!=magic);
printf("Right!\n"); printf("counter=%d\n",counter);}例4.9直到猜对为止#include<stdlib.h>#include<stdio.h>#include<time.h>main(){
intmagic;
intguess;
intcounter; srand(time(NULL)); magic=rand()%100+1; counter=0;
do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess); counter++;
if(guess>magic) printf("Wrong!Toohigh!\n");
elseif(guess<magic) printf("Wrong!Toolow!\n"); }while((guess!=magic)&&(counter<10));
printf("Right!\n"); printf("counter=%d\n",counter);}实验3改变控制条件后存在一个错误最多猜10次#include<stdlib.h>#include<stdio.h>#include<time.h>main(){
intmagic;
intguess;
intcounter; srand(time(NULL)); magic=rand()%100+1; counter=0;
do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess); counter++;
if(guess>magic) printf("Wrong!Toohigh!\n");
elseif(guess<magic) printf("Wrong!Toolow!\n"); else
printf("Right!\n"); }while((guess!=magic)&&(counter<10));
printf("counter=%d\n",counter);}实验3最多猜10次……do{ magic=rand()%100+1; counter=0;
do{ printf("Pleaseguessamagicnumber:"); scanf("%d",&guess); counter++;
if(guess>magic) printf("Wrong!Toohigh!\n");
elseif(guess<magic) printf("Wrong!Toolow!\n");
else printf("Right!\n"); }while((guess!=magic)&&(counter<10));
printf("counter=%d\n",counter); printf("Doyouwanttocontinue(Y/Nory/n)?"); scanf("%c",&reply); }while((reply=='Y')||(reply=='y'));猜多个数10次猜不对就猜下一个数直到用户选择结束为止嵌套循环循序渐进编程的拓展练习循序渐进——自底向上小学生加法题加法四则运算数字加法英文加法1+2=3one+two=threeA+B=C22/76程序实例:韩信点兵韩信有一队兵,他想知道有多少人,便让士兵排队报数。按从1至5报数,最末一个士兵报的数为1;按从1至6报数,最末一个士兵报的数为5;按从1至7报数,最末一个士兵报的数为4;按从1至11报数,最末一个士兵报的数为10。你知道韩信至少有多少兵吗?设兵数为x,则按题意x应满足下述关系式:x%5==1&&x%6==5&&x%7==4&&x%11==10采用穷举法对x从1开始试验,可得到韩信至少有多少兵23/76程序实例:韩信点兵#include<stdio.h>main(){
intx;
for(x=1;x<5000;x++) {
if(x%5==1&&x%6==5&&x%7==4&&x%11==10) { printf("x=%d\n",x); } } }/*属于“瞎猫碰死耗子”的做法*/
错在哪里!24/76程序实例:韩信点兵#include<stdio.h>main(){
intx;
for(x=1;;x++) {
if(x%5==1&&x%6==5&&x%7==4&&x%11==10) { printf("x=%d\n",x); } } }
错在哪里!死循环!一般情况下,要极力避免死循环绝大多数程序不需要死循环。如果出现,往往都是bug时间过长的循环会造成“假死”效果,也要考虑解决25/76程序实例:韩信点兵
——goto解决方案#include<stdio.h>main(){
intx;
for(x=1;;x++) {
if(x%5==1&&x%6==5&&x%7==4&&x%11==10) { printf("x=%d\n",x);
goto
END;
} }
END:; }26/76程序实例:韩信点兵
——break解决方案#include<stdio.h>main(){
intx;
for(x=1;;x++) {
if(x%5==1&&x%6==5&&x%7==4&&x%11==10) { printf("x=%d\n",x);
break; } } }27/76程序实例:韩信点兵
标志变量解决方案—可读性更好#include<stdio.h>main(){
intx=1;
int
find=0;/*置找到标志为假*/
for(x=1;!find;x++) {
if(x%5==1&&x%6==5&&x%7==4&&x%11==10) { printf("x=%d\n",x);
find=1; /*置找到标志为真*/} } }28/76函数设计的原则重点和难点的解决思路模块化程序设计函数复用函数封装和参数传递函数的定义防御性程序设计2.函数29/7629/72重点和难点的解决思路2.函数
从阶乘计算问题开始分析函数的定义函数封装与参数传递函数的调用过程函数的返回值函数原型分开编写合并在一起30/76重点和难点的解决思路函数封装与防御性程序设计31/76重点和难点的解决思路函数封装与防御性程序设计传入负数的实参会怎样?32/76重点和难点的解决思路函数封装与防御性程序设计33/76重点和难点的解决思路函数封装与函数复用案例——计算组合数
34/76重点和难点的解决思路函数封装与防御性程序设计35/76重点和难点的解决思路挑战类型表示的极限——50位的N!计算?大数的存储问题36/76重点和难点的解决思路函数设计的基本原则
信息隐藏1函数规模要小2函数功能要单一3函数接口定义要清楚入口参数有效性检查敏感操作前的检查调用成功与否的检查37/76模块化程序设计——猜数游戏猜多个数10次猜不对就猜下一个数分而治之自顶向下逐步求精自底向上自顶向下38/7638/72模块化程序设计——猜数游戏猜多个数10次猜不对就猜下一个数分而治之自顶向下逐步求精39/76模块化程序设计——猜数游戏猜多个数10次猜不对就猜下一个数处理用户输入,判断是否有输入错误,是否在合法的数值范围内
分而治之自顶向下逐步求精40/7640/72模块化程序设计——猜数游戏猜多个数10次猜不对就猜下一个数分而治之自顶向下逐步求精41/7641/72模块化程序设计——猜数游戏猜多个数10次猜不对就猜下一个数分而治之自顶向下逐步求精42/7642/72模块化程序设计——猜数游戏猜多个数10次猜不对就猜下一个数分而治之自顶向下逐步求精模块化程序设计的拓展练习简单的猜数游戏文曲星猜数游戏数独游戏44/76重点和难点的解决思路3.递归
经典的汉诺(Hanoi)塔问题理解递归的概念再次回到阶乘计算问题分析递归调用的过程和返回值45/76递归——汉诺(Hanoi)塔问题
A→C,A→B,C→B,A→C,B→A,B→C,A→CABCn=346/76递归——汉诺(Hanoi)塔问题
A→C,A→B,C→B,A→C,B→A,B→C,A→CABC47/76递归——汉诺(Hanoi)塔问题
A→C,A→B,C→B,A→C,B→A,B→C,A→CABC48/76递归——汉诺(Hanoi)塔问题
A→C,A→B,C→B,A→C,B→A,B→C,A→CABC49/76递归——汉诺(Hanoi)塔问题
A→C,A→B,C→B,A→C,B→A,B→C,A→CABCn更大些怎么办?50/76递归——汉诺(Hanoi)塔问题第一步:将问题简化假设A杆上只有2个圆盘,即汉诺塔有2层,n=2ABC51/76递归——汉诺(Hanoi)塔问题对于一个有n(n>1)个圆盘的汉诺塔,将n个圆盘分为两部分:上面的n-1个圆盘和最下面的n号圆盘。将“上面的n-1个圆盘”看成一个整体。将n-1个盘子从一根木桩移到另一根木桩上将1个盘子从一根木桩移到另一根木桩上ACB52/76重点和难点的解决思路递归
53/76重点和难点的解决思路递归计算Fibonacci数列作为反例既可用递归也可用迭代解决的问题,尽可能用迭代实现因为递归数的实现往往耗费更多的时间和栈空间
54/7654/72重点和难点的解决思路全局变量打印出计算Fibonacci数列每一项时所需的递归调用次数55/76重点和难点的解决思路自动变量和静态变量56/76重点和难点的解决思路自动变量和静态变量57/76重点和难点的解决思路4.指针结合实例,类比的方法,讲解为什么引入指针?指针类型的特殊性?为函数提供间接寻址和修改变量值的手段数组名作为函数参数结构体指针作为函数参数函数指针作为函数参数为动态内存分配和动态数据结构提供支持改善某些子程序的效率等58/76voidSwap(int*x,int*y){inttemp;temp=*x;*x=*y;*y=temp;}main(){inta,b;a=5;b=9;Swap(&a,&b);printf("a=%d,b=%d",a,b);}
voidSwap(intx,inty){inttemp;temp=x;x=y;y=temp;}main(){inta,b;a=5;b=9;Swap(a,b);printf("a=%d,b=%d",a,b);}程序1程序2例7.1~7.2:编写函数实现两数的互换主调函数被调函数实参形参结果有何不同?NotWork!Why?Tracetheexecution59/7659/72主调函数被调函数main(){
inta,b;a=5;b=9;Swap(a,b);printf("a=%d,b=%d",a,b);}voidSwap(int
x,int
y){
inttemp;temp=x;x=y;y=temp;}55ab实参形参99xyab程序1xy55temp9x
和y是内部变量单向值传递60/7660/72主调函数被调函数main(){
inta,b;a=5;b=9;Swap(&a,&b);printf("a=%d,b=%d",a,b);}voidSwap(int
*x,int
*y){
inttemp;temp=*x;*x=*y;*y=temp;}&a&a实参形参&b&bxyab程序2xy5temp5ab995*x*y交换的是x
和y指向的单元内容61/76voidSwap(int
*x,int
*y){
inttemp;temp=*x;*x=*y;*y=temp;}指针pTemp未初始化指针pTemp指向哪里未知对未知单元写操作是危险的voidSwap(int*x,int*y){
int
*pTemp;
*pTemp=*x;*x=*y;*y=*pTemp;}永远要清楚:每个指针指向了哪里指针指向的位置是什么62/76voidSwap(int
*x,int
*y){
inttemp;temp=*x;*x=*y;*y=temp;}非危险操作但是交换的是地址值不是指针指向单元的内容voidSwap(int*x,int
*y){
int
*pTemp;
pTemp=x;x=y;y=pTemp;}类比指针的概念门牌号或钥匙数组或指针作函数参数传递资源传递网址二维数组的行地址和列地址教室编号分楼层-房间编号整体编号64/76循序渐进编程——学生成绩管理综合应用实验——学生成绩管理围绕模块化程序设计用函数编写核心算法:计算最大值,排序,查找实例举一反三:大奖赛现场统分,通讯录管理,英汉词典...2动态数据结构——链表1静态数据结构——数组数组名作为函数参数指针作为函数参数65/76循序渐进编程——学生成绩管理综合应用实验——学生成绩管理菜单驱动的学生成绩管理程序每条学生记录的内容:学号,姓名、m门课程的成绩,总分,平均分输入并显示n个学生的m门课程成绩,计算总分和平均分按总分排序;输入学号,显示该学生的姓名、m门课程成绩66/76动态链表文件读写处理循序渐进编程——学生成绩管理异常处理提高健壮性通用的排序结构体数组普通的数组67/76循序渐进编程——学生成绩管理函数指针作为函数参数使用一个函数完成升序、降序排序voidSortScore(STU*head,intm,int(*compare)(inta,intb));
68/76课内实验内容的组织1.顺序结构计算定期存款本利之和输入输出函数,数学函数计算圆的周长和面积输入输出函数,宏定义2.选择结构身高预测If-else简单的计算器switch69/76课内实验内容的组织3.循环结构猜数游戏条件控制的循环,随机函数抓交通肇事犯计数控制的循环,嵌套循环,穷举法4.函数给小学生出加法考试题掷骰子游戏70/76课内实验内容的组织5.数组餐饮服务质量调查打分文曲星猜数游戏数据统计6.一维数组和函数综合学生成绩统计标记控制的循环7.二维数组和函数综合成绩排名与查找函数设计的基本原则71/76课内实验内容的组织8.结构体和指针、函数综合洗发牌游戏模拟显示数字式时钟9.递归和函数综合计算最大公约数递归与迭代的区别计算矩阵行列式的值10.文件和函数综合文件复制与追加72/76课外实验内容的组织计算到期存款本息之和存款预算寻找最佳存款方案抓交通肇事犯求解不等式计算礼炮声响次数产值翻番计算口令检查大奖赛现场统分实验课的指导计
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 环保地板采购合同范本
- 街巷路灯维修合同范本
- 七年级下册语文期末复习:现代文+文言文+基础知识+综合性学习+作文 试题分类汇编(含答案)
- 便宜仓库租赁合同范本
- 学校图书购书合同范本
- 服装数量采购合同范本
- 北京正规卖房合同范本
- 吉林省吉林市永吉县2024-2025学年七年级上学期期末考试数学试卷(含解析)
- 占道经营合同范本
- 2025标准版权合同模板
- 大学兼职申请书
- 狂犬疫苗打完免责协议书(2篇)
- 游乐设备事故应急预案
- 公司第1季度品质部工作总结报告
- 单片机应用技术试题题库答案
- 2025年浙江省金融控股有限公司招聘笔试参考题库含答案解析
- 新产品开发流程和步骤
- 大别山精神完整版本
- 2025年苏美达股份有限公司招聘笔试参考题库含答案解析
- 药店医保自查报告范文
- 《质谱分析方惠群版》课件
评论
0/150
提交评论