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

C++, stworzenie kolejnej pętli

Ostatnio zmodyfikowano 2014-12-06 14:44
Autor Wiadomość
Virtual25
Temat założony przez niniejszego użytkownika
C++, stworzenie kolejnej pętli
» 2014-12-05 20:04:14
Witam, jestem początkującym programistą i mam takie zadanie które wiem w jaki sposób wykonać ale nie wiem jak to zapisać. Zadanie polega na tym że wprowadzamy dane czyli nazwę zadania, ilość dni ile zadanie jest wykonywane i poprzedników zadania jeśli ma. Na wyjściu program ma wypisać nazwę zadania z przypisanymi datami, zadania rozpoczynamy od 1.02.2014 i jeśli np wprowadzimy zadanie A i ma trwać dwa dni i nie ma poprzedników to się zakończy 2.02.2014 i tak dalej jeśli podamy zadanie B i ma poprzednika A i trwa 3 dni to zacznie się zadanie 3.02.2014 i zakończy 5.02.2014. Zrobiłem to za pomocą tablicy relacji która wypisuje 1 gdy są poprzednicy i 0 gdy nie ma poprzedników. Problem pojawia się gdy zadania np dla zadania B damy poprzednika jakiegoś następnego C i wtedy na początku powinien wykonać zadanie A, potem zadanie C które ma poprzednika A i na końcu zadanie B. Niestety nie wypisuje tak jak trzeba gdy nie jest zachowana kolejność. Wiem że trzeba zrobić 3 pętlę żeby kilka razy sprawdzało mi tablicę czy są 0 i 1. Dodam jeszcze że tablica relacji sprawdza wiersz pierwszy i gdy są zera to wykonuje zadanie i zeruje kolumnę pierwszą i tak dalej, powinno robić że gdy napotka 1 powinno dalej przechodzić ale nie wiem jak to zrobić. Wklejam kawałek programu, ale niestety nie wiem jak to tak ładnie wkleić jak w innych tematach. Z góry przepraszam.


C/C++
// pętle wypisujące tablice relacji pomiedzy zadaniami
for( int i = 0; i < liczba_zadan; i++ )
{
    for( int j = 0; j < liczba_zadan; j++ )
    {
        if( nazwa[ j ] == zad_poprz[ i ] || nazwa[ j ] == zad_poprz2[ i ] )
             tab_rel[ i ][ j ] = 1;
        else tab_rel[ i ][ j ] = 0;
       
    }
}
for( int i = 0; i < liczba_zadan; i++ )
{
    for( int j = 0; j < liczba_zadan; j++ )
    {
        cout << setw( 3 ) << tab_rel[ i ][ j ];
    }
    cout << endl;
}
// pętle sprawdzające elementy które są jedynkami i zerujące kolumny



for( int i = 0; i < liczba_zadan; i++ )
{
    for( int j = 0; j < liczba_zadan; j++ )
    {
        if( tab_rel[ i ][ j ] == 0 )
        {
            czy_pusta = true;
        }
        else
        {
            czy_pusta = false;
            break;
        }
    }
   
   
    for( int j = 0; j < liczba_zadan; j++ )
    {
        if( czy_pusta )
        {
            tab_rel[ j ][ i ] = 0;
            if( liczba_zad_poprz[ i ] == 1 )
            {
                poczatek[ i ] = koniec[ i - 1 ] + 1000000;
                koniec[ i ] = poczatek[ i ] +( liczba_dni[ i ] - 1 ) * 10 * 10 * 10 * 10 * 10 * 10;
            }
            else if( liczba_zad_poprz[ i ] == 2 )
            {
                poczatek[ i ] = max( koniec[ i - 1 ], koniec[ i - 2 ] ) + 1000000;
                koniec[ i ] = poczatek[ i ] +( liczba_dni[ i ] - 1 ) * 10 * 10 * 10 * 10 * 10 * 10;
            }
        }
    }
}
[ / i ]
P-122272
pekfos
» 2014-12-05 20:22:17
Niestety nie wypisuje tak jak trzeba gdy nie jest zachowana kolejność.
Posortuj.
P-122273
Virtual25
Temat założony przez niniejszego użytkownika
» 2014-12-05 21:33:21
No wolałbym żeby ktoś pomógł za pomocą 3 pętli to zrobić
P-122278
pekfos
» 2014-12-05 21:36:04
Z tego co rozumiem, chcesz na podstawie danych określać, jak głębokie ma być zagnieżdżenie pętli..? W takim wypadku rekurencja - można to zrobić, ale to nie ma większego sensu. Do sortowania wg zależności jest Topological Sorting.
P-122279
Virtual25
Temat założony przez niniejszego użytkownika
» 2014-12-05 21:52:08
To jest projekt który mam do zrobienia i tabela relacji którą stworzyłem działa w taki sposób że po lewej stronie tak jakby są zadania do wykonania a u góry poprzednicy. Np Zadania A nie ma poprzednika czyli wiersz 0 ma same zera, dalej zadanie B ma poprzednika A czyli w wierszu drugim będzie jedna jedynka w kolumnie pierwszej. Ta tabela relacji ma po kolei się zerować, zadanie zostanie wykonane gdy same zera będą w wierszu, a następnie zerować kolumnę o tym samym indeksie. I właśnie działa wszystko gdy np zachodzi relacja:

0  0  0
1  0  0
1  1  0

a nie zachodzi gdy zadania mają późniejszych poprzedników czyli:

0  0  0
0  0  1
1  0  0
Powinno wykonać zadanie pierwsze, później trzecie a na koniec drugie niestety tak to nie działa mi i policzy zadanie pierwsze dobrą datę a następnie jakieś głupoty wypisuje, doradzono mi żeby stworzyć jeszcze pętlę że jeśli przejdzie raz sprawdzenie tablicy to żeby jeszcze raz później sprawdziło czy są jedynki jeszcze.
P-122284
Virtual25
Temat założony przez niniejszego użytkownika
» 2014-12-06 14:44:19
Sorry za post pod postem ale poratuje ktoś?
P-122348
« 1 »
  Strona 1 z 1