• 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

Object Storage Arubacloud
0 głosów
115 wizyt
pytanie zadane 5 czerwca 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 5 dni temu przez TOWaD Mądrala (6,000 p.)
edycja 5 dni temu 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 5 dni temu przez overcq Pasjonat (21,860 p.)
Kod jest chyba taki sam, jaki był?

Trzeba sprawdzać, czy “i” oraz “j” nie wykroczyło poza zakres tablicy.
komentarz 5 dni temu przez TOWaD Mądrala (6,000 p.)
Poprawiłem, miał być taki. No cóż, te kompy to złośliwe. Trzeba sprawdzać bo się mylą.
komentarz 5 dni temu przez overcq Pasjonat (21,860 p.)
Dodam tylko, że sprawdzenie czy licznik nie wykroczył poza zakres tablicy powinien być pierwszym sprawdzanym warunkiem (zanim wykroczy poza zakres).
komentarz 4 dni temu przez TOWaD Mądrala (6,000 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 727 wizyt
pytanie zadane 2 kwietnia 2019 w Java przez izas Nowicjusz (120 p.)
+1 głos
2 odpowiedzi 311 wizyt
–2 głosów
0 odpowiedzi 100 wizyt
pytanie zadane 7 czerwca 2017 w C i C++ przez Konrad Polasz Nowicjusz (160 p.)

92,752 zapytań

141,666 odpowiedzi

320,384 komentarzy

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

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!

...