Sprawdź się
Zadanie 2.2
Po podliczeniu punktów przyszedł czas na analizę wyników. W pliku wyniki.txt zapisano liczbę punktów zdobytych przez zawodników. Piątka uczestników została zdyskwalifikowana – zostało to zaznaczone literą D.
W każdym wierszu pliku nazwiska2.txt znajduje się nazwisko jednego uczestnika. Odpowiadające sobie wiersze w plikach wyniki.txt oraz nazwiska2.txt dotyczą tego samego uczestnika – zawierają jego nazwisko oraz osiągnięty przez niego wynik punktowy. Oznacza to, że wynik w pierwszym wierszu wyniki.txt uzyskała osoba zapisana w pierwszym wierszu nazwiska2.txt.
Oto pliki z danymi do pobrania:
nazwiska2.txt
Plik tekstowy do pobrania zawiera listę nazwisk Pobierz załącznik
wyniki.txt
Plik tekstowy do pobrania zawiera listę numerów oraz liter D Pobierz załącznik
Nazwiska uczestników nie są równej długości.
Korzystając z wybranego języka programowania, napisz program, który poda wyniki pierwszej i ostatniej osoby po uporządkowaniu w kolejności leksykograficznej. Wyniki zapisz do pliku odpowiedzi.txt.
Do oceny oddajesz:
plik
odpowiedzi.txtzawierający odpowiedź (nazwiska i wyniki pierwszego i ostatniego uczestnika w porządku leksykograficznym, w formacienazwisko1 wynik, nazwisko2 wynik)plik(i) z komputerową realizacją zadania (kodem programu)
Przedstaw rozwiązanie zadania, pisząc program w języku C++, Java lub Python. Zadbaj o prawidłowe wczytanie danych z pliku tekstowego. Rozwiązanie zadania znajdziesz niżej, pod sekcją ćwiczeń.
C++
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
void sortuj(string nazwiska[], int dlugosci[], int wyniki[], int dlListy, int pozycja){
const int liczbaZnakow = 32;
int pomocnicza[liczbaZnakow + 1] = { 0 };
string listaN[9];
int listaW[9];
int i;
for (i = 0; i < dlListy; i++) {
if (nazwiska[i].length() <= pozycja)
pomocnicza[0]++;
else
pomocnicza[nazwiska[i][pozycja] - 'a' + 1]++;
}
for (i = 1; i <= liczbaZnakow; i++)
pomocnicza[i] += pomocnicza[i - 1];
for (int i=0; i < liczbaZnakow; i++)
pomocnicza[i]--;
for (i = dlListy - 1; i >= 0; i--) {
if (nazwiska[i].length() <= pozycja) {
listaN[pomocnicza[0]] = nazwiska[i];
listaW[pomocnicza[0]] = wyniki[i];
pomocnicza[0]--;
}
else {
listaN[pomocnicza[nazwiska[i][pozycja] - 'a' + 1]] = nazwiska[i];
listaW[pomocnicza[nazwiska[i][pozycja] - 'a' + 1]] = wyniki[i];
pomocnicza[nazwiska[i][pozycja] - 'a' + 1]--;
}
}
for (i = 0; i < dlListy; i++) {
nazwiska[i] = listaN[i];
wyniki[i] = listaW[i];
}
}
int main() {
string nazwiskaWejscie[] = {"Misiak", "Nocun", "Turek", "Wachowicz", "Chmielewski", "Kalinowski", "Kowalski", "Kucharska", "Dygat", "Borowski"};
string wynikiWejscie[] = {"29", "15", "26", "25", "27", "19", "D", "13", "15", "12"};
int liczbaKwalifikowanychUczestnikow = 0;
int liczbaUczestnikow = sizeof(nazwiskaWejscie)/sizeof(nazwiskaWejscie[0]);
for (int i = 0; i < liczbaUczestnikow; i++) {
if (wynikiWejscie[i][0] != 'D') {
liczbaKwalifikowanychUczestnikow++;
}
}
string nazwiska[liczbaKwalifikowanychUczestnikow];
int wyniki[liczbaKwalifikowanychUczestnikow];
int j = 0;
for (int i = 0; i < liczbaUczestnikow; i++) {
if (wynikiWejscie[i][0] != 'D') {
nazwiska[j] = nazwiskaWejscie[i];
wyniki[j] = stoi(wynikiWejscie[i]);
j++;
}
}
int dlugosci[liczbaKwalifikowanychUczestnikow];
int max_dlugosc = 1, pozycja = 0, dlListy = 9;
for (int i = 0; i < liczbaKwalifikowanychUczestnikow; i++) {
dlugosci[i] = nazwiska[i].length();
if (max_dlugosc < dlugosci[i])
max_dlugosc = dlugosci[i];
nazwiska[i][0] = tolower(nazwiska[i][0]);
}
pozycja = max_dlugosc - 1;
while (pozycja >= 0) {
sortuj(nazwiska, dlugosci, wyniki, dlListy, pozycja);
pozycja--;
}
cout << nazwiska[0] << " " << wyniki[0] << ", " << nazwiska[liczbaKwalifikowanychUczestnikow - 1] << " " << wyniki[liczbaKwalifikowanychUczestnikow - 1];
}Java
public class Main {
static void sortuj(String[] nazwiska, int[] dlugosci, int[] wyniki, int dlugoscListy, int pozycja) {
int liczbaZnakow = 32;
int[] pomocnicza = new int[liczbaZnakow + 1];
String[] listaN = new String[9];
int[] listaW = new int[9];
int i;
for (i = 0; i < dlugoscListy; i++) {
if (nazwiska[i].length() <= pozycja)
pomocnicza[0]++;
else
pomocnicza[nazwiska[i].charAt(pozycja) - 'a' + 1]++;
}
for (i = 1; i <= liczbaZnakow; i++)
pomocnicza[i] += pomocnicza[i - 1];
for (i = 0; i < liczbaZnakow; i++)
pomocnicza[i]--;
for (i = dlugoscListy - 1; i >= 0; i--) {
if (nazwiska[i].length() <= pozycja) {
listaN[pomocnicza[0]] = nazwiska[i];
listaW[pomocnicza[0]] = wyniki[i];
pomocnicza[0]--;
} else {
listaN[pomocnicza[nazwiska[i].charAt(pozycja) - 'a' + 1]] = nazwiska[i];
listaW[pomocnicza[nazwiska[i].charAt(pozycja) - 'a' + 1]] = wyniki[i];
pomocnicza[nazwiska[i].charAt(pozycja) - 'a' + 1]--;
}
}
for (i = 0; i < dlugoscListy; i++) {
nazwiska[i] = listaN[i];
wyniki[i] = listaW[i];
}
}
public static void main(String[] args) {
String[] nazwiskaWejscie = {"Misiak", "Nocun", "Turek", "Wachowicz", "Chmielewski", "Kalinowski", "Kowalski", "Kucharska", "Dygat", "Borowski"};
String[] wynikiWejscie = {"29", "15", "26", "25", "27", "19", "D", "13", "15", "12"};
int liczbaKwalifikowanychUczestnikow = 0;
for (int i = 0; i < nazwiskaWejscie.length; i++) {
if (wynikiWejscie[i].charAt(0) != 'D') {
liczbaKwalifikowanychUczestnikow++;
}
}
String[] nazwiska = new String[liczbaKwalifikowanychUczestnikow];
int[] wyniki = new int[liczbaKwalifikowanychUczestnikow];
int j = 0;
for (int i = 0; i < nazwiskaWejscie.length; i++) {
if (wynikiWejscie[i].charAt(0) != 'D') {
nazwiska[j] = nazwiskaWejscie[i];
wyniki[j] = Integer.parseInt(wynikiWejscie[i]);
j++;
}
}
int[] dlugosci = new int[nazwiska.length];
int maxDlugosc = 1, pozycja = 0, dlugoscListy = nazwiska.length;
for (int i = 0; i < 9; i++) {
dlugosci[i] = nazwiska[i].length();
if (maxDlugosc < dlugosci[i])
maxDlugosc = dlugosci[i];
nazwiska[i] = nazwiska[i].toLowerCase();
}
pozycja = maxDlugosc - 1;
while (pozycja >= 0) {
sortuj(nazwiska, dlugosci, wyniki, dlugoscListy, pozycja);
pozycja--;
}
System.out.print(nazwiska[0] + " " + wyniki[0] + ", " + nazwiska[nazwiska.length - 1] + " " + wyniki[nazwiska.length - 1]);
}
}Python
def sortuj(nazwiska, wyniki, pozycja):
liczba_znakow = ord("z") - ord("a") + 2
pomocnicza = [0] * liczba_znakow
lista_n = [0] * len(nazwiska)
lista_w = [0] * len(nazwiska)
for i in range(len(nazwiska)):
if len(nazwiska[i]) <= pozycja:
pomocnicza[0] += 1
else:
pomocnicza[ord(nazwiska[i][pozycja]) - ord("a") + 1] += 1
for i in range(1, liczba_znakow):
pomocnicza[i] += pomocnicza[i - 1]
for i in range(liczba_znakow):
pomocnicza[i] -= 1
for i in range(len(nazwiska) - 1, -1, -1):
if len(nazwiska[i]) <= pozycja:
lista_n[pomocnicza[0]] = nazwiska[i]
lista_w[pomocnicza[0]] = wyniki[i]
pomocnicza[0] -= 1
else:
lista_n[pomocnicza[ord(nazwiska[i][pozycja]) - ord("a") + 1]] = nazwiska[i]
lista_w[pomocnicza[ord(nazwiska[i][pozycja]) - ord("a") + 1]] = wyniki[i]
pomocnicza[ord(nazwiska[i][pozycja]) - ord("a") + 1] -= 1
for i in range(len(nazwiska)):
nazwiska[i] = lista_n[i]
wyniki[i] = lista_w[i]
nazwiska_wejscie = ["Misiak", "Nocun", "Turek", "Wachowicz", "Chmielewski", "Kalinowski", "Kowalski", "Kucharska", "Dygat", "Borowski"]
wyniki_wejscie = ["29", "15", "26", "25", "27", "19", "D", "13", "15", "12"]
nazwiska = []
wyniki = []
for i in range(len(nazwiska_wejscie)):
if wyniki_wejscie[i].isdigit():
nazwiska.append(nazwiska_wejscie[i])
wyniki.append(wyniki_wejscie[i])
max_dlugosc = 1
pozycja = 0
for i in range(len(nazwiska)):
if max_dlugosc < len(nazwiska[i]):
max_dlugosc = len(nazwiska[i])
nazwiska[i] = nazwiska[i].lower()
pozycja = max_dlugosc - 1
while pozycja >= 0:
sortuj(nazwiska, wyniki, pozycja)
pozycja -= 1
print("{} {}, {} {}".format(nazwiska[0], wyniki[0], nazwiska[-1], wyniki[-1]))Odpowiedź
Odpowiedź do zadania dla danych zawartych w pliku wyniki.txt:
Andrzejewski 29, Zielinska 23