问题描述
分拣系统,主要问题始于“直到”功能。我想听听别人对我做错了什么的看法,如果有更简单的解决方案,如果您告诉我,我将不胜感激。 问题的想法是:您有n个人,您需要从键盘上介绍每个人。然后,我需要按字母顺序对它们进行排序
uses crt;
type Data = record
day : 1..31;
month : 1..12;
year : integer;
end;
Persoana = record
Name : string;
BirthDate : Data;
end;
ListaPersoane = array [1..50] of Persoana;
var x : ListaPersoane;
n:1..50;
i,z,j,l,a,v:integer;
y,k : longint;
aux : string;
begin
writeln('Program created on: 13/10/2020;');
writeln('give the number of people (max. 50):');
readln(n);
for i:=1 to n do begin
Clrscr;
writeln('Insert the name of person ',i,': '); readln(x[i].Name);
writeln('Insert the date o birth:'); writeln('day:'); readln(x[i].BirthDate.day);
writeln('month:'); readln(x[i].BirthDate.month);
writeln('year:'); readln(x[i].BirthDate.year);
Clrscr;
end;
writeln('_______________________');
for i:=1 to n do begin
writeln(i,') ',x[i].Name,' ',x[i].BirthDate.day,'/',x[i].BirthDate.month,x[i].BirthDate.year,';');
writeln('_______________________');
end;
writeln();
repeat
k:=0;
for i:=1 to n do begin
j:=1;
repeat
Inc(j);
until (x[i].Name[j]>x[i].Name[j]) or (x[i].Name[j]<x[i].Name[j]);
if(x[i].Name[j]>x[i+1].Name[j]) then begin
aux:=x[i].Name;
x[i].Name:=x[i+1].Name;
x[i+1].Name:=aux;
z:=x[i].BirthDate.day;
x[i].BirthDate.day:=x[i+1].BirthDate.day;
x[i+1].BirthDate.day:=z;
l:=x[i].BirthDate.month;
x[i].BirthDate.month:=x[i+1].BirthDate.month;
x[i+1].BirthDate.month:=l;
a:=x[i].BirthDate.year;
x[i].BirthDate.year:=x[i+1].BirthDate.year;
x[i+1].BirthDate.year:=a;
Inc(k);
end;
end;
until (k=0);
writeln('_______________________');
for i:=1 to n do begin
writeln(i,';');
writeln('_______________________');
end;
writeln();
end.
解决方法
我希望PascalABC
可以比较两个字符串,并返回其中一个“较小”或“较大”的字符串,而不会循环通过字符。
但是要引起您的注意(至少)排序代码中的三个问题,请考虑以下代码:
j := 1;
repeat
Inc(j);
until (x[i].Name[j] > x[i].Name[j]) or (x[i].Name[j] < x[i].Name[j]);
问题1:
您可以在循环之前初始化j := 1
。然后,在使用j
为字符建立索引之前,需要对其进行递增。因此,您永远不会尝试比较第一个字符。
问题2:
您的repeat
循环没有考虑到名称的长度有限且经常不同的情况。
问题3:
until
行上的以下任一条件是否为真:
(x[i].Name[j] > x[i].Name[j])
或者这个:
(x[i].Name[j] < x[i].Name[j])
在随后的代码中,您将x[i]
和x[i+1]
中的字符正确地进行了比较
我将这些错误的更正留给您自己纠正。如有需要,请咨询您的导师。
,您有一个重复..直到k = 0时终止。您从分配0的k开始,然后再不更改k。也许您的重复结束了,因为您没有在循环中更改k。