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++
#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
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<2) {
return false;
}
for(int i=2; i*i<=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
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++
#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
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 < line.length(); i++) {
aktualny = line.charAt(i);
if(aktualny<=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
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 <= 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++
#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 {
string napis[1000];
int byl[1000];
for (int j = 0; j < 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 < 1000; j++) {
if (byl[j] != 0)
cout << napis[j] << endl;
}
}
plik.close();
return 0;
}
Java
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<String, Boolean> map = new HashMap<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++
#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
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
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++
#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
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' && 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++
//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
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< 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() < min.length()) {
min = line;
Min = n;
}
else {
if(line.length() == min.length())
{
for(int i=1; i<min.length(); i++)
{
if(line.charAt(i)<min.charAt(i))
{
min= line;
Min=n;
break;
}else
{
if(max.charAt(i)<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
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) < len(minNum):
minNum = line
minRow = row
else:
if len(line) == len(minNum):
for i in range(1, len(line) - 1):
if line[i] < minNum[i]:
minNum = line
minRow = row
break
else:
if maxNum[i] < 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++
#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
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 < 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
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++
#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
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 < chars.length; i++) {
int a = chars[i] - klucz % 26;
if(a < '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 < 2)
continue;
String slowo = line.split(" ")[0];
int klucz = Integer.parseInt(line.split(" ")[1]);
System.out.println(odszyfruj(slowo, klucz));
}
}
br.close();
}
}
Python
def odszyfruj(a, key):
s = ""
for c in a:
if a == "\n":
continue
i = ord(c) - key % 26
if i < 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(" ")) < 2 or len(line.split(" ")[1]) < 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++
#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
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 < 0) {
klucz = 26 + klucz;
}
for(int i = 1; i < chars.length; i++) {
int check = chars[i] - slowo.charAt(i);
if(check < 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 < 2)
continue;
String slowo = line.split(" ")[0];
String szyfr = line.split(" ")[1];
if(!czyDobry(slowo, szyfr)) {
System.out.println(slowo);
}
}
}
br.close();
}
}
Python
def czyDobry(a, b):
key = ord(b[0]) - ord(a[0])
if key < 0:
key += 26
for i in range(1, len(b)):
check = ord(b[i]) - ord(a[i])
if check < 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(" ")) < 2 or len(line.split(" ")[1]) < 1:
continue
if not czyDobry(line.split(" ")[0], line.split(" ")[1]):
print(line.split(" ")[0])




