Zadanie 1

W pliku hasla.txt podanych jest 200 haseł użytkowników pewnego systemu. Każdy użytkownik ma jedno hasło (zapisane w osobnym wierszu), które zawiera od 1 do 20 znaków alfanumerycznych, tzn. cyfr od 0 do 9 lub liter alfabetu łacińskiego (małych lub wielkich). Polityka bezpieczeństwa systemu wymaga, aby hasła były odpowiednio skomplikowane i nie powtarzały się.

R15sE2TQ3HH7h

Plik hasla.txt
Plik TXT o rozmiarze 2.09 KB w języku polskim

W tym zadaniu zamiast pliku posłużymy się tablicą łańcuchów znaków zawierającą 200 haseł zgodych z warunkami zadania.

Zadanie 1.1

Podaj liczbę haseł złożonych jedynie ze znaków numerycznych, to znaczy cyfr od 0 do 9.

Zadanie zostało opracowane przez Centralną Komisję Egzaminacyjną i znajduje się w Maturalnym zbiorze zadań z informatyki jako zadanie nr 74.1. Ze zbiorem można zapoznać się na oficjalnej stronie cke.gov.pl.

Ponieważ na egzaminie maturalnego uczniowie mogą wybrać język programowania, w przedstawionym tu rozwiązaniu posłużymy się pseudokodem. Twoim zadaniem będzie przełożenie tak zapisanych instrukcji na dowolny język.

Aby rozwiązać zadanie, musimy znaleźć sposób na policzenie haseł spełniających odpowiednie kryteria. Pisząc kod, założymy, że mamy do dyspozycji dwie funkcje:

  1. pobierz_kod_ASCII() – zwracającą kod ASCIIkod ASCIIkod ASCII znaku podanego jako argument;

  2. długość() – zwracającą liczbę znaków składających się na łańcuch podany jako parametr.

Zaczniemy od zadeklarowania tablicy łańcuchów znaków:

Linia 1. hasła otwórz nawias kwadratowy zamknij nawias kwadratowy znak równości tablica 200 łańcuchów znaków zawierająca hasła użytkowników systemu.

Naszym zadaniem jest policzenie haseł numerycznych, dlatego potrzebujemy zmiennej, której wartość będziemy zwiększać za każdym razem, gdy natrafimy na ciąg złożony wyłącznie z cyfr. Początkowo wartość tej zmiennej wynosi 0:

Linia 1. hasła otwórz nawias kwadratowy zamknij nawias kwadratowy znak równości tablica 200 łańcuchów znaków zawierająca hasła użytkowników systemu. Linia 2. licznik znak równości 0.

Następnie utworzymy pętlę, w której zmienna licznikowa będzie przyjmowała wartości od 0 do 199. Wskaże ona kolejno wszystkie elementy tablicy:

Linia 1. hasła otwórz nawias kwadratowy zamknij nawias kwadratowy znak równości tablica 200 łańcuchów znaków zawierająca hasła użytkowników systemu. Linia 2. licznik znak równości 0. Linia 4. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek 199 wykonuj.

Pętla dla posłuży do zbadania każdego łańcucha znaków, zapisanego w tablicy hasła.

Na początku pętli definiujemy zmienną logiczną czy_numeryczne i nadajemy jej wartość true. Użyjemy jej później, aby zadecydować, czy zmienna licznik powinna być inkrementowana:

Linia 1. hasła otwórz nawias kwadratowy zamknij nawias kwadratowy znak równości tablica 200 łańcuchów znaków zawierająca hasła użytkowników systemu. Linia 2. licznik znak równości 0. Linia 4. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek 199 wykonuj. Linia 5. czy podkreślnik numeryczne znak równości true.

Następnie tworzymy kolejną pętlę dla. Jej zmienna licznikowa (j) wskaże – po kolei – znaki składające się na wszystkie hasła. Dzięki funkcji pobierz_kod_ASCII() będziemy badać wartość liczbową poszczególnych znaków łańcucha hasła[i]. Wynik przypiszemy zmiennej n.

Korzystając z instrukcji warunkowej jeżeli, sprawdzimy, czy n jest mniejsze od 48 lub większe od 57. Jeśli warunek taki jest spełniony, znak nie należy do przedziału opisującego cyfry w tablicy ASCII (innymi słowy, nie jest znakiem numerycznym). Zmienna czy_numeryczne przybierze wówczas wartość false, a pętla – służąca do kontrolowania bieżącego hasła – zostanie przerwana:

Linia 1. hasła otwórz nawias kwadratowy zamknij nawias kwadratowy znak równości tablica 200 łańcuchów znaków zawierająca hasła użytkowników systemu. Linia 2. licznik znak równości 0. Linia 4. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek 199 wykonuj. Linia 5. czy podkreślnik numeryczne znak równości true. Linia 7. dla j znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły hasła otwórz nawias kwadratowy i zamknij nawias kwadratowy minus 1 zamknij nawias okrągły wykonuj. Linia 8. n znak równości pobierz podkreślnik kod podkreślnik ASCII otwórz nawias okrągły hasła otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy zamknij nawias okrągły. Linia 10. jeżeli n otwórz nawias ostrokątny 48 lub n zamknij nawias ostrokątny 57 to. Linia 11. czy podkreślnik numeryczne znak równości false. Linia 12. break.

W językach programowania, z których można korzystać na egzaminie maturalnym, istnieją gotowe funkcje sprawdzające, czy dany znak jest cyfrą.

W języku Python jest to funkcja isdigit(). Zwraca ona wartość True, jeżeli znak jest liczbą, lub False, jeżeli nie jest. Oto przykład zastosowania:

Linia 1. znak znak równości cudzysłów 6 cudzysłów. Linia 3. if znak kropka isdigit otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 4. print otwórz nawias okrągły cudzysłów znak jest liczbą cudzysłów zamknij nawias okrągły. Linia 5. else dwukropek. Linia 6. print otwórz nawias okrągły cudzysłów znak nie jest liczbą cudzysłów zamknij nawias okrągły.

W języku C++ jest to funkcja isdigit(). Zwraca ona wartość niezerową, jeżeli znak jest cyfrą; w przeciwnym wypadku zwraca 0. Przykład zastosowania:

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 2. using namespace std średnik. Linia 4. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. char znak znak równości apostrof a apostrof średnik. Linia 7. if otwórz nawias okrągły isdigit otwórz nawias okrągły znak zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 8. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów znak jest liczbą cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 9. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 10. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów znak nie jest liczbą cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 11. zamknij nawias klamrowy. Linia 12. zamknij nawias klamrowy.

W języku Java jest to funkcja isDigit() z klasy Character. Zwraca ona wartość true, jeżeli znak jest cyfrą; w przeciwnym wypadku zwraca false. Przykład zastosowania:

Linia 1. public class Test otwórz nawias klamrowy. Linia 2. public static void main otwórz nawias okrągły String args otwórz nawias kwadratowy zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. char znak znak równości apostrof 5 apostrof średnik. Linia 5. if otwórz nawias okrągły Character kropka isDigit otwórz nawias okrągły znak zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. System kropka out kropka println otwórz nawias okrągły cudzysłów znak jest liczbą cudzysłów zamknij nawias okrągły średnik. Linia 7. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 8. System kropka out kropka println otwórz nawias okrągły cudzysłów znak nie jest liczbą cudzysłów zamknij nawias okrągły średnik. Linia 9. zamknij nawias klamrowy. Linia 10. zamknij nawias klamrowy. Linia 11. zamknij nawias klamrowy.

Pod koniec zewnętrznej pętli dla dodamy kolejną instrukcję warunkową jeżeli, która – zależnie od wartości logicznej czy_numeryczne – zwiększy zmienną licznik lub tego nie zrobi.

Po zakończeniu pętli podamy liczbę haseł, które zawierają wyłącznie znaki numeryczne:

Linia 1. hasła otwórz nawias kwadratowy zamknij nawias kwadratowy znak równości tablica 200 łańcuchów znaków zawierająca hasła użytkowników systemu. Linia 2. licznik znak równości 0. Linia 4. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek 199 wykonuj. Linia 5. czy podkreślnik numeryczne znak równości true. Linia 7. dla j znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek długość otwórz nawias okrągły hasła otwórz nawias kwadratowy i zamknij nawias kwadratowy minus 1 zamknij nawias okrągły wykonuj. Linia 8. n znak równości pobierz podkreślnik kod podkreślnik ASCII otwórz nawias okrągły hasła otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy zamknij nawias okrągły. Linia 10. jeżeli n otwórz nawias ostrokątny 48 lub n zamknij nawias ostrokątny 57 to. Linia 11. czy podkreślnik numeryczne znak równości false. Linia 12. break. Linia 14. jeżeli czy podkreślnik numeryczne to. Linia 15. licznik znak równości licznik plus 1. Linia 17. wypisz licznik.

W ten sposób rozwiązaliśmy zadanie. Zgodnie ze schematem oceniania punkty otrzymamy tylko wtedy, gdy podany wynik będzie prawidłowy. Zwróć uwagę, że ewentualne błędy mogą pojawić się wskutek pominięcia liczby 48 lub 57 podczas zapisywania warunku instrukcji jeżeli w wewnętrznej pętli. Warto poświęcić więc trochę czasu na sprawdzenie przedziałów w warunkach instrukcji warunkowej jeżeli. Jeśli się pomylimy i np. zamiast otwartego przedziału wpiszemy zamknięty, stracimy punkt.

Oto plik z wynikiem do zadania 1.1.

RrJX3d9558TEN

Plik wyniki_hasla.txt
Plik TXT o rozmiarze 31.00 B w języku polskim

Słownik

kod ASCII
kod ASCII

kod unikatowy dla każdego znaku; zestawienie znaków i ich kodów ASCII nazywane jest tablicą ASCII

znaki alfanumeryczne
znaki alfanumeryczne

znaki alfabetu łacińskiego oraz cyfry