Delphi Can

Orjinalini görmek için tıklayınız: Tek dizi içinde öncelik sırası belirleme (+10 puan)
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Sorumuz oldukça basit olsa da tek dizi içinde bunu yapmanızı talep edeceğim. Geçici olarak bir transfer objesi oluşturmak yasaktır.

10 tane ürün yer alıyor. Bunları bir TList içinde düşünün. 5 tanesi gömlek, 3 tanesi kravat, 2 tanesi de ceket. Önceliğimiz 5 tane gömlek sonra 3 kravat ve en son 2 ceket olacak şekilde sıralamayı elden geçirmek. Bunun için istediğiniz sıralama algoritmasını da kullanabilirsiniz.

Liste şu şekilde;

1. gömlek
2. kravat
3. ceket
4. gömlek
5. gömlek
6. kravat
7. gömlek
8. kravat
9. ceket
10. gömlek


İlk cevaplayan ve en kısa çözümü veren kişiye +10 puan
En kısa çözümü veren kişiye +9 puan
Doğru cevaplayan kişiye +8 puan

Başarılar!
program Project26;

{$APPTYPE CONSOLE}

{$R *.res}
{

1. gömlek
2. kravat
3. ceket
4. gömlek
5. gömlek
6. kravat
7. gömlek
8. kravat
9. ceket
10. gömlek
}
uses
 System.SysUtils;
 var
liste:array [0..9] of integer  ;
 const
    urunler : array[1..3] of string =
   (
     'gömlek', 'kravat', 'ceket '
   ) ;


  procedure QuickSort ( var aDizi: Array of Integer; aTaban, aTavan: Integer; aSadeceAraliktakiler: Boolean = FALSE);
 var
     Kucuk
   , Buyuk
   , Aradaki
   , Temp   : Integer;
 begin
   Kucuk   := aTaban;
   Buyuk   := aTavan;
   Aradaki := aDizi[ (Kucuk + Buyuk) div 2 ];
   repeat
     while ( aDizi[Kucuk] < Aradaki ) do Inc(Kucuk);
     while ( aDizi[Buyuk] > Aradaki ) do Dec(Buyuk);
     if (Kucuk <= Buyuk) then begin
         Temp := aDizi[Kucuk];
         aDizi[Kucuk] := aDizi[Buyuk];
         aDizi[Buyuk] := Temp;
         Inc(Kucuk) ;
         Dec(Buyuk) ;
     end;
   until (Kucuk > Buyuk);
   if (aSadeceAraliktakiler = FALSE) then begin
       if (Buyuk > aTaban) then QuickSort(aDizi, aTaban, Buyuk);
       if (Kucuk < aTavan) then QuickSort(aDizi, Kucuk, aTavan);
   end;
 end;

var
i:integer;
begin


liste[0]:=1;
liste[1]:=2;
liste[2]:=3;
liste[3]:=1;
liste[4]:=1;
liste[5]:=2;
liste[6]:=1;
liste[7]:=2;
liste[8]:=3;
liste[9]:=1;

 QuickSort(liste, Low(liste), High(liste)) ;
  for I := Low(liste) to High(liste) do writeln(inttostr(i+1)+'.'+urunler[liste[I]]);
 Readln;
end.



Ben burada Uğur Bey'in yazdığı QuickSort'u kullandım ama buradan istenilen bir algoritmada kullanılabilir.
Degisken kullanabiliyor muyuz ?
(28-11-2017, Saat: 20:14)boreas Adlı Kullanıcıdan Alıntı: [ -> ]Degisken kullanabiliyor muyuz ?

Serbest ancak ek bir liste oluşturup tek tek ayırıp sonra birleştirip diğerlerini silmek yasak Shy
CustomSort kullanılarak yapılabilir:


type
 TGiysi = (gömlek, kravat, ceket);  // ÖNCELİĞE GÖRE BU TİP OLUŞTURULMALI!!!

function CompareFunc(List: TStringList; Index1, Index2: Integer): Integer;
var
  Priorty1, Priorty2: Integer;
begin
  Priorty1 := GetEnumValue(TypeInfo(TGiysi), List[Index1]);
  Priorty2 := GetEnumValue(TypeInfo(TGiysi), List[Index2]);
  if Priorty1 > Priorty2 then
    Result := 1
  else if Priorty2 > Priorty1 then
    Result := -1
  else
    Result := 0;
end;

var
 Liste: TStringList;

...

Liste.Add('gömlek');
Liste.Add('kravat');
Liste.Add('ceket');
Liste.Add('gömlek');
Liste.Add('gömlek');
Liste.Add('kravat');
Liste.Add('gömlek');
Liste.Add('kravat');
Liste.Add('ceket');
Liste.Add('gömlek');
Liste.CustomSort(CompareFunc);
...