webForumDet fria alternativet

Ada, sortera 2D-array

0 svar · 2 591 visningar · startad av Peeer

PeeerMedlem sedan mars 20025 362 inlägg
#1

Hejhej!
Sitter här och försöker lära mig lite ada. Koden nedan fyller en array med slumptal, sorterar den och skriver ut den. Så långt inga problem. Problemet är när jag har en 2-dimensionell array (20 rader x 2 kolumner). Denna array ska sorteras efter raderna i första hand och kolumnerna i andra hand.

Ex:
2 3
3 2
3 3
4 2
osv..

Kruxet är att det ska gå att lösa utan att modifera sorteringsproceduren (eller tja, den får skrivas om men då ska den omskrivna fungera på såväl det 1-dimensionella fallet som det 2-dimensionella) som användes i koden nedan.

Jag har klurat fram och tillbaka och kommer inte på något bra sätt. Några tips?

En dimension:

with Ada.Text_IO;           use Ada.Text_IO;
with Ada.Integer_Text_IO;   use Ada.Integer_Text_IO;
with Ada.Numerics.Discrete_Random;

procedure Sort_Arr is
	--Skapa en typ (Int_Arr) och instansiera en variabel av typen.
	type Int_Arr is
		array(Positive range <>) of Integer;
	IA : Int_Arr(1 .. 20);

	procedure Generate(Arr : in out Int_Arr) is
	begin
	--Kod som fyller arrayen med slumptal.
	end Generate;

	procedure Put(Arr : in Int_Arr) is
	begin
		for I in Arr'Range loop
			Put(Arr(I), width => 1);
			New_Line;
		end loop;
	end Put;

	procedure Swap(A, B : in out Integer) is
	C: Integer;
	begin
		C := A;
		A := B;
		B := C;
	end Swap;

        --Bubblesort.
	procedure Sort(Arr : in out Int_Arr) is
	begin
		for I in (Arr'First + 1) .. Arr'Last loop
			for J in reverse I .. Arr'Last loop
				if Arr(J) < Arr(J-1) then
					Swap(Arr(J), Arr(J-1));
				end if;
			end loop;
		end loop;
	end Sort;
begin
	Generate(IA); -- Fyll arrayen med slumptal
	Put_Line("Skriv ut de osorterade talen:");
	Put(IA);

	Put_Line("Sorterar...");
	Sort(IA);

	Put_Line("Skriver ut sorterad:");
	Put(IA);
end Sort_Arr;

Två dimensioner:

with Ada.Text_IO;           use Ada.Text_IO;
with Ada.Integer_Text_IO;   use Ada.Integer_Text_IO;

with Ada.Numerics.Discrete_Random;

procedure Sort_Arr is
	--Skapa en typ (Int_Arr) och instansiera en variabel av typen.
	type Int_Arr is
		array(Positive range <>) of Integer;
	type Int_Pair_Arr is
		array(1 .. 2) of Int_Arr(1 .. 20);
	IPA : Int_Pair_Arr;

	procedure Generate(Arr : in out Int_Pair_Arr) is
	   subtype One_To_Ten is Integer range 1 .. 10;
	   package One_To_Ten_Random is
	      new Ada.Numerics.Discrete_Random(Result_Subtype => One_To_Ten);
	   -- En "Generator" är ett "dolt" värde som styr pseudoslumptalssekvensen.
	   G : One_To_Ten_Random.Generator;
	
	begin  -- One_To_Ten_Random_Test
	   -- För att få olika slumptalssekvenser vid olika körningar.
	   One_To_Ten_Random.Reset(G);

	   for I in Arr(1)'Range loop
	      Arr(1)(I) := One_To_Ten_Random.Random(G);
	      Arr(2)(I) := One_To_Ten_Random.Random(G);
	   end loop;
	end Generate;

	procedure Put(Arr : in Int_Pair_Arr) is
	begin
	        for J in Arr(1)'Range loop
       	         	Put(Arr(1)(J), Width => 2);
        	        Put(Arr(2)(J), Width => 2);
                	New_Line;
		end loop;
	end Put;
	
	procedure Swap(A, B : in out Integer) is
	C: Integer;
	begin
		C := A;
		A := B;
		B := C;
	end Swap;

	--Bubblesort.
	procedure Sort(Arr : in out Int_Arr) is
	begin
		for I in (Arr'First + 1) .. Arr'Last loop
			for J in reverse I .. Arr'Last loop
				if Arr(J) < Arr(J-1) then
					Swap(Arr(J), Arr(J-1));
				end if;
			end loop;
		end loop;	
	end Sort;
begin
	--Skicka in array-variabeln i generate-proceduren.
	Generate(IPA);
	Put_Line("Skriv ut de osorterade talen:");
	Put(IPA);

	--Put(IPA'Length);
	--Put(IPA(1)'Length);
	--Put(IPA'Length(2));
	--Put(IA(5,4));
	
	Put_Line("Sorterar...");
	Sort(IPA(1));
	
	Put_Line("Skriver ut sorterad:");
	Put(IPA);	
end Sort_Arr;
Genererad på 484 ms · cache AV · v20260730165559-full.f96bc7eb