• 沒有找到結果。

第 1 章 引言

N/A
N/A
Protected

Academic year: 2021

Share "第 1 章 引言"

Copied!
13
0
0

加載中.... (立即查看全文)

全文

(1)

第 1 章 引言

1.1 教学要点

本章主要介绍程序与程序设计语言的知识、C 语言的发展历史与特点,以及利用计算机 求解问题的基本过程,使学生了解相关的背景知识,对程序和程序设计语言有初步的认识,

理解计算机求解问题的基本过程。

1.1 节通过一个示例程序“计算阶乘”使学生对 C 语言程序有一个感性认识。教师在讲 授时,可以先运行程序,让学生观察程序的运行过程,再简单介绍 C 程序的构成。

1.2 节简要介绍程序的概念、程序设计语言的功能和语法要素,使学生对程序与程序设 计语言有初步的认识,不需要展开。

1.3 节简要介绍 C 语言的发展历史与特点。

1.4 节通过讲解一个示例“求 1~100 间所有偶数的和”,说明利用计算机求解问题的过程,

尤其是程序设计的主要过程。

建议教师讲授时,着重讲解 1.1 和 1.4 两节,结合程序演示,使学生对用 C 语言编程解 决实际问题的全过程有直观的认识,激发其学习编程的兴趣。宜将 2.1 节并入第一次课的讲 授,让学生第 1 次课后就能练习编程,有助于养成每周坚持课内、外上机的良好习惯。对 1.2 和 1.3 两节则简要介绍,也可以考虑将这两节的部分内容放在最后的复习课,帮助学生 梳理知识体系,体会 C 语言编程的特点。

讲授学时:2 学时,实验学时同讲授学时。

1.2 讲稿

1

Chap 1 引 言

1.1 一个C语言程序 1.2 程序与程序设计语言 1.3 C语言的发展历史与特点 1.4 实现问题求解的过程

本章分 4 节。

2

本章要点

什么是程序?程序设计语言包含哪些功能?

程序设计语言在语法上包含哪些内容?

结构化程序设计有哪些基本的控制结构?

C语言有哪些特点?

C语言程序的基本框架如何?

形成一个可运行的C语言程序需要经过哪些 步骤?

如何用流程图描述简单的算法?

提出本章的学习要点。

(2)

3

1.1 一个C语言程序

例1-1求阶乘问题。输入一个正整数n,输出n!。

#include <stdio.h> /* 编译预处理命令 */

intmain(void) /* 主函数*/

{

int n; /* 变量定义 */

intfactorial(int n); /* 函数声明 */

scanf("%d", &n); /* 输入一个整数 */

printf(“%d\n”, factorial(n)); /* 调用函数计算阶乘 */

return 0;

}

intfactorial(int n) /* 定义计算 n! 的函数 */

{

int i, fact = 1;

for(i = 1; i <= n; i++) /* 循环 */

fact = fact * i;

return fact;

}

输入 4 输出 24

C程序由函数组成 有且只有一个主函数main

展示第一个 C 语言程序,现场演示编译、

连接、运行的全过程,伴以生动的语言描 述,吸引学生的兴趣。

简要说明 C 语言由函数组成,有且只有一 个 main 函数。

4

1.2 程序与程序设计语言

程序

人们为解决某种问题用计算机可以识别的代码 编排的一系列加工步骤。

程序的执行过程实际上是对程序所表达的数据 进行处理的过程。

程序设计语言

提供了一种表达数据与处理数据的功能

要求程序员按照语言的规范编程

程序表达了要对数据进行处理的过程,运 行程序就是实际处理数据。

程序设计语言用于编写程序,因此,它必 须能表达数据、表达处理过程,同时有自 己的规范,即语法。

程序员需合法(合乎语法)使用程序设计 语言编程。

5

1.2 程序与程序设计语言

1.2.1 程序与指令

1.2.2 程序设计语言的功能

1.2.3 程序设计语言的语法

1.2.4 程序的编译与编程环境

本节介绍 4 个问题,其中程序与指令、程 序的编译与编程环境举例说明,其余简要 说明。

6

1.2.1 程序与指令

指令:计算机的一个最基本的功能 如实现一次加法运算或实现一次大小的判别

计算机的指令系统:计算机所能实现的指令 的集合

程序:一系列计算机指令的有序组合

第一个问题,介绍程序与指令。

解释指令(指令集)和程序。

指令集是有限的,但一系列指令的组合却 能实现复杂的功能,这就是计算机的奇妙 之处。

(3)

7

程序与指令

例1-2 编写程序,分别求和与乘积

虚拟的计算机指令系统(7条指令 )

指令1:Input X 将当前输入数据存储到内存的X单元

指令2:Output X 将内存X单元的数据输出。

指令3:Add X Y Z 将内存X单元的数据与Y单元的数据 相加并将结果存储到Z单元。

指令4:Sub X Y Z 将内存X单元的数据与Y单元的数据 相减并将结果存储到Z单元。

指令5:BranchEq X Y P 比较X与Y,若相等则程序跳 转到P处执行,否则继续执行下一条指令。

指令6:Jump P 程序跳转到P处执行。

指令7:Set X Y 将内存Y单元的值设为X。

例如,一个只有 7 条指令的指令系统,如 何通过对这些指令的不同组合实现求和、

乘积的功能。

将这些指令分为 3 类:

 输入和输出;

 加、减运算和赋值运算;

 流程控制。

8

程序与指令

输入3个数A, B和C,求A+B+C的结果

Input A; 输入第1个数据到存储单元A中 Input B;

Input C;

Add A B D; 将A、B相加并将结果存在D中 Add C D D; 将C、D相加并将结果存在D中 Output D; 输出D的内容

求 A+B+C,可以通过指令集中 2 类 3 条指 令(输入、求和、输出)的组合实现。

设问 1:如何求 A-B+C?

解答:

将 Add A B D;

改为:

Sub A B D;

9

程序与指令

输入A,求A+A+A的结果

解1:

Input A;

Add A A D;

Add A D D;

Output D;

解2:

Input A;

Set 0 Z;

Add Z A Z;

Add Z A Z;

Add Z A Z;

Output Z;

设问 2:如何求 A+A+A?

解 1 延续了求 A+B+C 的思路;

解 2 思路:

(1)输入一个数到 A 变量

(2)设 Z = 0

(3)重复做 3 遍:Z = Z + A;

(4)输出 Z

最后点出 A*3=A+A+A,为后面求 A*B 做 铺垫。

10

程序与指令

输入2个数A和B,求A*B A*B = A+A+……+A(B个A相加)

1.Input A;

2.Input B;

3.Set 0 X;

4.Set 0 Z;

5.BranchEq X B 9;

6.Add Z A Z;

7.Add 1 X X;

8.Jump 5;

9.Output Z;

 分别输入两个数到A、B 两个变量

 设X = 0,Z = 0

当X不等于B时,重复做 以下操作:

Z = Z + A;

X = X + 1;

输出Z

求 A*B:

先说明乘法的运算基础是加法(帮助学生 回 忆 小 学 怎 么 引 入 乘 法 概 念 ), 即 A*B=A+A+……+A(B 个 A 相加),而计 算机的乘法运算是可以用加法实现的;再 分析程序中用了指令集中 3 类 6 条指令

(除减法)实现乘法运算。

说明:X 用于计数,每加一个 A 就自增 1,

直到 X 的值等于 B,说明已经累加了 B 个 A。

(4)

11

1.2.2 程序设计语言的功能

数据表达:表达所要处理的数据

流程控制:表达数据处理的流程

第二个问题,介绍程序设计语言的功能,

即数据表达和流程控制。

12

数据表达

数据表达:一般将数据抽象为若干类型

数据类型:对某些具有共同特点的数据集合 的总称

代表的数据(数据类型的定义域)

在这些数据上做些什么(即操作或称运算)

例如:整数类型

包含的数据:{…,-2,-1,0,1,2,…}

作用在整数上的运算:+ 、 - 、 * 、 /等

数据表达:

(1)能处理哪些类型的数据?

(2)对数据能进行怎样的运算?

举例说明,如:

C 语言不能直接处理图像类型的数据;

C 语言能处理整数,对整数可以进行加、

减、乘、除和求余等算术运算;

C 语言能处理实数,但是对实数不能进行 求余运算。

13

数据表达

C语言提供的数据类型

基本数据类型:程序设计语言事先定义好,供 程序员直接使用,如整型、实型(浮点型)、

字符型等。

构造类型:由程序员构造,如数组、结构、文 件、指针等。

各种数据类型的常量与变量形式

常量(常数)与变量

如何用有限的语言语法形式表达客观世 界中多种多样的数据?

基本数据类型+构造类型

类比前面提到:虽然指令集是有限的,但 一系列指令的组合能实现复杂的功能。

14

流程控制

结构化程序设计方法

将复杂程序划分为若干个相互独立的模块

模块:一条语句(Statement)、一段程序或 一个函数(子程序)等

单入口、单出口

流程控制:描述数据处理的过程,即程序 的控制过程。

结构化程序设计方法:解决复杂问题的方 法之一,即分而治之,合而用之。

(5)

15

流程控制

任何程序都可以将模块通过3种基本的控 制结构进行组合来实现

顺序结构 分支结构 循环结构

3 种基本控制结构的组合可以解决复杂问 题。

16

流程控制

语句级控制:3种基本的控制结构

顺序控制结构:自然顺序执行

分支控制结构(选择结构):根据不同的条件来选择 所要执行的模块

循环控制结构:重复执行某个模块

单位级控制:函数的定义与调用

处理复杂问题时, 将程序分为若干个相对独立的子程序

(函数)

单位级控制:程序模块之间的控制(调用、

返回),不需展开。

17

1.2.3 程序设计语言的语法

用程序设计语言所写的程序必须符合相应 语言的语法

源程序(源代码)是一个字符序列,这些字符 序列按顺序组成了一系列“单词”,“单词”的组 合就形成了语言有意义的语法单位,一些简单 语法单位的组合又形成了更复杂的语法单位,

最后一系列语法单位组合成程序。

第三个问题,介绍程序设计语言的语法要 素。

说明 3 点:

(1)程序设计语言有自己的规范(语法)。

类比汉语语法、英语语法等。

(2)程序员编写的程序必须合法(合乎 语法)。

(3)示例给出了程序的构成,可以将其 比作写文章(字、词、句、段落、文章)。 写文章为了表达思想,编程序为了使计算 机能理解问题处理过程并解决问题(处理 数据)。

18

程序设计语言的语法

C语言的主要“单词”

(1)标识符: C语言的标识符规定由字母、数字以及下划 线组成,且第一个字符必须是字母或下划线。

(2)保留字(关键字): 它们是C语言规定的、赋予它们以 特定含义、有专门用途的标识符。

(3)自定义标识符: 包括在程序中定义的变量名、数据类 型名、函数名以及符号常量名。有意义的英文单词

(4)常量: 常量是有数据类型的,如,123、12.34

(5)运算符。代表对各种数据类型实际数据对象的运 算。如,+(加)、-(减)、*(乘)、/(除)、%(求 余)、>(大于)

程序设计语言最主要的语法要素之一:

“单词”—标识符、常量、运算符等。

结合例 1-1 说明,无需展开。

(6)

19

程序设计语言的语法

C语言的主要语法单位

(1)表达式: 运算符与运算对象组合就形成了表 达式。如,2 + 3 * 4

(2)变量定义: 变量也有数据类型,所以在定义 变量时要说明相应变量的类型。如: int i;

(3)语句: 语句是程序最基本的执行单位,程序 的功能就是通过对一系列语句的执行来实现 的。

(4)函数定义与调用

程序设计语言最主要的语法要素之一:

由“单词”组成的语法单位—表达式、变 量定义、语句、函数等。

结合例 1-1 说明,无需展开。

20

1.2.4 程序的编译与编程环境

程序的编译 编译器

程序————》计算机直接能理解的指令序列

编译器:对源程序进行词法分析、语法与语义分析,生成可执行的 代码。

直接指出程序中的语法错误

编程环境

包括编辑程序(Edit)、编译(Compile)、调试(Debug)等过 程。

掌握程序设计语言:根据语言的语法,用语言表达数 据、实现程序的控制,并会使用编程环境。

第四个问题,介绍程序的编译与编程环 境。

说明 3 点:

(1)编译可类比翻译。

(2)结合例 1-1 说明编程环境和 C 语言 上机过程(下一张 PPT)。

(3)学会编程:使用一种程序设计语言,

编写符合语法要求的程序,并在编程环境 下编译、连接、运行、调试程序,以解决 实际问题。

21

C 语言上机过程

源程序

test.cpp test.obj

可执行代码 test.exe

编译

连接

运行

22

1.3 C语言的发展历史与特点

历史

1972年:贝尔实验室的Dennis Ritchie在B语 言的基础上设计并实现了C语言。

1978年:B.W.Kernighan和D.Ritchie(简称K

& R)合著的《The C Programming Language》是各种C语言版本的基础,称之为 旧标准C语言。

1983年:美国国家标准化协会(ANSI)制定了 新的C语言标准,称ANSI C。

本节简单介绍即可。利用一些历史资料激 发学生的学习兴趣。

可结合 UNIX,介绍 C 语言的发展过程,

并说明 C 语言在业界的地位(可在网上查 找:Tiobe 编程语言排行榜)。

也可介绍 C 语言发明人 Ritchie 所获得的 荣誉。

(7)

23

C语言的特点

1.C语言是一种结构化语言

2.C语言语句简洁、紧凑,使用方便、灵活 32个关键字,9种控制语句,程序书写形式自由。

3.C语言程序易于移植

C语言将与硬件有关的因素从语言主体中分离出来,通过库函数或 其他实用程序实现它们。

4.C语言有强大的处理能力

5.生成的目标代码质量高,运行效率高

6.数据类型检查不严格,表达式出现二义性,不具备数据 越界自动检查功能,运算符的优先级与结合性对初学者难 于掌握。

C 语言中大小写字母代表不同含义

说明大小写字母代表不同含义。可将例 1-1 中某个标识符中的小写字母改为大写字 母,观察编译器的出错提示。

24

1.4 实现问题求解的过程

问题:求1~100间所有偶数的和。

1.问题分析与算法设计

求在一定范围内(1~100)、满足一定条件(偶数)的若干 整数的和,求累加和。

思路:设置一个变量(sum),其初值为0,然后在1~100的 数中(i)寻找偶数,将它们一个一个累加到sum中。

一步累加:sum = sum + i;

重复累加,用循环语句实现,在循环过程中:

(1) 判别 i 是不是偶数:用分支控制语句来实现。

(2) 对循环次数进行控制:通过 i 值的变化

本节通过示例“求 1~100 间所有偶数的和”

介绍程序设计的主要过程:

(1)问题分析与算法设计;

(2)编辑程序;

(3)编译连接;

(4)运行调试。

25

问题分析与算法设计

思路——》确定算法

算法:一组明确的解决问题的步骤,它产生结 果并可在有限的时间内终止。

算法的描述:

自然语言

伪代码

流程图:算法的图形表示法

(1)问题分析与算法设计

分析问题,明确思路,确定算法,并选择 适合的方式描述算法。

顺带介绍算法的基本概念、描述方式。

26 sum = 0

i = 1

i <= 100

i 是偶数?

sum=sum+i

i=i+1

输出sum

用程序流程图描述“求 1~100 间所有偶数 的和”的算法。

顺带回顾 3 种基本控制结构。

(8)

27

编辑程序

2.编辑程序

生成程序的源文件,C语言源文件的后缀为.c / .cpp

#include <stdio.h>

int main(void) {

int i, sum = 0;

for(i = 1; i <= 100; i++) if (i%2 == 0)

sum = sum + i;

printf("%d", sum);

return 0;

}

(2)编辑程序:现场演示,可以观察文 件的保存位置。

28

程序编译连接

3.程序编译连接

编辑程序后,用该语言的编译程序对其进行编 译,以生成二进制代码表示的目标程序(.obj),

与编程环境提供的库函数进行连接(Link)形 成可执行的程序(.exe)。

编译程序指出语法错误

(3)编译连接:现场演示,观察提示窗 口的内容(编译无错误)。

29

运行与调试

4.运行与调试

经过编辑、编译、连接,生成执行文件后,就可以在编程环境或操作系 统环境中运行该程序。

如果程序运行所产生的结果不是你想要的结果,这是程序的语义错误

(逻辑错误)。

语法错误VS 逻辑错误

调试:在程序中查找错误并修改错误的过程。

调试的方法

设置断点

单步跟踪

调试是一个需要耐心和经验的工作,也是程序设计最基本的技能之一。

(4)运行与调试:现场演示,看运行结 果。修改程序,观察语法错误、逻辑错误 及改正方法。

 语法错误:可以删除一个分号,使编 译出现错误提示,改正之,再编译。

类比写文章有错别字。

逻辑错误:将 sum=sum+i 改为 sum=sum-i,

编译、连接、运行,发现运行结果不符合 题目要求。找出错误(调试),改正之,

再编译、连接、运行,看结果。类比写文 章词不达意。

30

C语言程序的编辑、编译连接、

运行调试步骤示意图

 归纳总结 C 语言程序的编辑、编译连 接、运行调试步骤的示意图。用本章 所学过的顺序、分支以及循环三种流 程结构图来表达,达到复习前面所学 知识的目的。

(9)

1.3 习题参考答案

1.对 C 语言来说,下列标识符中哪些是合法的,哪些是不合法的?

total, _debug, Large&Tall, Counter1, begin_

解答:合法标识符:total, _debug, Counter1;不合法标识符:Large&Tall, begin_。

2.改写本章 1.4 节中的流程图 1.2,求 1~100 中能被 6 整除的所有整数的和。

解答:

图 1.1 “求 1~100 中能被 6 整除的所有整数的和”的流程图

3.改写本章 1.4 节中的程序,求 1~100 中能被 6 整除的所有整数的和,并在编程环境中验证 该程序的运行结果。

解答:

#include <stdio.h>

int main (void) {

int i, sum = 0;

for ( i = 1; i <= 100; i++ ){

(10)

if ( i % 6 == 0 ){

sum = sum + i;

} }

printf ( "%d", sum );

return 0;

}

4.对于给定的整数 n(n>1),请设计一个流程图判别 n 是否为一个素数(只能被 1 和自己整 除的整数),并分析该流程图中哪些是顺序结构、哪些是分支结构与循环结构。

解答: 在流程图中,分支结构和循环结构如图 1.2 所示,自上而下的 2 个实线框和 2 个虚线组 成了顺序结构。

图 1.2 “判别 n 是否为素数”的流程图

(11)

1.4 实验指导教材参考答案

一、编程示例

二、调试示例

三、基础编程题

(1)输出短句:在屏幕上显示一个短句“Programming in C is fun!”。

解答:

# include <stdio.h>

int main(void ) {

printf("Programming in C is fun!\n");

return 0;

}

思考:

① 如何在屏幕上显示自己的学号、姓名和班级?

解答:将上述程序中的 printf("Programming in C is fun!\n");替换为 printf("学号 姓名 班 级\n");

如:printf("31401234 张三 计算机 1401 班\n");

② 如何在屏幕上显示数字、英文字母和汉字等信息?例如:“你在计算中心 A1 机房吗?”

解答:将上述程序中的 printf("Programming in C is fun!\n");替换为 printf("你在计算中心 A1 机房吗?\n");

(2)输出三角形:在屏幕上显示下列三角形图案。(每行的*之间无空格)

****

***

**

* 解答:

# include <stdio.h>

int main(void ) {

printf("****\n***\n**\n*\n");

return 0;

}

(3)输出菱形图案:在屏幕上显示下列菱形图案。 (第 2 行两个 A 之间有 3 个空格)

A A A A

(12)

解答:

#include <stdio.h>

int main(void) {

printf(" A\nA A\n A\n");

return 0;

}

思考:如何在屏幕上显示一个由各种字符组成的图案?例如:

HHHHHH HdddddH HcccccH HHHHHH

解答:

#include<stdio.h>

int main(void) {

printf("HHHHHH\nHdddddH\nHcccccH\nHHHHHH\n");

return 0;

}

四、改错题

输出带框文字:在屏幕上输出以下 3 行信息。(源程序 error01_2.cpp)

*************

Welcome

*************

解答:

#include <stdio.h>

int main(void ) {

printf("*************\n");

printf(" Welcome\n");

printf("*************\n");

return 0;

}

五、拓展编程题

(1)输出短句(What is a computer?):在屏幕上显示一个短句“What is a computer?”

解答:

#include<stdio.h>

int main(void) {

printf("What is a computer?\n");

(13)

return 0;

}

(2)输出倒三角图案:在屏幕上显示下列倒三角图案。

* * * * * * * * * *

解答:

#include <stdio.h>

int main() {

printf("* * * *\n");

printf(" * * *\n");

printf(" * *\n");

printf(" *\n");

return 0;

}

參考文獻

相關文件

Hong Kong: The University of Hong Kong, Curriculum Development Institute of Education Department. Literacy for the

價值觀教育須結合學校和家庭教育,學校與家長必須緊密合作,才能

(2014) Press release: 42 Secondary Schools Offering Science, Technology, Engineering and Mathematics Applied Learning Programme (STEM ALP) Retrieved 12 October 2015

價值觀教育須結合學校和家庭教育,學校與家長必須緊密合作,才能

第四章: 中學報稅的設計 第五章: 初中諒程主建議 第六章: 高中諒我建議,..

Rebecca Oxford (1990) 將語言學習策略分為兩大類:直接性 學習策略 (directed language learning strategies) 及間接性學 習策略 (in-directed

內容 解說「識緣名色,名色緣識」(參閱課堂資料 3.6.1) 小結:.

[r]