WITH Ada.Text_IO;
USE Ada.Text_IO;
WITH Ada.Integer_Text_IO;
USE Ada.Integer_Text_IO;
WITH Ada.Numerics.Float_Random;
USE Ada.Numerics.Float_Random;
PROCEDURE Sortowanie IS
SUBTYPE Typ_Klucza IS Integer RANGE 1..1000; -- Kluczem sa cyfry
TYPE Element IS
RECORD
Klucz : Typ_Klucza;
END RECORD;
TYPE Tablica IS ARRAY (Natural RANGE <>) OF Element;--definiujemy tablice
--<> wycina dowolny zakres ze zbioru
--losowanie elementow tablicy przez program
PROCEDURE Losowanie (
Tab : OUT Tablica) IS
Losuj : Generator;
BEGIN
FOR Indeks IN Tab'RANGE LOOP
Tab(Indeks).Klucz := Integer(Random(Losuj)*30.0);
END LOOP;
END Losowanie;
--zamiana elementow
PROCEDURE Wymien (
Tab : IN OUT Tablica;
Poprzedni,
Nastepny : IN Integer) IS
Temp : Element;
BEGIN
Temp:=Tab(Poprzedni);
Tab(Poprzedni):=Tab(Nastepny);
Tab(Nastepny):=Temp;
END Wymien;
--wczytywanie tablicy
PROCEDURE Wczytaj_Tablice (
Tab : OUT Tablica) IS
Znak : Integer;
BEGIN
FOR Indeks IN Tab'RANGE LOOP
LOOP
Put(Indeks);
Put(" liczba: ");
Get(Znak);
EXIT WHEN Znak IN Typ_Klucza;
New_Line;
Put("Ups. To nie jest cyfra z zakresu [1,1000] . Podaj jeszcze raz. ");
New_Line(3);
END LOOP;
Tab(Indeks).Klucz:=Znak;
END LOOP;
END Wczytaj_Tablice;
--wypisanie tablicy
PROCEDURE Wypisz_Tablice (
Tab : IN Tablica) IS
BEGIN
FOR Indeks IN Tab'RANGE LOOP
Put(Tab(Indeks).Klucz);
END LOOP;
END Wypisz_Tablice;
--sortowanie przez wybor w porzadku rosnacym
PROCEDURE Sortowanie_Wybor (
Tab : IN OUT Tablica) IS
Pkt_Najmniejszy : Integer;
Porownania : Natural;
Zamiany : Natural;
BEGIN
Porownania:=0;
Zamiany:=0;
FOR Indeks IN Tab'First..Tab'Last-1 LOOP
Pkt_Najmniejszy:=Indeks;
FOR Indeks2 IN Indeks+1..Tab'Last LOOP
IF Tab(Indeks2).Klucz<Tab(Pkt_Najmniejszy).Klucz THEN
Pkt_Najmniejszy:=Indeks2;
END IF;
Porownania:=Porownania+1;
END LOOP;
IF Pkt_Najmniejszy /= Indeks THEN
Zamiany:=Zamiany+1;
Wymien(Tab,Pkt_Najmniejszy,Indeks);
END IF;
END LOOP;
Put("Ilosc porownan: ");
Put(Porownania);
New_Line;
Put("Ilosc zamian: ");
Put(Zamiany);
New_Line;
END Sortowanie_Wybor;
--sortowanie przez wybor w porzadku malejacym
PROCEDURE Sortowanie_Wybor_Malejacy (
Tab : IN OUT Tablica) IS
Pkt_Najwiekszy : Integer;
Porownania : Natural;
Zamiany : Natural;
BEGIN
Porownania:=0;
Zamiany:=0;
FOR Indeks IN Tab'First..Tab'Last-1 LOOP
Pkt_Najwiekszy:=Indeks;
FOR Indeks2 IN Indeks+1..Tab'Last LOOP
IF Tab(Indeks2).Klucz>Tab(Pkt_Najwiekszy).Klucz THEN
Pkt_Najwiekszy:=Indeks2;
END IF;
Porownania:=Porownania+1;
END LOOP;
IF Pkt_Najwiekszy /= Indeks THEN
Zamiany:=Zamiany+1;
Wymien(Tab,Pkt_Najwiekszy,Indeks);
END IF;
END LOOP;
Put("Ilosc porownan: ");
Put(Porownania);
New_Line;
Put("Ilosc zamian: ");
Put(Zamiany);
New_Line;
END Sortowanie_Wybor_Malejacy;
--sortowanie przez wstawianie w porzadku rosnacym
PROCEDURE Sortowanie_Wstawianie (
Tab : IN OUT Tablica) IS
Porownania : Natural;
Zamiany : Natural;
BEGIN
Porownania:=0;
Zamiany:=0;
FOR Indeks IN Tab'First..Tab'Last-1 LOOP
FOR Indeks2 IN Indeks+1..Tab'Last LOOP
Porownania:=Porownania+1;
IF Tab(Indeks2).Klucz<Tab(Indeks).Klucz THEN
Wymien(Tab,Indeks2,Indeks);
Zamiany:=Zamiany+1;
END IF;
END LOOP;
END LOOP;
Put("Ilosc porownan: ");
Put(Porownania);
New_Line;
Put("Ilosc zamian: ");
Put(Zamiany);
END Sortowanie_Wstawianie;
--sortowanie przez wstawianie w porzadku malejacym
PROCEDURE Sortowanie_Wstawianie_Malejacy (
Tab : IN OUT Tablica) IS
Porownania : Natural;
Zamiany : Natural;
BEGIN
Porownania:=0;
Zamiany:=0;
FOR Indeks IN Tab'First..Tab'Last-1 LOOP
FOR Indeks2 IN Indeks+1..Tab'Last LOOP
Porownania:=Porownania+1;
IF Tab(Indeks2).Klucz>Tab(Indeks).Klucz THEN
Wymien(Tab,Indeks2,Indeks);
Zamiany:=Zamiany+1;
END IF;
END LOOP;
END LOOP;
Put("Ilosc porownan: ");
Put(Porownania);
New_Line;
Put("Ilosc zamian: ");
Put(Zamiany);
END Sortowanie_Wstawianie_Malejacy;
PROCEDURE Przypisz (
Tab1 : IN Tablica;
Tab2 : OUT Tablica) IS
BEGIN
FOR Indeks IN Tab1'RANGE LOOP
Tab2(Indeks) := Tab1(Indeks);
END LOOP;
END Przypisz;
--program glowny
Max_Ilosc : CONSTANT := 30;
Elementy : Positive; --ilosc elementow
Wybor : Integer;
BEGIN
Put("Program sortuje tablice metoda wybierania i wstawiania. ");
New_Line(4);
LOOP
Put("Podaj ilosc elementow tablicy: ");
Get(Elementy);
New_Line;
EXIT WHEN 1<Elementy AND Elementy<=Max_Ilosc;
Put("Ups. Maksymalna ilosc elementow moze wynosic 30.");
New_Line;
END LOOP;
DECLARE
Tab1 : Tablica (1 .. Elementy);
Tab2 : Tablica (1 .. Elementy);
BEGIN
LOOP
Put("Wybierz metode wprowadzania danych: ");
New_Line;
Put("1. Sam wpisze dane. ");
New_Line;
Put("2. Program losuje dane. ");
New_Line;
Put("Twoj wybor: ");
Get(Wybor);
New_Line(2);
EXIT WHEN (Wybor=1 OR Wybor=2);
Put("Ups. Wybierz 1 lub 2. ");
New_Line;
END LOOP;
IF Wybor=1 THEN
Put("Wprowadz ");
Put(Elementy ,1);
Put(" liczby calkowite: ");
New_Line;
Wczytaj_Tablice(Tab1);
ELSE
Losowanie(Tab1);
END IF;
Przypisz(Tab1,Tab2);
Put("Twoja tablica przed sortowaniem: ");
New_Line;
Wypisz_Tablice(Tab1);
New_Line(2);
Put("SPOSOB 1: SORTOWANIE PRZEZ WYBOR.");
New_Line(2);
Put(" => Sortowanie w porzadku rosnacym. ");
New_Line;
Sortowanie_Wybor(Tab1);
Put("Twoja tablica po posortowaniu: ");
New_Line;
Wypisz_Tablice(Tab1);
New_Line(2);
Put(" => Sortowanie w porzadku malejacym. ");
New_Line;
Sortowanie_Wybor_Malejacy(Tab1);
New_Line;
Put("Twoja tablica po posortowaniu: ");
New_Line;
Wypisz_Tablice(Tab1);
New_Line(3);
Put("SPOSOB 2: SORTOWANIE PRZEZ WSTAWIANIE. ");
New_Line(2);
Put(" => Sortowanie w porzadku rosnacym. ");
New_Line;
Sortowanie_Wstawianie(Tab2);
New_Line;
Put("Twoja tablica po posortowaniu: ");
New_Line;
Wypisz_Tablice(Tab2);
New_Line(2);
Put(" => Sortowanie w porzadku malejacym. ");
New_Line;
Sortowanie_WSTAWIANIE_Malejacy(Tab2);
New_Line;
Put("Twoja tablica po posortowaniu: ");
New_Line;
Wypisz_Tablice(Tab2);
END;
END Sortowanie;