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

Zadanie z tabliami, serie w tablicach

Aruba Cloud - Virtual Private Server VPS
0 głosów
340 wizyt
pytanie zadane 5 czerwca 2024 w C i C++ przez Panwita Nowicjusz (200 p.)

Witam mam oto takie zadanie z cpp, ale nie do końca mi wychodzi poprawny wynik i nie wiem co jest źle

zadanie

Nazewnictwo: seria, to możliwie najdłuższy fragment tablicy (może być gdziekolwiek w tablicy i dowolnej niezerowej długości), który jest już posortowany (zawsze dane
w tablicy tworzą zbiór rozłącznych serii i ten zbiór serii „zajmuje” całą tablicę).

Mamy dane w tablicy wejściowej 1 (w postaci wielu serii) i w tablicy wejściowej 2
(w postaci wielu serii). Połącz każdą parę (z obu tablic) serii wejściowych w jedną (kolejną) serię tablicy wyjściowej 3 według poniższego algorytmu.

założenie upraszczające – na niższą ocenę: w obu tablicach jest po tyle samo serii, kolejne założenie upraszczające – na jeszcze niższą ocenę: znamy liczbę par serii.

  1. łączenie (pary serii) w jedną serię:
  • porównaj bieżący (pierwszy) element serii z tablicy 1 z bieżącym (pierwszym) elementem z tablicy 2.
  • skopiuj mniejszy z tych elementów w bieżące (pierwsze) miejsce serii w tablicy 3.
  • powtarzaj punkty a, b aż do wyczerpania jednej (z dwu) z serii wejściowych
    1. przekopiuj resztę z tej pary serii z tej „drugiej” tablicy do tablicy 3
    2. powtarzaj punkty 1 i 2 do wyczerpania wszystkich serii

 

przykład:

tab1: (kreskami zaznaczyłem rozdzielenia serii, ale algorytm sam powinien stwierdzić, czy następuje koniec jednej serii i początek następnej)

a

p

r

t

u

e

f

g

z

m

tab2:

b

n

d

v

k

o

w

krok 1

tab3:

a

krok 1

a

b

krok 1

a

b

n

krok 2

a

b

n

p

r

t

u

krok 1

a

b

n

p

r

t

u

d

itd.

kod

#include <iostream>
#include <vector>

using namespace std;

int main() {
    //tworze 3 wektory
    vector<char> tab1 = { 'a', 'p', 'r', 't', 'u', 'e', 'f', 'g', 'z', 'm' };

    vector<char> tab2 = { 'b', 'n', 'd', 'v', 'k', 'o', 'w' };

    vector<char> tab3 = {};//pusty wektor do którego bede dodwał elementy

    int i = 0, j = 0;
    
    for (int i = 0, j = 0;  i < tab1.size() && j < tab2.size(); ) {

        if (tab1[i] <= tab2[j]) {

            tab3.push_back(tab1[i]);// dodaje element z tab 1 do wyniku

            i++;
        }

        else {

            tab3.push_back(tab2[j]);//dodaje element z tab2 do wyniku

            j++;

        }

    }

    
    for (char c : tab3) {

        cout << c << " ";

    }
    
    

    return 0;
}

 


 

komentarz 7 czerwca 2024 przez TOWaD Mądrala (6,340 p.)
edycja 7 czerwca 2024 przez TOWaD

W tym przypadku nigdy nie będzie pusty

 for (int i = 0, j = 0;  i < tab1.size() && j < tab2.size(); ) {
 
        if (tab1[i] <= tab2[j]) {
 
            tab3.push_back(tab1[i]);// dodaje element z tab 1 do wyniku
 
            i++;
        }
 
        else  {
 
            tab3.push_back(tab2[j]);//dodaje element z tab2 do wyniku
 
            j++;
 
        }
        if(tab1[i]<tab3.back()|| tab2[j]<tab3.back() ){...

natomiast to było skopane mogło wykroczyć poza tablicę.

 while(tab1[i]>=tab3.back() ) {tab3.push_back(tab1[i]);i++;}

Edit: [online] teraz chyba dobrze.

 

komentarz 7 czerwca 2024 przez overcq Pasjonat (22,400 p.)
Kod jest chyba taki sam, jaki był?

Trzeba sprawdzać, czy “i” oraz “j” nie wykroczyło poza zakres tablicy.
komentarz 7 czerwca 2024 przez TOWaD Mądrala (6,340 p.)
Poprawiłem, miał być taki. No cóż, te kompy to złośliwe. Trzeba sprawdzać bo się mylą.
komentarz 7 czerwca 2024 przez overcq Pasjonat (22,400 p.)
Dodam tylko, że sprawdzenie czy licznik nie wykroczył poza zakres tablicy powinien być pierwszym sprawdzanym warunkiem (zanim wykroczy poza zakres).
komentarz 7 czerwca 2024 przez TOWaD Mądrala (6,340 p.)

Święta racja nawet o ty nie pomyślałem i w tablicach szczególnie karygodne,

ale takie tam kod:

#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
 
int main() {
    vector<char> tab1 = { 'a', 'p', 'r', 't', 'u', 'e', 'f', 'g', 'z', 'm' };
 
     
    try{ cout<<boolalpha<<"równe end"<<(tab1[tab1.size()]==*(tab1.end()))<<endl;}
    catch (...){ cout<<"error1";}
    try{ cout<<"\\0="<<(int)tab1[tab1.size()]<<endl;
        cout<<"\\0==(int)tab1[tab1.size()->"<<('\0'==(int)tab1[tab1.size()])<<endl;
    }
    catch (...){ cout<<"error2";}
    
     try{ cout<<tab1.at(tab1.size())<<endl;
        
    }
    catch (...){ cout<<"error3 <- tab1.at(tab1.size()) rzuca błędem" <<endl;}
 
    return 0;
}

i [online]

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
3 odpowiedzi 1,025 wizyt
pytanie zadane 2 kwietnia 2019 w Java przez izas Nowicjusz (120 p.)
+1 głos
2 odpowiedzi 459 wizyt
–2 głosów
0 odpowiedzi 135 wizyt
pytanie zadane 7 czerwca 2017 w C i C++ przez Konrad Polasz Nowicjusz (160 p.)

93,279 zapytań

142,278 odpowiedzi

322,298 komentarzy

62,599 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...