Sprawdź się
Zadanie 3. Kolekcja medali
Pan Operacyjny wywiesił na ścianie swoją kolekcję medali. Medale ustawione są w kolejności od najmniejszego do największego, w zależności od ich pola powierzchni. Występują one w dwóch kształtach – prostokąta oraz koła.
W związku z remontem, który miał miejsce w mieszkaniu, Pan Operacyjny musiał zdjąć wszystkie medale.
Po zakończeniu prac postanowił ułożyć je na miejscach, na których wcześniej się znajdowały.
W tym celu sporządził trzy listy – wysokość medalu, szerokość medalu oraz kształt. Dane zostały zapisane kolejno w dwóch plikach: wysokość.txt
, szerokość.txt
.
Dane z tych samych wierszy odnoszą się do jednego medalu, np. pierwszy wiersz w pliku wysokość.txt
opisuje wysokość medalu, który opisuje pierwszy wiersz w pliku szerokość.txt
.
W sytuacji, gdy wysokość równa jest szerokości, medal ma kształt koła.
Napisz program, który posortuje medale w kolejności od najmniejszego do największego, w zależności od ich pola powierzchni i wypisze w tej kolejności ich wysokości i szerokości.
Do rozwiązania zadania przyjmij, że = 3,14
W plikach wysokość.txt
oraz szerokość.txt
znajduje się 80 wierszy z liczbami rzeczywistymi z przedziału [1, 11) opisującymi kolejno wysokość oraz szerokość medali.
wysokość.txt
szerokość.txt
Przykładowe dane:
3,90
4,95
5,11
9,66
Do oceny oddajesz:
pliki
wysokość2.txt
orazszerokość2.txt
zawierające odpowiedź (dane w kolejności takiej, że pierwszy wiersz w plikuwysokość.txt
opisuje wysokość medalu, który opisuje pierwszy wiersz w plikuszerokość.txt
)plik(i) z komputerową realizacją zadania (kodem programu)
W przedstawionych ćwiczeniach część danych została umieszczona w tablicach. Wykorzystaj je do rozwiązania zadania.
Napisz implementację zadania lokalnie na swoim komputerze w języku, w którym programujesz. Zadbaj o prawidłowe wczytanie danych z pliku tekstowego do swojego programu. Odpowiedź do zadania dla danych z pliku znajdziesz na samym końcu zadania.
C++
Przykładowe rozwiązanie zadania:
#include <iostream>
using namespace std;
void scal(float polaMedali[], int lewy, int srodek, int prawy) {
int dlugoscL = srodek - lewy + 1;
int dlugoscP = prawy - srodek;
float lewaPom[dlugoscL];
float prawaPom[dlugoscP];
int i = 0;
int j = 0;
int pozycja = lewy;
for (i = 0; i < dlugoscL; i++)
lewaPom[i] = polaMedali[lewy + i];
for (j = 0; j < dlugoscP; j++)
prawaPom[j] = polaMedali[srodek + j + 1];
i = 0;
j = 0;
while (j < dlugoscP && i < dlugoscL) {
if (prawaPom[j] >= lewaPom[i]) {
polaMedali[pozycja] = lewaPom[i];
i++;
} else {
polaMedali[pozycja] = prawaPom[j];
j++;
}
pozycja++;
}
while (i < dlugoscL) {
polaMedali[pozycja] = lewaPom[i];
i++;
pozycja++;
}
while (j < dlugoscP) {
polaMedali[pozycja] = prawaPom[j];
j++;
pozycja++;
}
}
void sortowanieScalanie(float polaMedali[], int lewy, int prawy) {
if (lewy >= prawy)
return;
int srodek = (lewy + prawy) / 2;
sortowanieScalanie(polaMedali, lewy, srodek);
sortowanieScalanie(polaMedali, srodek + 1, prawy);
scal(polaMedali, lewy, srodek, prawy);
}
int main() {
float wysokosci[] = {10.24, 5.63, 9.12, 9.39, 9.43, 10.54, 10.81, 7.00, 9.58, 1.36, 3.09};
float szerokosci[] = {3.44, 2.99, 10.71, 2.35, 7.55, 5.45, 8.01, 8.90, 10.25, 1.00, 3.09};
int dlugosc = 11;
float polaMedali[dlugosc];
for (int i = 0; i < dlugosc; i++)
if (wysokosci[i] == szerokosci[i])
polaMedali[i] = wysokosci[i] * wysokosci[i] * 3.14;
else
polaMedali[i] = wysokosci[i] * szerokosci[i];
sortowanieScalanie(polaMedali, 0, dlugosc - 1);
cout << polaMedali[2] << " " << polaMedali[5] << " " << polaMedali[8];
}
Java
public class Main {
static void scal(float[] polaMedali, int lewy, int srodek, int prawy) {
int dlugoscL = srodek - lewy + 1;
int dlugoscP = prawy - srodek;
float[] lewaPom = new float[dlugoscL];
float[] prawaPom = new float[dlugoscP];
int i = 0;
int j = 0;
int pozycja = lewy;
for (i = 0; i < dlugoscL; i++)
lewaPom[i] = polaMedali[lewy + i];
for (j = 0; j < dlugoscP; j++)
prawaPom[j] = polaMedali[srodek + j + 1];
i = 0;
j = 0;
while (j < dlugoscP && i < dlugoscL) {
if (prawaPom[j] >= lewaPom[i]) {
polaMedali[pozycja] = lewaPom[i];
i++;
} else {
polaMedali[pozycja] = prawaPom[j];
j++;
}
pozycja++;
}
while (i < dlugoscL) {
polaMedali[pozycja] = lewaPom[i];
i++;
pozycja++;
}
while (j < dlugoscP) {
polaMedali[pozycja] = prawaPom[j];
j++;
pozycja++;
}
}
static void sortowanieScalanie(float polaMedali[], int lewy, int prawy) {
if (lewy >= prawy)
return;
int srodek = (lewy + prawy) / 2;
sortowanieScalanie(polaMedali, lewy, srodek);
sortowanieScalanie(polaMedali, srodek + 1, prawy);
scal(polaMedali, lewy, srodek, prawy);
}
public static void main(String[] args) {
float[] wysokosci = {10.24f, 5.63f, 9.12f, 9.39f, 9.43f, 10.54f, 10.81f, 7.00f, 9.58f, 1.36f, 3.09f};
float[] szerokosci = {3.44f, 2.99f, 10.71f, 2.35f, 7.55f, 5.45f, 8.01f, 8.90f, 10.25f, 1.00f, 3.09f};
float[] polaMedali = new float[wysokosci.length];
for (int i = 0; i < wysokosci.length; i++)
if (wysokosci[i] == szerokosci[i])
polaMedali[i] = wysokosci[i] * wysokosci[i] * 3.14f;
else
polaMedali[i] = wysokosci[i] * szerokosci[i];
sortowanieScalanie(polaMedali, 0, wysokosci.length - 1);
System.out.print(polaMedali[2] + " " + polaMedali[5] + " " + polaMedali[8]);
}
}
Python
def sortowanie_scalanie(pola_medali):
if len(pola_medali) > 1:
srodek = len(pola_medali) // 2
lewy = pola_medali[:srodek]
prawy = pola_medali[srodek:]
sortowanie_scalanie(lewy)
sortowanie_scalanie(prawy)
i = j = n = 0
while i < len(lewy) and j < len(prawy):
if lewy[i] < prawy[j]:
pola_medali[n] = lewy[i]
i += 1
else:
pola_medali[n] = prawy[j]
j += 1
n += 1
while i < len(lewy):
pola_medali[n] = lewy[i]
i += 1
n += 1
while j < len(prawy):
pola_medali[n] = prawy[j]
j += 1
n += 1
wysokosci = [10.24, 5.63, 9.12, 9.39, 9.43, 10.54, 10.81, 7.00, 9.58, 1.36, 3.09]
szerokosci = [3.44, 2.99, 10.71, 2.35, 7.55, 5.45, 8.01, 8.90, 10.25, 1.00, 3.09]
pola_medali = []
for i in range(0, len(wysokosci)):
if wysokosci[i] == szerokosci[i]:
pola_medali.append(wysokosci[i] ** 2 * 3.14)
else:
pola_medali.append(wysokosci[i] * szerokosci[i])
sortowanie_scalanie(pola_medali)
print(pola_medali[2], pola_medali[5], pola_medali[8])
Odpowiedź dla danych zawartych w pliku tekstowym:
Wysokości posortowanych medali:
Szerokości posortowanych medali: