HASŁA - na podstawie zadania 74 ze zbioru CKE http://www.cke

Transkrypt

HASŁA - na podstawie zadania 74 ze zbioru CKE http://www.cke
HASŁA - na podstawie zadania 74 ze zbioru CKE
http://www.cke.edu.pl/images/_EGZAMIN_MATURALNY_OD_2015/Materialy/Zbiory_zadan/
Matura_Zbi%C3%B3r_zada%C5%84_Informatyka.pdf
W pliku hasla.txt danych jest 200 haseł użytkowników pewnego systemu. Każdy użytkownik posiada
jedno hasło, każde zapisano w osobnym wierszu, zawierajace od 1 do 20 znaków alfanumerycznych,
tzn. cyfr od 0 do 9 lub liter alfabetu łacińskiego (małych lub dużych). Polityka bezpieczeństwa systemu
wymaga, aby hasła były odpowiednio skomplikowane.
1. Podaj liczbę haseł złożonych jedynie ze znaków numerycznych, tzn. cyfr od 0 do 9.
2. Podaj liczbę haseł, które spełniają jednocześnie poniższe warunki:
• hasło zawiera co najmniej jeden znak numeryczny, tzn. cyfrę od 0 do 9,
• hasło zawiera co najmniej jedną małą literę,
• hasło zawiera co najmniej jedną dużą literę.
3. Wypisz hasła, które zostały użyte przez co najmniej dwóch różnych użytkowników, tzn. występują
przynajmniej w dwóch różnych wierszach. Wypisz je bez powtórzeń, w kolejności leksykograficznej.
4. Podaj liczbę użytkowników posiadających hasła, w których występuje fragment złożony z czterech
kolejnych znaków ASCII (w dowolnej kolejności), na przykład:
A5mnpoR89cd
A5876RRcg
As45FGHFEk90nba
Poprawne odpowiedzi
1 - 16 haseł numerycznych
2 - 40 haseł zawiera przynajmniej jedną cyfrę oraz małą i dużą literę
3 - 8 haseł występuje w pliku więcej niż jeden raz:
8Y7JGYXXR5
Ehz018657
PAsCMQaervw
cefdi
cek
ikfLDegQXj
jir
yvm249t83o04
4 - 39 haseł spełnia kryterium zadania 4
Przykładowe rozwiązanie
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream we("hasla.txt");
const int n = 200;
string S[n];
int licz = 0;
// zad 1 - hasła numeryczne
for (int i=0; i<n; i++) {
we >> S[i];
int d = S[i].length();
int j=0;
while (j<d) {
if ( S[i][j]>='0' && S[i][j]<='9') j++; else break;
}
if (j==d) licz++;
}
cout << licz << " haseł numerycznych\n";
licz = 0;
// zad 2 - cyfra+mala+duza litera
bool cyfra, mala, duza;
for (int i=0; i<n; i++) {
cyfra = mala = duza = false;
for (int j=0; j<S[i].length(); j++) {
char c = S[i][j];
if ( c>='0' && c<='9') cyfra = true;
if ( c>='A' && c<='Z') duza = true;
if ( c>='a' && c<='z') mala = true;
}
if (cyfra && mala && duza) licz++;
}
cout << licz << " haseł ma cyfrę, małą i dużą literę\n\n";
cout << "Duplikaty:\n";
sort(S, S+n);
for (int i=0; i<n-1; i++) {
int j = i+1;
while (j<n && S[i]==S[j]) j++;
if (j>i+1) { cout << S[i] << endl; i = j-1; }
}
}
// zad 3 - duplikaty
cout << "\nSekwencja 4 kolejnych kodów ASCII\n";
licz = 0;
for (int i=0; i<n; i++) {
int d = S[i].length();
if (d<=3) continue;
for (int j=0; j<=d-4; j++) {
string w = S[i].substr(j,4);
sort(w.begin(), w.end());
if (w[0]+1==w[1] && w[1]+1==w[2] && w[2]+1==w[3]) {
cout << S[i] << endl;
licz++;
break; }
}
}
cout << licz << " haseł jest takich\n";
return 0;
// zad 4