主题:几个记录题木
编程小菜菜
[专家分:90] 发布于 2007-08-12 19:38:00
(这个不是..)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个字符串的最长公共子串.
最后更新于:2007-08-12 20:02:00
回复列表 (共11个回复)
沙发
Matodied [专家分:7560] 发布于 2007-08-12 21:21:00
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.
板凳
Matodied [专家分:7560] 发布于 2007-08-12 21:37:00
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 楼
编程小菜菜 [专家分:90] 发布于 2007-08-12 22:18:00
2呢?
4 楼
cmy28 [专家分:380] 发布于 2007-08-14 15:40:00
[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 楼
cmy28 [专家分:380] 发布于 2007-08-14 16:06:00
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 楼
cmy28 [专家分:380] 发布于 2007-08-14 16:14:00
3程序我编
7 楼
cmy28 [专家分:380] 发布于 2007-08-14 17:54:00
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 楼
游侠UFO [专家分:1200] 发布于 2007-08-15 10:49:00
貌似NOIP里面不能用编译开关,所以如果是训练NOIP的话,尽量不要用。。。
9 楼
编程小菜菜 [专家分:90] 发布于 2007-08-15 23:12:00
...谢了...貌似不要这么复杂...
10 楼
海浪123456789 [专家分:30] 发布于 2007-08-17 20:30:00
(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.
我来回复