Autor rozwiązania: Maciej Muras
W pliku dane.txt znajduje się 200 wierszy. Każdy wiersz zawiera 320 liczb naturalnych
z przedziału od 0 do 255, oddzielonych znakami pojedynczego odstępu (spacjami).
Przedstawiają one jasności kolejnych pikseli czarno-białego obrazu o wymiarach 320 na 200
pikseli (od 0 – czarny do 255 – biały).
Napisz program(y), który(e) da(dzą) odpowiedzi do poniższych zadań. Odpowiedzi zapisz
w pliku wyniki6.txt, a każdą odpowiedź poprzedź numerem oznaczającym odpowiednie
zadanie.
Uwaga: plik przyklad.txt zawiera dane przykładowe spełniające warunki zadania (obraz
ma takie same rozmiary). Odpowiedzi dla danych z pliku przyklad.txt są podane pod
poleceniami.
Plik z zadaniami można pobrać ze strony https://cke.gov.pl/images/_EGZAMIN_MATURALNY_OD_2015/Arkusze_egzaminacyjne/2017/formula_od_2015/informatyka/MIN-R2_1P-172.pdf
Pliki z danymi:
Rozwiązanie:
package com.company; import java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws FileNotFoundException { Scanner odczyt = new Scanner(new File ("dane.txt")); int kolejnaLiczba, ciemny=255,jasny=0,numerLini=0,wierszeBezSymetrii=0, liczbaKonstrasujacychPixeli=0, najdluzszaLiniaZTychSamychPixeli=1,aktualnieNajdluzszaLiniaZTychSamychPixeli=1, aktualnyPixel; int tablicaPixeli[][]=new int[200][320]; boolean pixelKontrastuje=false; while (odczyt.hasNextInt()) { for(int liczbyWWierszu=0;liczbyWWierszu<320;liczbyWWierszu++) { kolejnaLiczba =odczyt.nextInt(); tablicaPixeli[numerLini][liczbyWWierszu]=kolejnaLiczba; /* Zadanie 6.1. (0-2) Podaj jasność najjaśniejszego i jasność najciemniejszego piksela. Dla danych z pliku przyklad.txt wynikiem jest 255 (najjaśniejszy) i 0 (najciemniejszy). */ //-----------------------------------rozwiązanie 6.1----------------------------------- if (kolejnaLiczba>jasny) jasny=kolejnaLiczba; if (kolejnaLiczba<ciemny) ciemny=kolejnaLiczba; } numerLini++; } odczyt.close(); /* Zadanie 6.2. (0–2) Podaj, ile wynosi najmniejsza liczba wierszy, które należy usunąć, żeby obraz miał pionową oś symetrii. Obraz ma pionową oś symetrii, jeśli w każdym wierszu i-ty piksel od lewej strony przyjmuje tę samą wartość, co i-ty piksel od prawej strony, dla dowolnego 1 ≤ i ≤ 320. Dla danych z pliku przyklad.txt wynikiem jest 3. */ //-----------------------------------rozwiązanie 6.2----------------------------------- for(numerLini=0;numerLini<200;numerLini++) { for(int liczbyWWierszu=0;liczbyWWierszu<160;liczbyWWierszu++) { if( tablicaPixeli[numerLini][liczbyWWierszu]!=tablicaPixeli[numerLini][319-liczbyWWierszu]) { wierszeBezSymetrii++; break; } } } /* Zadanie 6.3. (0–3) Sąsiednie piksele to takie, które leżą obok siebie w tym samym wierszu lub w tej samej kolumnie. Dwa sąsiednie piksele nazywamy kontrastującymi, jeśli ich wartości różnią się o więcej niż 128. Podaj liczbę wszystkich takich pikseli, dla których istnieje przynajmniej jeden kontrastujący z nim sąsiedni piksel. Dla danych z pliku przyklad.txt wynikiem jest 5. */ //-----------------------------------rozwiązanie 6.3----------------------------------- for(numerLini=0;numerLini<200;numerLini++) { for (int liczbyWWierszu = 0; liczbyWWierszu < 320; liczbyWWierszu++) { pixelKontrastuje=false; aktualnyPixel=tablicaPixeli[numerLini][liczbyWWierszu]; if( (liczbyWWierszu>0)&&(Math.abs(aktualnyPixel-tablicaPixeli[numerLini][liczbyWWierszu-1]))>128) pixelKontrastuje=true; if( (liczbyWWierszu<319)&&(Math.abs(aktualnyPixel-tablicaPixeli[numerLini][liczbyWWierszu+1]))>128) pixelKontrastuje=true; if( (numerLini>0)&&(Math.abs(aktualnyPixel-tablicaPixeli[numerLini-1][liczbyWWierszu]))>128) pixelKontrastuje=true; if( (numerLini<199)&&(Math.abs(aktualnyPixel-tablicaPixeli[numerLini+1][liczbyWWierszu]))>128) pixelKontrastuje=true; if (pixelKontrastuje) liczbaKonstrasujacychPixeli++; } } /* Zadanie 6.4. (0–4) Podaj długość najdłuższej linii pionowej (czyli ciągu kolejnych pikseli w tej samej kolumnie obrazka), złożonej z pikseli tej samej jasności. Dla danych z pliku przyklad.txt wynikiem jest 198. */ //-----------------------------------rozwiązanie 6.4----------------------------------- for (int liczbyWWierszu = 0; liczbyWWierszu < 320; liczbyWWierszu++) { aktualnieNajdluzszaLiniaZTychSamychPixeli=1; for (numerLini = 1; numerLini < 200; numerLini++) { if (tablicaPixeli[numerLini][liczbyWWierszu] == tablicaPixeli[numerLini-1][liczbyWWierszu]) { aktualnieNajdluzszaLiniaZTychSamychPixeli++; if (aktualnieNajdluzszaLiniaZTychSamychPixeli > najdluzszaLiniaZTychSamychPixeli) najdluzszaLiniaZTychSamychPixeli++; } else aktualnieNajdluzszaLiniaZTychSamychPixeli = 1; } } System.out.println("6.1: Najjaśniejszy to: "+jasny+" Najciemniejszy to: "+ciemny); System.out.println("6.2: Wiersze bez symetrii: "+wierszeBezSymetrii); System.out.println("6.3: Liczba pixeli kontrastujących: "+liczbaKonstrasujacychPixeli); System.out.println("6.4: Najdłuższa linia pionowa z tych samych pikseli: "+najdluzszaLiniaZTychSamychPixeli); } }