课程详情
课程评价
spContent=人类学语言时,学会了听说读写,学数学时,学会了运算推理,学物理时,学会了观察实证,从而可以理解现实生活的周围,以便针对问题提出有效的解决方案。出于同样的理由,我们应该学习编程,这样能更好地理解越来越数字化的世界。编程不只是一门技术,它教会人们如何思考。现在,与我们一起学编程吧!
—— 课程团队
课程概述

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

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

那么,如何学习编程呢?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

授课目标

本科生和社会学习者

课程大纲

第1讲 了解计算机的工作原理

课后测验:了解计算机的工作原理

1.计算机系统的组成、用途各异的计算机

2.指令与计算机程序、计算机中的数

第2讲 信息在计算机中的表示

课后测验:信息在计算机中的表示

1.进制数的转换

2.数值数据、字符数据、其他数据的表示与存储

第3讲 编程的理论基础

课后测验:编程的理论基础

1.程序语言、计算机问题求解的基本特点

2.计算机算法及其表示、程序设计技术

第4讲 编写第一个C程序

课后测验:编写第一个C程序

Chapter 1 Quiz (Only for international class)

1.C语言的历史、C语言基本词法、编写第1个C程序

2.编写简单的程序、C程序基本结构、开发步骤、编码风格

第5讲 将简单数据引入C程序中

课后测验:将简单数据引入C程序中

1.数据类型、常量

2.变量、类型定义的修饰

资料片:国际大学生程序设计竞赛――2014西安赛区:欢迎

资料片:国际大学生程序设计竞赛――竞赛规则

第6讲 数值数据的运算与处理

课后测验:数值数据的运算和处理

1.运算符与表达式、算术运算

2.自增自减运算、位运算

第7讲 逻辑数据的运算与处理

课后测验:逻辑数据的运算和处理

1.关系运算、逻辑运算

2.用布尔代数简化逻辑式子、条件运算、其他运算、常量表达式

第8讲 赋值和类型转换

课后测验:赋值与类型转换

Chapter 2 Quiz  (Part I)  (Only for NPU international Class)

1.赋值运算符、隐式类型转换

2.混合运算的风险控制、显式类型转换

资料片:AlphaGo

第9讲 编写程序语句

课后测验:编写程序语句

1.编写简单语句、复合语句、注释,语句的写法

2.编程实现单个字符输入输出

资料片:那些年的编程快手们――用代码将梦想照进现实

第10讲 编程实现简单数据的输出

课后测验:编程实现简单数据的输出

1.printf函数和输出格式控制(1)

2.printf函数和输出格式控制(2)

第11讲 编程实现简单数据的输入

课后测验:编程实现简单数据的输入

1.scanf函数和输入格式控制(1)

2.scanf函数和输入格式控制(2)

第12讲 编程实现选择分支

课后测验:编程实现选择分支

Chapter 3 Quiz (Part I) (Only for NPU international class)

1.程序顺序结构和跳转结构

2.程序选择结构

第13讲 编程实现嵌套的选择分支

课后测验:编程实现嵌套的选择分支

1.选择结构的嵌套

2.程序如何应用选择结构

资料片:算法的舞蹈――冒泡排序Bubble Sort

第14讲 编程实现循环

课后测验:编程实现循环

1.while循环、循环三要素

2.循环不变式、do和for循环

资料片:算法的舞蹈――选择排序Select Sort

第15讲 循环的终止、加快和嵌套

课后测验:循环的终止、加快和嵌套

1.终止、加快、嵌套循环

2.编写计数型、条件型循环,循环程序时间性能分析

资料片:算法的舞蹈――插入排序Insert Sort

第16讲 编程实现枚举算法

课后测验:编程实现枚举算法

Chapter 4 Quiz (Only for NPU international class)

1.枚举算法策略

2.迭代算法、递推算法

资料片:算法的舞蹈――快速排序Quick Sort

第19讲 调用函数-调用形式

课后测验:调用函数-调用形式

1.函数调用优化,函数嵌套和递归调用

2.递归算法策略、分治算法策略

资料片:算法的天籁之音――6分钟“听”15种排序算法

第17讲 调用函数-返回与参数传递

课后测验: 调用函数-返回与参数传递

1.函数定义语法和函数返回

2.如何设计函数参数

资料片:算法的舞蹈――归并排序Merge Sort

第18讲 调用函数-原型与声明

课后测验:调用函数-原型与声明

1.函数声明、原型及库函数调用方法

2.常用库函数和第三方函数库使用

资料片:算法的舞蹈――希尔排序Shell Sort

第20讲 设计函数-函数间的数据传递(1)

课后测验:设计函数-函数间的数据传递(1)

Chapter 5 Quiz - Function (Only for NPU international class)

1.对象作用域概念

2.多模块下的作用域设计

资料片:排序算法比较

第21讲 设计函数-函数间的数据传递(2)

课后测验:设计函数-函数间的数据传递(2)

1.程序映像及加载

2.对象生命期设计

第22讲 设计函数-接口与实现分离

课后测验:设计函数-接口与实现分离

1.对象初始化

2.多模块下的接口设计

第23讲 编写规模化程序

课后测验:编写规模化程序

1.多文件程序结构与组织

2.规模化程序的工程设计

第24讲 编程任务的自动化工具

课后测验:编程任务的自动化工具

Chapter 6 Quiz I - Program organization (Only for NPU international Class)

1.用宏实现编程任务自动化

2.编译器预定义宏

第25讲 编程任务的接口与版本控制

课后测验:编程任务的接口与版本控制

1.文件包含

2.实现版本控制

第26讲 配置开发环境

1.开发环境参数与配置

2.使用第三方开发库

第27讲 批量数据的表示与处理

课后测验:批量数据的表示与处理

1.一维数组

2.多维数组

第28讲 批量数据的遍历与访问

课后测验:批量数据的遍历与访问

Chapter 7 Quiz I - Array (Only for NPU International Class)

Chapter 7 Quiz II - String (Only for NPU International Class)

1.数组元素的遍历

2.矩阵运算

第29讲 函数之间实现批量数据传递

课后测验:函数之间实现批量数据传递

1.幻方编程

2.传递数组参数

第30讲 构建大数和高精度类型

课后测验:构建大数和高精度类型

1.构建大数类型

2.高精度运算和混合编程

第32讲 实现排序算法

课后测验:实现排序算法

Chapter 8  Quiz I - Pointer  (Only for NPU International Class)

Chapter 8 Quiz II - StringII  (Only for NPU International Class)

1.实现冒泡、选择、插入排序

2.实现快速、归并、希尔等排序算法

第31讲 文字信息的表示与处理

课后测验:文字信息的表示与处理

1.字符串的表示与处理

2.字符串应用

第33讲 用空间换取时间编程方法

课后测验:用空间换取时间编程方法

1.实现查找算法

2.用空间换取时间编程

第34讲 探究指针的本质与使用

课后测验: 探究指针的本质与使用

1.指针的本质是什么?

2.使用指针

第35讲 指针运用的风险控制

课后测验:指针运用的风险控制

1.指针的有效性和风险控制

2.指针的运算规则

第36讲 数组元素的简洁表示

课后测验:数组元素的简洁表示

Chapter 9 Quiz - User-defined Data Type (Only for NPU International Class)

1.指向一维数组元素的指针

2.指向多维数组元素的指针

第37讲 大批量数据的简洁表示

课后测验:大批量数据的简洁表示

1.指向数组的指针和指针数组

2.多级指针和批量数据简洁表示

第38讲 完美实现函数之间的数据交换

课后测验:完美实现函数之间的数据交换

1.批量文字简洁表示

2.函数之间数据交换的高效方法

第39讲 字符串查找与匹配

课后测验:字符串查找与匹配

1.函数之间传递字符串数据

2.字符串查找与匹配算法

第40讲 回调函数

课后测验:回调函数

Chapter 10 Quiz I - Linked List (Only for NPU International Class)

Chapter 10 Quiz II - File (Only for NPU International Class)

1.学会用指针数据

2.学会用回调函数

第41讲 使用动态内存

课后测验:使用动态内存

1.获取动态内存

2.使用动态内存

第42讲 复杂数据在C程序中的表示

课后测验:复杂数据在C程序中的表示

1.结构体类型与对象

2.用指针简洁表示复杂数据

第43讲 编程使用复杂数据

课后测验:编程使用复杂数据

1.共用体类型和对象

2.枚举与位域

第44讲 构建数据类型体系

课后测验:构建数据类型体系

1.构建数据类型体系

2.用链表表示动态“数组”

第45讲 链表的运算

课后测验:用链表表示动态的复杂数据

1.链表的运算

2.结点插入和删除

第46讲 常用算法及策略

1.动态规划与贪心算法

2.图搜索与回溯算法

第47讲 编程操作永久性数据

课后测验:编程操作永久性数据

1.文件系统概念

2.操作文件

第48讲 编程读写文件

课后测验:编程读写文件

1.用C程序读写文件

2.编程处理各种格式的文件

预备知识

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

证书要求

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

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

A2)问题求解(简称NOJ,网址:www.cpskill.com):共有十季编程题,每季从题库中抽取10题,采用机器在线评阅。每题须在2周内完成,但学习者可任意选取时间点开始,全部习题须在课程结束前完成。

A3)课程设计(简称Devforge,网址:www.cpskill.com):与本课程后续的拓展实验配套,共有两个项目题,每个题目需在1-2周内完成,全部项目必须在课程结束前完成

 

2.本课程要求完成的考试如下

期末考试(简称cpTest)在课程结束的指定时间进行MOOC课程线上测试。考试题型为编程题等。

 

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

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

 

4.证书:

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

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

 

5.协作与欺骗政策:

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

参考资料

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在线购买

常见问题

......