abonnement Unibet Coolblue Bitvavo
pi_115309496
quote:
0s.gif Op woensdag 8 augustus 2012 21:42 schreef thenxero het volgende:

[..]

Ik krijg als output
[ code verwijderd ]

Die nullen blijven staan en de vector is dus niet kleiner geworden. Ik krijg ook geen error dat ik buiten de grenzen zit of zo :? .
Dat eerste is mogelijk, dat tweede klopt niet en het derde is gegarandeerd. Dat de nullen blijven staan mag C++ doen: de lengte van de vector is echter wel veranderd: controleer maar met vector.size():

1
2
3
4
5
6
std::vector<int> a;
for (int idx = 0; idx < 10; ++idx)
   a.push_back(idx);
std::cout << "Vector size: " << a.size() << '\n';
a.clear();
std::cout << "Vector size: " << a.size() << '\n';

Dat de waardes eigenlijk nog ergens in het geheugen bestaan maakt niet uit: net als op de harde schijf wordt iets dat verwijderd is, niet gelijk helemaal weggegooid maar alleen aangemerkt als 'overschrijfbaar'. Dit doet er verder niet toe: je moet nooit verder lezen dan vector.size() - 1. Dat is jouw verantwoordelijkheid en C++ zal je er niet voor waarschuwen als je het wel doet.

En nee, je kunt niet in dezelfde scope twee maal dezelfde variabele declareren. Je kunt a wel opnieuw toekennen:

1
2
3
vector<int> a;
// code
a = vector<int>(); // nu is a een nieuwe, lege vector
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_115310046
Waar ik eigenlijk mee bezig is, is PE 13. Ik moet dus 100 getallen van 50 cijfers bij elkaar optellen. Van het eerste getal zet ik de cijfers opeenvolgend in een vector genaamd vec1. Dan wil ik steeds het volgende getal bij het eerste optellen. Iteratief wil ik vec2 de vector laten zijn die het nieuwe op te tellen getal representeert. Bij dat laatste gaat er dus volgens mij iets mis.

Bij het "optellen" van de eerste twee vectors krijg ik het goede resultaat, maar als ik de derde erbij op wil tellen gaat het fout. Ik krijg geen foutmelding maar de code compileert niet eens.

SPOILER
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
pi_115310111
quote:
0s.gif Op woensdag 8 augustus 2012 21:43 schreef thenxero het volgende:

[..]

Met verwijderen bedoel ik dat het niet meer bestaat. Dus dat ik weer opnieuw kan zeggen:
[ code verwijderd ]

alsof ie nog niet bestaat. Of dat ik de vector weer kan gebruiken alsof hij nooit bestaan heeft.
Met a.swap(std::vector<int>()); (a = std::vector<int>();)
Heb je weer een nieuwe vector.
pi_115310224
Wacht, nu zie ik opeens iets. Ik probeer toegang te verkrijgen tot vec2[-1].
pi_115310315
Ik ben al bij opdracht 6...
Had ze al eerder gedaan maar ben loginnaam vergeten. :P

Even kijken hoe moest 6 nog maar.
Sum_n(n)^2 - Sum_n(n^2) = 2*Sum_i>j(ij)
En dat voor de eerste 100.

Oh easy.

edit ho ik vergeet de keer 2 nog...

[ Bericht 7% gewijzigd door t4rt4rus op 08-08-2012 22:12:20 ]
pi_115312242
quote:
11s.gif Op woensdag 8 augustus 2012 22:02 schreef thenxero het volgende:
Wacht, nu zie ik opeens iets. Ik probeer toegang te verkrijgen tot vec2[-1].
Dit heb ik nu opgelost. Nu krijg ik geen errors/failures meer maar klopt de optelling niet meer :( . Misschien maar even pauze nemen, want ik zie niks meer.
pi_115312490
quote:
0s.gif Op woensdag 8 augustus 2012 22:37 schreef thenxero het volgende:

Dit heb ik nu opgelost. Nu krijg ik geen errors/failures meer maar klopt de optelling niet meer :( . Misschien maar even pauze nemen, want ik zie niks meer.
Ik denk dat het iets te maken heeft met het feit dat bij een optelling het resulterende getal soms langer wordt...
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_115312491
quote:
0s.gif Op woensdag 8 augustus 2012 21:42 schreef thenxero het volgende:

[..]

Ik krijg als output
[ code verwijderd ]

Die nullen blijven staan en de vector is dus niet kleiner geworden. Ik krijg ook geen error dat ik buiten de grenzen zit of zo :? .
Heheheheh, dit is eigenlijk een goede oefening. Lees hoe een vector werkt en dan krijg je door wat er hier gebeurt. Het korte antwoord is dat clear() wel goed is, en dat de []-operator geen enkele check uitvoert (want performance); als je wel boundary-checks wilt hebben, gebruik dan at(i).
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
pi_115312890
quote:
0s.gif Op woensdag 8 augustus 2012 22:41 schreef GS42 het volgende:

[..]

Ik denk dat het iets te maken heeft met het feit dat bij een optelling het resulterende getal soms langer wordt...
Ja, had daar al voor gecorrigeerd... maar toch gaat er nog iets mis.
pi_115313307
quote:
void add(vector<int>* vec1, vector<int>* vec2)
Hier is overigens waar C++ references voor heeft geintroduceerd; gebruik beter

1void add(vector<int> &vec1, vector<int> &vec2)

en vervang de derefs (->'s) door gewone punten voor hetzelfde resultaat (semantisch), maar schonere code (en vrijheid voor de compiler iets anders te doen dan pointers passen, mocht er iets beters te doen zijn).
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
pi_115313401
Voor grote getallen zijn er libraries zoals MPIR.
pi_115313495
quote:
2s.gif Op woensdag 8 augustus 2012 22:54 schreef trancethrust het volgende:

[..]

Hier is overigens waar C++ references voor heeft geintroduceerd; gebruik beter
[ code verwijderd ]

en vervang de derefs (->'s) door gewone punten voor hetzelfde resultaat (semantisch), maar schonere code (en vrijheid voor de compiler iets anders te doen dan pointers passen, mocht er iets beters te doen zijn).
Thanks.
quote:
2s.gif Op woensdag 8 augustus 2012 22:56 schreef thabit het volgende:
Voor grote getallen zijn er libraries zoals MPIR.
Dat is vast niet zo leerzaam als dit geklooi :)
pi_115315551
Trouwens, nu we toch weer richting een nieuw vervolg gaan, vind ik wel dat we het eens serieus over die OP moeten hebben. Verschillende dingen:

- Waarom die plaatjes van Dummies-boeken? Die boeken zijn toch nooit het onderwerp geweest van dit topic? Wat is het nut?

- De opmerking "beperk je niet tot [...]" is wat denigrerend. Een duidelijke omschrijving van wat voor informatie behulpzaam is bij een vraag, lijkt op z'n plaats.

- Het "vorig topic" gedeelte is toch overbodig nu het een reeks is? En maken mods het nog steeds centraal?

- Die FAQ is ... tenenkrommend slecht. Serieus, print het uit, verbrand het en begin overnieuw. :P

- Het "handige links" gedeelte is een goed idee, maar de uitvoering laat te wensen over. Een verzameling van goede links die in de topics zijn genoemd is echter prima.

Samenvattend: ik geloof niet dat er iets nuttigs in staat en verscheidene contra-productieve dingen. Zullen we eens een nieuwe schrijven? Wie wil wat doen? ;)
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_115317316
Hallo,

Ik loop al een tijd met een idee om een programma te maken in c++. Ik weet echter niet of het haalbaar is in c++. Het gaat erom dat het veel informatie van Google en social media moet weten te plukken, het te organiseren en er ook grote hoeveelheden weer kan uploaden naar de dit soort sites.

In hoeverre is dit mogelijk in c++ of raden jullie me voor dit soort toepassingen een andere programmeertaal aan?
pi_115322082
quote:
0s.gif Op woensdag 8 augustus 2012 23:56 schreef Carlos93 het volgende:
Hallo,

Ik loop al een tijd met een idee om een programma te maken in c++. Ik weet echter niet of het haalbaar is in c++. Het gaat erom dat het veel informatie van Google en social media moet weten te plukken, het te organiseren en er ook grote hoeveelheden weer kan uploaden naar de dit soort sites.

In hoeverre is dit mogelijk in c++ of raden jullie me voor dit soort toepassingen een andere programmeertaal aan?
Alles kan, maar zonder ervaring kan het allemaal iets minder vlot.
quote:
0s.gif Op woensdag 8 augustus 2012 23:28 schreef GS42 het volgende:
Trouwens, nu we toch weer richting een nieuw vervolg gaan, vind ik wel dat we het eens serieus over die OP moeten hebben. Verschillende dingen:

- Waarom die plaatjes van Dummies-boeken? Die boeken zijn toch nooit het onderwerp geweest van dit topic? Wat is het nut?

- De opmerking "beperk je niet tot [...]" is wat denigrerend. Een duidelijke omschrijving van wat voor informatie behulpzaam is bij een vraag, lijkt op z'n plaats.

- Het "vorig topic" gedeelte is toch overbodig nu het een reeks is? En maken mods het nog steeds centraal?

- Die FAQ is ... tenenkrommend slecht. Serieus, print het uit, verbrand het en begin overnieuw. :P

- Het "handige links" gedeelte is een goed idee, maar de uitvoering laat te wensen over. Een verzameling van goede links die in de topics zijn genoemd is echter prima.

Samenvattend: ik geloof niet dat er iets nuttigs in staat en verscheidene contra-productieve dingen. Zullen we eens een nieuwe schrijven? Wie wil wat doen? ;)
Goed punt, en niet dat alleen; de beschrijving van C++ (een 'verbetering' op C) slaat ook de plank volledig mis. Het is een andere taal dat C als subset heeft puur omdat C veelgebruikt is. Tegenwoordige tijd. C is nog altijd populair in bij high-performance toepassingen.
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
pi_115322373
quote:
3s.gif Op donderdag 9 augustus 2012 01:45 schreef trancethrust het volgende:

[..]

Goed punt, en niet dat alleen; de beschrijving van C++ (een 'verbetering' op C) slaat ook de plank volledig mis. Het is een andere taal dat C als subset heeft puur omdat C veelgebruikt is. Tegenwoordige tijd. C is nog altijd populair in bij high-performance toepassingen.
Dat is inderdaad een onderdeel van de FAQ dat ik graag veranderd zou zien. :P

Muggenziftmodus: je opmerking "Het is een andere taal dat C als subset heeft puur omdat C veelgebruikt is" klopt volgens mij op twee punten niet. Ten eerste is C geen subset van C++ en ten tweede is C++ wel degelijk begonnen als uitbreiding van C ("C with classes") en is het dus niet puur omdat C veelgebruikt is dat C++ erop lijkt en het grotendeels ondersteunt. Het klopt wel dat veel legacy C-onderdelen om die reden aangehouden zijn, maar je 'puur' is volgens mij onwaar.

[ Bericht 0% gewijzigd door GS42 op 09-08-2012 02:06:06 ]
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_115327317
Kan zijn, ik heb begin nooit meegemaakt (kom van '84), maar de huidige staat is dat (zo goed als) alles wat in C kan, ook in C++ werkt. Tegelijkertijd doe je liever niet alles wat in C kan letterlijk in C++; in deze zin is het m.i. een subset, maar eigenlijk toch een compleet andere taal.
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
  donderdag 9 augustus 2012 @ 12:31:18 #243
85514 ralfie
!Yvan eht nioj
pi_115331078
quote:
0s.gif Op woensdag 8 augustus 2012 23:56 schreef Carlos93 het volgende:
Hallo,

Ik loop al een tijd met een idee om een programma te maken in c++. Ik weet echter niet of het haalbaar is in c++. Het gaat erom dat het veel informatie van Google en social media moet weten te plukken, het te organiseren en er ook grote hoeveelheden weer kan uploaden naar de dit soort sites.

In hoeverre is dit mogelijk in c++ of raden jullie me voor dit soort toepassingen een andere programmeertaal aan?
Ik zou het niet in c++ doen. De ratio werk/profijt is erg laag. Ga liever werken in visualbasic of C# (windows only) , Javascript (kan prima wat jij wil), Java (klotetaal, maar goed crossplatform te krijgen). c++ is handig als je echt programmeren wil leren of als je zeer geavanceerde technieken wil gebruiken of veel snelheid nodig hebt. Anders mijns inziens zonde van je tijd.
pi_115333544
Een nieuwe poging vectors bij elkaar op te tellen alsof het getallen zijn. Dus bijvoorbeeld, als
a = {9, 8, 6, 4}
b = {9, 6, 7}

Dan wil ik dat de functie add(a,b) ervoor zorgt dat b = {1, 0, 8, 3, 1}. De functie moet in ieder geval werken voor vectors b die minstens even lang zijn als a. De moeilijkheid zit hem in de verschillende lengtes van de vector. Volgens mij is dit de beste methode om daarmee om te gaan, alleen krijg ik nog wat errors waar ik geen touw aan vast kan knopen.

De functie:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void add(vector<int>& a, vector<int>& b)
{
    vector<int>::iterator k;
    vector<int>::iterator l;
    for(k=b.rbegin(); k<b.rend(); ++k)
    {
        for(l=a.rbegin(); l<a.rend(); ++l)
        {
            *k+=*l;
            if(*k>9 && !(*k==b.rend()))
            {
                *k%=10;
                *(--k)-=1;
            }
            else if(*k>9 && *k==b.rend())
            {
                a.insert(a.begin(),1);
            }
            if(l==a.rbegin()) break;
        }
    if(k==b.rbegin) break;
    }
}

En alle errors zien er (ongeveer) als volgt uit:
1
2
3
C:\Documents and Settings\...\C++\test\main.cpp|10|error: no match for 'operator='
 in 'k = std::vector<_Tp, _Alloc>::rbegin() 
[with _Tp = int, _Alloc = std::allocator<int>]()'|

Wat heeft dit te betekenen?
pi_115333704
De functies rbegin() en rend() leveren reverse_iterators op. Als je deze werkelijk wilt, dan moet je de declaraties van k en l veranderen van iterators naar reverse_iterators.

De fout zegt dat de compiler geen operator= kan vinden die een reverse_iterator aan een iterator-type toe kan kennen, wat natuurlijk klopt.

Let ook op dat je bij iterators geen < (of anderen) wilt gebruiken, alleen maar == en !=.
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_115333922
quote:
0s.gif Op donderdag 9 augustus 2012 13:42 schreef GS42 het volgende:
De functies rbegin() en rend() leveren reverse_iterators op. Als je deze werkelijk wilt, dan moet je de declaraties van k en l veranderen van iterators naar reverse_iterators.

De fout zegt dat de compiler geen operator= kan vinden die een reverse_iterator aan een iterator-type toe kan kennen, wat natuurlijk klopt.
Ah, dat eerste scheelt alweer een hoop errors. Heb nu geen errors meer maar het antwoord lijkt nergens op. Maar dat is logisch, heb er een rommeltje van gemaakt.

quote:
Let ook op dat je bij iterators geen < (of anderen) wilt gebruiken, alleen maar == en !=.
Waarom niet? Doen ze hier ook.
pi_115334734
Volgens mij lijkt dit al meer op wat ik wil. Ik heb nu < en > vermeden, maar krijg nu een infinite loop :? .
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void add(vector<int>& a, vector<int>& b)
{
    vector<int>::reverse_iterator k;
    vector<int>::reverse_iterator l;
    k=a.rbegin();
    l=b.rbegin();

    while(!(k==a.rend()) && !(l==b.rend()))
    *k+=*l;
    if(*k>9 && !(k==b.rend()))
    {
        *k-=10;
        *(++k)++;
    }
    else if(*k>9 && k==b.rend())
    {
        b.insert(b.begin(),1);
    }
    ++k;
    ++l;
}
pi_115334770
quote:
0s.gif Op donderdag 9 augustus 2012 13:48 schreef thenxero het volgende:

Waarom niet? Doen ze hier ook.
Er zijn verschillende soorten iterators en ze ondersteunen niet allemaal dezelfde operaties. Omdat iterators vaak gebruikt worden om algemene dingen te doen (bijvoorbeeld: nieuwe elementen toevoegen aan een willekeurige container) is het het beste om jezelf aan te leren de meest algemene vorm te gebruiken, zodat je later geen rare problemen krijgt.

In dit geval is het misschien een beetje overdreven (want in je voorbeeld gaat het goed, hoor), maar het is sowieso goed in om een for-loop met iterators altijd de volgende vorm aan te houden:

1
2
3
4
itt const end = s.end();
for (itt i = s.begin(); i != end; ++i) {
    // code
}

Dit is altijd juist.

Je code heeft trouwens nog een subtieler probleem: zodra je een container verandert (met insert(), push_back(), clear() etc.) zijn alle bestaande iterators mogelijk ongeldig en kunnen niet meer veilig gebruikt worden. Na jouw insert() kan je l dus niet meer gebruiken voordat je 'em opnieuw toekent.

Dit maken met iterators is vrij lastig. Misschien kan je beter twee for-loops met indexen gebruiken van de volgende vorm:

1
2
3
for (size_t idx = 0; idx < a.size(); ++idx) {
   // code
}

Als je nu een push_back doet, blijft idx geldig en groeit a.size() automatisch mee.
"Slechts diegene mag slopen die iets beters kan bouwen."
pi_115334937
Dat ook nog. Wat een drama.... dit bewaar ik voor een regenachtige zondag.
pi_115335140
quote:
10s.gif Op donderdag 9 augustus 2012 14:15 schreef thenxero het volgende:
Dat ook nog. Wat een drama.... dit bewaar ik voor een regenachtige zondag.
Sorry. :) Dat is het grote nadeel van C++: je moet erg veel leren voordat je het een beetje kunt gebruiken.

Er is ook een voordeel: de standard template library bevat veel nuttige code. Bijvoorbeeld valarray. Daarmee kan je gewoon a + b op arrays uitvoeren en dat is volgens mij precies wat jij wilt. Het enige dat je dan nog moet doen, is zorgen dat alle waarden <10 zijn na elke optelling. Een groot deel van goede C++-code schrijven is ook weten wat de STL in de aanbieding heeft.
"Slechts diegene mag slopen die iets beters kan bouwen."
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')