List 如何从Pascal中的输入形成链表?
我有一个格式为的输入文件:List 如何从Pascal中的输入形成链表?,list,pascal,turbo-pascal,List,Pascal,Turbo Pascal,我有一个格式为的输入文件: (a n),(a n-1)。。。(a0) 如何在Pascal中形成如下列表 type tt = ^t; t = record a: Integer; n: Integer; next: tt end; 例如: (510),(59),(58),(57),(56),(55),(54),(53),(52),(51),(50) 应该与图像上的类似: 新代码(按预期工作): program ex4_19; type
(a n),(a n-1)。。。(a0)
如何在Pascal中形成如下列表
type
tt = ^t;
t = record
a: Integer;
n: Integer;
next: tt
end;
例如:(510),(59),(58),(57),(56),(55),(54),(53),(52),(51),(50)
应该与图像上的类似:
新代码(按预期工作):
program ex4_19;
type
tt = ^t;
t = record
a: Integer;
n: Integer;
next: tt
end;
var
ukzv, ukrs: tt;
inp: text;
raDone: boolean;
i: integer;
str: string;
begin
assign(inp, 'f1.txt'); reset(inp);
assign(output, 'out.txt'); rewrite(output);
new(ukzv);
ukrs:=ukzv;
read(inp, str);
writeln(str);
for i:=1 to length(str) do
begin
case str[i] of
'(':
begin
raDone:=false;
new(ukzv^.next);
ukzv:=ukzv^.next;
ukzv^.a:=0;
ukzv^.n:=0;
end;
'0' .. '9':
begin
if raDone = false then
ukzv^.a:=ukzv^.a * 10 + (ord(str[i]) - ord('0'))
else
ukzv^.n:=ukzv^.n * 10 + (ord(str[i]) - ord('0'));
end;
' ':
begin
if raDone = false then
begin
raDone:=true;
end;
end;
')':
begin
ukzv^.next:=nil;
end;
end;
end;
ukzv:=ukrs;
while ukzv^.next <> nil do
begin
writeln(ukzv^.next^.a, ' ', ukzv^.next^.n);
ukzv:=ukzv^.next;
end;
end.
程序ex4_19;
类型
tt=^t;
t=记录
a:整数;
n:整数;
下一个:tt
终止
变量
ukzv,ukrs:tt;
inp:文本;
raDone:布尔型;
i:整数;
str:字符串;
开始
赋值(inp,'f1.txt');复位(inp);
赋值(输出'out.txt');重写(输出);
新的(ukzv);
ukrs:=ukzv;
读(inp,str);
writeln(str);
对于i:=1到长度(str)do
开始
案件str[i]
'(':
开始
raDone:=假;
新的(ukzv^下一个);
ukzv:=ukzv^.next;
ukzv^.a:=0;
ukzv^.n:=0;
终止
'0' .. '9':
开始
如果raDone=false,则
ukzv^.a:=ukzv^.a*10+(ord(str[i])-ord('0'))
其他的
ukzv^.n:=ukzv^.n*10+(ord(str[i])-ord('0');
终止
' ':
开始
如果raDone=false,则
开始
raDone:=真;
终止
终止
')':
开始
ukzv^.next:=nil;
终止
终止
终止
ukzv:=ukrs;
而ukzv^。下一个零做
开始
书面形式(ukzv^.next^.a',,ukzv^.next^.n);
ukzv:=ukzv^.next;
终止
终止
我有错误“无效的数字格式”,因为在第二个数字后面有“')。直到',我才知道如何读取数字,因为数字可以不同(1-1000)。有不同的方法,其中一种方法如下。从将文件读入字符串变量开始
'(5 10), (5 9), (5 8), (5 7), (5 6), (5 5), (5 4), (5 3), (5 2), (5 1), (5 0)'
然后使用循环(for..do
,repeat..till
或while..do
)逐个遍历字符。使用案例陈述来决定操作
下面是每个字符的处理过程,应该直接作为case
语句实现
您需要一个布尔值(例如,raDone:boolean
)来指示记录中的新数字是指向a
还是n
Get next char, '(', you know it's time to link in a new record (`r` in the following).
Get next char, '5', it's a digit and `not raDone`, so you accumulate `r.a` with it. See below!
Get next char, ' ', it's a space and `not raDone`, you know that entry for `r.a` has ended, set `raDone` to indicate next digits belong to `r.n`.
Get next char, '1', it's a digit and `raDone`, so you accumulate `r.n` with it.
Get next char, '0', it's a digit and `raDone`, so you accumulate `r.n` with it.
Get next char, ')', you know the entry for the current record is ready.
Get next char, comma, nothing to do, just skip it
Get next char, ' ', space, nothing to do, just skip it
用十进制数字(从字符转换而来)累加二进制值(如r.n):
您可能希望在输入字符串中添加错误检查以查找错误内容。您尝试了什么,以及如何失败?不是代码编写服务;你应该提供一份关于你的具体问题的报告,并描述你为解决这个问题所做的努力以及这些努力是如何不足的。请看一个好问题。@JeffZeitlin抱歉,已更新。我不知道如何执行那项任务。我不认为我上面的代码会对某人有所帮助,因为它只是一点点。开始提示:你需要纯粹地以字符串的形式读取输入,然后将其解析出来以得到你的数字。@JeffZeitlin我已经尝试过了,我已经删除了所有的“)”,“(“,”,“,”,但我不知道如何读取这个字符串。我有一个字符串“5 10 5 5 8…5 0”。我该怎么办?我希望它可以与不同的数字一起使用,例如“15 399 15 398…15 0”。它通常被称为乘法累加(或仅累加)。谢谢@Rudy,累加在这种情况下感觉很合适。@TomBrunberg我忘了说谢谢。谢谢:)
r.n := r.n * 10 + (ord(decimal character) - ord('0');