05数组与字符串Word文档格式.docx
《05数组与字符串Word文档格式.docx》由会员分享,可在线阅读,更多相关《05数组与字符串Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
4、数组的应用:
例1:
从键盘输入10个数,将这10个数逆序输出,并求这10个数的和,输出这个和。
programp1;
var
a:
i,s:
integer;
begin
fori:
=10downto1dowrite(a[i],'
writeln;
s:
=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;
array[1..n]ofinteger;
i,j:
=1tondo
read(a[i]);
readln;
=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);
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;
i,j,p,t:
Begin
=1tondo
=1ton-1do
begin
p:
=i+1to10do
ifa[j]<
a[p]thenp:
=j;
t:
=a[i];
a[i]:
=a[p];
a[p]:
{两数交换}
End.
例3:
用筛法求100以内的素数(质数)。
分析:
素数是除了1和它本身以外没有其它约数的数。
用筛法求素数的方法是:
用质数筛去合数:
从第一个素数2开始,把它的倍数去掉;
这样2以后的第一个非0数就一定也是素数,把它的倍数也删了……重复这个删数过程,直到在所找到的素数后再也找不到一个非0数。
把所有非0数输出。
programp2;
array[1..100]ofinteger;
i,j,k:
=1to100doa[i]:
a[1]:
i:
=2;
whilei<
=100do
k:
whilek<
=100do
=k+i;
a[k]:
{上面将所有a[i]的倍数清0}
i:
=i+1;
whilea[i]=0doi:
{查找接下来的第一个非0数}
=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.二维数组的定义:
a:
array[1..10,1..5]ofinteger;
其中:
a是数组名,由程序员自定;
array和of是定义数组的保留字;
(这两点和一维数组定义的格式一样)中括号中的两个范围表示二维数组共有多少行、多少列(第一个范围表示行数,第二个范围表示列数);
最后一个表示数组元素的类型,规定和一维数组一样。
如上例,定义了一个二维数组a,共有10行5列。
2.使用二维数组:
(1)数组元素的指称:
数组名[行号,列号]。
如第三行第四个元素:
a[3,4]。
对某一行进行处理。
如累加第4行的数据。
则固定行号为4。
如:
=1to5dos:
=s+a[4,i];
对某一列进行处理。
如累加第4列的数据。
则固定列号为4。
=s+a[i,4];
(2)二维数组的输入输出要用双重循环来控制:
=1to10do{————控制行数}
forj:
=1to5doread(a[i,j]){————第一行读入5个元素}
{————读入一个换行符}
{————最常用的方法:
从键盘读入数据初始化二维数组}
=1to10do
=1to5doa[i,j]:
将二维数组清0}
=1to5dowrite(a[i,j]:
4);
{————最常用的输出方法:
按矩阵形式输出二维数组的值}
竞赛小组共有20位同学,这学期每位同学共参与了三项比赛,请统计每位同学的平均分。
定义一个20行3列的二维数组来存放这些成绩。
定义一个20个元素的一维数组来存放平均分。
array[1..20,1..3]ofinteger;
b:
array[1..20]ofreal;
=1to20do
=1to3doread(a[i,j]);
{————从键盘上读入20个同学的三次竞赛成绩}
=1to20dob[i]:
{————先将平均分数组清0}
=1to3dob[i]:
=b[i]+a[i,j];
{————计算总分}
b[i]:
=b[i]/3;
{————计算平均分}
=1to20dowrite(b[i]:
5:
1);
{————输出平均分}
二维数组练习题:
1、设一维数组中有任意6个数:
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.字符串格式的定义:
string;
s1:
string[15];
字符串定义时,如不指定长度,则按该类型的最大长度(255个字符)分配空间,使用时最大可用长度为255个;
如果在中括号中给出一个具体的值(1—255之间),则按这个值的大小分配空间。
使用时,最大的可用长度即为该值。
2.字符串的输入、输出:
字符串类型既可按数组方式输入、输出,也可直接输入、输出:
readln(s);
writeln(s);
多个字符串输入时以回车作为数据间的分隔符;
每个readln语句只能读入一个字符串。
3.有关字符串的操作:
操作
类型
作用
返回值
例子
length(s)
函数
求字符串s的长度
整型
='
123456789'
;
l:
=length(s);
{l的值为9}
copy(s,w,k)
复制s中从w开始的k位
字符串
s1:
=copy(s,3,5);
{s1的值是'
34567'
}
val(s,k,code)
过程
将字符串s转为数值,存在k中;
code是错误代码
vars:
k,code:
1234'
val(s,k,code);
write(k);
{k=1234}
str(i,s)
将数值i转为字符串s
=1234;
str(i,s);
write(s);
{s='
Delete(s,w,k)
在s中删除从第w位开始的k个字符
s:
='
HonestAbeLincoln'
Delete(s,8,4);
Writeln(s);
{'
HonestLincoln'
}
Insert(s1,S,w)
将s1插到s中第w位
S:
Insert('
Abe'
S,8);
Pos(c,S)
求字符c在s中的位置
123.5'
i:
=Pos('
S);
{i的值为1}
+
运算符
将两个字符串连接起来
s2:
5678'
=s1+s2;
{'
12345678'
4、字符串应用
例1、随机输入一些国家的英文名字,以end作为输入结束标志,按字母顺序排序后输出。
Programex4_12;
Constn=100;
Vara:
array[1..n]ofstring[30];
i,j,m,b:
string[30];
m:
writeln(‘Inputcountryname:
’);
repeat
=m+1;
readln(a[m]);
untila[m]=‘end’;
Fori:
=1tom-2do
=i+1tom-1do
ifa[i]<
a[j]then
a[j]:
=k;
writeln(‘output:
=1tom-1do
Writeln(a[i]);
Writeln(‘*end*’);
Readln;
1、输入一个长度不超过255字符串,将其倒置输出。
例:
ABCDEF
FEDCBA
2、求n个字符串的最长公共子串,n<
20,字符长度不超过255。
3
Whatislocalbus?
Namesomelocalbus.
LocalbusishighspeedI/ObusclosetotheProcessor.
输出:
localbus