博文
C++ 入门 第5章 5.3.4 二维数组程序举例(2008-09-18 16:14:00)
摘要:
例5.4 将一个二维数组行和列元素互换,存到另一个二维数组中。例如
a= 1 2 3
4 5 6
b= 1 4
2 5
3 6
程序如下:
#include <iostream>
using namespace std;
int main( )
{
int a[2][3]={{1,2,3},{4,5,6}};
int b[3][2],i,j;
cout<<″array a:″<<endl;
for (i=0;i<=1;i++)
{
for (j=0;j<=2;j++)
{ cout<<a[i][j]<<″ ″;
b[j][i]=a[i][j];
}
cout<<endl;
}
cout<<″array b:″<<endl;
for (i=0;i<=2;i++)
{
for(j=0;j<=1;j++)
cout<<b[i][j]<<″ ″;
cout<......
C++ 入门 第5章 5.3.2 二维数组的引用(2008-09-18 16:11:00)
摘要:
二维数组的元素的表示形式为
数组名 [下标][下标]
如a[2][3]。下标可以是整型表达式,如a[2-1][2*2-1]。不要写成a[2,3],a[2-1,2*2-1]形式。
数组元素是左值,可以出现在表达式中,也可以被赋值,例如
b[1][2]=a[2][3]/2;
在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内。常出现的错误是
int a[3][4]; //定义3行4列的数组
┆
a[3][4]=15; //引用a[3][4]元素
定义a为3×4的数组,它可用的行下标值最大为2,列坐标值最大为3。最多可以用到a[2][3],a[3][4]就超过了数组的范围。
请严格区分在定义数组时用的a[3][4]和引用元素时的a[3][4]的区别。前者a[3][4]用来定义数组的维数和各维的大小,后者a[3][4]中的3和4是下标值,a[3][4]代表某一个元素。
5.3.3 二维数组的初始化
可以用下面的方法对二维数组初始化:
(1) 分行给二维数组赋初值。如
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
这种赋初值方法比较直观,把第1个花括号内的数据赋给第1行的元素,第2个花括号内的数据赋给第2行的元素……即按行赋初值。
(2) 可以将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。如
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
效果与前相同。但以第1种方法为好,一行对一行,界限清楚。用第2种方法如果数据多,写成一大片,容易遗漏,也不易检查。
这种方法对非0元素少时比较方便,不必将......
C++ 入门 第5章 5.3 二维数组的定义和引用(2008-09-18 16:10:00)
摘要:
具有两个下标的数组称为二维数组。有些数据要依赖于两个因素才能惟一地确定,例如有3个学生,每个学生有4门课的成绩,显然,成绩数据是一个二维表,如书中表5.1所示。
想表示第3个学生第4门课的成绩,就需要指出学生的序号和课程的序号两个因素,在数学上以S3,4表示。在C++中以s[3][4]表示,它代表数据73。
5.3.1 定义二维数组
定义二维数组的一般形式为
类型标识符 数组名[常量表达式][常量表达式]
例如
float a[3][4],b[5][10];
定义a为3×4(3行4列)的单精度数组,b为5×10(5行10列)的单精度数组。注意不能写成“float a[3,4],b[5,10];”。C++对二维数组采用这样的定义方式,使我们可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。例如,可以把a看作是一个一维数组,它有3个元素:a[0],a[1],a[2],每个元素又是一个包含4个元素的一维数组,见图5.4。a[0],a[1],a[2]是3个一维数组的名字。
图5.4
上面定义的二维数组可以理解为定义了3个一维数组,即相当于
float a[0][4],a[1][4],a[2][4]
此处把a[0],a[1],a[2]作一维数组名。C++的这种处理方法在数组初始化和用指针表示时显得很方便,这在以后会体会到。
C++中,二维数组中元素排列的顺序是:按行存放,即在内存中先顺序存放第一行的元素,再存放第二行的元素。图5.5表示对a[3][4]数组存放的顺序。
C++允许使用多维数组。有了二维数组的基础,再掌握多维数组是不困难的。例如,定义三维数组的方法是
float a[2][3][4];
定义float型三维数组a,它有2×3×4=24个元素。多维数组元素在内存中的排列顺序:第一维的下标变化最慢,最右边的下标变化最快。例如,上述三维数组的元素排列顺序为
a[0][0][0]→a[0][0][1]→a[0][0][2]→a[0][0][3]→a[0][1][0]→a[0][1][1]→a[0][1][2]→a[0]......
C++ 入门 第5章 数组 5.2.4 一维数组程序举例(2008-09-18 16:07:00)
摘要:
例5.2 用数组来处理求Fibonacci数列问题。
可以用20个元素代表数列中的20个数,从第3个数开始,可以直接用表达式f[i]=f[i-2]+f[i-1]求出各数。
程序如下:
#include <iostream>
#include <iomanip>
using namespace std;
int main( )
{ int i;
int f[20]={1,1}; //f[0]=1,f[1]=1
for(i=2;i<20;i++)
f[i]=f[i-2]+f[i-1]; //在i的值为2时,f[2]=f[0]+f[1],依此类推
for(i=0;i<20;i++) //此循环的作用是输出20个数
{if(i%5==0) cout<<endl; //控制换行,每行输出5个数据
cout<<setw(8)<<f[i]; //每个数据输出时占8列宽度
}
cout<<endl;  ......
C++ 入门 第5章 5.2.3 一维数组的初始化(2008-09-16 13:09:00)
摘要:
(1) 在定义数组时分别对数组元素赋予初值。例如
int a[10]={0,1,2,3,4,5,6,7,8,9};
(2) 可以只给一部分元素赋值。例如
int a[10]={0,1,2,3,4};
(3) 如果想使一个数组中全部元素值为1,可以写成
int a[10]={1,1,1,1,1,1,1,1,1,1};
不能写成 int a[10]={1*10};
不能给数组整体赋初值。
(4) 在对全部数组元素赋初值时,可以不指定数组长度。例如
int a[5]={1,2,3,4,5};
可以写成 int a[]={1,2,3,4,5};
5.2.4 一维数组程序举例
例5.2 用数组来处理求Fibonacci数列问题。
可以用20个元素代表数列中的20个数,从第3个数开始,可以直接用表达式f[i]=f[i-2]+f[i-1]求出各数。
程序如下:
#include <iostream>
#include <iomanip>
using namespace std;
int main( )
{ int i;
int f[20]={1,1}; //f[0]=1,f[1]=1
for(i=2;i<20;i++)
f[i]=f[i-2]+f[i-1]; //在i的值为2时,f[2]=f[0]+f[1],依此类推
for(i=0;i<20;i++)  ......
C++ 入门 第5章 数组 5.2.2 引用一维数组的元素(2008-09-16 13:07:00)
摘要:
数组必须先定义,然后使用。只能逐个引用数组元素的值而不能一次引用整个数组中的全部元素的值。
数组元素的表示形式为
数组名[下标]
下标可以是整型常量或整型表达式。例如
a[0]= a[5]+ a[7]- a[2*3]
例5.1 数组元素的引用。
#include <iostream>
using namespace std;
int main( )
{int i,a[10];
for (i=0;i<=9;i++)
a[i]=i;
for (i=9;i>=0;i--)
cout<<a[i]<<″ ″;
cout<<endl;
return 0;
}
运行结果如下:
9 8 7 6 5 4 3 2 1 0
程序使a[0]~a[9]的值为0~9,然后按逆序输出。
......
C++ 入门 第5章 数组(2008-09-16 13:06:00)
摘要:
5.1 数组的概念
5.2 一维数组的定义和引用
5.3 二维数组的定义和引用
5.4 用数组名作函数参数
5.5 字符数组
*5.6 C++处理字符串的方法——字符串类与字符串变量
5.1 数组的概念
概括地说: 数组是有序数据的集合。要寻找一个数组中的某一个元素必须给出两个要素,即数组名和下标。数组名和下标惟一地标识一个数组中的一个元素。
数组是有类型属性的。同一数组中的每一个元素都必须属于同一数据类型。一个数组在内存中占一片连续的存储单元。如果有一个整型数组a,假设数组的起始地址为2000,则该数组在内存中的存储情况如图5.1所示。
引入数组就不需要在程序中定义大量的变量,大大减少程序中变量的数量,使程序精炼,而且数组含义清楚,使用方便,明确地反映了数据间的联系。许多好的算法都与数组有关。熟练地利用数组,可以大大地提高编程和解题的效率,加强了程序的可读性。
C++用方括号来表示下标,如用s[1],s[2],s[3] 分别代表s1,s2,s3。
5.2 一维数组的定义和引用
5.2.1 定义一维数组
定义一维数组的一般格式为
类型标识符 数组名[常量表达式];
例如
int a[10];
它表示数组名为a,此数组为整型,有10个元素。
说明:
(1) 数组名定名规则和变量名相同,遵循标识符定名规则。
(2) 用方括号括起来的常量表达式表示下标值,如下面的写法是合法的:
int a[10];
int a[2*5];
int a[n*2]; //假设前面已定义了n为常变量
(3) 常量表达式的值表示元素的个数,即数组长度。例如,在“int a[10];”中,10表示a数组有10个元素,下标从0开始,这10个元素是: a[0],......
C++ 入门 第四章 2. include命令的两种形式(2008-09-13 19:10:00)
摘要:
在#include命令中,文件名除了可以用尖括号括起来以外,还可以用双撇号括起来。#include命令的一般形式为
#include <文件名>
或
#include ″文件名″
如
#include <iostream>
或
#include ″iostream″
都是合法的。二者的区别是: 用尖括号时,系统到系统目录中寻找要包含的文件,如果找不到,编译系统就给出出错信息。
有时被包含的文件不一定在系统目录中,这时应该用双撇号形式,在双撇号中指出文件路径和文件名。
如果在双撇号中没有给出绝对路径,如#include ″file2.c″则默认指用户当前目录中的文件。系统先在用户当前目录中寻找要包含的文件,若找不到,再按标准方式查找。如果程序中要包含的是用户自己编写的文件,宜用双撇号形式。
对于系统提供的头文件,既可以用尖括号形式,也可以用双撇号形式,都能找到被包含的文件,但显然用尖括号形式更直截了当,效率更高。
3. 关于C++标准库
在C++编译系统中,提供了许多系统函数和宏定义,而对函数的声明则分别存放在不同的头文件中。如果要调用某一个函数,就必须用#include命令将有关的头文件包含进来。C++的库除了保留C的大部分系统函数和宏定义外,还增加了预定义的模板和类。但是不同C++库的内容不完全相同,由各C++编译系统自行决定。不久前推出的C++标准将库的建设也纳入标准,规范化了C++标准库,以便使C++程序能够在不同的C++平台上工作,便于互相移植。新的C++标准库中的头文件一般不再包括后缀.h,例如
#include <string>
但为了使大批已有的C程序能继续使用,许多C++编译系统保留了C的头文件,即提供两种不同的头文件,由程序设计者选用。如
#include <iostream.h> //C形式的头文件
#include <iostream> &n......
C++ 入门 第四章 4.16.1 宏定义(2008-09-13 19:08:00)
摘要:
可以用#define命令将一个指定的标识符(即宏名)来代表一个字符串。定义宏的作用一般是用一个短的名字代表一个长的字符串。它的一般形式为
#define 标识符 字符串
这就是已经介绍过的定义符号常量。如
#define PI 3.1415926
还可以用#define命令定义带参数的宏定义。其定义的一般形式为
#define 宏名(参数表) 字符串
如
#define S(a,b) a*b //定义宏S(矩形面积),a、b为宏的参数
使用的形式如下:
area=S(3,2)
用3、2分别代替宏定义中的形式参数a和b,即用3*2代替S(3,2)。因此赋值语句展开为
area=3*2;
由于C++增加了内置函数(inline),比用带参数的宏定义更方便,因此在C++中基本上已不再用#define命令定义宏了,主要用于条件编译中。
4.16.2 “文件包含”处理
1.“文件包含”的作用
所谓“文件包含”处理是指一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。C++提供了#include命令用来实现“文件包含”的操作。如在file1.cpp中有以下#include命令:
#include ″file2.cpp″
它的作用见图4.18示意。
“文件包含”命令是很有用的,它可以节省程序设计人员的重复劳动。
#include命令的应用很广泛,绝大多数C++程序中都包括#include命令。现在,库函数的开发者把这些信息写在一个文件中,用户只需将该文件“包含”进来即可(如调用数学函数的,应包含cmath文件),这就大大简化了程序,写一行#include命令的作用相当于写几十行、几百行甚至更多行的内容。这种常用在文件头部的被包含的文件称为“标题文件”或“头部文件”。
头文件一般包含以下几类内容:
(1) 对类型的声明。
(2) 函数声明。
(3) 内置(inline)函数的定义。
(4) 宏定义。用#define定义的......
C++ 入门 第四章 4.16 预处理命令(2008-09-13 19:05:00)
摘要:
可以在C++源程序中加入一些“预处理命令”(preprocessor directives),以改进程序设计环境,提高编程效率。预处理命令是C++统一规定的,但是它不是C++语言本身的组成部分,不能直接对它们进行编译(因为编译程序不能识别它们)。
现在使用的C++编译系统都包括了预处理、编译和连接等部分,因此不少用户误认为预处理命令是C++语言的一部分,甚至以为它们是C++语句,这是不对的。必须正确区别预处理命令和C++语句,区别预处理和编译,才能正确使用预处理命令。C++与其他高级语言的一个重要区别是可以使用预处理命令和具有预处理的功能。
C++提供的预处理功能主要有以下3种:
(1) 宏定义
(2) 文件包含
(3) 条件编译
分别用宏定义命令、文件包含命令、条件编译命令来实现。为了与一般C++语句相区别,这些命令以符号“#”开头,而且末尾不包含分号。
......