170 likes | 396 Views
问题求解与计算思维. 合肥工业大学 计算机与信息学院 王浩 jsjxwangh@hfut.edu.cn. 计算思维的研究. Wing J M. Computational Thinking. Communications of the ACM , 2006 , 49 (3) Wing J M. Computational Thinking and Thinking about Computing[ EB/ OL ] . 2008. ht tp :/ / www. cs. cmu. edu/ ~ wing/ publications/ Wing08a. pdf
E N D
问题求解与计算思维 合肥工业大学 计算机与信息学院 王浩 jsjxwangh@hfut.edu.cn
计算思维的研究 • Wing J M. Computational Thinking. Communications of the ACM , 2006 , 49 (3) • Wing J M. Computational Thinking and Thinking about Computing[ EB/ OL ] . 2008. ht tp :/ / www. cs. cmu. edu/ ~wing/ publications/ Wing08a. pdf • 周以真. 计算思维. 中国计算机学会通讯,2007 ,3 (11) • 王飞跃. 从计算思维到计算文化[J]. 中国计算机学会通讯,2007,3(11). • 董荣胜,古天龙.计算思维与计算机方法论. 计算机科学, 2009 , 36(1) • 朱亚宗.论计算思维——计算思维的科学定位、基本原理及创新路径. 计算机科学, 2009, 36(4) • 郭喜凤, 孙兆豪, 赵喜清. 论计算思维工程化的层次结构. 计算机科学, 2009, 36(4) • 张晓如,张再跃. 再谈计算机思维 计算机教育 2010/23 • 牟琴, 谭良. 计算思维的研究及其进展. 计算机科学, 2011, 38(3) • ……
计算思维在计算机课程教学中的应用 • 许宏丽,周筱来,赵 耀. 基于创新意识培养的“多媒体技术应用”课程教学实践 . 计算机教育. 2011/08 • 曹江莲,谢慧萍. 新测试方式下非计算机专业程序设计课程教学探讨. 计算机教育. 2011/04 • 陈杰华, 戴丽娟. 以培养计算思维为核心的程序设计实验教学.实验技术与管理. 2011, 28(1) • 赵岭忠, 钱俊彦, 蔡国永. 算法设计策略与计算思维.企业科技与发展. 2010/08 • 范莉莉, 王忠群. 在《编译原理》课程教学中探索专业素质和能力的培养.现代计算机(专业版) . 2010/07 • 王甲海, 印 鉴. 人工智能教学与计算思维培养 . 计算机教育. 2010/19 • 陈杰华. 程序设计课程中强化计算思维训练的实践探索 .计算机教育. 2010/20 • 朱立平. 论程序设计课程“实验导学”教学模式的构建 .计算机教育. 2010/20 • 王 挺, 李梦君,周会平. 对编译原理课程教学中计算思维培养的探讨. 计算机教育. 2010/21 • 廖伟志,李文敬,王汝凉. 基于培养学生计算思维的任务驱动式“离散数学”教学模式研究 .计算机教育. 2010/21 • ……
计算思维与大学计算机基础教育 • 陈国良, 董荣胜. 计算思维与大学计算机基础教育.中国大学教学. 2011/01 • 董荣胜.《九校联盟(C9)计算机基础教学发展战略联合声明》呼唤教育的转型. 中国大学教学. 2010/10 • 何钦铭, 陆汉权, 冯博琴. 计算机基础教学的核心任务是计算思维能力的培养——《九校联盟(C9)计算机基础教学发展战略联合声明》解读. 中国大学教学. 2010/09 • 董荣胜. 计算思维与计算机导论 . 计算机科学, 2009, 36(4) • 何昭青.《计算机导论》课程内容体系构建的研究与实践. 湖南第一师范学院学报. 2010/05
存在的问题 • 计算思维、计算机思维、信息学思维? • 计算思维研究的内容和范围? • 计算思维如何体现在课程体系中? 计算科学 学科的3个形态:理论、抽象、设计(对应于本学科中问题求解的3个典型过程) 12个基本概念:绑定、大问题的复杂性、概念和形式模型、一致性和完备性、效率、演化、抽象层次、按空间排序、按时间排序、重用、安全性、折衷与结论 • 计算机基础课程教授计算思维的那些内容?
问题求解 计算思维(Computational Thinking,CT)是运用计算机科学的基础概念去求解问题、设计系统和理解人类行为。 基本概念:约简、嵌入、转化、仿真、递归、并行、多维分析、类型、抽象、分解、SoC,保护、冗余、容错、纠错、系统恢复、启发式、规划、学习、调度、折衷
问题求解 • 问题表示(如何建立模型) • 问题求解(如何设计算法) • 效率(如何有效地求解)
问题求解 • 例题 1 有13个乒乓球,其中有一个是坏的,其质量与其它球不同,请设计算法将其挑出。 建模与设计
问题求解 • 例题 2 下列语句完成两个变量a,b中数值的交换: c=a; a=b; b=c; 能否不借助变量c完成两个数的交换呢? 算法与效率
问题求解 • 例题 3 编程求解一元二次方程的根 ax2+bx+c=0 要求:设计完备的测试数据集,考虑a, b, c各种取值对根的影响 容错、纠错
问题求解 • 例题 1 解答1: • 步骤1:将13个球分成4,4,4,1四份,分别记为a,b,c,d组; • 步骤2:先比较a,b两组的轻重,若a与b一样重,取c中任意4个球与a或b比较,若都一样重,则d组为次品,若不一样重,则可知次品在c组取出的4个球中,并且可判断次品是轻还是重;若a与b不一样重,取c组与a或b进行称量对比,得出含有次品组为a组或者b组以及判断出次品是轻还是重。 • 步骤3:从步骤2中得到含有4个球的次品组,将这4个球平分成2组称量,根据次品是轻或重得到含有次品组e,再将次品组e中2个球分别放置天平两端,根据次品轻重判断得到次品球。
问题求解 • 例题 1 解答2: • (1)将13个球分为三个部分,6,6, 1,将6,6两部分进行称量,若平衡,则1所代表物品为次品;否则(2) • (2)取一组6,将其平分为两组计为a,b;另一组6再平分为c,d;取a,b,c两两称量,若都平衡则次品在d中,转到(3);若有一次不平衡,则次品在a,b,c之中,转到(3) • (3)将三个任取两个称量,若平衡,则次品为未称量的物品;若不平衡,则转到(4) • (4)若不平衡再测一次即可得次品。
问题求解 • 例题 1 解答3: • 将13个球记为1,2,3,4,5,5,6,7,8,9,10,11,12,13。1~6记为A, 7~12号记为B; • 步骤1:将A B组球放在天平上,若天平平衡,则次品为13号球;若不平衡,则转向步骤2; • 步骤2:取较轻的一组,不妨设为A,将A组重新分成两组放在天平两端,若平衡,则转向步骤3,不平衡转向步骤4; • 步骤3:将B组分成两组记为a,b,放在天平两端,(由步骤2值次品较重),取较重的一组,不妨设其为a,任取两个球放在天平两端,若天平平衡,则为a中的另一个球;若不平衡,则较重的为次品; • 步骤4:将A组分成两组,取较重的一组(三个球),任取两个放在天平两端,若平衡,则为三个中的另一个,若不平衡,则为较重的的球;
问题求解 • 例题 1 解答4: • 步骤1:从这堆产品中任意拿出2产品,放在天平两端; • 步骤2:记下天平两端是否相平;相平执行步骤3;否则执行步骤5; • 步骤3:从天平的右端拿下产品,再从剩余产品中任意拿出一个放在右端,记下是否相平; • 步骤4:若相平,重复步骤3,直到不平为止,则此时右端产品为劣质; • 步骤5:拿下右端产品,再从剩余产品中任意拿出放在右端,若相平,则之前拿下的为劣质;否则左端为劣质。
问题求解 • 例题 2 解答1: b=a*b;a=b/a; b=b/a; 解答2: a=a+b; b=a-b; a=a-b; 解答3: a=a-b; b=a+2b; a=(b-a)/2; b=b-a;
问题求解 • 例题 3 解答1: #include <iostream.h> #include <math.h> void main() { float a,b,c,t,x1,x2,real,imag; cout<<"输入系数:"; cin>>a>>b>>c; if(a==0) cout<<"这个方程不是二次方程!"<<endl; else { t=b*b-4*a*c; if(t<0) { real=-b/(2*a); imag=sqrt(-t)/(2*a); cout<<”这个方程有两个复数根:x1="<<real<<'+'<<imag<<"i x2="<<real<<'-'<<imag<<'i'<<endl; } else if(t==0) cout<<"这个方程有两个相等的根:x1=x2="<<-b/(2*a)<<endl; else { x1=-b/(2*a)+sqrt(t)/(2*a); x2=-b/(2*a)-sqrt(t)/(2*a); cout<<"这个方程有两个不相等的实数根:x1="<<x1<<" x2="<<x2<<endl; } }
问题求解 • 例题 3 解答2: #include<iostream.h> #include<math.h> void main() { float a,b,c,d,x1,x2,x; cout<<"请输入a,b,c的值:"<<a<<b<<c<<endl; cin>>a>>b>>c; d=b*b-4*a*c; if(a==0) { cout<<"该函数的解为x=:"<<(-c/b)<<endl;} else{ if(d<0) { cout<<"该函数无解!"<<endl;} if(d==0){ x=(-b)/(2*a); cout<<"该函数的解x为:"<<x<<endl;} if(d>0){ x1=(-b+sqrt(d))/(2*a); x2=(-b-sqrt(d))/(2*a); cout<<"该函数的解x1,x2为:"<<x1<<","<<x2<<endl;} } }