• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

c++,problem,matura

Object Storage Arubacloud
0 głosów
822 wizyt
pytanie zadane 17 marca 2018 w C i C++ przez Krystek102 Bywalec (2,440 p.)
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)

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

ma ktoś moze pomysł jak to rozwiązac,nie proszę o kod ,ale o wskazówki gdyż nie mam pomysłu jak to ugryźć>>

3 odpowiedzi

0 głosów
odpowiedź 17 marca 2018 przez Patrycjerz Mędrzec (192,320 p.)
edycja 17 marca 2018 przez Patrycjerz

Zależy, czy liczymy też powtórzenia (te same pary pikseli). Jeśli tak, to chodzisz po całej, wczytanej uprzednio z pliku, tablicy i sprawdzasz dla każdego piksela sąsiadów. Czyli liczby na narożnikach będą miały dwóch sąsiadów, na krawędziach trzech, zaś w pozostałych rejonach czterech. Jeśli wartość któregoś z nich różni się bardziej niż 128 od badanego piksela, to inkrementujesz licznik.

Oto przykład algorytmu:

// Tutaj odczyt kolejnych elementów pliku do dwuwymiarowej tablicy

int licznik = 0;
for (int i = 0; i < 200; i++)
{
	for (int j = 0; j < 320; j++)
	{
		if (i - 1 >= 0) // Sprawdzamy, czy takowy indeks nie wychodzi poza tablicę
		{
			if (abs(tablica[i][j] - tablica[i - 1][j]) > 128) // Sprawdzamy, czy różnica bezwględna piksela i jego sąsiada jest większa niż 128
			{
				licznik++;
				continue;
			}
		}
		if (i + 1 <= 199)
		{
			if (abs(tablica[i][j] - tablica[i + 1][j]) > 128)
			{
				licznik++;
				continue;
			}
		}
		if (j - 1 >= 0)
		{
			if (abs(tablica[i][j] - tablica[i][j - 1]) > 128)
			{
				licznik++;
				continue;
			}
		}
		if (j + 1 <= 319)
		{
			if (abs(tablica[i][j] - tablica[i][j + 1]) > 128)
			{
				licznik++;
				continue;
			}
		}
	}
}
1
komentarz 17 marca 2018 przez Śwież4k Bywalec (2,570 p.)
Obserwuję pytanie i zastanawiam się jak w ogóle wczytać te liczby do programu?
1
komentarz 17 marca 2018 przez Patrycjerz Mędrzec (192,320 p.)

Można to uczynić na wiele różnych sposobów. Używając kontenerów z biblioteki standardowej (np. std::vector), dynamicznej alokacji pamięci lub statycznej tablicy. Ja pokażę ostatni, najprostszy sposób:

std::fstream plik("plik.txt");
int tablica[200][320];

for (int i = 0; i < 200; i++)
{
	for (int j = 0; j < 320; j++)
	{
		plik >> tablica[i][j];
	}
}
komentarz 17 marca 2018 przez Śwież4k Bywalec (2,570 p.)
Dziękuję za odpowiedź. Pozdrawiam
komentarz 17 marca 2018 przez Krystek102 Bywalec (2,440 p.)

@Patrycjerz, a jeżeli nie liczę powtórzeń,tych samych pikseli to jak to należy zmodyfikować? 

komentarz 17 marca 2018 przez Patrycjerz Mędrzec (192,320 p.)
Przepraszam, nieco się rozpędziłem z tymi powtórzeniami. Miałoby to większy sens, gdybyśmy liczyli wszystkie kontrastujące pary. W tym przypadku kończymy analizę danego piksela, gdy którykolwiek sąsiad spełni warunek. Nie wiemy przez to, ile par przeanalizujemy i w jakiej kolejności. Nie ma to więc większego sensu.
komentarz 17 marca 2018 przez Krystek102 Bywalec (2,440 p.)
masz może pomysł jak to można zrobić żeby liczyło poprawnie,bez powtórzeń>?
komentarz 17 marca 2018 przez Patrycjerz Mędrzec (192,320 p.)
Ale mój kod liczy poprawnie. Masz znaleźć liczbę wszystkich pikseli, które zawierają przynajmniej jednego sąsiada spełniającego warunek kontrastowości. Tutaj nie ma mowy o unikaniu powtórzeń, musisz przeanalizować każdy piksel z osobna.
komentarz 18 marca 2018 przez Krystek102 Bywalec (2,440 p.)
kurcze,ale mi wychodzi 1503 a powinno 753,coś jest nie tak :(
komentarz 18 marca 2018 przez mokrowski Mędrzec (155,460 p.)

Hmm.. pewnie jest "nie tak" bo piksel będzie kontrastujący jeżeli dowolny jego sąsiad ma różnicę z jego wartością większą niż 128. Stąd jeśli jakikolwiek sąsiad spełnia warunek, nie ma sensu sprawdzać pozostałych sąsiadów.

Jak umieścisz gdzieś dane tego ćwiczenia (plik z wartościami pikseli), spróbuję coś podpowiedzieć.

komentarz 19 marca 2018 przez Krystek102 Bywalec (2,440 p.)

https://cke.gov.pl/egzamin-maturalny/egzamin-w-nowej-formule/arkusze/2017-2/

wybierasz informatyka i archiwum z plikami,tam będą dane,interesują nas dane.txt

0 głosów
odpowiedź 17 marca 2018 przez Beginer Pasjonat (22,110 p.)
Gdyby nam zależało na pamięci (a z założenia tak jest zawsze), myślę, że to zadanie można by rozwiązać przy użyciu dwóch tablic jednowymiarowych: 2 x tab(320). Wystarczy przecież wczytywać i porównywać liczby (piksele) w dwóch sąsiednich wierszach.
komentarz 17 marca 2018 przez Beginer Pasjonat (22,110 p.)
Może nawet wystarczyłaby jedna tablica: tab(320).
0 głosów
odpowiedź 20 marca 2018 przez mokrowski Mędrzec (155,460 p.)

Namachane na szybko i bez optymalizacji dla 1 wiersza. Ważne byś zrozumiał co się tu dzieje...

#include <iostream>
#include <vector>
#include <sstream>
#include <string>
#include <fstream>
#include <array>

constexpr static size_t MAX_COLS = 320;
constexpr static size_t MAX_ROWS = 200;
constexpr static int CONTRAST_VALUE = 128;

using values_t = std::array<std::array<int, MAX_COLS>, MAX_ROWS>;

void readDataFromFile(const std::string& fileName, values_t& data) {
    std::ifstream file("dane.txt");

    if(!file) {
        std::cerr << "Błąd otwarcia pliku: " << fileName << '\n';
        exit(EXIT_FAILURE);
    }

    int value;
    for(auto rowIdx = 0U; rowIdx < MAX_ROWS; ++rowIdx) {
        for(auto colIdx = 0U; colIdx < MAX_COLS; ++colIdx) {
            file >> value;
            data[rowIdx][colIdx] = value;
        }
    }
}

int checkContrast(int valueSrc, int valueDst) {
    return abs(valueSrc - valueDst) > CONTRAST_VALUE ? 1 : 0;
}

int checkNeighbors(const values_t& data, size_t rowIdx, size_t colIdx) {
    int checkCoords[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
    for(int i = 0; i < 4; ++i) {
        auto currentRowIdx = static_cast<int>(rowIdx) + checkCoords[i][0];
        auto currentColIdx = static_cast<int>(colIdx) + checkCoords[i][1];
        if((currentRowIdx < 0) || (currentColIdx < 0)
                || (currentRowIdx == MAX_ROWS) || (currentColIdx == MAX_COLS)) {
            continue;
        }
        if(checkContrast(data[rowIdx][colIdx], data[currentRowIdx][currentColIdx])) {
            return 1;
        }
    }
    return 0;
}

int main() {
    values_t data{};
    readDataFromFile("data.txt", data);
    size_t counter{};
    for(auto rowIdx = 0U; rowIdx < MAX_ROWS; ++rowIdx) {
        for(auto colIdx = 0U; colIdx < MAX_COLS; ++colIdx) {
            counter += checkNeighbors(data, rowIdx, colIdx);
        }
    }
    std::cout << "Wartości kontastujących jest: " << counter << '\n';
}

 

Podobne pytania

0 głosów
1 odpowiedź 802 wizyt
0 głosów
0 odpowiedzi 106 wizyt
pytanie zadane 7 marca 2022 w C i C++ przez fsfxvcxv Obywatel (1,160 p.)
0 głosów
1 odpowiedź 369 wizyt
pytanie zadane 22 marca 2021 w C i C++ przez fsfxvcxv Obywatel (1,160 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...