Jeśli jeszcze sami nie opracowaliście sobie maturalnych zadań na program z ostatnich lat to zapraszam do zapoznania się z moimi propozycjami. Na końcu wpisu znajdziecie link do pobrania paczki z poleceniami do zadań, danymi i oczywiście programami. Przepraszam za to, że niektóre są trochę nieczytelna i być może nieoptymalne, ale robiłem je jakiś czas temu i pewnie miałem wtedy clean code w poważaniu ;). Na egzamin możemy wybrać C++, Javę lub Pythona, w związku z czym przygotowałem implementację w każdym z tych języków.
Matura z informatyki – programy z 2014
Zadania na program z tego roku nie było szczególnie trudne. Jedynie teoretycznie najtrudniejsze zadanie trzecie sprawiło mi pewną trudność. Przydał się algorytm sprawdzający, czy liczba należy do liczb pierwszych , którego implementację wstawiałem na samym poczatku istnienia bloga.
Podpunkt a)
W podpunkcie tym wystarczyło przeiterować poprzez znaki słowa. Wykorzystamy fakt, że każdy znak można reprezentować jako liczbę. Zsumujemy potem znaki i sprawdzimy, czy suma jest liczba pierwszą.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <fstream>
using namespace std ;
bool czy_pierwsza ( int a )
{
if ( a < 2 ) return false ;
for ( int i = 2 ; i * i <= a ; i ++ )
{
if ( a % i == 0 ) return false ;
}
return true ;
}
int main ( )
{
int suma = 0 ;
int licznik = 0 ;
string napis ;
fstream plik ;
plik . open ( "NAPIS.txt" , ios :: in ) ;
if ( ! plik )
{
cout << "No nie" ;
return 1 ;
} else
{
while ( plik >> napis )
{
for ( int i = 0 ; i < napis . length ( ) ; i ++ )
{
suma += napis [ i ] ;
}
if ( czy_pierwsza ( suma ) == true ) licznik ++ ;
suma = 0 ;
}
}
cout << licznik ;
plik . close ( ) ;
return 0 ;
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package matura ;
import java . io . BufferedReader ;
import java . io . File ;
import java . io . FileReader ;
import java . io . IOException ;
public class Main {
static boolean czyPierwsza ( int a ) {
if ( a & lt ; 2 ) {
return false ;
}
for ( int i = 2 ; i* i & lt ; = a ; i ++ ) {
if ( a % i == 0 ) {
return false ;
}
}
return true ;
}
public static void main ( String [ ] args ) throws IOException {
File f = new File ( "NAPIS.txt" ) ;
if ( ! f . exists ( ) )
{
System . out . println ( "Plik " + f . getName ( ) + " nie został odnaleziony." ) ;
return ;
}
BufferedReader br = new BufferedReader ( new FileReader ( f ) ) ;
if ( br . ready ( ) ) {
String line ;
int suma = 0 ;
int licznik = 0 ;
while ( ( line = br . readLine ( ) ) != null ) {
for ( char c : line . toCharArray ( ) ) {
suma += c ;
}
if ( czyPierwsza ( suma ) )
licznik ++ ;
suma = 0 ;
}
System . out . println ( "Znaleziono " + licznik + " słów, których suma ASCII jest liczbą pierwszą" ) ;
br . close ( ) ;
}
else
{
System . out . println ( "Oj nie nie, -1 byczq." ) ;
br . close ( ) ;
return ;
}
}
}
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def czyPierwsza ( x ) :
for i in range ( 2 , int ( x / 2 ) + 1 ) :
if x % i == 0 :
return False
return True
file = open ( "NAPIS.TXT" , "r" )
pierwsze = 0
for line in file :
suma = 0
for char in line :
if char == "\n" :
continue
suma += ord ( char )
if czyPierwsza ( suma ) :
pierwsze += 1
print ( pierwsze )
file . close ( )
Podpunkt b)
Tutaj, podobnie jak w poprzednim podpunkcie, wykorzystamy liczbową reprezentację znaku. Wystarczy więc sprawdzać kolejne znaki i porównywać z poprzednim.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <fstream>
using namespace std ;
int main ( )
{
fstream plik ;
plik . open ( "NAPIS.txt" , ios :: in ) ;
if ( ! plik )
{
cout << "No nie" ;
return 1 ;
} else
{
int aktualny ;
int poprzedni ;
bool jest = true ;
string napis ;
while ( plik >> napis )
{
poprzedni = napis [ 0 ] ;
for ( int i = 1 ; i < napis . length ( ) ; i ++ )
{
aktualny = napis [ i ] ;
if ( aktualny <= poprzedni )
{
jest = false ;
} else
{
poprzedni = aktualny ;
}
}
if ( jest == true ) cout << napis << endl ;
jest = true ;
}
}
plik . close ( ) ;
return 0 ;
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package matura ;
import java . io . BufferedReader ;
import java . io . File ;
import java . io . FileReader ;
import java . io . IOException ;
public class Main {
public static void main ( String [ ] args ) throws IOException {
File f = new File ( "NAPIS.txt" ) ;
if ( ! f . exists ( ) )
{
System . out . println ( "Plik " + f . getName ( ) + " nie został odnaleziony." ) ;
return ;
}
BufferedReader br = new BufferedReader ( new FileReader ( f ) ) ;
if ( br . ready ( ) ) {
String line ;
int aktualny ;
int poprzedni ;
boolean jest = true ;
while ( ( line = br . readLine ( ) ) != null ) {
poprzedni = line . charAt ( 0 ) ;
for ( int i = 1 ; i & lt ; line . length ( ) ; i ++ ) {
aktualny = line . charAt ( i ) ;
if ( aktualny & lt ; = poprzedni ) {
jest = false ;
}
else
{
poprzedni = aktualny ;
}
}
if ( jest )
System . out . println ( line ) ;
jest = true ;
}
br . close ( ) ;
}
else
{
System . out . println ( "Oj nie nie, -1 byczq." ) ;
br . close ( ) ;
return ;
}
}
}
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
file = open ( "NAPIS.TXT" , "r" )
for line in file :
poprzednia = line [ 0 ]
nastepna = 0
pom = True
for char in line [ 1 : ] :
if char == "\n" :
continue
nastepna = char
if nastepna & lt ; = poprzednia :
pom = False
break
poprzednia = nastepna
if pom :
print ( line )
file . close ( )
Podpunkt c)
W tym podpunkcie zapiszemy słowa do tablicy, a następnie będziemy sprawdzać, czy już się w niej pojawił. Jeżeli tak, to pomijamy jego ponowne wstawianie.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <fstream>
using namespace std ;
int main ( ) {
fstream plik ;
plik . open ( "NAPIS.txt" , ios :: in ) ;
if ( ! plik ) {
cout & lt ; & lt ; "No nie" ;
return 1 ;
} else {
string napis [ 1000 ] ;
int byl [ 1000 ] ;
for ( int j = 0 ; j & lt ; 1000 ; j ++ )
byl [ j ] == 0 ;
int i = 0 ;
while ( plik >> napis [ i ] ) {
for ( int j = i - 1 ; j >= 0 ; j -- ) {
if ( napis [ i ] == napis [ j ] ) {
byl [ j ] ++ ;
break ;
}
}
i ++ ;
}
for ( int j = 0 ; j & lt ; 1000 ; j ++ ) {
if ( byl [ j ] != 0 )
cout & lt ; & lt ; napis [ j ] & lt ; & lt ; endl ;
}
}
plik . close ( ) ;
return 0 ;
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package matura ;
import java . io . BufferedReader ;
import java . io . File ;
import java . io . FileReader ;
import java . io . IOException ;
import java . util . HashMap ;
public class Main {
public static void main ( String [ ] args ) throws IOException {
File f = new File ( "NAPIS.txt" ) ;
if ( ! f . exists ( ) )
{
System . out . println ( "Plik " + f . getName ( ) + " nie został odnaleziony." ) ;
return ;
}
BufferedReader br = new BufferedReader ( new FileReader ( f ) ) ;
if ( br . ready ( ) ) {
String line ;
HashMap & lt ; String , Boolean > map = new HashMap & lt ; String , Boolean > ( ) ;
while ( ( line = br . readLine ( ) ) != null ) {
if ( map . containsKey ( line ) ) {
if ( ! map . get ( line ) ) {
map . put ( line , true ) ;
System . out . println ( line ) ;
}
} else {
map . put ( line , false ) ;
}
}
br . close ( ) ;
}
else
{
System . out . println ( "Oj nie nie, -1 byczq." ) ;
br . close ( ) ;
return ;
}
}
}
Python
file = open ( "NAPIS.TXT" , "r" )
words = [ ]
repeated = [ ]
for line in file :
if not words . __contains__ ( line ) :
words . append ( line )
else :
if not repeated . __contains__ ( line ) :
repeated . append ( line )
for x in repeated :
print ( x )
file . close ( )
Matura z informatyki – programy z 2015
Podpunkt 1.
W tym zadaniu musimy każdą liczbę potraktować jako łańcuch znaków. Następnie zliczymy ilość znaków będących zerami i jedynkami. Na koniec możemy je ze sobą porównać.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <fstream>
using namespace std ;
int main ( )
{
fstream plik ;
plik . open ( "liczby.txt" , ios :: in ) ;
if ( ! plik )
{
cout << "Błąd" ;
return 1 ;
} else
{
string liczba ;
int licznik = 0 ;
int l_jedynek = 0 ;
int l_zer = 0 ;
while ( plik >> liczba )
{
for ( int i = 0 ; i < liczba . length ( ) ; i ++ )
{
if ( liczba [ i ] == '1' ) l_jedynek ++ ;
else l_zer ++ ;
}
if ( l_zer > l_jedynek ) licznik ++ ;
l_jedynek = 0 ;
l_zer = 0 ;
}
cout << licznik ;
}
return 0 ;
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package matura ;
import java . io . BufferedReader ;
import java . io . File ;
import java . io . FileReader ;
import java . io . IOException ;
public class Main {
public static void main ( String [ ] args ) throws IOException {
File f = new File ( "liczby.txt" ) ;
if ( ! f . exists ( ) )
{
System . out . println ( "Plik " + f . getName ( ) + " nie został odnaleziony." ) ;
return ;
}
BufferedReader br = new BufferedReader ( new FileReader ( f ) ) ;
if ( br . ready ( ) ) {
String line ;
int count = 0 ;
while ( ( line = br . readLine ( ) ) != null ) {
int jedynki = 0 ;
int zera = 0 ;
for ( char c : line . toCharArray ( ) ) {
if ( c == '0' ) {
zera ++ ;
}
else {
jedynki ++ ;
}
}
if ( zera > jedynki )
count ++ ;
}
br . close ( ) ;
System . out . println ( count ) ;
}
else
{
System . out . println ( "Oj nie nie, -1 byczq." ) ;
br . close ( ) ;
return ;
}
}
}
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
file = open ( "liczby.txt" , "r" )
suma = 0
for word in file :
zera = 0
jedynki = 0
for char in word :
if char == "\n" :
continue
if char == '1' :
jedynki += 1
else :
zera += 1
if zera > jedynki :
suma += 1
print ( suma )
file . close ( )
Podpunkt 2
Tutaj wystarczyło zauważyć, że liczba zapisana podzielna jest przez 2, jeżeli jej ostatnia cyfra, najmniej znacząca, nie jest jedynką. Sprawa ma się podobnie w przypadku podzielności przez 8.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <fstream>
using namespace std ;
int main ( )
{
fstream plik ;
plik . open ( "liczby.txt" , ios :: in ) ;
if ( ! plik )
{
cout << "Błąd" ;
return 1 ;
} else
{
string liczba ;
int przez_dwa = 0 ;
int przez_osiem = 0 ;
while ( plik >> liczba )
{
if ( liczba [ liczba . length ( ) - 1 ] == '0' ) przez_dwa ++ ;
if ( liczba [ liczba . length ( ) - 1 ] == '0' && liczba [ liczba . length ( ) - 2 ] == '0' && liczba [ liczba . length ( ) - 3 ] == '0' ) przez_osiem ++ ;
}
cout << przez_dwa << endl << przez_osiem ;
}
return 0 ;
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package matura ;
import java . io . BufferedReader ;
import java . io . File ;
import java . io . FileReader ;
import java . io . IOException ;
public class Main {
public static long getValue ( String s ) {
long l = 0 ;
for ( int i = s . length ( ) - 1 ; i >= 0 ; i -- ) {
l += Math . pow ( 2 , s . length ( ) - i ) * Integer . parseInt ( "" + s . charAt ( i ) ) ;
}
return l ;
}
public static void main ( String [ ] args ) throws IOException {
File f = new File ( "liczby.txt" ) ;
if ( ! f . exists ( ) )
{
System . out . println ( "Plik " + f . getName ( ) + " nie został odnaleziony." ) ;
return ;
}
BufferedReader br = new BufferedReader ( new FileReader ( f ) ) ;
if ( br . ready ( ) ) {
String line ;
int p2 = 0 ;
int p8 = 0 ;
while ( ( line = br . readLine ( ) ) != null ) {
if ( line . charAt ( line . length ( ) - 1 ) == '0' ) {
p2 ++ ;
if ( line . charAt ( line . length ( ) - 2 ) == '0' & amp ; & amp ; line . charAt ( line . length ( ) - 3 ) == '0' ) {
p8 ++ ;
}
}
}
System . out . println ( "Podzielne przez 2: " + p2 ) ;
System . out . println ( "Podzielne przez 8 : " + p8 ) ;
br . close ( ) ;
}
else
{
System . out . println ( "Oj nie nie, -1 byczq." ) ;
br . close ( ) ;
return ;
}
}
}
Python
file = open ( "liczby.txt" , "r" )
p8 = 0
p2 = 0
for word in file :
if word [ len ( word ) - 2 ] == '0' :
p2 += 1
if word [ len ( word ) - 3 ] == '0' and word [ len ( word ) - 4 ] == '0' :
p8 += 1
print ( "Podzielne przez 2: " + str ( p2 ) )
print ( "Podzielne przez 8: " + str ( p8 ) )
file . close ( )
Podpunkt 3
W tym podpunkcie potrzebujemy kilku zmiennych pomocniczych. Przyda nam w nim się, między innymi, zmienna przechowująca długość najdłuższego bloku zer. Następnie wystarczy sprawdzać lokalnie najdłuższy blok w iterowanym wyrazie. Potem już tylko pozostaje porównanie go z poprzednią zmienną i ewentualna ich podmiana.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
//wiem, że kod wygląda słabo, ale już naprawdę nie miałem siły :D
#include <iostream>
#include <fstream>
using namespace std ;
int main ( )
{
fstream plik ;
plik . open ( "liczby.txt" , ios :: in ) ;
if ( ! plik )
{
cout << "Błąd" ;
return 1 ;
} else
{
string liczba , najwieksza , najmniejsza ;
plik >> liczba ;
najwieksza = liczba ;
najmniejsza = liczba ;
int n = 1 ;
int najw = 1 ;
int najm = 1 ;
while ( plik >> liczba )
{
++ n ;
if ( liczba . length ( ) > najwieksza . length ( ) )
{
najwieksza = liczba ;
najw = n ;
} else
{
if ( liczba . length ( ) == najwieksza . length ( ) )
{
for ( int i = 1 ; i < liczba . length ( ) ; i ++ )
{
if ( liczba [ i ] > najwieksza [ i ] )
{
najwieksza = liczba ;
najw = n ;
break ;
} else
{
if ( najwieksza [ i ] > liczba [ i ] ) break ;
}
}
}
}
if ( liczba . length ( ) < najmniejsza . length ( ) )
{
najmniejsza = liczba ;
najm = n ;
} else
{
if ( liczba . length ( ) == najmniejsza . length ( ) )
{
for ( int i = 1 ; i < liczba . length ( ) ; i ++ )
{
if ( liczba [ i ] < najmniejsza [ i ] )
{
najmniejsza = liczba ;
najm = n ;
break ;
} else
{
if ( najwieksza [ i ] < liczba [ i ] ) break ;
}
}
}
}
}
cout << najm << endl << najw ;
}
return 0 ;
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package matura ;
import java . io . BufferedReader ;
import java . io . File ;
import java . io . FileReader ;
import java . io . IOException ;
public class Main {
public static long getValue ( String s ) {
long l = 0 ;
for ( int i = s . length ( ) - 1 ; i >= 0 ; i -- ) {
l += Math . pow ( 2 , s . length ( ) - i ) * Integer . parseInt ( "" + s . charAt ( i ) ) ;
}
return l ;
}
public static void main ( String [ ] args ) throws IOException {
File f = new File ( "liczby.txt" ) ;
if ( ! f . exists ( ) )
{
System . out . println ( "Plik " + f . getName ( ) + " nie został odnaleziony." ) ;
return ;
}
BufferedReader br = new BufferedReader ( new FileReader ( f ) ) ;
if ( br . ready ( ) ) {
String line = br . readLine ( ) ;
String max = line ;
String min = line ;
int n = 1 ;
int Max = 1 ;
int Min = 1 ;
while ( ( line = br . readLine ( ) ) != null ) {
n ++ ;
if ( line . length ( ) > max . length ( ) ) {
max = line ;
Max = n ;
}
else {
if ( line . length ( ) == max . length ( ) ) {
for ( int i = 1 ; i & lt ; line . length ( ) ; i ++ ) {
if ( line . charAt ( i ) > max . charAt ( i ) ) {
max = line ;
Max = n ;
break ;
}
else {
if ( max . charAt ( i ) > line . charAt ( i ) ) {
break ;
}
}
}
}
if ( line . length ( ) & lt ; min . length ( ) ) {
min = line ;
Min = n ;
}
else {
if ( line . length ( ) == min . length ( ) )
{
for ( int i = 1 ; i & lt ; min . length ( ) ; i ++ )
{
if ( line . charAt ( i ) & lt ; min . charAt ( i ) )
{
min = line ;
Min = n ;
break ;
} else
{
if ( max . charAt ( i ) & lt ; line . charAt ( i ) ) {
break ;
}
}
}
}
}
}
}
System . out . println ( "Najmniejsze: " + Min ) ;
System . out . println ( "Najwieksze : " + Max ) ;
br . close ( ) ;
}
else
{
System . out . println ( "Oj nie nie, -1 byczq." ) ;
br . close ( ) ;
return ;
}
}
}
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
file = open ( "liczby.txt" , "r" )
minNum = file . readline ( )
maxNum = minNum
row = 1
maxRow = 1
minRow = 1
for line in file :
row += 1
if len ( line ) > len ( maxNum ) :
maxNum = line
maxRow = row
else :
if len ( line ) == len ( maxNum ) :
for i in range ( 1 , len ( line ) - 1 ) :
if line [ i ] > maxNum [ i ] :
maxNum = line
maxRow = row
break
else :
if maxNum [ i ] > line [ i ] :
break
else :
if len ( line ) & lt ; len ( minNum ) :
minNum = line
minRow = row
else :
if len ( line ) == len ( minNum ) :
for i in range ( 1 , len ( line ) - 1 ) :
if line [ i ] & lt ; minNum [ i ] :
minNum = line
minRow = row
break
else :
if maxNum [ i ] & lt ; line [ i ] :
break
print ( "Najmniejsza " + str ( minRow ) )
print ( "Najwieksza " + str ( maxRow ) )
file . close ( )
Matura z informatyki – programy z 2016
Zadanie z tego roku sprawiło mi największa przyjemność, gdyż w swoim czasie strasznie „jarałem się” szyfrowaniem, kryptologią, a sam omawiany już przeze mnie szyfr Cezara nie należy do tych najtrudniejszych.
Podpunkt 1.
Zanim przejdziemy do szyfrowania, musimy sprawdzić jaka jest reszta z dzielenia 107 przez 26. Reszta ta jest nam potrzebna, aby ustalić faktyczne położenie przesuniętego znaku. Dzielimy przez 26, ponieważ to właśnie co tyle cyklicznie musimy powtarzać alfabet.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <fstream>
using namespace std ;
void szyfruj ( string &napisik , int k )
{
k %= 26 ;
for ( int i = 0 ; i < napisik . length ( ) ; i ++ )
{
if ( napisik [ i ] + k > 90 )
napisik [ i ] = napisik [ i ] + k - 26 ;
else
napisik [ i ] = napisik [ i ] + k ;
}
}
int main ( )
{
fstream plik ;
plik . open ( "dane_6_1.txt" , ios :: in ) ;
if ( ! plik )
{
cout << "Dupa" ;
return 1 ;
} else
{
string napis ;
while ( plik >> napis )
{
szyfruj ( napis , 107 ) ;
cout << napis << endl ;
}
}
plik . close ( ) ;
return 0 ;
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package matura ;
import java . io . BufferedReader ;
import java . io . File ;
import java . io . FileReader ;
import java . io . IOException ;
public class Main {
public static String szyfruj ( String s ) {
char [ ] chars = s . toCharArray ( ) ;
for ( int i = 0 ; i & lt ; chars . length ; i ++ ) {
int a = chars [ i ] + 107 % 26 ;
if ( a > 'Z' )
a -= 26 ;
chars [ i ] = ( char ) a ;
}
return new String ( chars ) ;
}
public static void main ( String [ ] args ) throws IOException {
File f = new File ( "dane_6_1.txt" ) ;
if ( ! f . exists ( ) ) {
System . out . println ( "Podany plik nie istnieje." ) ;
return ;
}
BufferedReader br = new BufferedReader ( new FileReader ( f ) ) ;
if ( br . ready ( ) ) {
String line ;
while ( ( line = br . readLine ( ) ) != null ) {
System . out . println ( szyfruj ( line ) ) ;
}
}
br . close ( ) ;
}
}
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def szyfruj ( a ) :
chars = [ ]
for c in a :
if a == "\n" :
continue
i = ord ( c ) + 107 % 26
if i > 90 :
i -= 26
chars . append ( chr ( i ) )
s = ""
for c in chars :
s += c
return s
file = open ( "dane_6_1.txt" , "r" )
for line in file :
print ( szyfruj ( line ) )
Podpunkt 2.
W podpunkcie tym dokonujemy działań odwrotnych do tych, które robiliśmy przy szyfrowaniu. Tak jak w poprzednim podpunkcie musimy uwzględnić cykliczne przesunięcie alfabetu o 26.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <fstream>
using namespace std ;
void deszyfruj ( string &napisik , int k )
{
k %= 26 ;
for ( int i = 0 ; i < napisik . length ( ) ; i ++ )
{
if ( napisik [ i ] - k < 65 )
napisik [ i ] = napisik [ i ] - k + 26 ;
else
napisik [ i ] = napisik [ i ] - k ;
}
}
int main ( )
{
fstream plik ;
plik . open ( "dane_6_2.txt" , ios :: in ) ;
if ( ! plik )
{
cout << "Dupa" ;
return 1 ;
} else
{
string napis ;
int kod ;
while ( plik >> napis >> kod )
{
cout << napis << "|" << kod << "|" ;
deszyfruj ( napis , kod ) ;
cout << napis << endl ;
}
}
plik . close ( ) ;
return 0 ;
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package matura ;
import java . io . BufferedReader ;
import java . io . File ;
import java . io . FileReader ;
import java . io . IOException ;
public class Main {
public static String odszyfruj ( String s , int klucz ) {
char [ ] chars = s . toCharArray ( ) ;
for ( int i = 0 ; i & lt ; chars . length ; i ++ ) {
int a = chars [ i ] - klucz % 26 ;
if ( a & lt ; 'A' )
a += 26 ;
chars [ i ] = ( char ) a ;
}
return new String ( chars ) ;
}
public static void main ( String [ ] args ) throws IOException {
File f = new File ( "dane_6_2.txt" ) ;
if ( ! f . exists ( ) ) {
System . out . println ( "Podany plik nie istnieje." ) ;
return ;
}
BufferedReader br = new BufferedReader ( new FileReader ( f ) ) ;
if ( br . ready ( ) ) {
String line ;
while ( ( line = br . readLine ( ) ) != null ) {
if ( line . split ( " " ) . length & lt ; 2 )
continue ;
String slowo = line . split ( " " ) [ 0 ] ;
int klucz = Integer . parseInt ( line . split ( " " ) [ 1 ] ) ;
System . out . println ( odszyfruj ( slowo , klucz ) ) ;
}
}
br . close ( ) ;
}
}
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def odszyfruj ( a , key ) :
s = ""
for c in a :
if a == "\n" :
continue
i = ord ( c ) - key % 26
if i & lt ; 65 :
i += 26
s += chr ( i )
return s
file = open ( "dane_6_2.txt" , "r" ) . read ( ) . split ( '\n' )
for line in file :
if len ( line . split ( " " ) ) & lt ; 2 or len ( line . split ( " " ) [ 1 ] ) & lt ; 1 :
continue
print ( odszyfruj ( line . split ( " " ) [ 0 ] , int ( line . split ( " " ) [ 1 ] ) ) )
Podpunkt 3.
W tym podpunkcie wystarczy sprawdzić odległość miedzy dwoma pierwszymi znakami. Następnie porównujemy go z pozostałymi odstępami. Jeżeli coś się nie będzie zgadzało, to dodajemy niepoprawny plik do listy.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std ;
void sprawdz ( string napisik1 , string &napisik2 )
{
int k ;
if ( napisik2 [ 0 ] < napisik1 [ 0 ] )
k = abs ( napisik2 [ 0 ] + 26 - napisik1 [ 0 ] ) ;
else
k = abs ( napisik2 [ 0 ] - napisik1 [ 0 ] ) ;
for ( int i = 0 ; i < napisik2 . length ( ) ; i ++ )
{
if ( napisik2 [ i ] - k < 65 )
napisik2 [ i ] = napisik2 [ i ] - k + 26 ;
else
napisik2 [ i ] = napisik2 [ i ] - k ;
}
if ( napisik1 != napisik2 ) cout << napisik1 << endl ;
}
int main ( )
{
fstream plik ;
plik . open ( "dane_6_3.txt" , ios :: in ) ;
if ( ! plik )
{
cout << "Dupa" ;
return 1 ;
} else
{
string napis1 , napis2 ;
while ( plik >> napis1 >> napis2 )
{
sprawdz ( napis1 , napis2 ) ;
// cout << napis << "|" << kod << "|";
//deszyfruj(napis, kod);
// cout << napis << endl;
}
}
plik . close ( ) ;
return 0 ;
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package matura ;
import java . io . BufferedReader ;
import java . io . File ;
import java . io . FileReader ;
import java . io . IOException ;
public class Main {
public static boolean czyDobry ( String slowo , String szyfr ) {
char [ ] chars = szyfr . toCharArray ( ) ;
int klucz = chars [ 0 ] - slowo . charAt ( 0 ) ;
if ( klucz & lt ; 0 ) {
klucz = 26 + klucz ;
}
for ( int i = 1 ; i & lt ; chars . length ; i ++ ) {
int check = chars [ i ] - slowo . charAt ( i ) ;
if ( check & lt ; 0 ) {
check = 26 + check ;
}
if ( check != klucz )
return false ;
}
return true ;
}
public static void main ( String [ ] args ) throws IOException {
File f = new File ( "dane_6_3.txt" ) ;
if ( ! f . exists ( ) ) {
System . out . println ( "Podany plik nie istnieje." ) ;
return ;
}
BufferedReader br = new BufferedReader ( new FileReader ( f ) ) ;
if ( br . ready ( ) ) {
String line ;
while ( ( line = br . readLine ( ) ) != null ) {
if ( line . split ( " " ) . length & lt ; 2 )
continue ;
String slowo = line . split ( " " ) [ 0 ] ;
String szyfr = line . split ( " " ) [ 1 ] ;
if ( ! czyDobry ( slowo , szyfr ) ) {
System . out . println ( slowo ) ;
}
}
}
br . close ( ) ;
}
}
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def czyDobry ( a , b ) :
key = ord ( b [ 0 ] ) - ord ( a [ 0 ] )
if key & lt ; 0 :
key += 26
for i in range ( 1 , len ( b ) ) :
check = ord ( b [ i ] ) - ord ( a [ i ] )
if check & lt ; 0 :
check += 26
if check != key :
return False
return True
file = open ( "dane_6_3.txt" , "r" ) . read ( ) . split ( '\n' )
for line in file :
if len ( line . split ( " " ) ) & lt ; 2 or len ( line . split ( " " ) [ 1 ] ) & lt ; 1 :
continue
if not czyDobry ( line . split ( " " ) [ 0 ] , line . split ( " " ) [ 1 ] ) :
print ( line . split ( " " ) [ 0 ] )