校本教材pascal分析.docx
《校本教材pascal分析.docx》由会员分享,可在线阅读,更多相关《校本教材pascal分析.docx(57页珍藏版)》请在冰豆网上搜索。

校本教材pascal分析
身份证的奥秘(字符串)
“同学们,上课时间到了……”上课提示系统播放出提示音,同学们有序的进入教室。
今天,老师上课的内容是生活中的规律。
课堂上在老师的引导下,同学们踊跃发言,举出了生活中许多有规律的实例。
其中有一个是身份证的规律。
规律是:
1.地址码(身份证前六位)表示编码对象常住户口所在县(市、旗、区)的行政区划代码。
2.出生日期码(身份证第七位到第十四位)表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。
例如:
1981年05月11日就用51119810表示。
3。
顺序码(身份证第十五位到十七位)为同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。
其中第十七位奇数分给男性,偶数分给女性。
4。
校验码(身份证最后一位)是根据前面十七位数字码,按照ISO7064:
1983.MOD11-2校验码计算出来的检验码。
作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么此人的身份证就变成了19位,而19位的号码违反了国家标准,并且我国的计算机应用系统也不承认19位的身份证号码。
Ⅹ是罗马数字的10,用X来代替10,可以保证公民的身份证符合国家标准。
在下课时,老师请同学们用计算机翻译出身份证的奥秘。
【解题分析】
大家一起来看这道题目,一始就肯定想到了这身份证用数字来接收做。
但这样做的话细看有两个弊端:
1.这个身份证的位数太多了,数值达到了18多位,我想你学编程还没学到这多达18位的变量吧。
2.就算你知道这种变量,解决了第一个弊端,但是这身份证的最后一位会出现字符‘X’。
所以用数字来做是不行的。
我们来想想这题我们应该用什么数据最好的来保存这身份证呢?
这里就要新学习一个知识,这个知识的名字叫做字符串。
有人肯定会说这字符串有什么作用呢?
这字符串就是保存字符的一个有255位的数组。
详细介绍字符串,就在【知识拓展】里,请现在就看看字符串拥有这什么样的功能呢?
虽然这身份证数字已经确定好啦用字符串来接收,但接下来该怎么来做呢?
我们看了知识拓展,就肯定知道了字符串的一大功能copy。
Copy是截取函数,是专门用于字符串的。
我们可以用copy来怎么做呢?
我们一起想一想这身份证如果是用数字来做我们会怎么做呢?
对,就是把数字从这个身份证中摘下来按要求输出什么数字。
输出出生日期码是身份证的第位到第十四位,顺序码是身份证的第十五位到十七位,其中第十七位是性别,校验码身份证最后一位。
将按这样的顺序输出。
这是用数字来做就这样,我们的字符串也可以像这样得来做。
每次就是用copy(身份证数字,从第几位摘取,摘取多少个)。
【程序流程图】
1.输入全班总共共有人数。
2.进入用全班人数次数的循环,来将所有人身份证进行分析个人资料。
3.输入一个人的身份证。
4.用copy(身份证,7,8)就会截取下来那个人的出生年月日。
5.再用copy(身份证,15,2)截取下那个人是当天出生的第几个人。
6.那么a[17]应该就是那个人的性别了,我想ord这个函数你们应该认识吧。
就是把字符转成相对应的数字,再将这数字减掉48,就和正常数字是一样的了。
我们把这个数mod2看如果是1,就输出‘na’。
如果是0,就输出‘nv’。
这就是奇数是男生,偶数是女生
7.a[18]就是检验码,如果a[18]是‘x’的话,输出‘10’,否则就直接输出a[18]。
【知识拓展】
字符串是一个字符数组,比如a=‘12345678’,那么a[2]=’2’。
为了输出输出提示字符已不止一次地使用过字符串常量。
例如:
‘Inputnumber:
’,’calculateshadowarea:
’就是两个字符串常量。
字符串常量是其值为一对撇号之间的字符序列,但不包括撇号。
一个字符串里包含的字符个数称为字符串的长度。
例如上面第一个串长是13(含空格字符),第二个串长是22。
当两个撇号之间不含任何字符时,称为空串。
空串的长度为0。
空串和任何字符串变量类型相容,并可作为初始值赋给任何一个字符串变量。
计算机应用的一个重要方面是进行非数值数据的处理。
为了方便地处理字符串,TurboPascal提供了一种新的数据类型——字符串类型。
字符串类型是构造类型,在很多方面的字符数组类型有相似之处,都靠下标引用其中的元素(字符),都可以被读写、赋值或当人选过程或函数的形参,此时又都只能以类型标识符的形式出现在形参表中(见第5章)。
然而,它们之间还存在一些差别。
其中,最主要有两个差别:
一是字符串中的字符个数(即字符串长度)可以从0到所指出的上限动态变化,而数组元素的个数是固定不变的;二是在内存中的存储方式不同。
(一)字符串类型的定义
字符串类型定义的一般形式:
被认为是相等的。
<类型标识符>=string[长度];
其中string为保留字,整型常数指明了字符串的最大长度,其值不能超过255。
当长度值及其外方括号省略时,隐含表示长度为255。
例如:
type
FileName=string[20];
TexLine=string[80];
Var
name1,name2:
FileName;
book1,book2:
TexLine;
以上定义了最大长度分别为20个字符、80个字符的两个字符串类型。
被说明字符串类型的变量被称为字符串变量,上例中的name1,namee2,book1,book2都为字符串类型变量。
字符串变量在内存中所占的空间是它的最大长度加1个字节用来存放所给字符串变量的实际有效长度(≤最小长度),可用零下标去访问。
例如,对上述说明的name字符串变量,Ord(name[0])即指出了name字符串中实际字符的个数。
字符串变量中的实际有效字符,从第二个字节开始有效每个字符占一个字节。
实际长度值加“1”以外的字节单元中是随机信息。
字符串变量为其中每个字符都规定了相应的下标。
串中实际字符的下标从1到串的长度值,即通过字符串的下标可以访问字符串中单个字符。
这可以通过在字符串变量标识符后面加上用方括号的整型下标表达式来实现,这一点很像字符数组。
(二)符串运算
字符串常量、字符串变量、字符函数引用(值为串类型)和字符串运算符组成的表达式称为字符串表达式。
利用字符串表达式可以对字符串数据进行运算或操作。
字符串运算符主要是指字符串连接运算符:
“+”,所谓连接运算就是指把第二个字符串拼接到第一个字符串的后面,结果是一个新的字符串。
加号可以进行字符串的连接,尽管也可以用后面将要介绍的连接函数concat完成同样的操作但运算符“+”通常更为方便。
如果连接后得到的新串的长度超过255,那么将会产生运行错误。
例如:
‘Turbo’+‘Pascal’=‘TurboPascal’
‘1234’+‘*’+‘5678’=‘1234*5678’
‘GOOD’+‘’+‘MORNING’=‘GOODMORNING’
关系运算符<,<=,>=,<>可以用于字符串数据间的比较。
关系运算符的优先级低于连接运算符的优先级。
字符串关系运算的结果是一个布尔值。
当两个字符串进行比较时,是从左到右逐个比较两个字符串中每个字符的ASCII码值,直到找到不相同字符为止。
此时ASCII码值大的字符所在串就大。
如果两个字符长度不同,且直至较短串的最后一个字符处两者都相同,则认为较长串值大,较短串值小。
只有当两个字符串长度相等且对应字符完全相同时,这两个字符串才被认为是相等的。
总之,字符串的比较是按字典顺序进行的,排在前面的字符值小,后面的字符值较大。
例如,下列表达式中:
‘ASC’=‘ASC’;‘ASC’<‘ASCII’;
‘ABCMN’<>‘ABCDE’;‘STUDENT’>‘STUND’;
‘TurboPascal’>‘Turbopascal’;
‘3’<‘24’;
前三个值为True,而后两个值为False。
赋值运算罕用来把一个字符串表达式的值赋给一个字符串变量。
当然,被赋值的变量其最大长度要大于等于字符串表达式值的字符个数。
所赋的字符串表达式可以是一个字符串常数,也可以是一个已赋过值的字符串变量,还可以是一个字符函数引用。
例如,在执行语句:
age:
=‘sixteen’;
line:
=‘Happyyou’+age+’birthday’+‘,’+‘ZhangLing.’
后ling的最后是‘Happyyousixteenbirthday,ZhangLing.’。
如果字符变量被赋予过长的值(即赋予一个比定义说明时最大长度还多的字符),那么多出的字符将被截掉。
如上面的例子,如果age被定义成属于类型string[3],那么执行上述赋值语句后,age中只含最左边的三个字符‘six’。
(三)类型和字符数组类型的关系
在TurboPascal中,字符数组可以出现在字符串表达式中,在这种情况下,字符数组被转换成具有该数组长度的字符串。
因此,字符数组可以用和字符串同样的方式进行比较操作,并且只要长度相同,就可以把字符串常数赋给字符数组,而字符串变量和字符串表达式计算得到的值不能赋给字符数组。
因为它们是不同类型的,且字符数组中的元素个数是固定的,而字符串变量和字符串表达式计算出来的值其长度是可变的。
另外,字符数组可以赋给字符串变量,当数组个数少于字符串变量所能容纳的最大长度时,取数组中全部字符;当多余时,多余的字符在赋值时被截掉。
其次,字符串变量和字符数组一样都可通过直标访问其中的单个字符。
因此,可以把字符串变量和字符变量看成是带有长度字节(由零下标指示)的字符数组。
(四)字符串过程和字符串函数
在TurboPascal中提供了台下与字符串类型有关的标准过程和函数,以便字符串数据的的处理与应用。
1.Delete过程
格式:
Delete(st。
pos。
num);
功能:
该过程从st串中的pos位置开始删除个数为num人字符的子字符串。
其中st是字符串变量,pos和num都是整型表达式。
如果pos+num的的值超过了字符串的长度,即企图删除字符串尾数以外的字符时,则只有串内字符被删掉。
Pos的值在1~255之间,如pos>255就产生运行错误。
例如:
st:
=‘TurboPascal6.0’
Delete(st,7,6);
将使st变为‘Turbo6.0’。
2.Insert过程
格式:
Insert(obj,target,pos);
功能:
该过程把字符串obj插入到字符串target的pos位置。
Obj是一个字符串表达式,target是一个字符串变量,pos是整型表达式。
如果pos比target长度大,那么obj就边到target之后;如果插入的target的最大长度,则多出字符将被截掉,target中只含有最左面那些字符;如果pos在1~255之外,则产生运行错误。
例如:
st:
=‘TurboPascal6.0’
Insert(‘isgoodlanuage’,st,17);
则将使st变为‘TurboPascal6.0isgoodlanguage’.
3.str过程
格式:
str(value,st);
功能:
该过程把value的数值转换成字符串存放在st中。
Value是一个具有整型或实型的参数,st是一个字符串变量。
参数是含有特殊格式命令的表达式。
例如,i值为12345,那么str(i:
6,st)使st值变为‘12345’,而x的值为3.14E4时,那么str(x:
10:
0,st)使st值变为‘31400’。
4.Val过程
格式:
val(st,var,code);
功能:
该过程把字符串st转换成对应的整型或实型数值(根据val的类型而定),并把这个值存放在var中。
St必须是一个表示数值的字符串,并符合数值常很的形成规则,首尾空格均不得出现。
Var必须是整型或实型变量,code必须是一个整型变量,作为过程执行的出错检查代码。
如果没有检查出错误,变量code置为0,否则置为第一个出错字符位置,同量转换结果值无意义。
例如,st=‘123’,则val(st,i,result)将使i值变为123,result值为0。
如果st内含有非数值字符,例如,‘215XOZ’,则val(st,i,reault)将使i值无意义,且result值为4,指出错误位置是在第四个字符位置上。
若st的值为‘215.42E5’,且x值是一个实型变量,那么调用val(st,x,result)将使x值为21542000,result值为0。
5.copy函数
格式:
copy(stposnum);
功能:
copy函数返回st串中一个从位置pos处开始的,包含num个字符的子字串。
这里st是一个字符表达式,pos和num是整型表达式。
如果pos值大于st字串长度,那么返回一个空串;如果试图得到字串尾部以外的字符,即若的长度,那么只返回串内字符;如果pos在1~255之外则产生运行错误。
例如:
st:
=‘DiskOperatingSystem’
copy(st,6,9)返回值为‘Operating’
copy(st,1。
4)返回值为‘Disk’
copy(st,16,6)返回值为‘System’
6.concat函数
格式:
concat(st1,st2……,stn);
功能:
函数concat把宏观世界所有自变量表示的字串按所给出的顺序连接起来,并返回连接后的值。
自变量st1,st2,……stn均是字串表达式,彼此用逗号隔开。
若结果字串长度大于255,则产生运行错误。
它可用连接运算符“+”代替并且更为方便。
例如,st1的值为‘Iam’,st2的值为‘student’,则concat(st1,‘a’,st2)返回‘Iamastudent’。
7.Length函数
格式:
lingth(st);
功能:
length函数返回字符串表达式st的长度值,即串st中字符的个数,结果类型是整型。
例如,st值为‘TurboPascal6.0’,则length(st)返回值为16。
8.pos函数
格式:
pos(objtarget);
功能:
pos函数返回字符串obj在字串target中的第一次出现的位置号。
Obj和target均是字符串表达式,值的类型为整型。
字串中第一个字符位置号为1,如果target中没有匹配的串则pos返回值为0。
例如:
st的值为‘Seeyoulater!
’,那么pos(‘you’,st)返回值为4,pos(‘Seek’,st)返回值为0。
【程序展示】
varhaoma:
string;{haoma是用来记录身份证号码的}
n,i:
longint;{n是有多少个人,i是循环控制变量}
begin
readln(n);{输入共有多少人}
fori:
=1tondo
begin
readln(haoma);{输入号码,必须是用readln}
write('chushengriqi:
',copy(haoma,7,4),'',copy(haoma,11,2),'',copy(haoma,13,2),'');{这个copy的作用在知识拓展上介绍了,输出出生年月日}
write('chushengshunxu:
',copy(haoma,15,2),'');{输出顺序码}
if(ord(haoma[17])-48)mod2=0then{判断是男还是女}
write('nv'){是女输出nv}
else
write('nan');{是男输出nan}
ifhaoma[18]<>'X'then{判断是不是X}
writeln('yanzhengma:
',haoma[18]{输出验证码}
else
writeln('yanzhengma:
10');
end;
end.
【能力提高】
我们大家看完了这道题,应该对这个字符串非常地了解了吧!
再来看看这道经典的回文数题目吧!
回文数
有一种数字:
一个数字如果从前往后和从后往前读都是一样,那么这个数就叫回文数。
比如123321和12321就是回文数。
如今小明要来判断这个数是不是回文数。
输入:
一个数(不超过225位)。
输出:
看这个数是不是回文数,是的就输出yes,不是就输出no。
例如:
输入:
123321
输出:
yes
例如1:
输入:
12312
输出:
no
这道题我们可以采取这个字符串来做,我们很容易就想到从中间将其分开,再进行比较,这就像对称轴图形一样。
这样不就知道了这个数字是不是回文数,不就解决了这题。
但是我们要注意这从中间分,因为这个回文数位数有的是奇数。
比如说这12321就是个回文数,可你能怎么从中间分呢?
所以我们前面部分就不用把位数加一再div2,而是直接div2,这样就可以解决这位数不是奇数的问题吗?
有人会问这后面部分怎么截下来,就算截下来我们也不可以将正的和反的比较。
这样我们就可以从末尾倒过来截与前面部分位数的字符不就行了。
我们这题就可以完美的解决了。
【回文数程序如下】
vari,k,n,m,j,f:
longint;
s,k1,k2,t:
string;
begin
readln(s);
k:
=length(s);
k1:
=copy(s,1,kdiv2);
k2:
='';
forj:
=kdowntokdiv2do
k2:
=k2+s[j];
ifk1=k2then
writeln('yes')
else
writeln('no');
end.
【练习题】
1.随机输入一个长度不超过255字符串,将其倒置后输出。
输入文件:
是一个字符串。
输出文件:
这个字符串的倒序。
例如:
输入:
100000000000
输出:
000000000001
2.从键盘上输入一串字符(可能含数字、小写字母),以#作为输入结束标志。
输入:
一串字符串。
输出:
其中字母出现的次数。
编程完成:
统计输入字符中每个小写字母出现的次数(没有出现的不输出)。
样例:
输入:
2bcdaab33wycc#输出:
a2b2c3d1w1y1
3.编写一个程序,统计从键盘输入的n(<100)个英文单词中以c开头的单词,并输出个数。
输入:
N=共有n个字符串。
以下n行是n个字符串。
输出:
以c开头的单词,并输出个数。
样例:
输入:
4ancatbeeCow输出:
catCow2
4.求m×n的值。
(m与n的位数均不超过255位)
输入:
m和n;
输出:
m*n;
例如:
输入:
23
输出:
6
教导主任的烦恼(for循环)
安庆市华一小是以信息技术为特长的名校,在校学生有2000多人。
学校教学质量过硬,这不仅有学生和老师的功劳,也与学校的管理分不开。
例如,每次期中考试,教导处都要求各班将分数汇总过来,教导主任按年级统计出优秀(100~90)、良好(90分以下~80)、及格(80分以下~60)、不及格(60分以下)人数,再依据这些数据,做出分析。
因为人数太多,教导主任很烦恼,你有什么好办法帮帮他吗?
【解题分析】
我们来看看这道题目,我们来想一想这题是不是非常的像一个桶,你来把这个分数往里放,桶肯定会越来越多,最后就把这桶的个数输出。
可我们怎样来做这个桶呢?
我们肯定会想到用数组来制作这个,如果没学过数组,我们就用一个一个的变量来充当数组。
但是我们的分数不可能只是整数,有可能分数。
这样是可以的,但我们麻烦的是我们该怎么放进去呢?
这是我们当前最大的问题。
让我们开动脑经,我们肯定会想到按分数的十位以上来放。
可我们马上会想到这分数的十位以上怎么得到呢?
我们可以用div10的方法来截取十位。
但这div只能用于整数,而我们的分数不可能只是整数,有可能是98.5分这个小数,而div是不对小数用。
我们虽然不能用div,但我们可以模仿div的操作来进行。
我们可以用分数除以10,随然有很多小数,但整数就是十位以上的数。
我们可以有trunc函数,来获得整数部分。
这样就有了很多种方法,可以用if语句来一个一个的判断,但也可以用if嵌套来完成。
这些我想你们应该学过,这是编程入学必知。
但我觉的这样做事非常的麻烦,要是我就会使用caseof语句。
这样非常方便,caseof在知识拓展里讲到了。
Case分数十位以上of,100~90的人数加一,90分以下~80的人数加一,80分以下~60的人数加一,60分以下的人数加一。
【程序流程】
1.输入总共人数。
2.进入一个以人数为次数的循环。
3.输入这个人的分数。
4.将这个分数的十位以上提取出来。
用case语句。
100~90的人数加一,90分以下~80的人数加一,80分以下~60的人数加一,60分以下的人数加一。
5.退出循环。
6.输出这些分数段的人数。
【知识拓展】
实型real
范围:
2.9*10^-39~1.7*10^38
占用空间:
6字节
优点:
数据范围大。
缺点:
当计算量大或数据大的情况下,计算会有一定误差。
注意:
把它输出时,不能忘了按题目要求加场宽。
trunc(x)求x的整数部分例:
trunc(5.6)=5结果是integer型
Case:
择的各个条件是由同一个表达式的不同结果值决定时,TurboPascal为我们提供了case语句来实现。
它的的选择过程很象一个多路开关,即由语句选择表达式的值,决定切换至哪一路去工作。
因此,在程序设计中,它是一种强有力的手段。
在实现多路径分支控制时,有时用case对某些问题的处理和设计,比用if语句的程序更简洁、更清晰。
语句的格式:
case<选择表达式>of
情况常量1:
语句1
情况常量2:
语句2
…
情况常量n:
语句n
else语句n+1
end
2—4
其中case、of、else、end为保留字,其表达式部分可以是整型、字符型、布尔型,但不能是实型。
确切地说,情况表达式只能是顺序顺序类型,其后的常量称为情况常量,是根据将要选择情况设置的常量。
在程序设计中,语句前面的情况常量部分可由具体问题决定由一个或多个常量构成。
当出现多个情况常量时,它样之间用逗号隔开。
情况常量应与表达式具有相同的类型。
Case语句的执行部分如图2—4所示。
由图2—4可见,该语句的执行过程为:
首先计算表达式的值,若其值与of后面的情况常量之一相等,则执行该情况常量后的语句部分,然后将其转到case语句的结尾。
如果选择表达式不与任何情况常量相等,则判断else是否存在;若存在则执行else后的语句部分,执行后再转到case语句结尾,否则直接转到case语句结尾。
其中语句部分可以是复合语句或空语句。
应该引起注意的是:
if语句是二选一,而case语句是多选一,它是通过表达式的切换来达到多路径的控制功能。
Case语句对多分支结构描述十分清晰,使用十分方便。
【程序展示】
varrenshu:
array[6..9]oflongint;{renshu是记录下每个分段中有多少人}
n,h,i:
longint;{n是共有多少人,h是分数的个位以上的数,i是循环控制变量}
chengji:
real;{chengji是每个人的成绩}
begin
readln(n);{输入共多少人}
fori:
=1tondo