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

Partial Sum: Sumy częściowe - program w C++

Object Storage Arubacloud
0 głosów
468 wizyt
pytanie zadane 5 czerwca 2020 w C i C++ przez kupson3697 Użytkownik (610 p.)

Cześć. Miałem za zadanie napisać program, o poniższej treści:

Napisałem taki kod i przetestowałem. Według mnie działa z wszelkimi danymi:

#include <iostream>
#include <vector>

using namespace std;

std::vector<int>::iterator partial_sum(std::vector<int>::const_iterator b, std::vector<int>::const_iterator e,std::vector<int>::iterator f){

    vector<int> vector = {};

    int sum = 0;

    while(f<e){

        sum = sum + *f;
        *f = sum;
        f++;
    }

    return f;
}

int main() {
    std::vector<int> vector {3, 2, -1, 3, 4};
    auto result = partial_sum(vector.cbegin(), vector.cend(), vector.begin());
    for (auto iterator = vector.cbegin(); iterator < result;) {
        std::cout << *iterator++ << " ";
    }
    std::cout << std::endl;
}

 

Niestety dostałem od wykładowcy, a raczej sprawdzarki błąd o poniższej treści:

Following code was run:
    const std::vector<int> input {5, -5, 1, -1, 3, -3};
    std::vector<int> output(input.size());
    auto result = partial_sum(input.cbegin(), input.cend(), output.begin());
Invalid result or output
EXECUTION ERROR

Czy ktoś może dostrzega błąd? Będę bardzo wdzięczny za wskazówki, bo sam już nie mam pojęcia.

 

Z góry serdecznie dziękuję wink

1
komentarz 5 czerwca 2020 przez LuQ232 Mądrala (7,200 p.)

O ile dobrze widzę to po wrzuceniu danych : {5, -5, 1, -1, 3, -3} otrzymujemy output : 5 0 1 0 3 0. Wiec raczej taki jaki oczekujemy...

Jednak o ile dobrze widzę to twój wykładowca użył kodu ale dla const vectora:

const std::vector<int> input {5, -5, 1, -1, 3, -3};

a nie dla vectora opisanego jak w poleceniu:

std::vector<int> vector {5, -5, 1, -1, 3, -3};

 

Czy czasem nie o to chodzi i to nie generuje  " Invalid result "? 

 

1
komentarz 5 czerwca 2020 przez tkz Nałogowiec (42,000 p.)

Nie ma znaczenia, bo oba kontenery zawierają to samo. Chyba, że w sprawdzarce jest sprawdzany jeszcze typ. 

Abstrahując od poprawności kodu. Stały iterator możesz uzyskać w dwa sposoby, używając metod z przedrostkiem "c", takie jak cbegin, cend. Albo używać const <kontener>, co implikuje na stały iterator. https://stackoverflow.com/questions/31208640/what-is-the-difference-between-cbegin-and-begin-for-vector http://www.cplusplus.com/reference/vector/vector/cbegin/

 

2 odpowiedzi

+1 głos
odpowiedź 6 czerwca 2020 przez TOM_CPP Pasjonat (22,640 p.)
wybrane 7 czerwca 2020 przez kupson3697
 
Najlepsza

W swoim kodzie zakładasz że wszystkie iteratory odnoszą się do tego samego kontenera, a tak nie jest. W tekście błędu który otrzymujesz wyraźnie widać, że iterator będący ostatnim parametrem funkcji partial_sum() odnosi się do zupełnie innego kontenera niż pierwsze dwa iteratory. Stąd też w swoim kodzie w linijce 12, porównujesz dwa różne/niekompatybilne iteratory, co w efekcie prowadzi do błędu.

Zobacz jak może wyglądać przykładowa funkcja partial_sum()

using iter = vector<int>::iterator;
using citer = vector<int>::const_iterator;

iter partial_sum( citer begin , citer end , iter tag )
{
    auto sum {0};
    while( begin<end )
    {
        sum += *begin;
        *tag = sum;
        ++begin; ++tag;
    }
    return tag;
}

Należy także zaznaczyć, że sygnatura tej funkcji nie jest dobrze zaprojektowana, gdyż nie mamy informacji o rozmiarze kontenera powiązanego z iteratorem tag. Możliwa jest sytuacja gdy wyjdziemy poza zakres/rozmiar tego kontenera doprowadzając do jakiegoś paskudnego UB.

 

0 głosów
odpowiedź 7 czerwca 2020 przez kupson3697 Użytkownik (610 p.)
Panowie, bardzo dziękuję za odpowiedzi, nakierunkowały mnie na rozwiązanie zadania. Tak jak piszecie, dziwne dla mnie jest to, że w poleceniu trzeci argument odwołuje się do tego samego kontenera, a w kodzie sprawdzarki odwołuje się do innego. Cóż, przerobiłem odpowiednio program i liczę na pozytywny wynik :-) Jeszcze raz wielkie dzięki za pomoc!

Podobne pytania

0 głosów
2 odpowiedzi 3,291 wizyt
pytanie zadane 5 sierpnia 2016 w C i C++ przez dhealy Początkujący (250 p.)
0 głosów
1 odpowiedź 318 wizyt
pytanie zadane 15 sierpnia 2018 w SPOJ przez Piotr Błaszczak Bywalec (2,890 p.)
0 głosów
1 odpowiedź 272 wizyt

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 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!

...