西北工业大学

图片
课程概述

程序设计(CPComputer Programming)课程是大学计算机教育的核心课程,它既是各类专业技术的应用基础,又是各种实践环节的软件工具,更是课程设计、学科竞赛、毕业设计、创新创业、创客科技等活动的重要平台。编程能力不仅是学习者进一步专业深造的潜力体现,也是创新人才的重要指标。

学习编程包括语言工具、问题求解、实现方法、算法思想、编程抽象、编程范式、设计模式等内容,涉及算法设计、程序实现、计算科学、软件工程、系统开发、学科交叉等方面。本质上,程序是逻辑演绎的形式化表达,反映的是人类对这个世界的数字化理解。因此,提高编程能力可从两点出发:一是以思维训练为中心的编程技能,二是以学科融合为核心的领域知识。

那么,如何学习编程呢?

1.按“双线索”学习程序语言

任何程序语言,包括C语言,都是一个标准化的、具有庞大知识内容的形式语言体系。因此以语言知识为学习线索必然是整体凌乱、抓不住主次,容易迷失学编程的方向。

须知,计算机的基本工作原理决定了计算机问题求解是“计算数据”的过程,编程就是去解决“如何表示数据”和“如何实现计算”。将“数据表示”和“程序实现”作为学习程序语言的两条主线索,抓住语言对此所起的作用,螺旋上升,交叉推进,如下图:

这时,你会发现程序语言是服务编程的工具而不是目标。

2.有“节奏感”推进编程实践

学习程序语言时需要快节奏,学习编程方法和编程技术时需要慢节奏,即使是敲代码也要有节奏,快慢使得学习者“抓大”(设计方法)“放小”(语言知识),得到最大化的“饱满感”编程训练。

学编程需要完成大量练习,称为“刷题”。编程实践过程中的灵感、技术、习惯、动机、反思以及畅想,将会把程序设计的知识逐一转化成技能,形成编程思维。对编程有激情是一件很美妙的事情,但同时也必须培养自己对于编程周边所有事情的热情。在节奏引领下可以更有效地与计算机对话,从而赋予我们将创意变成原型的能力。

这时,你会发现编程是帮助人们与计算机沟通的工具。

3.从“多维度”进行思维训练

计算科学思维是多维度的,例如基于计算技术的普适思维,特点是抽象和构造;基于算法思想的数学思维,特点是形式化和自动化;基于数据技术的逻辑思维,特点是因果关系和相关关系;基于系统结构的应用思维,特点是整体性和结构性。

程序最重要的两个基本要素是算法和数据结构,编程的难点不是算法或者数据结构本身,而是如何理解和分解问题,并将其映射到最合适的算法或数据结构上,这个映射本身不是程序要解决的问题,是人脑在思维,是构造性思维、逆向思维、猜想与试验、设计思维等全脑思维的艺术。

这时,你会发现编程是思维的体操。

4.用“系统观”拓展编程视野

衡量编程有两个重要指标:编程累计行数(TLOC)和单个程序行数(SLOC)。以解题为主的编程训练能提高TLOC,但却止步于SLOC。即使将小规模、数学型问题做成百上千,TLOC指标上去了,但SLOC却不见长。一般的,SLOC小于300行时很难让人体会到“开发的感觉”,这时编程局限在“数学工具”视野里。显然,单纯的思维训练和仅仅摄取知识信息无法形成系统观。

实际上,计算方法(数值计算、非数值计算)仅是程序设计方法的一种,程序方法学中还有诸如操作系统、人机界面、图形图像、多媒体、网络通信、数据库、硬件接口等技术领域,每个领域都有独特的编程技术和精巧的解决方法。通过引入高级编程技术的学习,融合各类学科专业的领域知识,拓展求解问题的专业覆盖面、问题复杂度和数量,可以改变编程的广度、深度和力度,形成编程核心模式及对它们不断运用所形成的思维方式的系统观,这是优秀程序员最重要的素质。

这时,你会发现编程是全方位的创新实践。

5.以“跨领域”塑造核心价值

掌握知识和能力是大学学业的价值,但仅仅是这些就可能掩盖了大学学业的核心价值和潜质,即通过知识内化为思维、通过能力提升到创造,最终拥有终身享用不尽的、可持续发展的知识发现、知识获取、知识建构的科学素养。

学会了编程就等于掌握了信息时代的听说读写能力,学习编程形成的心理技能对于我们生活的其他方面都极其有用。通过跨学科、跨领域的延伸,编程将提高问题求解的能力,提升对世界的理解力和改善解决问题的决策能力,建立起批判性思维、系统性思维、创造性思维。通过增加挑战式内容,强化在专业学科研究上表现出很强的发展潜力,形成学业核心价值。

这时,你会发现编程教会人们如何思考。


归纳起来,就是“技能提升、思维训练、系统培养、价值塑造”。

证书要求

1.本课程要求完成的作业分为3种:

A1)测验练习(简称QUIZ):在每周课后安排随堂测验,内容为程序语言知识题,题型为客观题。

A2)问题求解(简称NOJ):共有十二季编程题(其中最后两季选作),每季从题库中抽取10题,采用机器在线评阅。每题按评价指标计10.80.50.30分。每题须在2周内完成,但学习者可任意选取时间点开始,全部习题须在课程结束前完成。

S1)课程设计(简称Devforge):与本课程后续的实验课程相配套。共有2个项目题,每个项目题须在1周内完成,须在课程结束前完成。

 

2.本课程要求完成的考试分为2种:

A3)课程考试(简称cpTest考试):在课程结束的指定时间在线上机测试(针对高校用户,可进行线下集中式上机考试)。考试题为知识型客观题和编程题,题型有单选题、多选题、判断题、程序修改题、程序阅读题、程序填空题、编程题等。

S2)实验考试(简称cpSkill考试):与本课程后续的实验课程相配套。考试题均为编程题,考试成绩是通过与否、完成时间、质量因子加权计算的结果。

 

3.总成绩(实验环节仅线下或SPOC)计算方法:

按百分制计分,总成绩=QUIZ×10% + NOJ×50% + cpTest×40%

本课程后续将采用CPSTComputer Programming Skills Test,编程技能测试)综合评价理论、实验、课程设计、讨论交流等环节,给出评估学习者编程能力更科学的PSI指数(Programming Skills Index,普赛指数)。

 

4.证书:

1)合格:总成绩60分至84分为合格,申请后可获得合格证书。

2)优秀:总成绩85分至100分为优秀,申请后可获得优秀证书。

 

5.协作与欺骗政策:

1NOJcpTestcpSkill:学习者可以与其他同学讨论完成,但所有代码必须是自己编写的,当NOJ机器评阅检查出作业结果(称为查重)有较高相似度时,后提交的习题判罚0分,三次查重违例,总计分为0分。

2Devforge:学生可以与其他同学讨论或者共同完成,如果是合作完成,需要指明合作者及自己所承担的任务。

预备知识

学习者应该先修过或已经掌握计算机导论或者大学计算机基础的主要内容,了解计算机的发展过程,理解计算机系统的构成和基本工作原理,并能够熟练地操作计算机及通过互联网获取信息资源。不能双手盲打键盘的学生,需要在开课初期多练习,迎头赶上!

授课大纲

第1周:一、了解计算机的工作原理
              (1)计算机系统的组成
              (2)用途各异的计算机
              (3)指令与计算机程序
              (4)计算机中的数
            二、信息在计算机中的表示
              (1)进制数的转换
              (2)数值数据的表示与存储
              (3)字符数据的表示与存储
              (4)其他数据的表示与存储
            三、编程的理论基础
              (1)程序语言
              (2)计算机问题求解的基本特点
              (3)计算机算法及其表示
              (4)程序设计技术
            四、编写第一个C程序
              (1)C语言的历史
              (2)C语言基本词法
              (3)编写简单的程序
              (4)C程序基本结构
              (5)开发步骤
              (6)编码风格
第2周:一、将简单数据引入C程序中
              (1)数据类型
              (2)常量
              (3)变量
              (4)类型定义的修饰
            二、数值数据的运算与处理
              (1)运算符与表达式
              (2)算术运算
              (3)自增自减运算
              (4)位运算
            三、逻辑数据的运算与处理
              (1)关系运算
              (2)逻辑运算
              (3)用布尔代数简化逻辑式子
              (4)条件运算
              (5)其他运算
              (6)常量表达式
            四、赋值和类型转换
              (1)赋值运算符
              (2)隐式类型转换
              (3)显式类型转换
              (4)混合运算的风险控制
第3周:一、编写程序语句
              (1)编写简单语句和复合语句
              (2)编写注释
              (3)语句的写法
              (4)编程实现单个字符输入输出
            二、编程实现简单数据的输出
              (1)printf函数
              (2)输出格式控制
            三、编程实现简单数据的输入
              (1)scanf函数
              (2)输入格式控制
            四、编程实现选择分支
              (1)程序顺序结构
              (2)程序选择结构
第4周:一、编程实现嵌套的选择分支
              (1)选择结构的嵌套
              (2)程序如何应用选择结构
            二、编程实现循环
              (1)while循环
              (2)循环三要素
              (3)do循环
              (4)for循环
            三、循环的终止、加快和嵌套
              (1)终止循环
              (2)加快循环
              (3)嵌套循环
              (4)编写计数型循环
              (5)编写条件型循环
              (6)对循环程序的时间性能分析
            四、编程实现枚举算法
              (1)枚举算法策略
              (2)迭代算法、递推算法
第5周:一、调用函数-返回与参数传递
              (1)函数定义
              (2)函数返回
              (3)函数参数
              (4)如何设计参数
            二、调用函数-原型与声明
              (1)函数声明和原型
              (2)库函数调用
              (3)常用库函数
              (4)使用第三方函数库
            三、调用函数-调用形式
              (1)内联函数
              (2)函数嵌套和递归调用
              (3)递归算法策略
              (4)分治算法策略
            四、设计函数-函数间的数据传递(1)
              (1)局部变量和全局变量
              (2)对象作用域
              (3)同一文件的对象冲突与共享
              (4)不同文件的对象冲突与共享
第6周:一、设计函数-函数间的数据传递(2)
              (1)程序映像
              (2)程序加载
              (3)进程内存分配原理
              (4)对象的生命期
            二、设计函数-接口与实现分离
              (1)对象初始化
              (2)声明与定义
              (3)多模块下的函数设计
              (4)接口与实现分离
            三、编写规模化程序
              (1)多文件程序结构
              (2)工程项目
              (3)规模化程序的组织
              (4)开发工具的项目管理功能
            四、编程任务的自动化
              (1)预处理命令
              (2)不带参数的宏定义
              (3)带参数的宏定义
              (4)编译器预定义宏
第7周:一、编程任务的接口与版本控制
              (1)文件包含
              (2)第三方函数库的文件包含
              (3)条件编译
              (4)实用预处理命令
            二、配置开发环境
              (1)开发环境的路径参数
              (2)开发环境的配置
              (3)第三方开发库的包含和连接
              (4)第三方开发库的配置方法
            三、批量数据的表示与处理
              (1)一维数组的定义与初始化
              (2)多维数组的定义与初始化
            四、批量数据的遍历与访问
              (1)数组元素的遍历
              (2)矩阵运算
第8周:一、函数之间实现批量数据传递
              (1)用数组作为函数参数
              (2)数组参数的传递机制
            二、构建大数和高精度类型
              (1)大数类型的接口设计
              (2)大数类型的实现
              (3)高精度运算算法
              (4)如何调用第三方软件-以Matlab为例
            三、文字信息的表示与处理
              (1)字符串的表示与存储
              (2)字符串的输入与输出
              (3)字符串的处理
              (4)字符串与数值之间的转换
            四、实现排序算法
              (1)排序概念
              (2)冒泡排序
              (3)选择排序
              (4)插入排序
              (5)快速排序
              (6)排序算法的时间性能分析
              (7)归并排序
              (8)希尔排序
              (9)堆排序
              (10)非比较交换型排序
第9周:一、用空间换取时间编程方法
              (1)顺序查找法
              (2)二分查找法
              (3)插值查找法
              (4)斐氏查找法
              (5)空间换取时间
              (6)用数学方法解决问题
            二、探究指针的本质与使用
              (1)指针的本质
              (2)指针变量的定义与引用
              (3)指针变量的初始化
              (4)指针变量的赋值
            三、指针运用的风险控制
              (1)指针的有效性
              (2)指针的风险控制
              (3)指针的运算规则
              (4)指针的限定
            四、数组元素的简洁表示
              (1)指向一维数组元素的指针
              (2)指向多维数组元素的指针
第10周:一、大批量数据的简洁表示
              (1)指向数组的指针
              (2)元素为指针的数组
              (3)多级指针
              (4)批量数据简洁表示的基本思路
               二、完美实现函数之间的数据交换
              (1)指向字符串的指针
              (2)指向字符串数组的指针
              (3)指针作为函数参数
              (4)数组作为函数参数的实质
               三、字符串查找与匹配
              (1)指针参数的const限定
              (2)字符串作为函数参数
              (3)字符串查找算法
              (4)字符串匹配算法
               四、回调函数
              (1)函数返回指针数据
              (2)函数指针
              (3)带参数的main函数
              (4)回调函数
              (5)函数同步调用和异步调用
              (6)钩子函数和HOOK技术
第11周:一、使用动态内存
              (1)动态内存的概念
              (2)分配动态内存
              (3)释放动态内存
              (4)动态内存的应用
               二、复杂数据在C程序中的表示
              (1)结构体类型
              (2)结构体对象
              (3)复杂数据为元素的数组
              (4)用指针简洁表示复杂数据
               三、编程使用复杂数据
              (1)函数传递复杂数据
              (2)共用体类型和对象
              (3)枚举数据类型
              (4)位域数据类型
               四、构建数据类型体系
              (1)用户自定义类型
              (2)类型名字体系
              (3)链表的基本概念
              (4)创建链表
第12周:一、链表的运算
              (1)遍历链表
              (2)销毁链表
              (3)查找结点
              (4)逆序链表
              (5)单链表插入结点
              (6)单链表删除结点
              (7)双链表插入结点
              (8)双链表删除结点
               二、常用算法及策略
              (1)动态规划算法
              (2)贪心算法
              (3)图搜索算法
              (4)广度优先搜索BFS
              (5)深度优先搜索DFS
              (6)回溯算法
               三、编程操作永久性数据
              (1)文件系统概念
              (2)流式文件
              (3)文件指针
              (4)文件打开
              (5)关闭文件
              (6)文件状态
              (7)文件缓存
              (8)文件定位
               四、编程读写文件
              (1)文件读写操作的基本形式
              (2)从文件中读写字符与字符串数据
              (3)从文件中读写二进制数据
              (4)成千上万的文件格式

参考资料

1.姜学锋、曹光前,C程序设计,清华大学出版社,2012年,ISBN 978-7-302-28011-8在线购买

2.姜学锋、魏英,C程序设计实验教程,清华大学出版社,2011年,ISBN 978-7-302-24943-6在线购买

3.姜学锋、刘君瑞、汪芳,C程序设计习题与解析,清华大学出版社,2011年,ISBN 978-7-302-24942-9在线购买

常见问题

......

分享