370 likes | 459 Views
第 7 章 程序设计基础. 主讲教师: Email :. 本章介绍. 了解程序和程序设计的基本概念以及各种程序设计语言等; 了解算法概念和常用算法; 掌握程序设计的三种控制结构; 掌握 C 语言程序设计语言的基本知识,并学会简单 C 程序设计的编写; 了解程序设计实践平台在学习程序设计中的作用。. 7.1 程序和程序设计. 本节知识点: 程序和程序设计的基本概念; 程序设计语言分类; 常见高级程序设计语言介绍。. 7.1.1 程序和程序设计的基本概念. 1997 年计算机“深蓝”战胜称霸 20 余年的国际象棋世界冠军卡斯巴罗夫。
E N D
第7章 程序设计基础 主讲教师: Email:
本章介绍 • 了解程序和程序设计的基本概念以及各种程序设计语言等; • 了解算法概念和常用算法; • 掌握程序设计的三种控制结构; • 掌握C语言程序设计语言的基本知识,并学会简单C程序设计的编写; • 了解程序设计实践平台在学习程序设计中的作用。
7.1程序和程序设计 • 本节知识点: • 程序和程序设计的基本概念; • 程序设计语言分类; • 常见高级程序设计语言介绍。
7.1.1 程序和程序设计的基本概念 • 1997年计算机“深蓝”战胜称霸20余年的国际象棋世界冠军卡斯巴罗夫。 • 深蓝使用的是一个“C语言程序” • “围棋”游戏中所需要的算法比“国际象棋”中的算法更加复杂,因此至今难以战胜国际大师
7.1.1 程序和程序设计的基本概念 • 程序(Program)是为实现特定目标或解决特定问题而用计算机语言编写的指令序列的集合,而程序与数据、文档的集合便构成了软件。 • 程序设计(Programming)则是指给出解决特定问题程序的过程,是软件构造活动中的重要组成部分。程序设计往往以某种程序设计语言为工具,给出这种语言下的程序。
7.1.2 程序设计语言分类 • 一、按发展过程分类 • (1)机器语言 • (2)汇编语言 • (3)高级语言 • (4)智能语言 • 二、按执行方式分类 • (1)编译执行语言 • (2)解释执行语言 • 三、按设计模式分类 • (1)面向过程的程序设计语言 • (2)面向对象的程序设计语言
7.1.3 常见高级程序设计语言介绍 • 一、C/C++语言 • 目前世界上流行使用最广泛的高级程序设计语言; • 效率高、可移植性强,特别适于编写系统软件; • C++在C语言的基础上开发,它在兼容C的同时支持了面向对象编程 • 二、Visual Basic • 可视化编程语言,简单、易学 • 面向对象语言,一个对象往往具有属性、方法、事件三大特性。 • 三、Java语言 • 最大的特点是“一次编译,到处运行” • 缺点是效率较低 • 四、C#语言 • 由C和C++衍生而来,专门为.NET的应用而开发的面向对象语言
7.2 算法 • 本节知识点: • 算法的定义; • 算法的复杂度; • 算法分类及经典算法举例;
7.2.1 算法的定义 • 算法是求解问题的步骤,它是指令的有限序列,其中每一条指令表示一个或多个操作。 • 算法具有下列5个特性: • (1)有穷性。 • (2)确定性。 • (3)可行性。 • (4)输入。 • (5)输出。
7.2.2算法的复杂度 • 程序的规模比计算机硬件的发展要快得多,算法的设计越来越重要 • 算法复杂度衡量 • 一、时间复杂度 • 算法的时间复杂度指的是执行算法所需要的时间 • 二、空间复杂度 • 空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度
7.2.3 算法分类和经典算法举例 • 算法通常分为: • 递推法 • 递归法 • 穷举法 • 贪心法 • 分治法 • 动态规划法 • 迭代法
7.2.3 算法分类和经典算法举例 • 递推法 • 递推法是利用问题本身所具有的一种递推关系求问题解的一种方法。它把问题分成若干步,找出相邻几步的关系,从而达到目的,此方法称为递推法。 算法举例:求斐波那契数列第10项。 已知斐波那契数列第1项为1,第2项也为2,递推关系是当前项等于前2项之和,即递推关系式为:F[n]=f[n-1]+f[n-2] (n>=3)。因此可以将算法描述为: (1)F[1]←1,F[2]←2,index←3; (2)F[m]←F[m-1]+F[m-2]; (3)如果index<=10,执行步骤2,否则算法结束。
7.2.3 算法分类和经典算法举例 • 递归法 • 递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。 将n个盘子从A柱子移到C柱子可以分解为以下3个步骤: (1)将A柱子上n-1个盘借助C柱子先移到B柱子上; (2)把A柱子上剩下的一个盘移到C柱子上; (3)将B柱子上n-1个盘借助A柱子先移到C柱子上。
7.2.3 算法分类和经典算法举例 • 穷举法 • 穷举法又称为枚举法,对所有可能情况,一个不漏地进行检验,从中找出符合要求的答案,因此穷举法是通过牺牲时间来换取答案的全面性。 Begin for x=0 to 100 do for y=0 to 100 do for z=0 to 100 do if x + y + z=100 and x*5 + y*3 + z/3 = 100 then {得到一组符合题目要求的解} End “百鸡问题”: 鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
7.2.3 算法分类和经典算法举例 • 贪心法 • 贪心法以当前情况为基础作最优选择,而不考虑各种可能的整体情况,所以贪心法不一定能够得到最优解,而是只能够保证得到一个较为满意的解。 算法举例——背包问题:有一个背包,可以放Wm公斤物品,现有n件物品,第i件物品的重量是Wi公斤,价值为Vi元(1≤i≤n),现要求在包内放若干件物品,使包内物品总价值最大。 用贪心法来求背包问题,为了使包内物品的总价值最大,先计算出所有物品的单位价值,然后按单位价值从高到低依次选择物品放入包,在不超过限重的情况下尽可能放更多的物品。
7.2.3 算法分类和经典算法举例 • 分治法 • 分治法是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解。 二分查找又称折半查找,它是一种效率较高的查找方法,它要求原有序列必须按关键字大小有序排列。其算法步骤如下: (1)确定代查找区间,即初始化left和right的值; (2)求出查找区间的中间位置mid = ( left + right )/ 2; (3)用待查关键字值与中间位置的关键字值进行比较; 若相等,则查找成功; 若大于,则在后(右)半个区域继续进行查找,即令left=mid+1; 若小于,则在前(左)半个区域继续进行查找,即令right=mid-1; (4)继续回到步骤,直到left>=right为止。
7.3程序的基本控制结构 • 本节知识点: • 顺序结构; • 选择结构; • 循环结构;
7.3.1 顺序结构 • 顺序结构表示的是算法按照操作步骤描述的顺序依次执行的一种结构,如图所示,程序总是按照操作步骤描述的顺序,依次执行A,B,C,…各部分,这是最基本的控制结构。 顺序结构
7.3.1 顺序结构 • 选择结构也称为分支结构或条件结构,根据条件判断的结果决定执行哪个语句 • (1)如果条件P成立,则执行A语句,否则如果条件P不成立,则执行B语句; • (2)只能执行其中的一个分支,不能既执行A又执行B。 • (3)无论执行A或执行B,都要经过一个出口脱离选择结构,进入后面的C语句; • (4)在许多情况下,只要对条件成立的执行操作,因此B语句可能是空的,即不执行任何操作。 选择结构
7.3.3 循环结构 • 当型循环结构先进行条件判断,然后确定循环体是否执行,执行过程如下: • (1)判断条件P是否成立,若不成立转向步骤(4)执行;若成立,执行步骤(2)。 • (2)执行循环体A。 • (3)继续判断条件P,即转到步骤(1)执行。 • (4)退出循环。 • 根据它的执行过程可知,当循环条件P在第一次判断不成立时则循环体一次也不执行
7.3.3 循环结构 • 直到型循环。先执行一次循环体,然后根据条件是否成立来决定循环体是否继续执行,执行过程如下: • (1)执行循环体A。 • (2)判断条件P是否成立,若不成立转向步骤(3)执行;若成立,执行步骤(1)。 • (3)退出循环。 • 根据它的执行过程可知,循环体A至少要执行一次。
7.4 C语言初步 • 本节知识点: • C语言开发环境 • 简单C程序设计 • 标识符和关键字; • 运算符与表达式
7.4.1 C语言开发环境 • 一、C-Free(推荐初学者使用) • http://www.programarts.com/cfree_ch/index.htm • 二、Dev-C++ • http://sourceforge.net/projects/dev-cpp/ • 三、Microsoft Visual Studio 6.0或者更高版本 • 帮助文档:http://msdn.microsoft.com/zh-cn/vstudio/
7.4.2 简单C程序设计 • 以一个简单的例子来阐述C程序的基本结构。 • 描述 • 求两个整数中的最大值。 • 输入 • 两个整数 • 输出 • 输出最大的值,格式为: • max=最大值 • 样例输入 • 1 2 • 样例输出 • max=2 • 题目来源 • http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1467
一个结构完整而且风格良好的程序代码如下: #include <stdio.h> int max(int x,int y); /*声明max函数*/ int main() /*主函数*/ { int a,b,c; /*定义变量*/ scanf("%d%d",&a,&b);/*输入变量a和b的值*/ c=max(a,b); /*调用max函数,将得到的值赋给c*/ printf("max=%d\n",c);/*输出c的值*/ return 0; } int max(int x,int y)//定义max函数 { int z; //定义变量z if(x>y) z=x; else z=y; //求x,y中的最大值,并把最大值保存到z中 return(z); //将z的值返回 }
7.4.2 简单C程序设计 • (1)C程序是由函数构成的。一个C程序至少包含一个函数(main函数),也可以包含一个main函数和若干个其他函数,C语言规定必须用main作为主函数名。函数是C程序的基本单位。被调用的函数可以是系统提供的库函数(如printf函数),也可以是用户自定义的函数(如max函数)。
7.4.2 简单C程序设计 • (2)一个函数由函数头和函数题组成。
7.4.2 简单C程序设计 • (3)一个C程序总是从main函数开始执行的,而不管main函数在整个程序中的位置如何。main函数可以放在程序最前面,也可以放在程序的最后,或者放在一些函数之前和另一些函数之后。 • (4)C程序可以没有行号,书写格式自由,一行内可以写几个语句,一个语句可以分开写在多行上,但为了风格一致,一般一行写一个语句。 • (5)每个语句和数据定义的最后必须有一个分号。 • (6)可以用/*……*/或者//对C程序中的任何部分作注释。加上必要的注释,可增加程序的可读性。
7.4.3 标识符和关键字 • 标识符 • 标识符由字母、数字和下划线组成,并且第一个字符只能是字母或下划线。因此下面的标识符是合法的: • area、PI、a_b、_are、I_am、a1、b123、abc • 而以下标识符是非法的: • 123a、a+b、a=b • 关键字 • 关键字(key word)或保留关键字在C程序的语法中起着特殊的作用,不能另作它用。
7.4.4 运算符与表达式 • C语言中的运算法主要分为赋值运算符、算术运算符、关系运算符、逻辑运算符、自增自减运算符、条件运算符、逗号运算符等。将变量、常量、函数调用用运算符连接起来则组成了表达式。 如一元二次方程的实根可以用下面的表达式求出 X1 = (-b+sqrt(b*b-4*a*c))/(2*a); X2 = (-b-sqrt(b*b-4*a*c))/(2*a);
7.5程序设计实践平台 • 本节知识点: • ACM国际大学生程序设计竞赛; • 常见的程序设计实践平台; • 台州学院在线程序设计综合实验平台简介。
7.5.1 ACM国际大学生程序设计竞赛 • ACM国际大学生程序设计竞赛是最具影响力的大学生计算机竞赛,赛事目前由IBM公司赞助。ACM-ICPC以团队的形式代表各学校参赛,每队由3名队员组成。每位队员必须是在校学生,有一定的年龄限制,并且最多可以参加2次全球总决赛和5次区域选拔赛。比赛期间,每队使用1台电脑,需要在5个小时内使用C、C++、Pascal或Java等程序设计语言编写程序解决10个左右的实际问题。程序完成之后提交裁判运行,运行的结果会判定为正确或错误并及时通知参赛队。而且有趣的是每队在正确完成一题后,组织者将在其位置上升起一只代表该题颜色的气球。
7.5.2 常见的程序设计实践平台 • 常见的在线程序设计自动评判系统有: • 台州学院(TZC):http://acm.tzc.edu.cn • 浙江大学(ZJU):http://acm.zju.edu.cn • 北京大学(PKU):http://poj.org • 杭电(HDU):http://acm.hdu.edu.cn
7.5.3台州学院在线程序设计综合实验平台简介 • (1)用户管理:提供新用户自由注册、资料修改、加入班级和团队、用户排名和班级排名等功能; • (2)题目管理:允许用户在线提交题目、永久保存并随时查看源代码、上传题目等; • (3)在线比赛:自由参加在线竞赛并根据排名获取积分、自己组织比赛、撰写解题报告根据用户评分进行排名并赢取积分等; • (4)实验管理:提供实验教学环境,完全通过在线方式完成实验题目、撰写实验报告、教师批改和打印、自动统计实验成绩和平时成绩等; • (5)在线交流:提供站内邮件、自主研发的Web群、讨论版、论坛和公告等内容进行在线交流; • (6)趣味活动:使用积分参与礼品兑换、图书借阅、竞赛竞猜等趣味活动。
第一步:编写代码 • 你需要先在C程序开发环境(如VC、Dev-CPP、CFree等)下编写代码,并进行认真测试,如最终的代码可能为: #include <stdio.h> int main() { int a,b; scanf("%d %d",&a, &b); printf("%d\n",a+b); return 0; }
第二步:提交代码 • 单击题目下方的链接“提交”,将上述代码复制并粘贴到页面文本框中(要求用户已经在首页上登录系统),并选择合适的语言,并确保题号正确,最后点击“提交”按钮,系统便会自动编译您提交的源程序,并在新打开的页面中显示评判结果(刚提交时可能显示Judging,请按F5刷新浏览器或者等1秒钟系统会自动刷新) ,如果“Accepted”则代表题目答案正确