C++-ban ezt hogyan kell megoldani?
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
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.
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;
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. :)
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';
}
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!