Autor: Maciej Muras Zadanie znajduje się pod adresem: https://cke.gov.pl/images/_EGZAMIN_MATURALNY_OD_2015/Arkusze_egzaminacyjne/2017/formula_do_2014/informatyka/MIN-R2_1P-172.pdf Opis: Zadanie 4. Ciągi binarne W pliku binarne.txt znajduje się 500 napisów złożonych wyłącznie z zer i jedynek. W każdym wierszu umieszczony jest jeden napis. Każdy napis ma długość podzielną przez 4. Napisz program (lub programy), który da odpowiedzi do poniższych zadań. Odpowiedzi zapisz w pliku zadanie4.txt, każdą odpowiedź poprzedź numerem odpowiedniego zadania. Zadanie 4.1 (0-4) Napis nazywać będziemy dwucyklicznym, jeśli składa się on wyłącznie z dwóch powtórzeń tego samego napisu. Przykład: Napis 10001000 jest dwucykliczny (składa się z dwóch powtórzeń napisu 1000), natomiast napisy 00011000 i 10001001 nie są dwucykliczne. Podaj liczbę napisów dwucyklicznych w pliku binarne.txt, najdłuższy napis dwucykliczny z tego pliku oraz jego długość. Zadanie 4.2 (0-2) Napisy z pliku binarne.txt traktujemy jako binarne zapisy liczb dziesiętnych, w których każdy segment złożony z 4 znaków jest reprezentacją binarnego zapisu jednej cyfry (zapis taki nazywany jest kodem BCD). Napis uznajemy za niepoprawny, gdy któryś z segmentów ma wartość większą niż 9 (czyli nie jest zapisem cyfry dziesiętnej). Przykład: Napis 10010111 jest poprawny i reprezentuje liczbę 97, natomiast napis 11010000 nie jest poprawny, gdyż jego pierwszy segment (1101) reprezentuje w zapisie binarnym większą od 9 liczbę 13. Podobnie nie jest poprawny napis 1110, ponieważ reprezentuje w zapisie binarnym liczbę 14. Podaj liczbę niepoprawnych napisów z pliku binarne.txt oraz najmniejszą długość niepoprawnego napisu. Egzamin maturalny z informatyki Poziom rozszerzony Strona 3 z 8 MIN_1R Zadanie 4.3 (0-4) Napisy z pliku binarne.txt traktujemy teraz jako liczby naturalne w zwykłym zapisie binarnym, pomijamy jednak liczby większe niż 65 535. Wyznacz największą spośród tych liczb, podaj jej wartość w zapisie binarnym oraz w zapisie dziesiętnym. Przykład: W pliku o zawartości: 1111000011110000 11110000111100001000 10100110 druga liczba jest pomijana (jako większa od 65 535), zatem największą liczbę wybieramy spośród 1111000011110000(2)=61680(10) oraz 10100110(2)=166(10). Odpowiedzią jest zatem para 1111000011110000, 61680. package com.company; import java.io.FileNotFoundException; import java.util.Scanner; import java.io.*; import java.math.BigInteger; public class Main { public static void main(String[] args) throws FileNotFoundException{ String wiersz = "", pierwszyCykl, drugiCykl, najdluzszyNapisDCText="",substringBCD, najwieksza=""; String tablicaBCD[]; int liczbaNiepoprawnych=0, liczbaNiepoprawnychB=0,liczbaDec=0,najwiekszaDec=0; int liczbaNapisowDwucyklicznych=0, najdluzszyNapisDwucykliczny=0,najkrotszaNiepoprawna=999999999; BigInteger najwiekszaBig =new BigInteger("11001101110",2); //pierwszy wiersz z pliku binarne.txt [trzeba // pamiętać o tym by dać ,2 !!! - błąd trudny do znalezienia BigInteger liczbaBig =new BigInteger("0"); Scanner odczyt = new Scanner(new File ("binarne.txt" )); // ----------------------------------------- zadanie 4.1 ----------------------------------------- while (odczyt.hasNextLine()) { wiersz=odczyt.nextLine(); pierwszyCykl=wiersz.substring(0,wiersz.length()/2); drugiCykl=wiersz.substring(wiersz.length()/2,wiersz.length()); if (pierwszyCykl.equals(drugiCykl)) { liczbaNapisowDwucyklicznych++; if (wiersz.length()>najdluzszyNapisDwucykliczny) { najdluzszyNapisDwucykliczny=wiersz.length(); najdluzszyNapisDCText=wiersz; } } // ----------------------------------------- zadanie 4.2 SPOSÓB_A wyrażenia regularne !!! tablicaBCD= wiersz.split("(?<=\\G.{4})"); // SPOSÓB_1 wyrażenia regularne !!! for (String liczba:tablicaBCD){ if ((Integer.parseInt(liczba)>1001)){ liczbaNiepoprawnychB++; if (najkrotszaNiepoprawna>wiersz.length()) najkrotszaNiepoprawna=liczba.length(); break; } } // ----------------------------------------- zadanie 4.2 SPOSÓB_B substring for (int a=0;a<wiersz.length();a+=4){ substringBCD=wiersz.substring(a,a+4); if ((Integer.parseInt(substringBCD)>1001)) { liczbaNiepoprawnych++; if (najkrotszaNiepoprawna>wiersz.length()) najkrotszaNiepoprawna=wiersz.length(); break; } } // ----------------------------------------- zadanie 4.3 liczbaBig=new BigInteger(wiersz,2); if ((liczbaBig.compareTo(najwiekszaBig)==1) &&((BigInteger.valueOf(65536)).compareTo(liczbaBig)==1) ) { najwieksza=wiersz; najwiekszaBig=liczbaBig; } } System.out.println("4.1 \nLiczba napisów dwucyklicznych: "+liczbaNapisowDwucyklicznych+" \nNajdłuższy napis " + "dwucykliczny: " + ""+najdluzszyNapisDCText+"" + "\nDługość najdłuższego napisu dwucyklicznego: " + +najdluzszyNapisDwucykliczny); System.out.println("4.2\nLiczba niepoprawnych napisów: "+liczbaNiepoprawnychB+"\nNajkrótsza długość " + "niepoprawnego napisu to: "+najkrotszaNiepoprawna); System.out.println("4.3\nNajwiększa liczba(dec)"+najwiekszaBig+"\nNajwiększa liczba(hex)"+ najwieksza); } }