• 沒有找到結果。

temp=new item; //申请新的节点 temp->num=stno; //向节点保存数据

temp->next=head; //初始表尾为 NULL,以后用于节点的连接 head=temp; //更新表头

cin>>stno; //输入新数据 }

cout<<"The output will be:"<<endl;

temp=head; //非空表可略 while(temp!=NULL)

{cout<<setw(6)<<temp->num;

temp=temp->next;}

cout<<endl;

}

运行结果如图 4.28 所示。

图 4.28 运行结果

思考:如要求每一新表元素都插入至已生成链表的表尾位置,该如何修改程序?

4.7 常用算法

1.统计

【例 4.18】有一个协会在换届选举中由全体人员以无记名投票方式直选主席,共有 5 名 候选人,每个人的代号分别用 1、2、3、4、5 表示。每名会员填写一张选票,若同意某名候选 人则在其姓名后打上钩。试编写一计票程序。

分析:由于需要统计 5 位候选人的票数,可使用数组记录,为了方便处理,建立一个有 6 个元素的数组 a,使下标与候选人代号对应(下标是 0 未用),这样输入 2 就让 a[2]加 1。由于 不知选票数目,而编号又没有-1,可以考虑用-1 作为终止标志。根据分析,编写程序如下:

//Ex4_18.cpp

#include "iostream"

using namespace std;

void main() {

int a[6]={0},i;

cout<<"请依次输入每张选票所投候选人的代码:"<<endl;

cin>>i;

while (i!=-1) {

if (i>=1 && i<=5) a[i]++;

cin>>i;

}

for(i=1;i<=5;i++)

cout<<i<<": "<<a[i]<<endl;

}

运行结果如图 4.29 所示。

图 4.29 运行结果

【例 4.19】输入一行字符,统计其中有多少个单词(规定单词之间用空格隔开)。

分析:单词的数目可以由空格出现的次数决定(连续的若干空格算一个,一行开头的空 格不统计)。根据分析,编写程序如下:

//Ex4_19.cpp

#include "iostream"

using namespace std;

void main() {

char str[80],c;

int i,num=0,word=0; //确保输入的 m 为正整数,r 在 2~16 之间 gets(str);

cout<<"原字符串:"<<str<<endl;

for(i=0;(c=str[i])!='\0';i++) if(c==' ') word=0;

else if(word==0) {word=1;num++;}

cout<<"单词数为:"<<num<<endl;

}

运行结果如图 4.30 所示。

图 4.30 运行结果

2.数值计算

【例 4.20】编程输出以下的杨辉三角形(输出前 10 行)。

1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1

……

分析:观察上面的杨辉三角形,可找到以下规律:

(1)第一列及对角线元素均为 1。

( 2 ) 其 他 元 素 为 其 所 在 位 置 的 上 一 行 对 应 列 和 上 一 行 前 一 列 元 素 之 和 , 即 : a[i][j]=a[i-1][j-1]+a[i-1][j]。

程序如下:

//Ex4_20.cpp

#include "iostream"

#include "iomanip"

using namespace std;

#define N 6 void main() {

int i,j,a[N][N];

for(i=0;i<N;i++) {

a[i][i]=1;a[i][0]=1;} //对 a 数组的第一列和对角线元素赋值为 1

for(i=2;i<N;i++) //对除第一列和对角线之外的元素赋值 for(j=1;j<=i-1;j++)

a[i][j]=a[i-1][j-1]+a[i-1][j];

for(i=0;i<N;i++) {

for(j=0;j<=i;j++) //注意条件 j<=i 表示只输出 a 数组的左下三角形部分 cout<<setw(5)<<a[i][j];

cout<<endl;

} }

3.删除(插入)数据

【例 4.21】随机生成 10 个互不相同的 1~100 之间的整数放在一维数组中,找出值最大 的元素,并从数组中删除该值。

分析:该题涉及两个问题:

(1)随机产生若干个互不相同的数,这通过随机数每产生一个数 x,然后 x 和数组中已 有的数比较,若有相同,x 数作废,重新产生,否则该数放入数组中。重复上述过程直到产生

满 10 个数。

(2)删除操作首先从 10 个数中找最大值的下标位置 k ,然后从 k+1 到最后逐一向前 移动。

根据分析,编写程序如下:

//Ex4_21.cpp

#include "iostream"

using namespace std;

void main()

{int a[10],i, k,maxi,x;

a[0]=rand()%100+1; //产生 1~100 之间的随机数,作为第 0 个元素

for(i=1;i<10;i++) //通过程序自动形成有 9 个元素、有规律的数组

{

re: x=rand()%100+1;

for(k=0;k<i;k++)

if(x==a[k]) goto re; //找到有相同的数,重新产生数 a[i]=x; //无相同值元素,产生的数放入数组对应的元素位置中 }

cout<<"原始数据:";

for(i=0;i<10;i++) //产生的 10 个互不相同的元素 cout<<a[i]<<" ";

maxi=0;

for(i=1;i<10;i++) //查找最大值的位置 maxi if(a[maxi]<a[i]) maxi=i;

cout<<endl<<"删除最大值:"<<a[maxi];

for(i=maxi;i<9;i++) //从最大值后面的元素往前移一位 a[i]=a[i+1];

cout<<"后的数据:";

for(i=0;i<9;i++) //输出前 9 个元素 cout<<a[i]<<" ";

cout<<endl;

}

运行结果如图 4.31 所示。

图 4.31 运行结果

如果在一组有序数据中插入一个数,使这组数据仍旧有序。插入的基本思想是:

(1)查找待插入数据在数组中的位置 k。

(2)从最后一个元素开始往前直到下标为 k 的元素依次往后移动一个位置。

(3)第 k 个元素的位置空出,将要插入的数据插入。

4.数制转换

【例 4.22】编写一个程序,实现将一个十进制正整数 m 转换成 2~16 的 r 进制的字符串。

分析:将一个十进制正整数 m 转换成 r 进制数的思路是:将 m 不断除 r 取余数(若余数 超过 9,还要进行相应的变换,例如 10 变换成 A、11 变换成 B 等),直到商为 0,以反序得到 结果,即最后得到的余数在最高位。根据分析,编写程序如下:

//Ex4_22.cpp

#include "iostream"

using namespace std;

void main() {

int i=0,r,n,c[10];

long int m;

char b[17]="0123456789abcdef";

do {

cout<<"输入十进制数 m 和 r 进制基数:";

cin>>m>>r;

}while (m<0||r<2||r>16 ); //确保输入的 m 为正整数,r 在 2~16 之间 cout<<"十进制数"<<m<<"转换为"<<r<<"进制数,";

do

{c[i++]=m%r;} //取余数 while((m=m/r)!=0);

cout<<"结果为:";

for(--i;i>=0;--i)

{n=c[i];cout<<b[n];} //将余数转换成对应的字符 cout<<endl;

}

运行结果如图 4.32 所示。

图 4.32 运行结果

1.数组

数组是具有相同类型的数据的集合。根据下标的个数可将数组分为一维数组、二维数组、

三维数组等。数组的定义语句为:

类型说明符 数组名[常数表达式][…][…];

引用数组就是引用数组的各元素,可以通过下标的变化引用任意一个数组元素。需要注 意的是,不要进行下标越界的引用,那样会带来意外的副作用。

同一个数组的所有元素在存储器中占用一片连续的存储单元。

C++可以使用字符型数组存放字符串数据并实现有关字符串的操作。字符串输出是从指定

的地址开始输出,直到遇到字符串结束符‘\0’为止,因此,定义字符数值时一定要留一个数 组元素存放‘\0’。此外,C++还提供了许多字符串处理函数。使用这些函数,可以提高字符 串处理的效率。

2.指针

指针是 C++语言中的一种数据类型,是专门用来处理地址的。我们把用来存放地址的变 量称为指针变量。定义指针变量的一般格式是:

类型说明符 *指针变量名表;

指针在定义后必须初始化才能使用;否则结果不正确。此外,还要注意指针的引用、基 本运算及指针与变量的关系。

任何能由数组下标完成的操作都可以由指针来实现,用指针来处理数组及元素是最快捷的方 式。要搞清楚数组名所代表的地址常量和指向数组元素的指针变量之间的本质区别和操作异同。

3.动态存储空间

使用动态存储分配机制可以使程序在运行时根据具体情况灵活调整存储分配情况,它是 使用指针、运算符 new 和 delete 来完成的。

4.结构体与链表

结构体是由一组不同的数据类型构成的。学习时要注意掌握结构体类型的定义、结构体 成员的引用及结构体与数组的区别。

链表是一种动态数据结构,学习时要掌握链表的概念、基本操作和简单应用,以便为今 后进一步学习数据结构奠定基础。

相關文件