Kezdőoldal » Számítástechnika » Programozás » C++-ban ezt hogyan kell...

C++-ban ezt hogyan kell megoldani?

Figyelt kérdés

Van egy N elemű tömböm, amiben az elemek 0-tól 2000-ig vesznek fel értéket. Nos, ebben a sorozatban egy szakasznak számít az, ahol a leghosszabb egymás mellett levő számok 1000 alá esnek.


Pl (egy 6 elemű tömbben ezek az elemek vannak): 500, 600, 1500, 800, 400, 500


Nos, ugye ebben két szakasz van.

1 szakasz: 500-tól 600-ig

2 szakasz: 800-tól 500-ig


És azt szeretném kérdezni hogy hogy írathatom ki ennek a két szakasznak a kezdőpontjait és a végpontjait?


Pl a fenti esetben ezt kéne kiírnia a gépnek: 1 2 4 6



2015. nov. 5. 16:42
 1/5 anonim ***** válasza:
2015. nov. 5. 16:45
Hasznos számodra ez a válasz?
 2/5 anonim ***** válasza:

Felveszel 2 változót, egyet a kezdőpontnak, és egyet a végpontnak. Majd egy ciklussal addig mész a tömbben, amíg 1000 alatti számot nem kapsz. Ez lesz az aktuális kezdőpont. Majd egy másik ciklussal, amíg 1000 alatti számot olvas, addig "szakasz". Ahol megállt a ciklus, az az első olyan, ami már nem része a ciklusnak. Tehát az eggyel azelőtti a szakasz végpontja.


Ezt az eljárást ismétled egy külső ciklus belsejében, amíg a tömb végére nem érsz.

2015. nov. 5. 16:49
Hasznos számodra ez a válasz?
 3/5 A kérdező kommentje:

De úgy kéne hogy ha az N elemű tömbön belül több szakasz is van akkor kiírja mindegyik szakasz kezdőpontját és végpontját a képernyőre, egymás mellé sorban. Valaki nem tudna egy példakódot mutatni? Vagy az enyémet kiegészíteni:


using namespace std;


int main()

{

int N;

cerr<<"Adja meg a meresi adatok darabszamat! ";

cin>>N;

int tomb[N];

for (int i=0;i<N;i++)

{

cerr<<"Adja meg a(z) "<<i+1<<". meresi eredmenyt! ";

cin>>tomb[i];

}


int K=0;

for(int i=0; i<N;i++)

{

if (tomb[i+1]>1000 && tomb[i]<1001)

K=K++;

}

cerr<<"Arvizmentes folyoszakaszok szama: ";

cout<<K<<endl;

2015. nov. 5. 17:36
 4/5 anonim ***** válasza:

En a kovetkezokeppen csinalnam:


1. A tomb elemeit, ill. a szakaszok adatait ket deque-ben tarolom


deque<int> ADATOK;

Ez a tomb fogja tarolni a szamokat


deque<pair<int, int>> SZAKASZOK;

Ez a tomb fogja tarolni a szakaszok kezdet- es vegpontjait (a "pair" egy ket elembol allo objektum)


2. Beolvasom az adatokat az "Adatok" tombbe.

cin >> n;

ADATOK.push_back(n);


3. Miutan beolvastad, hozzaadok egy "hamis" adatot a tomb elejehez es vegehez, hogy tudja kezelni az elso elemmel kezdodo, ill. az utolsoval vegzodo szakaszokat.

ADATOK.push_front(1001);

ADATOK.push_back(1001);


4. Egy ciklussal ellenorzom az elemeket, es ha meghatarozok egy kezdet es veg pontot, ezt berakom a szakaszokba.*

int kezdet = 0;


for (int i = 0; i < ADATOK.size() - 1; ++i)

{

if (ADATOK[i] >= 1000 && ADATOK[i + 1] < 1000)

kezdet = i + 1;


if (ADATOK[i] < 1000 && ADATOK[i + 1] >= 1000)

SZAKASZOK.push_back(std::make_pair(kezdet, i));

}


5. Kesz! Kiirom a szakaszokat.*


for (int i = 0; i < SZAKASZOK.size(); ++i)

cout << i + 1 << ". szakasz: kezdet " << SZAKASZOK[i].first << ", veg " << SZAKASZOK[i].second << std::endl;


*mielott valaki mondana, tudom, hogy iteratorral elegansabb, de ne halmozzuk el a kezdot tul sok uj infoval. :)

2015. nov. 6. 09:57
Hasznos számodra ez a válasz?
 5/5 anonim ***** válasza:

std::vector<int> szamok = {500, 600, 1500, 800, 400, 500, 1400, 900, 500, 200, 100, 900, 1100, 600};

std::vector<std::pair<decltype(szamok.cbegin()), decltype(szamok.cbegin())>> szakaszok;


for (auto first = szamok.cbegin(), last = first; last != szamok.cend();)

{

first = std::find_if(last, szamok.cend(), [](const auto& i) {return i < 1000; });

last = std::find_if(first, szamok.cend(), [](const auto& i) {return i >= 1000; });

szakaszok.emplace_back(first, last);

}


for(const auto& i : szakaszok)

{

for (auto it = i.first; it != i.second; ++it)

{

std::cout << *it << ' ';

}

std::cout << '\n';

}

2015. nov. 7. 15:30
Hasznos számodra ez a válasz?

További kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!