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ę.
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:
pobierz_kod_ASCII() – zwracającą kod ASCIIkod ASCIIkod ASCII znaku podanego jako argument;
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.
hasła[] = 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.
hasła[] = tablica 200 łańcuchów znaków zawierająca hasła użytkowników systemu
licznik = 0
dla i = 0, 1, ..., 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.
hasła[] = tablica 200 łańcuchów znaków zawierająca hasła użytkowników systemu
licznik = 0
dla i = 0, 1, ..., 199 wykonuj
czy_numeryczne = 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.
hasła[] = tablica 200 łańcuchów znaków zawierająca hasła użytkowników systemu
licznik = 0
dla i = 0, 1, ..., 199 wykonuj
czy_numeryczne = true
dla j = 0, 1, ..., długość(hasła[i] - 1) wykonuj
n = pobierz_kod_ASCII(hasła[i][j])
jeżeli n < 48 lub n > 57 to
czy_numeryczne = false
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.
znak = "6"
if znak.isdigit():
print("znak jest liczbą")
else:
print("znak nie jest liczbą")
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.
#include <iostream>
using namespace std;
int main() {
char znak = 'a';
if (isdigit(znak)) {
cout << "znak jest liczbą" << endl;
} else {
cout << "znak nie jest liczbą" << endl;
}
}
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.
public class Test {
public static void main(String args[]) {
char znak = '5';
if (Character.isDigit(znak)) {
System.out.println("znak jest liczbą");
} else {
System.out.println("znak nie jest liczbą");
}
}
}
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.
hasła[] = tablica 200 łańcuchów znaków zawierająca hasła użytkowników systemu
licznik = 0
dla i = 0, 1, ..., 199 wykonuj
czy_numeryczne = true
dla j = 0, 1, ..., długość(hasła[i] - 1) wykonuj
n = pobierz_kod_ASCII(hasła[i][j])
jeżeli n < 48 lub n > 57 to
czy_numeryczne = false
break
jeżeli czy_numeryczne to
licznik = licznik + 1
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.