《高级语言程序设计》是计算机大类/软件工程大类的一门重要的专业基础课程。设置本课程的主要目的是使学生掌握用计算机分析和解决问题的思维方法以及程序设计的基本方法,建立从问题到算法再到程序的认知,在从问题到算法再到程序的问题求解及程序构造和实现的过程中理解高级语言的基本构造要素以及算法和数据结构在程序构造中的作用,具备良好的编程素养,以及综合运用所学程序设计语言和程序设计方法,设计、构造和应用计算系统求解科学或工程问题的程序设计和实现能力,为后继课程的学习和将来从事软件开发、解决复杂工程问题奠定编程能力基础。
(一) 成绩累计方式
(1)自主式作业
由系统随机抽题的自主式作业,占总成绩的20%。
学生登录面向学生自主学习的高级语言能力测试平台(SSE),自主选择知识点和难度系数,平台自动从后台的题库系统中随机抽取相应知识点和难度系数的题目给学生,学生在线上限时完成并提交代码,获得作业分。分数评定和奖惩规则如下:
1)根据学生上机测试成绩柔性定制个人作业满分线,使其个人作业满分线与其上机测试总成绩成反比。个人作业满分线=(实验上机随堂测试满分线-实际上机随堂测试总分)*100。若按此公式计算出来的满分线超过了2000分,则2000分封顶,即2000分为个人刷题满分线的上限。
2)若未达到自己的个人作业满分线,则按下面公式计算:个人实际刷题分数 / 个人满分线 * 作业满分20分。
3)在习题市场中自主设计有创意的题目或找错题,每录用1道题或找到一个错题,可减免作业分20分(相当于降低其个人作业满分线)。
(2) 开放式实验大作业
开放式实验大作业,占总成绩的20%。
实验程序和实验报告的综合成绩由学生在SPOC里互评,教师对学生互评结果进行随机抽查,对于不合理的分数可以由教师重评,取代学生的互评分。
未在规定的截止时间内在SPOC中提交实验程序和报告,按0分计。未在规定的截止时间内在SPOC中完成指定数量的互评,扣除一定的互评分。
不做实验大作业者,即使其他项分数累计可以及格,最终的总成绩也一律按0分计。
(3) 实验上机随堂测试
实验上机随堂测试,占总成绩的50%。
第1次实验课熟悉系统环境,进行模拟演练,仅安排2个实验学时。
第2次~第4次实验课,利用3学时进行实验上机随堂测试和试卷点评。实验上机测试内容分别覆盖基本控制结构和穷举/递推/迭代/递归等问题求解算法、排序和查找算法、字符串/结构体/链表等内容。
每次上机随堂测试必做题满分为50分(另有附加分2分),总计考3次,取3次测试的平均分作为实验上机测试的总分。
因属于随堂测试,故缺考者不给补考机会,当次考试成绩按0分计。因病不能参加考试者,需出具医院开的病假条,按实际参加测试的次数计算平均分。
(4) 实验小班研讨(分两次课进行)
实验小班研讨,占总成绩的10%。
采用“生讲生评、互动研学、同伴助学”的方式,分小班针对不同的实践研学主题进行互动研讨和同伴助学。 注意:本环节可以不参加,不参加本环节的学生的各项累计总分最高为90分。想冲击90分以上的学生必须参加本环节。
(5)附加分
(1)实验上机随堂测试获得附加题的附加分(2分)。
(2)实验上机测试结束后参加生讲生评可以获得1~3分的附加分。例如,某道题未获得满分的同学可邀请该题获得满分的同学一起上台讲题(鼓励每两人组成一个互帮互学小组),采用你问我答的方式分析讲解程序的错误和错误原因,两人可同时各加1分。任课教师也可以调取未获得满分的卷子,现场征集讲题者,此时仅给讲题者一人加1分。三次上机实验测试,每人最多加3分。
课程最终成绩 = (1)+(2)+(3)+(4)+(5) 其中,如果(2)实验大作业为0分的话,那么总成绩也为0分。(4)和(5)两个环节不是必须项。
序号 | 教学内容 | 教学要求 | 学时 |
1 | 1. 程序设计的方法学基础—— 基本运算和基本I/O (1) 软件开发的基本过程,现代集成开发环境,程序的编辑、编译、链接和运行; (2) 基本运算; (3) 基本I/O(在MOOC上自主学习)。 | 1.掌握常用的集成开发环境,以及程序在计算机中编辑、编译、链接和运行的过程; 2.掌握基本数据类型的基本运算,以及键盘输入和屏幕输出等简单的I/O操作,能够用基本数据类型、基本运算构造顺序结构的程序。 | 2 |
2 | 1. 程序设计的方法学基础—— 基本控制结构与基本程序设计方法 (1) 算法的基本概念,算法的流程图描述(在MOOC上自主学习); (2) 单分支/双分支/多分支选择结构,条件语句,开关语句; (3) 当型/直到型循环,计数控制/条件控制/标记控制的循环,循环语句。 (4) 三种基本控制结构的嵌套,嵌套循环的执行过程,三种基本控制结构应用于求解累加求和、连乘求积、统计、分类等实际问题; (5) 结构化程序设计的基本思想和方法(在MOOC上自主学习); (6) 测试用例的基本概念,程序测试的目的,程序测试的基本方法; (7) 常用的程序排错方法,利用现代集成开发环境的可视化调试工具调试程序的基本方法。 (8) 信息隐藏,过程抽象,函数封装,函数复用,模块分解,自顶向下、逐步求精的模块化程序设计方法(在MOOC上自主学习); (9) 函数定义、调用,参数传递,简单变量做函数参数重构代码; (10) 防御式编程,程序的健壮性、可读性和可维护性; (11) 代码风格(在MOOC上自主学习)。 | 1. 掌握算法的基本概念和流程图描述方法; 2. 掌握选择结构和循环结构的基本控制方法,面向累加求和、连乘求积、统计等应用问题,能够用顺序、选择和循环三种基本控制结构构造结构化的程序。 3. 理解结构化程序设计的基本思想,以及好结构对提高程序可读性的重要性; 4. 掌握程序测试和程序调试的基本方法和技巧。 5. 掌握模块分解的基本原则,以及自顶向下、逐步求精的模块化程序设计方法; 6. 掌握用函数封装和过程抽象重构或复用代码的基本方法 7. 掌握防御式编程的基本方法 8. 理解良好的代码风格对提高程序可读性的重要性 | 8 |
3 | 2. 程序设计的问题求解基础—— 枚举与递推,分治与递归 (1) 枚举、递推/迭代等常用问题求解策略,算法效率,程序优化; (2) 递归函数的定义、调用和执行过程,条件递归的基本要素; (3) 分治与递归之间的关系,递归与迭代的优缺点分析。 | 1. 掌握枚举、递推/迭代、递归等常用问题求解方法的基本原理思想及其程序实现方法,针对给定的问题,能够选择恰当的策略来求解问题并对程序进行优化 2. 理解分治、递归等问题求解方法的基本思想,理解分治与递归、递归与迭代之间的关系 | 2 |
4 | 3. 程序设计的算法和数据结构基础——一般线性表与排序查找算法 (1) 一般线性表的顺序存储结构 数组下标越界的错误案例分析(在MOOC上自主学习); (2) 一般线性表的遍历和求最值等基本算法及其函数程序实现,传值调用与模拟传引用调用; (3) 顺序查找、二分查找的基本思想,一般线性表上的查找算法的函数程序实现; (4) 选择排序、冒泡排序、插入排序的基本思想,一般线性表上的排序算法的函数程序实现; (5) 算法的时间复杂度(自学)。 | 1. 掌握一般线性表的遍历、求最值和排序和查找算法,针对给定的问题,能够选择恰当的算法构造程序 3. 掌握传值调用与模拟传引用调用的区别,理解数组下标越界产生的危害和后果 4. 初步了解算法时间复杂度的概念 | 4 |
5 | 3. 程序设计的算法和数据结构基础——指针与数据的间接寻址 (1) 直接寻址与间接寻址,指针的基本概念,指针变量作函数参数; (2) 字符指针和字符数组,字符串的表示和存储、输入和输出; (3) 字符指针或字符数组做函数参数,实现字符串的复制、连接、比较、检索、匹配等基本文本处理操作 缓冲区溢出,缓冲区溢出攻击(在MOOC上选学) (4) 函数指针及其应用(在MOOC上选学); (5) 指针和数组间的关系; (6) 指针数组与索引存储结构,字符串的物理排序与索引排序。 | 1. 掌握指针与间接寻址的概念,理解用指针变量作函数参数的特殊性,掌握指针做函数参数的参数传递方式,掌握指针做函数参数的程序设计和实现方法 2. 掌握字符串的表示与存储方式,以及输入输出方法,掌握向函数传递字符串实现字符串复制、连接、比较、检索、匹配等基本操作,了解缓冲区溢出与缓冲区溢出攻击 3. 了解函数指针及其在编写通用函数中的应用 4. 理解数组与指针之间的关系 5. 掌握指针数组的概念及其在字符串表示和处理中的应用,了解索引结构与索引排序 | 6 |
7 | 3. 程序设计的算法和数据结构基础——结构体与构造数据类型的应用 (1) 从定长数组到动态数组,内存映像,动态内存分配函数,动态数组的程序实现; (2) 结构体类型,共用体类型 枚举类型(在MOOC上选学) (3) 用结构体封装函数参数,向函数传递批量数据,结构体和共用体的应用实例; (4) 结构体用于对复杂静态数据结构按关键字查找和排序的函数程序实现; (5) 抽象数据类型,从结构体到类,从面向过程到面向对象(自学 )。 | 1. 理解定长数组和动态数组的区别,掌握动态内存分配函数以及动态数组的程序实现 2. 掌握用结构体封装函数参数向函数传递结构体数据的程序实现 3. 理解抽象数据类型,了解结构体和共用体类型的不同特点和应用场景(如稀疏矩阵的压缩存储与转置计算等) 4. 针对复数、有理数运算等应用问题,能够恰当地定义结构体类型并进行程序实现,掌握用结构体对复杂静态数据结构按关键字进行查找和排序的程序实现 | 4 |
8 | 3. 程序设计的算法和数据结构基础——动态数据结构 (1) 数据的逻辑结构和存储结构,从静态数据结构到动态数据结构,从线性表的顺序存储到链式存储结构; (2) 单向链表的创建、节点的遍历、插入、删除等基本操作及其函数程序实现,单向链表的冒泡排序算法及其函数程序实现; (3) 双向链表、循环链表与单向链表的不同特点,单循环链表应用实例; (4) 限定性线性表,栈和队列的数据访问方式,栈和队列的顺序存储与链式存储方式,栈和队列的应用实例; (5) 树和图等其他数据结构简介,二叉树的顺序存储与链式存储,二叉树的遍历、查找等基本操作; (6) 内存管理与文件I/O(在MOOC上选学)。 | 1. 掌握静态数据结构和动态数据结构,以及线性表的顺序存储到链式存储的优缺点,针对给定的问题,能够选择恰当的数据结构构造程序 2. 掌握单向链表的基本操作及其程序设计和实现方法 3. 了解双向链表、循环链表的基本特点 4. 掌握栈和队列的数据访问方式、存储方式及其应用 5. 初步了解树和图等其他数据结构 6. 掌握二叉树的顺序存储与链式存储,二叉树的遍历算法及其程序实现 7. 了解内存泄漏、非法内存访问等常见内存错误及其解决对策 8. 了解文件I/O的基本操作 | 6 |