因此,我需要按帕斯卡按字母顺序对结构数据进行排序,我即兴使用了一种排序方法,但是idk出现错误,如何解决

问题描述

分拣系统,主要问题始于“直到”功能。我想听听别人对我做错了什么的看法,如果有更简单的解决方案,如果您告诉我,我将不胜感激。 问题的想法是:您有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。