回 帖 发 新 帖 刷新版面

主题:几个记录题木

(这个不是..)1.一个简单的行编辑程序,用户输入一个多行的字符序列,总数不大于250.
若用户发现前一个字符是错的就输入一个退格符#,表示前一个字符无效.若错误太多,则输入一个退行符@,表示当前行中的字符无效.(如果已经在行首,则输入#无效).
样例输入:
whil##ilr#e(s#*s)
outcha@putchar(*s=#++);
样例输出:
while(*s)
putchar(*s++)
2.给定一篇有英文单词,逗号,句号和空格组成的文章.要求统计里面出现过的单词次数,按从多到少排序输出到文件中,次数相同的按字典顺序排序.
3.score.dat地一行为正整数N,以下为N位同学的田径成绩.顺序是编号,姓名,跳高,跳远,百米跑.编号由5位数组成,且第1位为0.姓名不超过20个字符.跳高不超过2米,跳远不超过3米,百米跑不超过132秒,不小于9秒.请你统计.将三项竞赛的前三名的各项成绩输出到score.out.
4.求最长公共子串.对于给定的N(N<20)个字符串,串长不超过100,求N个字符串的最长公共子串.

回复列表 (共11个回复)

沙发

1、(在输入字符序列前要输入n,n为行数)
TYPE arr = ARRAY[1..63] OF STRING;
VAR
   t: arr;
   a, b: STRING[251]; i, j, l, n: INTEGER; ch: CHAR; s: STRING[1];
BEGIN
    WRITE('n='); READLN(n);
    FOR j:=1 TO n DO BEGIN
        a := ''; b := '';
        REPEAT
             READ(ch);
             IF ch <> CHR(13) THEN a := a + ch;
        UNTIL ch = CHR(13);
        l := LENGTH(a);
        FOR i:=1 TO l DO BEGIN
            s := COPY(a, i, 1);
            b := b + s;
            IF s = '#' THEN BEGIN
               DELETE(b, LENGTH(b) - 1, 2);
            END;
            IF s = '&' THEN BEGIN
               DELETE(b, 1, LENGTH(b));
            END;
        END;
        t[j] := b;
    END;
    FOR i:=1 TO n DO BEGIN
        WRITELN(t[i]);
    END;
END.

板凳

4、
FUNCTION substring(a, b: STRING): STRING;
VAR
   s, t: STRING; i, j, k, l, maxl: INTEGER;
BEGIN
    l := LENGTH(a); maxl := 0; t := '';
    FOR i:=1 TO l DO BEGIN
        FOR j:=1 TO l + 1 - i DO BEGIN
            s := COPY(a, i, j);
            FOR k:=1 TO LENGTH(b) + 1 - LENGTH(s) DO BEGIN
                IF COPY(b, k, LENGTH(s)) = s THEN BEGIN
                   IF LENGTH(s) > maxl THEN BEGIN
                      t := s; maxl := LENGTH(s);
                   END;
                END;
            END;
        END;
    END;
    substring := t;
END;
VAR
   i, n: INTEGER; sub, m: STRING[100];
BEGIN
    READLN(n);
    READLN(m); sub := m;
    FOR i:=2 TO n DO BEGIN
        READLN(m);
        sub := substring(sub, m);
    END;
    WRITELN('substring=', sub);
END.

3 楼

2呢?

4 楼

[quote]1、(在输入字符序列前要输入n,n为行数)
TYPE arr = ARRAY[1..63] OF STRING;
VAR
   t: arr;
   a, b: STRING[251]; i, j, l, n: INTEGER; ch: CHAR; s: STRING[1];
BEGIN
    WRITE('n='); READLN(n);
    FOR j:=1 TO n DO BEGIN
        a := ''; b := '';
        REPEAT
             READ(ch);
             IF ch <> CHR(13) THEN a := a + ch;
        UNTIL ch = CHR(13);
        l := LENGTH(a);
        FOR i:=1 TO l DO BEGIN
            s := COPY(a, i, 1);
            b := b + s;
            IF s = '#' THEN BEGIN
               DELETE(b, LENGTH(b) - 1, 2);
            END;
            IF s = '&' THEN BEGIN
               DELETE(b, 1, LENGTH(b));
            END;
        END;
        t[j] := b;
    END;
    FOR i:=1 TO n DO BEGIN
        WRITELN(t[i]);
    END;
END.
[/quote]

谁说要读入行数?多此一举得厉害!!
只要用文件里面的eoln函数就可以判断是否换行了,根本不要读入行数

5 楼


4、matodied的很好,只是有一个小错误:
 FOR j:=1 TO l + 1 - i DO BEGIN
            s := COPY(a, i, j);
改为:for j:=i to l+1 do begin
            s:=copy(a,i,j);

否则会使得整个程序运行出错的。

不过……我再思考一个问题:如果这n个字符串有公共子串,第一个和第二个字符串有两个公共子串,倘若按照你这个算法去找1、2两串的公共子串找到的不是n各字符串共有的那个子串,而是另一个子串怎么办?我也不知道怎么办……[em10][em10]

6 楼


3程序我编

7 楼


3题

{$n+}
Program score;
  const
     maxn=100;
  type
      node=record
          number,nam:string;
          high,long,run:extended;
      end;
      stype=array[1..maxn]of node;
  var
     s:stype;
     n:integer;
  procedure init;
    var
       ch:char;
       st:string;
       i,j:integer;
    begin
       readln(n);
       for i:=1 to n do
         begin
           st:='';
           read(ch);
           while ch<>' 'do
             begin
               st:=st+ch;
               read(ch);
             end;
           s[i].number:=st;
           st:='';
           read(ch);
           while ch<>' 'do
             begin
               st:=st+ch;
               read(ch);
             end;
           s[i].nam:=st;
           with s[i] do
           readln(high,long,run);
         end;
    end;
  procedure print;
    var
       i:integer;
    begin
       for i:=1 to 3 do
         with s[i] do
           writeln(number,' ',nam,' ',high:0:2,' ',long:0:2,' ',run:0:2);
    end;
  procedure work;
    var
       i,j:integer;
       t:node;
    begin
       for i:=1 to n-1 do
         for j:=i+1 to n do
           if s[i].high<s[j].high then begin
              t:=s[i];
              s[i]:=s[j];
              s[j]:=t;
              end;
       writeln('The first three in high_jump:');
       print;
       for i:=1 to n-1 do
         for j:=i+1 to n do
           if s[i].long<s[j].long then begin
             t:=s[i];
             s[i]:=s[j];
             s[j]:=t;
             end;
       writeln('The first three in long_jump:');
       print;
       for i:=1 to n-1 do
         for j:=i+1 to n do
           if s[i].run>s[j].run then begin
             t:=s[i];
             s[i]:=s[j];
             s[j]:=t;
             end;
       writeln('The first three in running:');
       print;
    end;
  begin
     init;
     work;
end.

{注意:1、跳高跳远赛跑成绩我用实数形表示,由于real类型运算较慢,用了extended,所以在程序开头需要打开编译开关。2、跳高跳远是数据越大成绩越好,赛跑是数据越小成绩越好}

8 楼

貌似NOIP里面不能用编译开关,所以如果是训练NOIP的话,尽量不要用。。。

9 楼

...谢了...貌似不要这么复杂...

10 楼

(2)草草了事呀!没排序!有时间就改改吧!
var a:string;    b:array[1..26]of integer;       c:array[1..26] of integer;
 i,j,at,av:integer;
 begin
  readln(a);
  at:=length(a);
   for i:=1 to at do
    for j:=97 to 122 do
  begin
   if (a[i]='.')  or (a[i]=',') or (a[i]=' ') then
   break;
     if a[i]=(chr(j)) then
     begin
       b[j-96]:=b[j-96]+1;
       break;
     end;
  end;
   for i:=1 to at do
    for j:=65 to 90 do
  begin
      if (a[i]='.')  or (a[i]=',') or (a[i]=' ') then
   continue;
    if a[i]=(chr(j)) then
     begin
      b[j-64]:=b[j-64]+1;
       break;
     end;
 end;
  for i:=1 to 26 do
    begin
     write((chr(i+96)),':',b[i],' ');
    end;
 end.

我来回复

您尚未登录,请登录后再回复。点此登录或注册