C++, stworzenie kolejnej pętli
Ostatnio zmodyfikowano 2014-12-06 14:44
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. 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; }
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 ]
|
|
pekfos |
» 2014-12-05 20:22:17 Niestety nie wypisuje tak jak trzeba gdy nie jest zachowana kolejność. |
Posortuj. |
|
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ć |
|
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. |
|
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. |
|
Virtual25 Temat założony przez niniejszego użytkownika |
» 2014-12-06 14:44:19 Sorry za post pod postem ale poratuje ktoś? |
|
« 1 » |