Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

program dziala dobrze tylko dla pewnego przedzialu zmiennej (od 1 do 8, powyzej juz blednie)

Ostatnio zmodyfikowano 2010-04-28 18:11
Autor Wiadomość
dmx81
Temat założony przez niniejszego użytkownika
program dziala dobrze tylko dla pewnego przedzialu zmiennej (od 1 do 8, powyzej juz blednie)
» 2010-04-27 00:21:31
C/C++
#include <vector>
#include <iostream>
#include<conio.h>


void dodaj( std::vector < int > & wektor, int n )
{
    if( wektor[ n ] > 0 ) // dodajemy do najnizszego "bitu", jesli ma juz wartosc 1, zerujemy go, a 1 dopisujemy wyzej - i tak w kolko, az zostanie w miejsce 0 dopisana 1//
    {
        wektor[ n ] = 0;
        n++;
        dodaj( wektor, n );
        return;
    }
    else
         wektor[ n ] ++;
   
    for( int i = wektor.size() - 1; i >= 0; i-- ) //wyswietlamy aktualny stan naszego wektora, poczawszy od najwyzszego bitu//
         std::cout << wektor[ i ] << " ";
   
    std::cout << std::endl;
    return;
}
int potega( int a, int b )
{
    int wynik = a;
    if( b == 0 )
         return 1;
    else if
    ( b == 1 )
         return a;
    else if( b > 1 )
    {
        for( int i = 1; i < b; i++ )
             wynik *= a;
       
        return wynik;
    }
}
int main()
{
    std::cout << potega( 2, 7 ) << std::endl; // obliczamy, ile jest mozliwych rozwiazan naszego problemu - 7 zmiennych, kazda moze przyjac 2 wartosci (0 lub 1)//
    std::vector < int > wektor; //wektor bedzie przetrzymywal nasze zmienne (moze to byc tez np tablica)//
    wektor.resize( 7 ); //ustawiamy wektor na 7 miejsc, nastepnie kazde z nich zerujemy, dla pewnosci wyswietlamy stan wektora po zerowaniu//
    for( int i = 0; i < wektor.size(); i++ )
         wektor[ i ] = 0;
   
    for( int i = 0; i < wektor.size(); i++ )
         std::cout << wektor[ i ] << std::endl;
   
    for( int i = 0; i < potega( 2, 7 ); i++ ) // dla wszystkich mozliwych rozwiazan, dodajemy do zmiennych w wektorze 1, wg odpowiedniego algorytmu//
         dodaj( wektor, 0 );
   
    getch();
   
    return 0;
}

dlaczego program dziala od 1 do 8 zmiennych w wektorze, a przy 9 i wiecej juz fiksuje? kiedys juz mialem podobny problem, ale byl kod napisany przez kogos, rowniez przez P. Piotra, teraz napisalem od poczatku sam, a ten sam rezultat, mimo, ze wydaje sie, ze powinien dzialac dobrze ...


PS>> no chyba ze konsola ma zbyt mala pamiec i pokazuje tylko od pewnego momentu, bo rozwiazan jest np 2^9...
P-16390
DejaVu
» 2010-04-27 02:30:16
Cud, że ta Twoja rekurencja w ogóle działa. Pod linuxem byłoby naruszenie ochrony pamięci. Nie sprawdzasz nawet czy element wektora a[n] istnieje (tj. czy indeks nie wychodzi poza zakres).
P-16391
dmx81
Temat założony przez niniejszego użytkownika
» 2010-04-27 14:10:11
ok rozumiem, dopisze if(wektor n >0 && n<wektor.size) lub cos takiego (mam krotka przerwe w pracy wiec pisze na szybko, w domu sprawdze dalej) ale to chyba nie rozwiazuje problemu, o ktory pytam? bo Pana program dzialal dokladnie tak samo, jesli chodzilo o liczbe wyrazow wieksza niz 8, do 8 pokazywalo wszytsko od 00000 do 11111, a powyzej 8 pokazuje od 010101 czyli nie od poczatku jakby, wiec pytam, czy konsola ma jakas ograniczona pamiec wyswietlania 
P-16394
DejaVu
» 2010-04-27 20:30:17
Co jak co ale mój program działał dobrze, a nie tak samo jak Twój i nie wyglądał tak samo.
P-16410
dmx81
Temat założony przez niniejszego użytkownika
» 2010-04-28 00:55:22
co jak co, ale Pana, jak i moj, dzialaja podobnie (nie mowie o konstrukcji programu - mowie o wyniku w konsoli)

C/C++
#include <vector>
#include <iostream>

void obliczenia( std::vector < int >& klopsy )
{
    for( long i = 0; i < klopsy.size(); i++ )
         std::cout << klopsy[ i ];
   
    std::cout << std::endl;
}

void szoruj( std::vector < int >& klopsy, int indeks )
{
    if( indeks >= klopsy.size() )
    {
        obliczenia( klopsy );
        return;
    } //if
   
    for( int i = 0; i < 2; i++ )
    {
        klopsy[ indeks ] = i;
        szoruj( klopsy, indeks + 1 );
    } //for
}

int main()
{
    std::vector < int > ble;
    ble.resize( 9 );
    szoruj( ble, 0 );
    return 0;
}

prosze skompilowac i powiedziec, czy pierwsza linia w konsoli zaczyna sie od 000000000? bo dla ble.resize 8 dziala dobrze, pokaze 00000000 w pierwszej linii - dokladnie tak samo jak w moim przypadku dla wektora o liczbie elementow > 8 pierwsza linia w konsoli nie jest taka, jaka byc powinna, jak wychodzi to dla zakresu od 1 do 8 no i dlatego tak to drąże, ja nie twierdze ze Pana kod jest zly, nie twierdze, ze moj nie ma bledow, ze wszystkim sie zgadzam - ale prosze tylko o wskazanie przyczyny, dlaczego wystepuje taki problem, bo ja nie potrafie przejsc do porzadku dziennego z tym fantem, dopoki nie mam tego pod kontrola... dlatego, jesli moge prosic jeszcze o troszke cierpliwosci, mam nadzieje, ze jesli zna Pan juz odpowiedz, to mi powie, a jesli nie, ze tez Pana to zaintryguje, dziekuje
P-16420
DejaVu
» 2010-04-28 13:56:58
Konsola pamięta domyślnie 300 ostatnich wierszy.
P-16423
dmx81
Temat założony przez niniejszego użytkownika
» 2010-04-28 17:45:38
o taka odpowiedz mi chodzilo :) dzieki, poszukam w googlach, ale moze szybciej ktos odpowie, czy mozna te ustawienie na 300 wierszy zmienic? jesli nie, zostaje co ok 300 wierszy getch()?
P-16435
DejaVu
» 2010-04-28 18:11:53
Da się zmienić, ale to nie będzie crossplatformowe rozwiązanie.
P-16442
« 1 »
  Strona 1 z 1