pascal第5章数组.ppt

上传人:sh****n 文档编号:6396762 上传时间:2020-02-24 格式:PPT 页数:49 大小:258.50KB
返回 下载 相关 举报
pascal第5章数组.ppt_第1页
第1页 / 共49页
pascal第5章数组.ppt_第2页
第2页 / 共49页
pascal第5章数组.ppt_第3页
第3页 / 共49页
点击查看更多>>
资源描述
第五章数组 第一节一维数组第二节二维数组第三节字符数组和字符串类型 第一节一维数组 为什么要使用数组 通过前面几章的学习 我们已经可以编写程序来解决各种相当复杂的问题了 但是当需要处理的数据比较多时 仅依靠前面的知识是不够的 即使简单的问题也可能需要比较复杂的程序来处理 请看下面的例子 例题输入50个学生的某门课程的成绩 打印出低于平均分的学生序号与成绩 分析 在解决这个问题时 虽然可以通过一个变量来累加读入的50个成绩求出学生的总分 进而求出平均分 但因为只有读入最后一个学生的分数后才能求得平均分 并且要求打印出低于平均分的学生序号和成绩 故必须把50个学生的成绩都保留起来 然后逐个和平均分比较 把低于平均分的成绩打印出来 如果 用简单变量a1 a2 a50存储这些数据 要用50个变量保存输入的数据 程序片断如下 readln a1 a2 a10 readln a41 a42 a50 注意 如果真正要像上面这样编写程序 则上面的所有省略号必须用完整的语句写出来 可以看出 这样的程序是多么繁琐 如果说处理的数据规模达到成千上万 上面的例子单单读入就会异常复杂 电脑的特点没有得到体现 从以上的讨论可以看出 如果只使用简单变量处理大量数据 就必须使用大量只能单独处理的变量 即使是简单问题也需要编写冗长的程序 选手们可能已经看出 我们需要把一大批具有相同性质的数据组合成一个新类型的变量 可以用简单的程序 比如循环50次 对这个新变量的各个分量进行相同的处理 每个分量仍然保留单个变量的所有性质 在上面的例子中 各分量是整型变量或实型变量的性质 如果能象数学中使用下标变量ai形式表示这50个数 则问题就容易实现 在Pascal语言中 具有下标性质的数据类型是数组 如果使用数组 上面的问题就变得十分简单 清晰 例如 读入50个学生的成绩 只需写如下语句即可 fori 1to50doreadln a i 在这里引用了带下标的变量 分量变量称为数组元素 a i 来代替a1 a2 a50 方括号中的i称为下标 当循环变量i 1时a i 就是a 1 当i 2时a i 就是a 2 当i 50时a i 就是a 50 输入的时候 让i从1变化到50 循环体内输入语句中的a i 也就分别代表了a1 a2 a50这50个带下标的变量 这样上述问题的程序可写为 tot 0 tot存储50个学生的总分fori 1to50do 循环读入每一个学生的成绩 并把它累加到总分中beginread a i tot tot a i end ave tot 50 计算平均分fori 1to50doifa i avethenwriteln No i a i 如果第i个同学成绩小于平均分 则将输出这个学生的序号和成绩 要在程序中使用下标变量 必须先说明这些下标变量的整体 数组 即数组是若干个同名 如上面的下标变量的名字都为a 下标变量的集合 这些变量的类型全部一致 一维数组 当数组中每个元素只带有一个下标时 我们称这样的数组为一维数组 一维数组的定义 1 类型定义类型定义一般格式为 type 其中type是Pascal保留字 表示开始一个类型定义段 在其后可以定义若干个自定义的数据类型 是为定义的类型取的名字 称它为类型标识符 类型定义后 也就确定了该类型数据取值的范围 以及数据所能执行的运算 和Pascal提供的标准类型如integer real等没什么区别 2 一维数组类型的定义一维数组类型的一般格式 var数组名 array 下标1 下标2 of 对于上例 a array 1 50 ofinteger 说明 其中array和of是Pascal保留字 下标1和下标2是同一顺序类型 且下标2的序号大于下标1的序号 它给出了数组中每个元素 下标变量 允许使用的下标类型 也决定了数组中元素的个数 基类型是指数组元素的类型 它可以是任何类型 同一个数组中的元素全部具有相同类型 因此我们可以说 数组是由固定数量的相同类型的元素组成的 再次提醒注意 类型和变量是两个不同概念 不能混淆 就数组而言 程序的执行部分使用的不是数组类型而是数组变量 数组的另一种定义形式 先定义数组的类型标识符 再定义数组 如 typearray1 array 1 8 ofinteger vara1 a2 array1 其中array1为一个类型标识符 表示一个下标值从1到8 数组元素类型为整型的一维数组 而a1 a2则是这种类型的数组变量 代表二个数组 我们平时更多的是将二者全并起来 直接定义 vara1 a2 array 1 8 ofinteger 当在说明部分定义了一个数组变量之后 Pascal编译程序为所定义的数组在内存空间开辟一串连续的存储单元 例如 vara array 1 10 ofinteger 以下表示a数组在内存的存储如表所示 a数组共有10个元素组成 在内存中10个数组元素共占10个连续的存储单元 a数组最小下标为1 最大下标10 按定义a数组所有元素都是整型变量 一维数组元素的赋值操作 数组元素的引用形式为 数组名 下标表达式 数组一经定义后 数组元素就具有简单变量一样的性质 使用时必须写出下标 对于一维数组变量的赋值有两种形式 一是对各数组元素赋值 二是对数组所有元素整体赋值 例如 设有下列变量定义vara1 a2 array 1 20 ofinteger i integer 执行下列语句 fori 1to20doa1 i 1 数组元素赋值a2 a1 两个数组只要结构 元素个数和类型 相同 就可以整体赋值这个程序片段的功能是将一维整型数组变量a1 a2的所有数组元素都初始化赋值为1 前面的循环语句是逐个赋值 最后一个赋值语句是两个一维数组间的整体赋值 其作用相当于把数组a1中每一个数组元素的值分别赋给数组a2中相应的元素 这要求两个数组具有相同类型和一样的下标范围 一维数组的引用 一维数组元素的输入不能整个数组输入 只能逐个元素赋值a i x 一般用FOR循环做 如 Fori 1to7doread a i 一维数组元素的输出不能整个数组一起输出 只能逐个元素输出Write a i 一般用FOR循环做 如 Fori 1to7dowrite a i 例5 1输入10个数 要求程序按输入时的逆序把这10个数打印出来 也就是说 按输入相反顺序打印这10个数 分析 我们可定义一个数组a用以存放输入的50个数 然后将数组a中的内容逆序输出 programex5 1 typearr array 1 10 ofinteger 说明一数组类型arrvara arr i integer beginwriteln Enter10integer fori 1to10doread a i 从键盘上输入10个整数readln 读入时起换行作用fori 10downto1do 逆序输出这10个数write a i 10 end 例5 2输入一串字符 以 结束 统计其中每个字母出现的次数 分析 为了简单起见 只考虑每个小写字母出现的次数 为记录每个字母出现的次数 定义一个由26个元素组成的数组 下标类型是字符 元素类型为整型 如 num array a z ofinteger 用num a 记录字母a出现的次数 用num b 记录字母b出现的次数 开始应将num的每个元素置成0 其实所有变量的初始值都为0 当读入的字符不是 时 应判断它是否为字母 若是则应将相应字母计数加1 此时需判断哪个字母 只要将读入的字母作为下标 就可以找出相应的数组元素 将它加1即可 若读入的字符是 则结束循环 最后输出统计结果 程序如下 Programex5 2 varnum array a z ofinteger ch char beginforch a to z do 等价于fillchar num sizeof num 0 num ch 0 read ch whilech dobeginif ch a and ch0thenwrtieln ch num ch end 运行结果cabc 8796abcaa a4b2c3 例5 3将a数组中第一个元素移到最后数组末尾 其余数据依次往前平移一个位置 分析 为完成题目所要求的操作 其算法应该包括以下几个主要步骤 把第一个元素的值取出放在一个临时单元temp中 通过a 2 a 1 a 3 a 2 a 4 a 3 a n a n 1 实现其余元素前移 将temp值送入a n Programex5 3 constn 10 vara array 1 n ofinteger i integer temp integer beginwriteln read n datas fori 1tondoread a i temp a 1 fori 1ton 1doa i a i 1 a n temp writeln Result fori 1tondowrite a i 3 end 运行结果 read10datas 12345678910Result 23456789101 例5 4宾馆里有一百个房间 从1 100编了号 第一个服务员把所有的房间门都打开了 第二个服务员把所有编号是2的倍数的房间 相反处理 第三个服务员把所有编号是3的倍数的房间作 相反处理 以后每个服务员都是如此 当第100个服务员来过后 哪几扇门是打开的 所谓 相反处理 是 原来开着的门关上 原来关上的门打开 分析 此题较简单 只要设置一个表示门是开的还是关的标志数组 只有二种状态采用布尔型更直观 由于有固定的循环次数 用for循环显得简练 程序如下 Programex5 4 constn 100 vara array 1 n ofBoolean i j k integer beginfori 1tondoa i true 可用fillchar a sizeof a true 代替fori 2tondoforj 1tondoifjmodi 0thena j not a j forj 1tondoifa j truethenwrite j 5 可写成 ifa j thenwrite j 5 readlnend 运行结果 1491625364981100 例5 5约瑟夫问题 N个人围成一圈 从第一个人开始报数 数到M的人出圈 再由下一个人开始报数 数到M的人出圈 输出依次出圈的人的编号 N M由键盘输入 分析 1 由于对于每个人只有出圈和没有圈两种状态 因此可以用布尔型标志数组存储游戏过程中每个人的状态 不妨用TRUE表示出圈 FALSE表示没有圈 2 开始的时候 给标志数组赋初值为FALSE 即全部在圈内 3 模拟报数游戏的过程 直到所有的人出圈为止 程序如下 Programex5 5 varn m s f t integer a array 1 100 ofboolean 根据题意开出数组大小beginreadln n m 共n人 报到m出圈fort 1tondoa t false f 0 t 0 s 0 刚开始所有变量默认值也是0repeatt t 1 逐个枚举圈中的所有位置ift n 1thent 1 数组模拟环状 最后一个与第一个相连ifa t falsethens s 1 第t个位置上有人则报数ifs mthen 当前报的数是mbegins 0 计数器清零write t 输出出圈人的编号a t true 此处的人已出圈 设置为空f f 1 出圈的人数增加一个end untilf n 直到所有的人都出圈为止end 运行结果 输入 85输出 52871463 例5 6输入十个正整数 把这十个数按由大到小的顺序排列 选择排序 将数据按一定顺序排列称为排序 排序的算法有很多 其中选择排序是一种较简单的方法 分析 要把十个数按从大到小顺序排列 则排完后 第一个数最大 第二个数次大 因此 我们第一步可将第一个数与其后的各个数依次比较 若发现 比它大的 则与之交换 比较结束后 则第一个数已是最大的数 最大的泡往上冒 同理 第二步 将第二个数与其后各个数再依次比较 又可得出次大的数 如此方法进行比较 最后一次 将第九个数与第十个数比较 以决定次大的数 于是十个数的顺序排列结束 如对5个进行排序 这个五个数分别为829105 按选择排序方法 过程如下 初始数据 829105第一次排序 829105928105102895102895第二次排序 108295109285109285第三次排序 109825109825第四次排序 109852对于十个数 则排序要进行9次 程序如下 programex5 6 vara array 1 10 ofinteger i j t integer beginwriteln Input10integers fori 1to10doread a i 读入10个初始数据readln fori 1to9do 进行9次排序beginforj i 1to10do 将第i个数与其后所有数比较ifa i a j then 若有比a i 大 则与之交换begint a i a i a j a j t endend fori 1to10dowrite a i 5 end 运行结果 输入 867521897455892341输出 589234152546774189 例5 7编程输入十个正整数 然后自动按从大到小的顺序输出 冒泡排序 分析 用循环把十个数输入到A数组中 从A 1 到A 10 相邻的两个数两两相比较 即 A 1 与A 2 比 A 2 与A 3 比 A 9 与A 10 比 只需知道两个数中的前面那元素的标号 就能进行与后一个序号元素 相邻数 比较 可写成通用形式A i 与A i 1 比较 那么 比较的次数又可用1 n i 循环进行控制 即循环次数与两两相比较时前面那个元素序号有关 在每次的比较中 若较大的数在后面 就把前后两个对换 把较大的数调到前面 否则不需调换位置 下面例举5个数来说明两两相比较和交换位置的具体情形 564375和6比较 交换位置 排成下行的顺序 654375和4比较 不交换 维持同样的顺序 654374和3比较 不交换 顺序不变654373和7比较 交换位置 排成下行的顺序 65473经过 1 5 1 次比较后 将3调到了末尾 经过第一轮的1 N 1 次比较 就能把十个数中的最小数调到最末尾位置 第二轮比较1 N 2 次进行同样处理 又把这一轮所比较的 最小数 调到所比较范围的 最末尾 位置 每进行一轮两两比较后 其下一轮的比较范围就减少一个 最后一轮仅有一次比较 在比较过程中 每次都有一个 最小数 往下 掉 用这种方法排列顺序 常被称之为 冒泡法 排序 程序如下 Programex5 7 constN 10 vara array 1 N ofinteger 定义数组i j t integer beginfori 1toNdoReadln a i 输入十个数forj 1toN 1do 冒泡法排序fori 1toN jdo 两两相比较ifa i a i 1 then 比较与交换begint a i a i a i 1 a i 1 t end fori 1toNdo 输出排序后的十个数write a i 6 readlnend 运行结果 输入 2586123465221655输出 2568121622345565 例5 8用筛法求出100以内的全部素数 并按每行五个数显示 分析 把2到100的自然数放入a 2 到a 100 中 所放入的数与下标号相同 在数组元素中 以下标为序 按顺序找到未曾找过的最小素数minp 和它的位置p 即下标号 从p 1开始 把凡是能被minp整除的各元素值从a数组中划去 筛掉 也就是给该元素值置0 让p p 1 重复执行第 步骤 直到minp Trunc sqrt N 为止 打印输出a数组中留下来 未被筛掉的各元素值 并按每行五个数显示 用筛法求素数的过程示意如下 图中用下划线作删去标志 23456789101112131415 9899100 置数 23456789101112131415 9899100 筛去被2整除的数 23456789101112131415 9899100 筛去被3整除的数 23456789101112131415 9899100 筛去被整除的数 程序如下 Programex5 8 constN 100 Vara array 1 n ofboolean i j integer BeginFillchar a sizeof a true a 1 False fori 2toTrunc sqrt N doifa I thenforj 2toNdivIdoa i j False t 0 fori 2toNdoifa i thenBeginwrite i 5 inc t iftmod5 0thenwritelnend End 上机练习5 1 1 输入十个正整数 然后把这十个数按由小到大的顺序输出 选择排序 2 输入十个正整数 然后把这十个数按由小到大的顺序输出 冒泡排序 3 国际象棋盘中 第1格放1粒米 第2格放2粒米 第3格放4粒米 第4格放8粒米 第5格放16粒米 问 16个格子总共可以放多少粒米 分析 第i个格子可放多少粒米 2i 14 输出斐波列契数列的前N项 5个1行 01123581321 5 读入n个数 打印其中的最大数及其位置号 6 输入N个整数 找出最大数所在位置 并将它与第一个数对调位置 7 将一个数组中的所有元素倒序存放 分析 A 1 A N A 2 A N 1 A I A J I从1开始 每交换1次 I加1 直到I NDIV28 有52张朴克牌 使它们全部正面朝上 从第2张牌开始 把凡是2的倍数位置上的牌翻成正面朝下 接着从第3张牌开始 把凡是3的倍数位置上的牌正面朝上的翻成正面朝下 正面朝下的翻成正面朝上 接着从第4张牌开始 把凡是4的倍数位置上的牌按此规律依此类推 直到第1张要翻的牌是第52张为止 统计最后有几张牌正面朝上 并打印出它们的位置 9 围绕着山顶有10个洞 一只狐狸和一只兔子各住一个洞 狐狸总想吃掉兔子 一天兔子对狐狸说 你想吃我有一个条件 先把洞从1 10编上号 你从10号洞出发 先到1号洞找我 第二次隔1个洞找我 第三次隔2个洞找我 以后依此类推 次数不限 若能找到我 你就可以饱餐一顿 不过在没有找到我以前不能停下来 狐狸满口答应就开始找了 它从早到晚找了1000次洞 累得昏了过去也没有找到兔子 请问 免子躲在几号洞里 答案 2 4 7 9 第二节二维数组 二维数组的定义 当一维数组元素的类型也是一维数组时 便构成了 数组的数组 即二维数组 二维数组定义的一般格式 我们一般这样定义二维数组 数组名 array 下标类型1 下标类型2 of元素类型 说明 其中两个下标类型与一维数组定义一样 可以看成 下界1 上界1 和 下界2 上界2 给出二维数组中每个元素 双下标变量 可以使用下标值的范围 of后面的元素类型就是基类型 如 a array 1 4 1 10 ofinteger 可以这样理解 a array 1 4 ofarr arr array 1 10 ofinteger a数组实质上是一个有4行 10列的表格 表格中可储存40个元素 第1行第1列对应a数组的a 1 1 第n行第m列对应数组元素a n m 二维数组元素的引用 二维数组的数组元素引用与一维数组元素引用类似 区别在于二维数组元素的引用必须给出二个下标 引用的格式为 下标1 下标2 说明 显然 每个下标表达式的类型应与对应的下标类型一致 且取值不超出下标类型所指定的范围 否则会导致致命的越界错误 例如 设有定义 a array 1 3 1 5 ofinteger 则表示a是二维数组 相当于一个3 5的表格 共有3 5 15个元素 它们是 a 1 1 a 1 2 a 1 3 a 1 4 a 1 5 a 2 1 a 2 2 a 2 3 a 2 4 a 2 5 a 3 1 a 3 2 a 3 3 a 3 4 a 3 5 因此可以看成一个矩阵 表格 a 3 4 即表示第3行 第4列的元素 对于整个二维数组的元素引用时 采用二重循环来实现 如 给如上定义二维数组a都赋值为1 表达如下 fori 1to3doforj 1to5doa i j 1 对二维数组的输入与输出也同样可用二重循环来实现 fori 1to3doforj 1to5doread a i j fori 1to3dobeginforj 1to5dowrite a i j 5 writeln end 说明 当定义的数组下标有多个时 我们称为多维数组 下标的个数并不局限在一个或二个 可以任意多个 如定义一个三维数组a和四维数组b a array 1 100 1 3 1 5 ofinteger b array 1 100 1 100 1 3 1 5 ofinteger 多维的数组引用赋值等操作与二维数组类似 二维数组程序设计 例5 9设有一程序programex5 9 constn 3 vara array 1 n 1 n ofinteger i j 1 n beginfori 1tondobeginforj 1tondoread a i j readln end fori 1tondobeginforj 1tondowrite a j i 5 writeln end end 且运行程序时的输入为 2 1 3 3 3 1 1 2 1 则程序的输出应是 2 3 11 3 23 1 1 例5 10已知一个6 6的矩阵 方阵 把矩阵二条对角线上的元素值加上10 然后输出这个新矩阵 分析 矩阵即表格 是一个二维数组 有6行6列共36个元素 每个矩阵都有二条对角线 本题难点在于对角线的元素怎么确定 Programex5 10 vara array 1 6 1 6 ofinteger i j integer beginfori 1to6do 输入矩阵元素forj 1to6doread a i j fori 1to6do 更改对角线上元素的值forj 1to6doif i j or i j 7 thena i j a i j 10 寻找对角线的特征fori 1to6do 输出6行6列的矩阵元素beginforj 1to6dowrite a i j 5 writeln end end 例5 11大部分元素是0的矩阵称为稀疏矩阵 假设有k个非元素 则可把稀疏矩阵用K 3的矩阵简记之 其中第一列是行号 第二列是列号 第三列是该行 该列下的非元素的值 如 0005写简记成 145 第1行第4列有个数是50200222 第2行第2列有个数是20100321 第3行第2列有个数是1试编程读入一稀疏矩阵 转换成简记形式 并输出 分析 本题中需要解决的主要问题是查找非零元素并记忆位置 将原始矩阵存于数组a 转换后的矩阵存于数组b 当然b数组的行数可以控制在一个小范围内 programex5 11 constn 3 m 5 vara array 1 n 1 m ofinteger b array 1 100 1 3 ofinteger i j k integer beginfori 1tondo 矩阵初始forj 1tomdoread a i j k 0 fori 1tondoforj 1tomdo ifa i j 0then 找到非零值 存储begink k 1 b k 1 i b k 2 j b k 3 a i j end fori 1tokdo 输出beginforj 1to3dowrite b i j 3 writeln end end 例5 12打印杨辉三角形的前10行 杨辉三角形如下图 111111121121133113311464114641 图6 3 图6 4 分析 观察图6 3 大家不容易找到规律 但是如果将它转化为图6 4 不难发现杨辉三角形其实就是一个二维表的小三角形部分 假设通过二维数组yh存储 每行首尾元素为1 且其中任意一个非首位元素yh i j 的值其实就是yh i 1 j 1 与yh i 1 j 的和 另外每一行的元素个数刚好等于行数 有了数组元素的值 要打印杨辉三角形 只需要控制好输出其始位置就行了 程序如下 programex5 12 vara array 1 10 1 10 ofinteger i j integer begina 1 1 1 设定第一行的值fori 2to10do 从第二行开始推begina i 1 1 a i i 1 设定每一行的首尾值为1forj 2toi 1do 当前行非首尾的数a i j a i 1 j 1 a i 1 j 每个数等于上一行的二个数之和end fori 1to10dobeginifi10thenwrite 30 3 i 控制每行的起始位置 即空格数量forj 1toidowrite a i j 6 writeln end end 例5 13输入一串字符 字符个数不超过100 且以 结束 判断它们是否构成回文 分析 所谓回文指从左到右和从右到左读一串字符的值是一样的 如12321 ABCBA AA等 先读入要判断的一串字符 放入数组letter中 并记住这串字符的长度 然后首尾字符比较 并不断向中间靠拢 就可以判断出是否为回文 程序如下 programex5 13 varletter array 1 100 ofchar i j 0 100 ch char begin 读入一个字符串以 号结束write Inputastring i 0 read ch whilech dobegini i 1 letter i ch read ch end j 1 判断它是否是回文while j ithenwriteln Yes elsewriteln No end 上机练习5 2 1 输入一个3 3二维数组 找出其中最小的数 输出它的值以及所在行号和列号 2 输入4行4列数组 将第2行与第3行元素对调 3 输入4 4方阵 分别求两条对角线上元素之和 4 矩阵的转置 A B 123转置为1471045625811789369121011125 给一维数组输入M个整数 假设M 6 数组元素分别为748915 要求建立一个如下数组 矩阵 748915489157891574915748157489574891 6 建立如下矩阵 2345345645675678注意 一般情况下 给二维数组赋初值 都是找A I J 与I和J的函数关系 对于任意的A I J I J 7 设数组a是有n个元素的整数数组 从中找出最大和子序列 8 打印杨辉三角形的前10行 第三节字符数组和字符串类型 无论数组的下标有几个 类型如何 但数组中全体元素的类型必须相同 数组元素的类型可以是任何类型 当它是字符型时 我们称它为字符数组 由于字符数组与字符串类型的应用是计算机非数值处理的重要方面之一 所以我们把它们两个放在一起进行讨论 下面我们举例说明字符数组的应用 字符类型 字符类型为由一个字符组成的字符常量或字符变量 字符常量定义 const字符常量 字符 字符变量定义 Var字符变量 char 字符类型是一个有序类型 字符的大小顺序按其ASC 代码的大小而定 函数succ pred ord适用于字符类型 例如 后继函数 succ a b 前继函数 pred B A 序号函数 ord A 65 例5 14按字母表顺序和逆序每隔一个字母打印 即打印出 acegIkmoqsuwyzxrvtpnljhfdb 分析 程序中 我们利用了字符类型是顺序类型这一特性 直接将字符类型变量作为循环变量 使程序处理起来比较直观 程序如下 programex5 14 varletter char beginforletter a to z doif ord letter ord a mod2 0thenwrite letter 3 writeln forletter z downto a doif ord letter ord z mod2 0thenwrite letter 3 writeln end 字符串类型 字符串是由字符组成的有穷序列 pascal提供string和ansistring二种字符串类型 二者只是在字符串的长度上有区别 string类型长度在255以内 超出255长度的部分被忽略 而ansistring类型没有长度限制 其实可存储2G的内容 所以看作长度无限制 字符串类型定义 var字符串变量 string n 其中 n是定义的字符串长度 必须是0 255之间的自然整数 第0号单元中存放串的实际长度 程序运行时由系统自动提供 第1 n号单元中存放串的字符 若将string n 写成string 则默认n值为255 例如 VARname string 8 screenline string FreePascal中 一个字符串中的字符可以通过其对应的下标灵活使用 例如 varname string beginreadln name fori 1toord name 0 dowriteln name i 输出name串中的第i个字符end 语句writeln name i 输出name串中第i个字符 例5 15求输入英文句子单词的平均长度 分析 程序中 变量s用于存句子中英文字母的总数 变量count用于存放句子中单词的个数 ch j 表示ch串中的第j个位置上的字符 ord ch 0 为ch串的串长度 程序充分利用FreePascal允许直接通过字符串下标得到串中的字符这一特点 使程序比较简捷 programex5 15 varch string 定义ch为字符串类s count j integer beginwrite Thesentenceis readln ch 读入整行内容s 0 count 0j 0 repeatinc j ifnot ch j in theninc s 这是集合的表式ifch j in theninc count until j ord ch 0 or ch j in ifch j thenwriteln Itisnotasentence elsewriteln Averagelengthis s count 10 4 结果保留二位小数end 字符串的操作 由字符串的常量 变量和运算符组成的表达式称为字符串表达式 字符串运算符包括 1 连接运算符例如 Free PASCAL 的结果是 FreePASCAL 若连接的结果字符串长度超过255 则被截成255个字符 若连接后的字符串存放在定义的字符串变量中 当其长度超过定义的字符串长度时 超过部份字符串被截断 例如 varstr1 str2 str3 string 8 beginstr1 Free str2 PASCAL str3 str1 str2 end 则str3的值为 FreePA 2 关系运算符两个字符串的比较规则为 从左到右按照ASC 码值逐个比较 遇到ASC 码不等时 规定ASC 码值大的字符所在的字符串为大 例如 AB AC 结果为真 12 2 结果为真 PASCAL PASCAL 结果为假 例5 16对给定的10个国家名 按其字母的顺序输出 分析 程序中 当执行到ifcname k cname j 时 自动将cname k 串与cname j 串中的每一个字符逐个比较 直至遇到不等而决定其大小 这种比较方式是计算机中字符串比较的一般方式 程序如下 proramex5 16 vari j k integer t string 20 cname array 1 10 ofstring 20 beginfori 1to10doreadln cname i fori 1to9do 选择排序begink i forj i 1to10doifcname k cname j thenk j t cname i cname i cname k cname k t end fori 1to10dowriteln cname i end 字符串的函数和过程 FreePascal提供了八个标准函数和标准过程 见下表 利用这些标准函数与标准过程 一些涉及到字符串的问题可以灵活解决 例5 17正确的邮箱地址格式是 用户名 服务器名 输入一个邮箱地址判断它是不是合法的邮箱地址 分析 此题的题意很简单 在判断邮箱地址合法性上需要考虑 1 邮箱地址字符串中是否包括字符 2 字符不能出现在第一个位置也不能出现字符的末尾 程序如下 Programex5 17 varp integer s string beginreadln s p pos s if p 1 and p length s thenwriteln ok elsewriteln error end 例5 18对输入的一句子实现查找且置换的功能 分析 程序中 输入要查找的字符串及要置换的字符串 充分用上了字符串处理的标准过程delete insert及标准函数pos 程序如下 Programex5 18 vars1 s o string i integer beginreadln s1 输入原句readln s 输入要查找的内容readln o 输入替换的目标内容i pos s s1 在s1中查找s 若找不到返回0whilei0dobegindelete s1 i length s 在s1中从第i位开始删除length s 个字符insert o s1 i 把o的内容插入s1的第i个位置i pos s s1 end writeln s1 end 例5 19随机输入一个长度不超过255的字符串 将其倒置后输出 分析 将字符串读入到字符串变量Letters中 这里用字符串类型来处理 让同学们更好地掌握字符处理的函数和过程 程序如下 Programex5 19 Varletters string i len integer ch char beginreadln letters len length letters fori 1tolendobeginch copy letters len 1 delete letters len1 insert ch letters i endwriteln letters end 运行结果 输入 ABCDEF输出 FEDCBA 请维护编者版权 请勿将课件在网络上传播 福建省长乐一中董永建浙江省温州中学舒春平2009年9月
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!