Strona Główna     FAQFAQ  SzukajSzukaj  UżytkownicyUżytkownicy  GrupyGrupy


Poprzedni temat :: Następny temat
C++ problem z algorytmem
Autor Wiadomość
maniek910


Skąd: Kalisz
Wysłany: 2011-08-26, 18:45   C++ problem z algorytmem

Mam pewien problem otóż nie mogę wykminić żadnego działającego sposobo na mój problem mam tablice(w tym wypadku są to kolejne elementy ciągu fibonaciego)

0 1 1 2 3 5 8 mój program ma mi wypisać liczby nie należące do danego ciągu dla tego przykładu było by to 4 6 i 7 .

miałem pomysł ,stworzyć pomocniczą tabele od 0 do n czyli 0,1,2,3,4,,,n i porównywać pokolei elementy z ciągiem ale wtedy wypisuje bzdury ,chciałem porównywać na zasadzie że jeśli liczba poróżnien w całym obiegu dla danej liczby jest równa ilości sprawdzanych liczb to ta liczba w niej nie wystepuje niestety prgram mi nie działa ;/ moje wypociny ...
Kod:

#include <iostream>

using namespace std;

int const n = 5;
int const m = 5;

int main()
{

    int tab[n];
    int tab_1[m];

    for(int i=0;i<n;i++){
        tab[i]=i;
    }
    for(int j=0;j<m;j++)cin >> tab_1[j] ;


    for(int i=0;i<n;i++){
        int s=0;
        for(int j=0;j<m;j++){

            if(tab[i]!=tab_1[j])s=s+1;
            if(s==6)cout << tab[i];



    }
    }

    system("PAUSE");
    return EXIT_SUCCESS;
}
_________________
 
   
ExeQtoR 
Moderator



Pomógł: 38 razy
Skąd: K.P.
Wysłany: 2011-08-26, 20:06   

Chcesz gotowy kod czy pomysł:

a) kod -> później -> nie chce mi się teraz myśleć nad tym xD

b) pomysł:

1) Generujesz tablice z danym ciągiem liczb(Fibonacciego)
2) sortujesz ją od 0 do n.... -> to chyba masz od razu jak ja generujesz, ale w razie czego piszę;]
//3) optymalizujesz ją... tzn... wywalasz liczby powtarzające się
4) generujesz nową tablicę od 0 do N gdzie N to Twoja końcowa liczba(większa lub równa ostatniej liczbie Ciągu FIBtablica), ale Tablica jest typu BOOL, ustawiasz wszystko na True;-))))))
5) Najlepsza zabawa xD ->

For (int i=0; i<TablicaFib.lenght(); i++) //przelatujemy całą tablicę FIB
{
TablicaNowa[TablicaFib[i]] = False;
}
//Uważaj aby ostatnia(największa) wartość w tablicy FIB nie była większa niż ILOŚĆ elementów w NowejTablicy -> błąd zakresu indeksowania tablicy -> wyjdziesz po za zakres

6) Przeszukujesz TablicaNowa i wyświetlasz dane:
for (int i=0; i<TablicaNowa.lenght(); i++)
{
If (TablicaNowa[i] == true) Cout << i.toString();
}

----

Aha, kodu nie kopiuj, bo kurcze nie pamiętam już C++ za dobrze i chyba byki zrobiłem w warunkach gdzie pobieram długość tablicy(jej ilosć), ja bym to zrobił na liście w C# a tam jest odrobinkę inna składnia, a po za tym piszę to z głowy i jak widzisz... punkt 3 Ci za komentowałem, czyli nie obowiązuje, bo jak już raz ustawisz zmienną na False to potem drugi raz jak ustawisz znowu na False to jest to samo, a czas operacji krótszy a niżeli byś optymalizował cała tablice... hmm.. czyli tworzył nowa i usuwał starą... znowu mi się pierdykło, Lista jest automatycznie relinkowana, a tablica nie xD

powodzenia, ja wracam do pisania pracy dyplomowej, jak nie dasz rady, to daj znać ;-P postaram się o gotowca ;)
_________________
Moderatora grzecznie się słuchamy,
nie spamujemy, nie bluzgamy...


 
 
   
maniek910


Skąd: Kalisz
Wysłany: 2011-08-26, 22:45   

Cytat:
4) generujesz nową tablicę od 0 do N gdzie N to Twoja końcowa liczba(większa lub równa ostatniej liczbie Ciągu FIBtablica), ale Tablica jest typu BOOL, ustawiasz wszystko na True;-))))))
za dobry w logice nie jestem w c++ ale jeśli utworze taka tablice i napisze np bool tablica[m] ; to tablica mimo uprzedniego wypelnienia liczbami od 0 do n przyjmie wartosci 1 jako true .

Cytat:
TablicaNowa[TablicaFib[i]] = False;
tablica od tablicy :P czy takie coś jest możliwe w c++ ?
_________________
 
   
ExeQtoR 
Moderator



Pomógł: 38 razy
Skąd: K.P.
Wysłany: 2011-08-26, 23:18   

Maniek.... Widzisz... nie rozumiesz pewnych rzeczy, albo ja nie zakapowałem co chcesz zrobić ;-)

Int TabFIB[8] -> Zawartość -> (0, 1, 1, 2, 3, 5, 8, 13, 21)

i chcesz mieć tablicę o zawartości(4,6,7,9,10,11,12,14,15,16,17,18,19,20,22) tak ?? Jeżeli tak to czytaj dalej ;-)

Bool TabNowa[30] ->Zawartość -> (True, [...], True) // specjalnie ustawiłem na 30, mogło by być najmniej 22 !! ponieważ ostatnia liczba z FIB(ostatnia w przykładzie) to 21 do tego + 1, potem wyjaśnię dlaczego.

for (int i=0; i< sizeof(TabFib) / sizeof(Int); i++)
{
TabNowa[TabFIB[i]] = False;
}

tłumaczenie:
Od i=0; do ilości elementów tablicy(zadziała poprawnie nawet dla dynamicznych tablic) TabFIB.
Pobieramy pierwszy element tablicy TabFIB -> 0 -> jest to liczba typu INT(tak tablica została zadeklarowana)

Dalej Kompilator to co wyciągnął z TabFIB[0] wstawia jako INDEX do tablicy TabNowa[..] -> a tam kryje się wartość Bool, którą chcemy zmienić !

innym słowy, mamy:
Tablice o 30 elementach BOOL -> interesuje nas fakt iż jest to adresowana o 1, czyli 0,1,2,3,4,5,6,...29; daje nam to fakt iż pod tymi indeksami są wartości TRUE(czyli w moim[naszym] mniemaniu wszystkie te pola są AKTYWNE, że chcemy je DEZAKTYWOWAĆ, ale tylko te które odpowiadają polom CiąguFIB, więc pobieramy LICZBĘ(int) z tablicy gdzie są liczby do zdezaktywowania i wstawiamy je jako INDEX w następnej tablicy i tam ustawiamy FALSE.

Dalej, wyświetlenie tylko i wyłącznie ! numeru INDEXU z TabNowa gdzie wartość jest == True ;-) ))

Czyli de-facto nic nie usuwamy ;-)

można sobie to skojarzyć tak graficznie:
|----------------------------------------------------------
|0|1|2|3|.......................................................29| //index
|----------------------------------------------------------
|T|F|T|T|.........................................................T| //wartość bool
|----------------------------------------------------------

Gdzie pierwsza linia, to Indeksy tablicy TabNowa, a dół to wartość BOOL,
Teraz czynność: przeszukujemy Tablicę FIB i pierwsza wartość elementu to np. 1 lecimy pod Index TabNowa i dezaktywujemy ją(na rysunku ustawiona już na False) ;-) )) Wszystko.

Indeksy są zawsze od 1 do N, masz pewność że nie przeoczysz czegoś, wartość TablicyFIB zawsze będzie liczbowa.
Problem będzie tkwił jak będziesz operował na liczbach, których nie potrafimy nazwać słownie czyli rzędu 1*10^9999999999999999999
W tedy masz 2 Tablice i potrzebujesz je utrzymać równocześnie w pamięci... ale zawsze można TabFIB wrzucić na dysk i operować na dysku ;-) dla upartego Tablice Nowa też możesz wpakować do pliku... w końcu 3TB na HDD to nie to samo co 4GB RAM (tutaj mowa o jednej kości i jednym dysku - takie porównanie);-)))

Jak do jutra się z tym nie uporasz, to Ci to jutro w wolnej chwili zrobię, bo dziś już padam....

EDIT////

Kod:
// Maniek.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>

using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
    int n;
    int *tabFIB;
    bool *tabNowa;
    cout << "Podaj ilosc liczb FIB: ";
    cin >> n;
    tabFIB = new int[n];

    tabFIB[0]=0;
    tabFIB[1]=1;
   
    for (int i = 2; i < n; i++)
    {
        tabFIB[i]=tabFIB[i-1]+tabFIB[i-2];
    }

    tabNowa = new bool[tabFIB[n-1]+1];

    for (int i = 0; i <= tabFIB[n-1] + 1; i++)
    {
        tabNowa[i] = true;
    }

    for (int i = 0; i < n; i++)
    {
        tabNowa[tabFIB[i]] = false;
    }

    cout << "Ciag " << n << " liczb FIB to:" << endl;
    for (int i = 0; i < n-1; i++)
    {
        cout << tabFIB[i] << ", ";
    }
    cout << tabFIB[n-1] << ";" << endl;
    cout << "Ciag liczb z wylaczeniem liczb FIB z zakresu 0.." << tabFIB[n-1]+1 << " to:" << endl;
    for (int i = 0; i < tabFIB[n-1]; i++)
    {
        if (tabNowa[i] == true)
        {
            cout << i << ", ";
        }
    }
    if (tabNowa[tabFIB[n-1] + 1] == true)
    {
        cout << tabFIB[n-1] + 1 << ";" << endl;
    }
    cout << "\n\n\t\t\tDziekuje za uwage ExeQtoR\n" << endl;
 
    system("PAUSE");
    return 0;
}


Podaj optymalnie do 15 liczb FIB ;-) jak podasz np. 25, to dostaniesz oczopląsu na monitorze

Program nie jest zabezpieczony przed wprowadzeniem czegoś innego a niżeli liczb całkowitych dodatnich ;-)

Da się go jeszcze uprościć komasując dwie pętle w jedną, ale tak może łatwiej Ci będzie zakapować wszystko ;-)

aj.... nie patrz na _tmain i tą tablicę... Visual 2010 tak generuje funkcję główną, Ty w innym kompilatorze zmień to ma int main()

w kodzie PL znaki specjalnie zostały wyrzucone ;-)
_________________
Moderatora grzecznie się słuchamy,
nie spamujemy, nie bluzgamy...


 
 
   
maniek910


Skąd: Kalisz
Wysłany: 2011-08-27, 11:45   

Dziękuję bardzo że chciało Ci się dla mnie to naskrobać przeanalizuję i spróbuję sam też napisać , ale w między czasie siedziałem trochę i też napisałem ten program ale w inny sposób mianowicie mam c.fibonaciego i 2 tablice od 0 do n sprawdzam które liczby są takie same jeśli takie znajdę zeruje je w tablicy pomocniczej i potem tą tablice wyświetlam program ladnie śmiga mianowicie mam jeden problem mam nadzieję że powiesz mi czemu go mam :D mianowicie
Kod:
#include <iostream>

using namespace std;
int const n=200; // rozmiar tablicy pomocniczej
int const m=50; //ilosc elementow ciagu (maxymalna)
int main()
{
    int tab[n],tab1[m],size;


    cout <<"ile elementow pokazac" << endl;
    cin >> size;
    tab1[0]=0;
    tab1[1]=1;
    for(int j=2;j<size;j++){
        tab1[j]=tab1[j-1]+tab1[j-2];
    }
    for(int j=0;j<size;j++)cout << tab1[j] << " " ; // show fib

    for(int i =0;i<tab1[size-1];i++){
        tab[i]=i;
    }

    for(int i =0;i<tab1[size-1];i++){
        for(int j=0;j<size;j++){
            if(tab[i]==tab1[j])tab[i]=0;
        }
    }
    cout << endl;

    for(int i=0;i<tab1[size-1];i++)cout << tab[i] << " ";




    system("PAUSE");
    return EXIT_SUCCESS;
}






wszystko ladnie pokazało aleeee chciałem wyświetlic w petli te elementy już bez 0 czyli tylko te co mi brak i tu jest dziwny problem oO piszę
Kod:

for(int i=0;i<tab1[size-1];i++){
if(tab[i]==0)i++;
else
cout << tab[i] << " ";
}

i efekt mam taki



jak pewnie zauważyłeś z bliżej nieznanych mi przyczyn ucieło np liczby takie jak 6 czy 9 ;/ wiesz może czemu ?
_________________
 
   
ExeQtoR 
Moderator



Pomógł: 38 razy
Skąd: K.P.
Wysłany: 2011-08-27, 11:51   

maniek910 napisał/a:
wiesz może czemu ?

Chyba tak ;-)

Nie analizuje całosci, ale wstaw zamiast tego:

Kod:
for(int i=0;i<tab1[size-1];i++){
 if(tab[i]==0)i++;
 else
 cout << tab[i] << " ";
 }

Taki kod:
Kod:
for(int i=0;i<tab1[size-1];i++){
 if(tab[i]!=0) cout << tab[i] << " ";
 }

powinno hulać ;-) )))

jak Ci zadziała to możemy zrobić mały test komu szybciej program działa.

pobierasz datę systemową zaraz po tym jak wystukujesz coś ... potem pobierasz datę systemową na końcu i masz wynik czasu pracy programu ;-) ))

///////////Edit

Program z uwidocznionym czasem pracy ;-)
Kod:
// Maniek.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <windows.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int n;
    int *tabFIB;
    bool *tabNowa;
    DWORD Start, Stop;
    cout << "Podaj ilosc liczb FIB: ";
    cin >> n;

    Start = GetTickCount(); // Po tym program wykonuje sie bez oczekiwania na usera ;-)

    tabFIB = new int[n];

    tabFIB[0] = 0;
    tabFIB[1] = 1;
   
    for (int i = 2; i < n; i++)
    {
        tabFIB[i]=tabFIB[i-1]+tabFIB[i-2];
    }

    tabNowa = new bool[tabFIB[n-1] + 1];

    for (int i = 0; i <= tabFIB[n-1] + 1; i++)
    {
        tabNowa[i] = true;
    }

    for (int i = 0; i < n; i++)
    {
        tabNowa[tabFIB[i]] = false;
    }

    cout << "Ciag " << n << " liczb FIB to:" << endl;
    for (int i = 0; i < n - 1; i++)
    {
        cout << tabFIB[i] << ", ";
    }
    cout << tabFIB[n-1] << ";" << endl;
    cout << "Ciag liczb z wylaczeniem liczb FIB z zakresu 0.." << tabFIB[n-1] + 1 << " to:" << endl;
    for (int i = 0; i < tabFIB[n-1]; i++)
    {
        if (tabNowa[i] == true)
        {
            cout << i << ", ";
        }
    }
    if (tabNowa[tabFIB[n-1] + 1] == true)
    {
        cout << tabFIB[n-1] + 1 << ";" << endl;
    }

    Stop = GetTickCount(); //Program juz zakonczyl wszystkie operacje liczenia wiec pobieramy raz jeszcze date i czas ;-))
    cout << "\nProgram wykonywal sie: " << Stop - Start << " milisekund";

    cout << "\n\n\t\t\tDziekuje za uwage ExeQtoR\n" << endl;
 
    system("PAUSE");
    return 0;
}



Zrób tak samo ze swoim i porównaj który szybciej zadziała ;-)
_________________
Moderatora grzecznie się słuchamy,
nie spamujemy, nie bluzgamy...


 
 
   
maniek910


Skąd: Kalisz
Wysłany: 2011-08-27, 12:55   

Kod:
for(int i=0;i<tab1[size-1];i++){
 if(tab[i]!=0) cout << tab[i] << " ";
 }
działa ~~ ale tak naprawdę nie widzę logicznej różnicy xD między moim a twoim kodzikiem :( no ale nic, teraz mi powiedz jak pobrać tą date systemową :) ?

P.S
co do twojego kodu widzę że tablice są na wskaźnikach , niestety wskaźników jeszcze się nie uczyłem :P
_________________
 
   
ExeQtoR 
Moderator



Pomógł: 38 razy
Skąd: K.P.
Wysłany: 2011-08-27, 14:23   

maniek910 napisał/a:
działa ~~ ale tak naprawdę nie widzę logicznej różnicy xD

Jak to nie ma różnicy :lol: skoro jeden działa a drugi nie to różnica jest 8)

mój: Pętla: Sprawdza czy wartość jest RÓŻNA od 0 jeżeli tak: COŚ... ;-)
Twój: Pętla: Sprawdza czy jest 0 jeżeli tak: Zwiększa licznik o 1 -> dalej pętla też go zwiększa o jeden -> TWÓJ BŁĄD(podwójna inkrementacja licznika) ;-)

mogę Ci to inaczej z obrazować(poprawić na Twoim):
Kod:
for(int i=0;i<tab1[size-1];i++){
  if(tab[i]==0){
    //NIE RÓB NIC
  }else{
    cout << tab[i] << " ";
  }
}

Ten też zadziała poprawnie, a ja wcześniej w moim użyłem innego warunku: zamiast "==" użyłem "!=" a to różnica ;-)
maniek910 napisał/a:
no ale nic, teraz mi powiedz jak pobrać tą date systemową ?

Datę jak datę... znowu po co Ci wiedzieć dokładną datę po "ludzkiemu" ;-) ??
Wystarczy mieć datę po komputerowemu, potem druga odjąć i to co wyjdzie wyświetlić a potem porównać z drugim programem ;-)
Kod:

#include <windows.h>

int main()
{
DWORD Start, Stop;

//wczytywanie danych od usera

Start = GetTickCount();

//Liczymy.......................................

Stop = GetTickCount();
//już wszystko wyliczyliśmy i wyświetliliśmy dane ;-)

cout << "\nProgram wykonywal sie: " << Stop - Start << " milisekund";
system("PAUSE");
return 0;
}

ExeQtoR napisał/a:
co do twojego kodu widzę że tablice są na wskaźnikach

hmmm... wskaźnik, tak ;-) ale to są tablice dynamiczne, czyli najpierw deklarujemy że mamy taką zmienną, potem ją inicjalizujemy jako tablicę o N długości, a N podaje user ;-) więc nie musisz na sztywno podawać w kodzie ;-)

Więc Tablica dynamiczna nie różni się niczym od statycznej, po za tym że dynamiczna w czasie programu jest inicjalizowana a statyczna na początku, a dalej działają identycznie -> zauważ że dalej już żadnego wskaźnika nie używam ;-P
_________________
Moderatora grzecznie się słuchamy,
nie spamujemy, nie bluzgamy...


 
 
   
Wyświetl posty z ostatnich:   
Dodaj do: WypowiedÄ˝ dla Wykop  WypowiedÄ˝ dla Facebook  WypowiedÄ˝ dla Wyczaj.to  WypowiedÄ˝ dla Gwar  WypowiedÄ˝ dla Delicious  WypowiedÄ˝ dla Digg  WypowiedÄ˝ dla Furl  WypowiedÄ˝ dla Google  WypowiedÄ˝ dla Magnolia  WypowiedÄ˝ dla Reddit  WypowiedÄ˝ dla Simpy  WypowiedÄ˝ dla Slashdot  WypowiedÄ˝ dla Technorati  WypowiedÄ˝ dla YahooMyWeb
Odpowiedz do tematu
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
system walidacji dla gości opracował Petermechanic
Forum komputerowe
Strona wygenerowana w 0,16 sekundy. Zapytań do SQL: 9