问题求解与计算思维(合肥工业大学王浩教授)

Download Report

Transcript 问题求解与计算思维(合肥工业大学王浩教授)

问题求解与计算思维
合肥工业大学
计算机与信息学院
王浩
[email protected]
计算思维的研究
 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)
 ……
合肥工业大学 计算机与信息学院
2
计算思维在计算机课程教学中的应用
 许宏丽,周筱来,赵 耀. 基于创新意识培养的“多媒体技术应用”课程教
学实践 . 计算机教育. 2011/08
 曹江莲,谢慧萍. 新测试方式下非计算机专业程序设计课程教学探讨. 计
算机教育. 2011/04
 陈杰华, 戴丽娟. 以培养计算思维为核心的程序设计实验教学.实验技术与
管理. 2011, 28(1)
 赵岭忠, 钱俊彦, 蔡国永. 算法设计策略与计算思维.企业科技与发展.
2010/08
 范莉莉, 王忠群. 在《编译原理》课程教学中探索专业素质和能力的培养.
现代计算机(专业版) . 2010/07
 王甲海, 印 鉴. 人工智能教学与计算思维培养 . 计算机教育. 2010/19
 陈杰华. 程序设计课程中强化计算思维训练的实践探索 .计算机教育.
2010/20
 朱立平. 论程序设计课程“实验导学”教学模式的构建 .计算机教育.
2010/20
 王 挺, 李梦君,周会平. 对编译原理课程教学中计算思维培养的探讨. 计算
机教育. 2010/21
 廖伟志,李文敬,王汝凉. 基于培养学生计算思维的任务驱动式“离散数
学”教学模式研究 .计算机教育. 2010/21
合肥工业大学 计算机与信息学院
3
 ……
计算思维与大学计算机基础教育
 陈国良, 董荣胜. 计算思维与大学计算机基础教育.中国大
学教学. 2011/01
 董荣胜.《九校联盟(C9)计算机基础教学发展战略联合声
明》呼唤教育的转型. 中国大学教学. 2010/10
 何钦铭, 陆汉权, 冯博琴. 计算机基础教学的核心任务是
计算思维能力的培养——《九校联盟(C9)计算机基础教
学发展战略联合声明》解读. 中国大学教学. 2010/09
 董荣胜. 计算思维与计算机导论 . 计算机科学, 2009, 36(4)
 何昭青.《计算机导论》课程内容体系构建的研究与实践.
湖南第一师范学院学报. 2010/05
合肥工业大学 计算机与信息学院
4
存在的问题
 计算思维、计算机思维、信息学思维?
 计算思维研究的内容和范围?
 计算思维如何体现在课程体系中?
计算科学
学科的3个形态:理论、抽象、设计(对应于本学科中
问题求解的3个典型过程)
12个基本概念:绑定、大问题的复杂性、概念和形式模
型、一致性和完备性、效率、演化、抽象层次、按空间
排序、按时间排序、重用、安全性、折衷与结论
 计算机基础课程教授计算思维的那些内容?
合肥工业大学 计算机与信息学院
5
问题求解
计算思维(Computational Thinking,CT)是运
用计算机科学的基础概念去求解问题、设计系统和
理解人类行为。
基本概念:约简、嵌入、转化、仿真、递归、并行、
多维分析、类型、抽象、分解、SoC,保护、冗余、
容错、纠错、系统恢复、启发式、规划、学习、调
度、折衷
合肥工业大学 计算机与信息学院
6
问题求解
 问题表示(如何建立模型)
 问题求解(如何设计算法)
 效率(如何有效地求解)
合肥工业大学 计算机与信息学院
7
问题求解
 例题 1
有13个乒乓球,其中有一个是坏的,其质量与其它
球不同,请设计算法将其挑出。
建模与设计
合肥工业大学 计算机与信息学院
8
问题求解
 例题 2
下列语句完成两个变量a,b中数值的交换:
c=a;
a=b;
b=c;
能否不借助变量c完成两个数的交换呢?
算法与效率
合肥工业大学 计算机与信息学院
9
问题求解
 例题 3
编程求解一元二次方程的根 ax2+bx+c=0
要求:设计完备的测试数据集,考虑a, b, c各种
取值对根的影响
容错、纠错
合肥工业大学 计算机与信息学院
10
问题求解
 例题 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个球分别
放置天平两端,根据次品轻重判断得到次品球。
合肥工业大学 计算机与信息学院
11
问题求解
 例题 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)若不平衡再测一次即可得次品。
合肥工业大学 计算机与信息学院
12
问题求解
 例题 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组分成两组,取较重的一组(三个球),任取两个放在
天平两端,若平衡,则为三个中的另一个,若不平衡,则为较重的
的球;
合肥工业大学 计算机与信息学院
13
问题求解
 例题 1
解答4:
 步骤1:从这堆产品中任意拿出2产品,放在天平两端;
 步骤2:记下天平两端是否相平;相平执行步骤3;否则
执行步骤5;
 步骤3:从天平的右端拿下产品,再从剩余产品中任意
拿出一个放在右端,记下是否相平;
 步骤4:若相平,重复步骤3,直到不平为止,则此时右
端产品为劣质;
 步骤5:拿下右端产品,再从剩余产品中任意拿出放在
右端,若相平,则之前拿下的为劣质;否则左端为劣质
。
合肥工业大学 计算机与信息学院
14
问题求解
 例题 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;
合肥工业大学 计算机与信息学院
15
 例题 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;
}
}
合肥工业大学 计算机与信息学院
16
 例题 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;}
}
}
合肥工业大学 计算机与信息学院
17