05数组与字符串.docx

上传人:b****6 文档编号:7152595 上传时间:2023-01-21 格式:DOCX 页数:10 大小:20.08KB
下载 相关 举报
05数组与字符串.docx_第1页
第1页 / 共10页
05数组与字符串.docx_第2页
第2页 / 共10页
05数组与字符串.docx_第3页
第3页 / 共10页
05数组与字符串.docx_第4页
第4页 / 共10页
05数组与字符串.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

05数组与字符串.docx

《05数组与字符串.docx》由会员分享,可在线阅读,更多相关《05数组与字符串.docx(10页珍藏版)》请在冰豆网上搜索。

05数组与字符串.docx

05数组与字符串

第五章 数组(结构类型一)

5.1一维数组

〖语法分析〗

    在编程时用到一批类型相同的数据,为了处理上的方便,通常以数组的形式来定义这一批数据。

1、数组的定义格式:

Var

   a:

array[1..10]ofinteger;

    其中:

a是这一批数据的名称,称为数组名;array、of是定义数组的保留字;中括号中的数字是数据编号的下限和上限,同时也说明了数据的个数(上限-下限);最后一个是数据的基类型,如integer,char,real,boolean。

2、数组元素的输入:

数组名代表的并不是一个变量,而是一批变量,因而,不能直接整个数组读入,而是要逐个数组元素读入,通常用循环结构来完成这一功能。

下面是几个常用输入数组元素的例子:

fori:

=1to10doread(a[i]);

    {从键盘读入数组元素的值;最常用的方法}

fori:

=1to10doa[i]:

=i;

    {数组元素a[1]到a[10]的值分别为1到10;数据赋初值}

fori:

=1to10doa[i]:

=0;

    {数组元素清0;最常用的数据初始化的方法}

fori:

=1to10doa[i]:

=random(100);

    {随机产生10个100以内的数,赋给各数组元素}

 3、数组元素的输出:

    和数组元素的输入相同,数组元素的输出也不能由一个write语句直接完成。

同样要逐个数组元素输出。

通常也用循环结构来完成这一功能:

fori:

=1to10dowrite(a[i],'');{————数组元素之间用空格分隔}

writeln;

  4、数组的应用:

    例1:

从键盘输入10个数,将这10个数逆序输出,并求这10个数的和,输出这个和。

programp1;

var

    a:

array[1..10]ofinteger;

    i,s:

integer;

begin

    fori:

=1to10doread(a[i]);

    fori:

=10downto1dowrite(a[i],'');

    writeln;

    s:

=0;

    fori:

=1to10dos:

=s+a[i];

    writeln('s=',s);

end.

例2:

输入10个整数,把这10个数按从小到大的顺序排序。

(一)〔冒泡法排序〕算法描述:

1、从a[1]到a[10]把相邻的两个数两两比较;

2、在每次进行比较过程中,若前一个数比后一个数大,则对调两个数。

以5个数为例:

75386{7和5比较,7>5,进行对调;}

57386{7和3比较,7>3,进行对调;}

53786{7和8比较,7<8,不进行对调;}

53786{8和6比较,8>6,进行对调;}

53768

Programsample;

Constn=10;

Var

a:

array[1..n]ofinteger;

i,j:

integer;

begin

fori:

=1tondo

read(a[i]);

readln;

fori:

=1ton-1do

forj:

=1ton-ido

ifa[j]>a[j+1]then

begint:

=a[j];a[j]:

=a[j+1];a[j+1]:

=t;end;

forI:

=1to10do

write(a[i]:

5);

readln;

end;

〔二〕〔选择法排序〕算法描述:

1、先假设a[1]中的数最小,记下此最小数的位置p=1;

2、依次把a[p]和a[i](i从2变化到10)进行比较,每次比较时,若a[i]中的数比a[p]中的数小,则把i的值赋给p,使p总是指向当前所扫视过的数中最小数的位置。

3、把a[p]和a[1]中的数对调,最小数就放在a[1]中了。

Programno;

Constn=10;

Var

a:

array[1..n]ofinteger;

i,j,p,t:

integer;

Begin

fori:

=1tondo

read(a[i]);

readln;

fori:

=1ton-1do

begin

p:

=i;

forj:

=i+1to10do

ifa[j]

=j;

t:

=a[i];a[i]:

=a[p];a[p]:

=t;{两数交换}

end;

fori:

=1tondo

write(a[i]:

5);

readln;

End.

例3:

用筛法求100以内的素数(质数)。

    分析:

素数是除了1和它本身以外没有其它约数的数。

用筛法求素数的方法是:

用质数筛去合数:

从第一个素数2开始,把它的倍数去掉;这样2以后的第一个非0数就一定也是素数,把它的倍数也删了……重复这个删数过程,直到在所找到的素数后再也找不到一个非0数。

把所有非0数输出。

programp2;

var

    a:

array[1..100]ofinteger;

    i,j,k:

integer;

begin

    fori:

=1to100doa[i]:

=i;

    a[1]:

=0;i:

=2;

    whilei<=100do

    begin

        k:

=i;

        whilek<=100do

        begin

            k:

=k+i;

            a[k]:

=0;

        end;

        {上面将所有a[i]的倍数清0}

        i:

=i+1;

        whilea[i]=0doi:

=i+1;

        {查找接下来的第一个非0数}

    end;

    fori:

=1to100doifa[i]<>0thenwrite(a[i],'');

end.

练习题:

1、随机产生20个100以内的数,输出;按从小到大的顺序排序,输出。

2、输入n个整数,请找出最小数所在的位置,并把它与第一个数对调后输出。

例如:

输入:

3 2 5 1 7

输出:

4

   1 2 5 3 7  

3、将一个数插入到有序的数列中,插入后数列仍然有序。

例如:

输入:

1 2 3 5 

4

输出:

1 2 3 4 5

4、约瑟夫问题:

n个人围成一圈,从第一个人开始报数,数到m的人出圈,再由下一个人开始报数,数到m的人出圈,…输出次数依次出圈的人的编号。

例如:

输入:

8  5

输出:

5  2  8  7  1  4  6  3

5、编写程序把任意十进制整数转换成二进制。

例如:

输入:

6

输出:

110

 

5.2二维数组

一维数组在编程中多用于描述线性的关系:

如一组数;一组成绩;一组解答等。

数组元素只有一个下标,表明该元素在数组中的位置。

二维数组在编程中多数用于描述二维的关系:

如地图、棋盘、城市街道、迷宫等等。

而二维数组元素有两个下标:

第一个下标表示该元素在第几行,第二个下标表示在第几列。

1.二维数组的定义:

var

    a:

array[1..10,1..5]ofinteger;

    其中:

a是数组名,由程序员自定;array和of是定义数组的保留字;(这两点和一维数组定义的格式一样)中括号中的两个范围表示二维数组共有多少行、多少列(第一个范围表示行数,第二个范围表示列数);最后一个表示数组元素的类型,规定和一维数组一样。

如上例,定义了一个二维数组a,共有10行5列。

2.使用二维数组:

    

(1)数组元素的指称:

数组名[行号,列号]。

如第三行第四个元素:

a[3,4]。

    对某一行进行处理。

如累加第4行的数据。

则固定行号为4。

如:

fori:

=1to5dos:

=s+a[4,i];

    对某一列进行处理。

如累加第4列的数据。

则固定列号为4。

如:

fori:

=1to10dos:

=s+a[i,4];

    

(2)二维数组的输入输出要用双重循环来控制:

fori:

=1to10do{————控制行数}

begin

    forj:

=1to5doread(a[i,j]){————第一行读入5个元素}

    readln;{————读入一个换行符}

end;

{————最常用的方法:

从键盘读入数据初始化二维数组}

fori:

=1to10do

    forj:

=1to5doa[i,j]:

=0;

{————最常用的方法:

将二维数组清0}

fori:

=1to10do

begin

    forj:

=1to5dowrite(a[i,j]:

4);

    writeln;

end;

{————最常用的输出方法:

按矩阵形式输出二维数组的值}

例1:

竞赛小组共有20位同学,这学期每位同学共参与了三项比赛,请统计每位同学的平均分。

分析:

定义一个20行3列的二维数组来存放这些成绩。

定义一个20个元素的一维数组来存放平均分。

programp1;

var

    a:

array[1..20,1..3]ofinteger;

    b:

array[1..20]ofreal;

    i,j:

integer;

begin

    fori:

=1to20do

    begin

        forj:

=1to3doread(a[i,j]);

        readln;

    end;

{————从键盘上读入20个同学的三次竞赛成绩}

    fori:

=1to20dob[i]:

=0;

{————先将平均分数组清0}

    fori:

=1to20do

    begin

        forj:

=1to3dob[i]:

=b[i]+a[i,j];{————计算总分}

        b[i]:

=b[i]/3;{————计算平均分}

    end;

    fori:

=1to20dowrite(b[i]:

5:

1);

{————输出平均分}

writeln;

end.

 

二维数组练习题:

1、设一维数组中有任意6个数:

789251

编一个程序建立具有如下的方阵,最后输出结果:

789251

178925

517892

251789

925178

892517

2、求一个5X5数阵中的马鞍数,输出它的位置,若无,则输出“NotFound”。

所谓马鞍数,是指在行上最小而在列上最大的数。

如下:

56789

45678

34521

23490

12548

则1行1列上的数就是马鞍数。

3.以下是一个5阶幻方的实例:

17241815

23571416

46132022

101219213

11182529

幻方的特点:

它的每一行,每一列和两条对角线上的元素之和都相等。

其值是N*(N*N+1)/2,N代表方阵的行数或列数;一个N阶奇数幻方有1到N×N自然数组成。

编一个程序,打印出小于10阶的任意奇数幻方。

 

5.3字符串

字符串用于存放整批的字符数据。

通常编程中使用字符串存放字符化了的数字数据。

如高精度运算时存放操作数和运算结果。

字符串可以看作是特殊的字符串数组来处理。

当然,它也有自已的特点。

1.字符串格式的定义:

var

s:

string;s1:

string[15];

字符串定义时,如不指定长度,则按该类型的最大长度(255个字符)分配空间,使用时最大可用长度为255个;如果在中括号中给出一个具体的值(1—255之间),则按这个值的大小分配空间。

使用时,最大的可用长度即为该值。

2.字符串的输入、输出:

字符串类型既可按数组方式输入、输出,也可直接输入、输出:

readln(s);writeln(s);多个字符串输入时以回车作为数据间的分隔符;每个readln语句只能读入一个字符串。

3.有关字符串的操作:

操作

类型

作用

返回值

例子

length(s)

函数

求字符串s的长度

整型

s:

='123456789';

l:

=length(s);{l的值为9}

copy(s,w,k)

函数

复制s中从w开始的k位

字符串

s:

='123456789';

s1:

=copy(s,3,5);{s1的值是'34567'}

val(s,k,code)

过程

将字符串s转为数值,存在k中;code是错误代码

 

vars:

string;k,code:

integer;

begin

s:

='1234';

val(s,k,code);

write(k);{k=1234}

str(i,s)

过程

将数值i转为字符串s

 

i:

=1234;

str(i,s);

write(s);{s='1234'}

Delete(s,w,k)

过程

在s中删除从第w位开始的k个字符

 

s:

='HonestAbeLincoln';

Delete(s,8,4);

Writeln(s);{'HonestLincoln'}

Insert(s1,S,w)

过程

将s1插到s中第w位

 

S:

='HonestLincoln';

Insert('Abe',S,8);{'HonestAbeLincoln'}

Pos(c,S)

函数

求字符c在s中的位置

整型

S:

='123.5';

i:

=Pos('',S);{i的值为1}

+

运算符

将两个字符串连接起来

 

s1:

='1234';

s2:

='5678';

s:

=s1+s2;{'12345678'}

 

4、字符串应用

例1、随机输入一些国家的英文名字,以end作为输入结束标志,按字母顺序排序后输出。

Programex4_12;

Constn=100;

Vara:

array[1..n]ofstring[30];

i,j,m,b:

integer;

k:

string[30];

Begin

m:

=0;

writeln(‘Inputcountryname:

’);

repeat

m:

=m+1;readln(a[m]);

untila[m]=‘end’;

Fori:

=1tom-2do

forj:

=i+1tom-1do

ifa[i]

begin

k:

=a[i];a[i]:

=a[j];a[j]:

=k;

end;

writeln(‘output:

’);

Fori:

=1tom-1do

Writeln(a[i]);

Writeln(‘*end*’);

Readln;

End.

练习题:

1、输入一个长度不超过255字符串,将其倒置输出。

例:

输入:

ABCDEF

输出:

FEDCBA

2、求n个字符串的最长公共子串,n<20,字符长度不超过255。

例:

输入:

3

     Whatislocalbus?

Namesomelocalbus.

LocalbusishighspeedI/ObusclosetotheProcessor.

输出:

localbus

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1