Une image / un lien ci-dessous est fourni (tel quel) pour télécharger la présentation
Politique de téléchargement : le contenu du site vous est fourni TEL QUEL pour votre information et votre usage personnel ; il ne peut être vendu, concédé sous licence ni partagé sur d’autres sites sans l’accord de son auteur.Le contenu vous est fourni TEL QUEL, pour votre information et votre usage personnel uniquement.Téléchargez la présentation en cliquant sur ce lien.Lors du téléchargement, si vous ne parvenez pas à télécharger une présentation, l’éditeur a peut-être supprimé le fichier de son serveur.Pendant le téléchargement, si vous ne parvenez pas à obtenir une présentation, le fichier a peut-être été supprimé par l’éditeur.
a:=0;b:=0;{新一局的比分初始化} end;{then} end; {'W',’L’} end;{case} end;{while} readln; end; {while} a:=0; b:=0; {新一局的比分初始化} writeln; reset(input);{重新读输入行} while not eof(input) do{若文件未读完且比赛未结束,则循环} begin while not eoln(input) do{若当前行处理完,则21分制的比赛结束} begin read(ch);{读一个字符}
case ch of{根据字符的种类分情形处理} ‘E’: begin{若比赛结束,则输出双方比分,退出21分制的计算过程} writeln(a,':',b); break; end;{ 'E'} 'W',’L’: begin{华华或对方得一分} if ch=’W’then inc(a) else inc(b); if ((a>=21)or(b>=21)) and (abs(a-b)>1) {若有一方得分达到21分且双方的分数差值大于1,则输出双方比分} then begin writeln(a,':',b); a:=0;b:=0;{新一局的比分初始化} end;{then} end;{ 'W',’L’} end;{case} end;{while} readln; end;{while} close(input); close(output);{关闭输入文件和输出文件} 关键是文件操作。如果在计算21分制的得分前,不会通过reset(input)将读头移到文件首,则会出错!
由于连接后的字串长度不变,我们可以利用字符串的大小顺序和十进制的进位关系,对n个数串s进行排序由于连接后的字串长度不变,我们可以利用字符串的大小顺序和十进制的进位关系,对n个数串s进行排序 for i←1 to n-1 do {顺序排定s1…sn-1} for j←i+1 to n do{si依次与si+1…sn比较} if s[i]<s[j] then {若sj大于si,则si与sj交换位置} begin s1←s[i];s[i] ←s[j];s[j] ←s1; end;{then} for i←1 to n do write(s[i]);{输出最大的多位整数}
字符串编辑 从键盘输入一个字符串(长度≤40个字符),并以字符’.’结束. 例如:’This is a book.’,现对该字符串进行编辑,编辑功能有: D:删除一个字符,命令的方式为:D a。其中a为被删除的字符。例如:D s 表示删除字符’s’,若字符串中有多个’s’,则删除第一次出现的,如上例中删除的结果为’Thi is a book.’ I:插入一个字符,命令的格式为:I a1 a2。其中a1表示插入到指定字符前面,a2表示将要插入的字符。例如:I s d 表示在指定字符’s’的前面插入字符’d’,若原串中有多个’s’,则插入在最后一个字符的前面。如上例中,原串:’This is a book.’,插入后:’This ids a book.’ R:替换一个字符,命令格式为:R a1 a2。其中a1为被替换的字符,a2为替换的字符,若在原串中有多个a1,则应全部替换。例如:原串:’This is a book.’。 输入命令: R o e,替换后:’This is a beek.’。 在编辑过程中,若出现被指定的字符不存在时,则给出提示信息
删除操作 字串S中寻找que[3]。若找不到,则失败退出;否则,将该字符删去: i←pos(que[3],s); if i=0 then begin writeln(’Error!’);halt;end{then} else delete(s,i,1); 插入操作 从S串尾出发,由右而左寻找que[3]字符的位置。若找不到,失败退出;否则将que[5]字符插在该位置前i←length(s);{由右而左寻找que[3]字符的位置i} while (i>0)and(s[i] ≠que[3]) do i←i-1; if i≠0then insert(que[5],s,i){将que[5]字符插在i位置前} else begin writeln(’Error!’);halt;end;{else}
替换操作 从串首出发,由左而右寻找que[3]字符的位置。若找不到,失败退出;否则将que[5]替换所有的que[3]字符: error←true; for i←1 to length(s)do{由左而右替换que[3]字符} if s[i]=que[3] then begin error←false;s[i]←que[5]; end;{then} if error then{若找不到,失败退出} begin writeln(’Error!’);halt; end{then}
主程序 输入原串s和命令串que; case que[1] of ’D’:begin 删除操作;end;{ ’D’} ’I’:begin 插入操作;end;{ ’I’} ’R’:begin 替换操作;end;{ ’R’} end;{case} 输出s;
输出文件 输出文件名a.out,格式如下: i Ei Fi 其中i为字典表中符合条件的单词序号(1≤i≤n),若字典表中不存在符合条件的单词,则对应的i=0。若上述三种情况不存在,则输出N。 输入输出样例 输入1: 5 abcde abc asdfasfd abcd aacd abcd 输出1: 4 E5 F1 输入2: 1 a b 输出2: 0 E0 F0 N
我们将字典表中的单词分成3类: 第1类:单词与待匹配单词多或少一个字符,其余字符匹配; 第2类:单词仅有一个字符与待匹配单词不匹配; 第3类:单词与待匹配单词完全匹配; 设 const note :array[1..3] of string=('F','E',''); {匹配情况的标志} var want :string; {待匹配单词} list :array[1..100] of string; {字典表。其中list[i]为字典i} ans :array[1..100] of integer;{单词的类别序列。其中 ans[i]= }
1、匹配情况的计算 • ⑴计算两个等长字串中不同字符的个数 • function find(a,b:string):integer;{输入两个等长字串a,b,计算和返回不同字符的个数} • var i,tot:integer; • begin • tot←0; • for i←1 to length(a) do if a[i]<>b[i] then inc(tot); • find←tot; • end;{ find }
⑵判别一个字串是否比另一个字串多一个字符(其余字符匹配)⑵判别一个字串是否比另一个字串多一个字符(其余字符匹配) • 我们不知道长度大1的字串究竟在哪个位置上多出一个字符,无奈,只能将该字串的每一个字符试插在另一个字串的对应位置上。如果插入后使得两串相同,则说明猜想成立。否则猜想不成立。 • function check(a,b:string):integer;{输入字串a,b。若b能够在a的基础上添加一个字符得到的话,则返回1;否则返回0} • var i:integer; • begin • check←0; • for i←0 to length(a) do begin • a←copy(a,1,i)+b[i+1]+copy(a,i+1,255);{在a[i]后插入b[i+1]} • if a=b {若插入后两串相同,则成功退出} • then begin check←1;exit;end;{then} • delete(a,i+1,1); {删去a中的插入字符} • end;{for} • end;{check}
2、计算字典表中的每一类单词 • 首先,我们依次计算每一个单词的类别序号 • 在单词i与待匹配单词等长的情况下,若两串相同,则单词i的类别记为3;若两串仅有一个字符不同,则单词i的类别记为2; • 若单词i比待匹配单词多或少一个字符(其余字符匹配),则单词i的类别记为1;否则单词i的类别记为0; • 然后根据ans序列在字典表中依次搜索类别3‥类别1的单词,输出对应的单词序号。如果在字典表中不存在上述3种类别的单词,则输出‘N’。 • fillchar(ans,sizeof(ans),0); { 单词的类别序列初始化} • for i←1 to n do begin {对字典中的每个单词进行分类} • if length(list[i])=length(want) {若单词i与待匹配单词等长} • then begin • k←find(list[i],want);{计算单词i与待匹配单词的不同字符个数} • if k=0 then ans[i] ←3; {记下类别序号} • if k=1 then ans[i] ←2; • end;{then}
{若单词i比待匹配单词多或少一个字符(其余字符匹配),则单词i的类别记为1;否则单词i的类别记为0}{若单词i比待匹配单词多或少一个字符(其余字符匹配),则单词i的类别记为1;否则单词i的类别记为0} if length(list[i])+1=length(want) then ans[i] ←check(list[i],want); if length(list[i])=length(want)+1 then ans[i] ←check(want,list[i]); end;{for} have←false; {匹配情况存在的标志初始化} for i←3 downto 1 do begin {依次输出每一类别的单词在字典表最先出现的序号} k←0; for j←1 to n do if ans[j]=i then begin k←j;break;end;{then} have←have or (k>0); writeln(note[i],k); end;{for}
Type numtype=array[1..500]of word;{整数数组类型} vara,b:numtype;{a和b为整数数组}la,lb:integer;{整数数组a的长度和b的长度} s:string;{输入数串} 将数串s转化为整数数组a的方法如下:k←length(s);for i←1 to k do a[k-i+1]←ord(s[i])-ord(‘0’);
1、加法运算a←a+b(a、b为numtype类型) 首先,确定a和b中的最大位数x(x=max{la,lb})。然后依照由低位至高位(第1位至第x位)的顺序进行加法运算。在每一次位运算中,a当前位加b当前位的和除以10,其整商即为进位,其余数即为和的当前位。在进行了x位的加法后,若最高位有进位(a[x+1]≠0),则a的长度为x+1。 procedure plus(var a:numtype;b:numtype);{a←a+b} var i,x:byte; begin if la≥lb then x←la {确定两数中的最大位数} else x←lb; for i←1 to x do {逐位相加} begin a[i] ←a[i]+b[i];a[i+1] ←a[i+1]+a[i] div 10;a[i] ←a[i] mod 10 end;{for} while a[x+1]≠0 do x←x+1; {和的最高位进位} la←x-1; end;{ plus }
1.将数串s转化为整数数组m 设数串s=s1‥sp,串长为p。其中si为第p-i+1位n进制数(1≤i≤p)。我们将s转化为整数数组m=m[p]‥m[1],其中m[i]对应第i位n进制数。 type mtype=array[1..100]of integer; var m:mtype; 按下述方法将s转化为整数数组m: p←length(s);{计算s的串长} for i←1 to p do {从最高位开始计算整数数组m } begin k←p-i+1;{计算si对应于的m数组下标} case s[i] of{转换si} ’a’..’f’:m[k]←10+ord(s[i])-ord(’a’); ’0’..’9’:m[k]←ord(s[i])-ord(’0’); else 输出错误信息并退出程序; end;{case} end;{for}
2.判别整数数组m是否为回文数 function check (m: mtype) :boolean;{若整数数组m为回文数,则返回true,否则返回false} var i:integer; begin check←false; for i←1to do if m[i] ≠m[p-i+1] then exit;{返回m非回文数标志} check←true;{返回m为回文数标志} end;{check}
3.n进制加法运算 整数数组m1与其反序数m2进行n进制加法运算,得到结果m1 procedure solve(var m1: mtype); var m2: mtype; begin for i←1 to p do m2[i]←m1[p-i+1];{计算反序数m2} for i←1 to p do {由右而左逐位相加} begin m1[i]←m1[i]+m2[i];m1[i+1]← ;{进位} m1[i]←m1[i]mod n;{确定当前位} end;{for} if m1[p+1] ≠0 then p←p+1;{最高位进位} if check (m1)then 输出步数并退出程序; end;{solve}
4.主程序 输入进制数n和数串s; fillchar(m,sizeof(m),0) 将s转换为整数数组m; if check(m) then begin 输出步数0;halt;end;{then} 步数初始化为0; while 步数≤30 do begin 步数+1;solve(m);end;{while} 输出无解信息;
2、减法运算a←a-b(a、b为numtype类型,a>b) 依照由低位至高位(第1位至第la位)的顺序进行减法运算。在每一次位运算中,若出现不够减的情况(a[i]<b[i]),则向高位借位(dec(a[i+1]),a[i]←a[i]+10)。在进行了la位的减法后,若最高位为零(a[la]=0),则a的长度-1。 procedure minus(var a:atype;var la:integer;b:atype);{计算a=a-b,返回差a及其长度la} var i:integer; begin for i←1 to la do {逐位相减} begin if a[i]<b[i]{借位} then begin dec(a[i+1]);a[i]←a[i]+10;end;{then} a[i]←a[i]-b[i];{计算差的第i位} end;{for} while a[la]=0 do dec(la);{计算差的实际长度} end;{minus}
3、乘法运算a←a*c(a为numtype类型,c为字节型) 按照乘法规则,从a的第1位开始逐位与c相乘。在第i位乘法运算中(1≤i≤la),a的i位与c的乘积必须加上i-1位的进位(i-1位的乘积除以10的整商),然后规整积的i-1位(取i-1位的乘积对10的余数): procedure multiply(var a:numtype;c:byte); var i:byte; begin a[1] ←a[1]*c;{第1位初始化} for i←2 to la do{逐位相乘} begin a[i] ←a[i]*c;a[i] ←a[i]+a[i-1] div 10;a[i-1]←a[i-1] mod 10 end;{for} while a[la] ≥10 do{积的最高位进位} begin la←la+1;a[la] ←a[la-1] div 10;a[la-1] ←a[la-1] mod 10 end{while} end;{ multiply }
4、高精度除法 设a,b为除数和被除数,q和r为小数和余数序列,其中r[0]=0。按照除法规则逐位相除:若当前位hv的小数和余数与先前得出的某位i相同((r[i]=r[hv])and (q[i]=q[hv])),则说明除法成功。若i=0,则q[1]..q[hv]为小数;否则q[i]..q[hv-1]为循环节。上述过程一直进行到小数50位为止。 readln(f,a,b);{输入除数和被除数} if b=0 then begin writeln(f0,'Meaningless.'); continue end; if a*b<0{计算和输出商的整数部分} then begin write('-'); a:=abs(a); b:=abs(b) end; write(f0,a div b); if a mod b=0 then exit; a:=a mod b; write(‘.’);{开始计算小数部分} hv:=0; bn:=false;{小数位数和循环节标志初始化} r[0]:=0;{第0位余数为0,除尽的比较标志}
while hv<50 do begin{计算小数和余数的当前位} inc(hv); q[hv]:=a*10 div b;r[hv]:=a*10 mod b;a:=r[hv]; i:=0;{在小数和余数中寻找与当前位相同的位数i} while (i<=hv-1) and ((r[i]<>r[hv]) or (q[i]<>q[hv])) do inc(i); if i<=hv-1{若相同位存在或被除尽} then begin for j:=1 to i-1 do write(q[j]);{输出循环节前的小数} if i<>0 then write(f0,‘{’);{输出循环节} if i>0 then for j:=i to hv-1 do write(q[j]) else for j:=1 to hv do write(q[j]);{若第hv位小数和余数为0,则输出小数部分} if i<>0 then write('}');bn:=true; break{成功标志} end end; if not bn then for i:=1 to 50 do write(q[i]);{输出50位小数}
计算ans←ans*l fillchar(ans1,sizeof(ans1),0);{乘积初始化} for i:=0 to 499 do{连乘当前项} for j:=0 to 499-i do inc(ans1[i+j],ans[i]*l[j]); for i:=0 to 498 do{对乘积进行规整} begin inc(ans1[i+1],ans1[i] div 10);ans1[i]:=ans1[i] mod 10; end;{for} ans1[499]:=ans1[499] mod 10; ans:=ans1;
计算l←l2 fillchar(l1,sizeof(l1),0);{高一位的当前项初始化} for i:=0 to 499 do{前一项的平方作为当前项,取后500位} for j:=0 to 499-i do inc(l1[i+j],l[i]*l[j]); for i:=0 to 498 do{对当前项进行规整} begin inc(l1[i+1],l1[i] div 10); l1[i]:=l1[i] mod 10; end;{for} l1[499]:=l1[499] mod 10; l:=l1;
Connexion au compte
Connectez-vous pour publier votre contenu sur SlideServe.