1.面向过程的程序设计和算法
在面向过程的程序设计中,程序设计者必须指定计算机执行的具体步骤,程序设计者不仅要考虑程序要“做什么”,还要解决“怎么做”的问题,根据程序要“做什么”的要求,写出一个个语句,安排好它们的执行顺序。怎样设计这些步骤,怎样保证它的正确性和具有较高的效率,这就是算法需要解决的问题。
1.1 算法的概念
一个面向过程的程序应包括以下两方面内容:
(1) 对数据的描述。在程序中要指定数据的类型和数据的组织形式,即数据结构(data structure)。
(2) 对操作的描述。即操作步骤,也就是算法 (algorithm)。
对于面向过程的程序,可以用下面的公式表示: 程序=算法+数据结构
作为程序设计人员,必须认真考虑和设计数据结构和操作步骤(即算法)。
算法是处理问题的一系列的步骤。算法必须具体地指出在执行时每一步应当怎样做。不要认为只有“计算”的问题才有算法。广义地说, 为解决一个问题而采取的方法和步骤,就称为“算法”。
计算机算法可分为两大类别:数值算法和非数值算 法。数值算法的目的是求数值解。非数值算法包括 的面十分广泛,最常见的是用于事务管理领域。目前,计算机在非数值方面的应用远远超过了在数值方面的应用。
C++既支持面向过程的程序设计,又支持面向对象的程序设计。无论面向过程的程序设计还是面向对象的程序设计,都离不开算法设计。
1.2 算法的表示
1. 自然语言
用中文或英文等自然语言描述算法。但容易产生歧 义性,在程序设计中一般不用自然语言表示算法。
2. 流程图
可以用传统的流程图或结构化流程图。用图的形式 表示算法,比较形象直观,但修改算法时显得不大方便。
3. 伪代码(pseudo code)
伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。用伪代码写算法并无固定的、严格的语法规则,只需把意思表达清楚,并且书写的格式要写成清晰易读的形式。它不用图形符号,因此书写方便、格式 紧凑,容易修改,便于向计算机语言算法(即程序) 过渡。
4. 用计算机语言表示算法
用一种计算机语言去描述算法,这就是计算机程序。
2. C++程序和语句
2.1 程序
一个程序包含一个或多个程序单位 (每个程序单位构成一个程序文件)。每一个程序单位由以下几个部分组成:
(1) 预处理命令。如#include命令和#define命令。
(2) 声明部分。例如对数据类型和函数的声明,以及对变量的定义。
(3) 函数。包括函数首部和函数体,在函数体中可以包含若干声明语句和执行语句。 如下面是一个完整的C++程序:
注:如果一个变量在函数之外进行声明,此变量是全局 变量,它的有效范围是从该行开始到本程序单位结 束。如果一个变量在函数内声明,此变量是局部变 量,它的有效范围是从该行开始到本函数结束。
2.2 语句
1. 声明语句
如int a,b;在C语言中,只有产生实际操作的才称为 语句,对变量的定义不作为语句,而且要求对变量 的定义必须出现在本块中所有程序语句之前。因此 C程序员已经养成了一个习惯: 在函数或块的开头 位置定义全部变量。在C++中,对变量(以及其他对 象)的定义被认为是一条语句,并且可以出现在函 数中的任何行,即可以放在其他程序语句可以出现 的地方,也可以放在函数之外。这样更加灵活,可 以很方便地实现变量的局部化(变量的作用范围从 声明语句开始到本函数或本块结束)。
2. 执行语句
通知计算机完成一定的操作。执行语句包括:
(1) 控制语句,完成一定的控制功能。C++有9种控制语句,即
① if( )~else~(条件语句)
② for( )~(循环语句)
③ while( )~(循环语句)
④ do~while( )(循环语句)
⑤ continue(结束本次循环语句)
⑥ break(中止执行switch或循环语句)
⑦ switch(多分支选择语句)
⑧ goto(转向语句)
⑨ return (从函数返回语句)
(2) 函数和流对象调用语句。函数调用语句由一次函数调用加一个分号构成一个语句。
例如
sort(x,y,z); //假设已定义了sort函数,它有3个参数
cout<<x<<endl; //流对象调用语句
(3) 表达式语句。由一个表达式加一个分号构成一个语句。最典型的是: 由赋值表达式构成一个赋值语句。
i=i+1 //是一个赋值表达式
i=i+1; //是一个赋值语句
任何一个表达式的最后加一个分号都可以成为一个语句。一个语句必须在最后出现分号。表达式能构成语句是C和C++语言的一个重要特色。 C++程序中大多数语句是表达式语句(包括函数调用语句)
3. 空语句
下面是一个空语句:
;
即只有一个分号的语句,它什么也不做。
有时用来做被转向点,或循环语句中的循环体。
4. 复合语句
可以用 { }把一些语句括起来成为复合语句。
如下面是一个复合语句。
{
z=x+y;
if(z>100) z=z-100;
cout<<z;
}
注意:复合语句中最后一个语句中最后的分号不能省略。
3. 赋值语句
赋值语句是由赋值表达式加上一个分号构成。
(1)C++的赋值语句具有其他高级语言的赋值语句的功能。
但不同的是: C++中的赋值号“=”是一个运算符,可以写成
a=b=c=d;
而在其他大多数语言中赋值号不是运算符,上面的写法是不合法的。
(2) 关于赋值表达式与赋值语句的概念。
在C++ 中,赋值表达式可以包括在其他表达式之中,
例如 if((a=b)>0) cout<<″a>0″<0″<0) cout<<″a>0″<<endl;
按语法规定if后面的( )内是一个条件。现在在x的位置上换上一个赋值表达式“a=b”,其作用是:
先进行赋值运算(将b的值赋给a),然后判断a是否大于0,如大于0,执行cout<<″a>0″<0) ;。在if语句中的“a=b”不是赋值语句而是赋值表达式,这样写是合法的。不能写成
if((a=b;)>0) cout<<″a>0″<<endl;
因为在if的条件中不能包含赋值语句。C++把赋值语句和赋值表达式区别开来,增加了表达式的种类,能实现其他语言中难以实现的功能。
4.C++的输入与输出
输入和输出并不是C++语言中的正式组成成分。C 和C++本身都没有为输入和输出提供专门的语句结构。输入输出不是由C++本身定义的,而是在编译系统提供的I/O库中定义的。
C++的输出和输入是用“流”(stream)的方式实现的。图3.2和图3.3表示C++通过流进行输入输出的过程。
有关流对象cin、cout和流运算符的定义等信息是存 放在C++的输入输出流库中的,因此如果在程序中 使用cin、cout和流运算符,就必须使用预处理命令把头文件stream包含到本文件中:
#include <iostream>
尽管cin和cout不是C++本身提供的语句,但是在不致混淆的情况下,为了叙述方便,常常把由cin和流提取运算符“>>”实现输入的语句称为输入语句或 cin语句,把由cout和流插入运算符“<<”实现输出 的语句称为输出语句或cout语句。根据C++的语 法,凡是能实现某种操作而且最后以分号结束的都是语句。
*4.1 输入流与输出流的基本操作
cout语句的一般格式为
cout>变量1>>变量2>>……>>变量n;
cin语句的一般格式为
cin>>变量1>>变量2>>……>>变量n;
在定义流对象时,系统会在内存中开辟一段缓冲 区,用来暂存输入输出流的数据。在执行cout语句 时,先把插入的数据顺序存放在输出缓冲区中,直到输出缓冲区满或遇到cout语句中的endl(或′\n′, ends,flush)为止,此时将缓冲区中已有的数据一 起输出,并清空缓冲区。输出流中的数据在系统默 认的设备(一般为显示器)输出。
*4.2 在输入流与输出流中使用控制符
上面介绍的是使用cout和cin时的默认格式。但有时人们在输入输出时有一些特殊的要求,如在输出实数时规定字段宽度,只保留两位小数,数据向左或向右对齐等。C++提供了在输入输出流中使用的控制符(有的书中称为操纵符)。 需要注意的是: 如果使用了控制符,在程序单位的开头除了要加iostream头文件外,还要加iomanip头文件。
举例: 输出双精度数
如果在多个cout语句中使用相同的setw(n),并使用 setiosflags(ios∷right),可以实现各行数据右对齐,如果指定相同的精度,可以实现上下小数点对齐。
4.3 用getchar和putchar 函数进行字符的输入和输出
C++还保留了C语言中用于输入和输出单个字符的函数,使用很方便。其中最常用的有getchar函数和 putchar函数。
1. putchar函数(字符输出函数)
putchar函数的作用是向终端输出一个字符。例如 putchar(c); 它输出字符变量c的值。
可以看到: 用putchar可以输出转义字符, putchar(′\n′)的作用是输出一个换行符,使输出的 当前位置移到下一行的开头。putchar(66)的作用是 将66作为ASCII码转换为字符输出,66是字母′B′的 ASCII码,因此putchar(66)输出字母′B′。其余类似。
putchar(10)中的10是换行符的ASCII码, putchar(10)输出一个换行符,作用与putchar(′\n′) 相同。
2. getchar函数(字符输入函数)
此函数的作用是从终端(或系统隐含指定的输入设 备)输入一个字符。getchar函数没有参数,其一般 形式为getchar( )函数的值就是从输入设备得到的字符。
在运行时,如果从键盘输入大写字母′A′并按回车键,就会在屏幕上输出小写字母′a′。
请注意,getchar( )只能接收一个字符。getchar函数得到的字符可以赋给一个字符变量或整型变量, 也可以不赋给任何变量,作为表达式的一部分。
4.4 用scanf和printf函数进行输入和输出
在C语言中是用printf函数进行输出,用scanf函数 进行输入的。C++保留了C语言的这一用法。在此只作很简单的介绍。
scanf函数一般格式是:
scanf(格式控制,输出表列);
printf函数的一般格式是:
printf(格式控制,输出表列);