Glapa
Użytkownik-
Liczba zawartości
33 -
Rejestracja
-
Ostatnia wizyta
Glapa's Achievements
Nowy (1/15)
0
Reputacja
-
Ten zabieg nie pomoże, ponieważ błąd pojawia się w pliku nagłówkowym. Proponuję przyzwyczaić się do opisywania wskaźników bez białego znaku po typie lub przed nazwą zmiennych (metoda formatowania C/C++). Wydaje mi się, że problem stanowi odwołanie do węzła poprzez operator '::'. Spróbuj zamiast niego użyć: DLista<typ>.wezel *wybrany;
-
@up good point dodam jeszcze tylko, że przy końcu równi pochyłej zmianie ulegnie składowa pionowa prędkości. Obiekt będzie leciał dalej przy wzroście kąta do 45 stopni( maleje tarcie wraz ze wzrostem , a następnie zacznie maleć. Wynika to z faktu, że po przekroczeniu kąta 45 stopni zacznie znacząco maleć składowa pozioma przyspieszenia.
-
po pierwsze zerknij tutaj :obrazek W tym momencie interesuje nas najbardziej wzór na przyspieszenie ciała. Widzimy w nim dwie straszne funkcje trygonometryczne ;) i współczynnik tarcia. Zacznijmy od różnych kątów dla tej samej powierzchni. Współczynnik tarcia jest taki sam więc interesują nas tylko wartości cos i sin dla danego kąta. Kiedy zwiększamy kąt nasz cos maleje, a sin rośnie w związku z czym ciało będzie miało większe przyspieszenie i tym samym poleci dalej. Oczywiście dla powierzchni gładkiej współczynnik tarcia jest mniejszy, a więc ciała puszczone na tej równi polecą dalej niż z chropowatej. Teraz kwestia kształtu obiektów. Jeśli kulka i klocek to kulka poleci dalej (mniejsza powierzchnia styczna a tym samym mniejsze tarcie no i kulka się toczy, a klocek zsuwa. Jeżeli kulka i samochód to zależy od kształtu i oporów powierza )
-
pierwsza część jest prosta << to inaczej *2, a >> to inaczej /2. Musisz wykonać operację przesunięcia w lewo (<<) dwa razy, a w prawo (>>) trzy. W dziesiętnej to raczej nie problem bo używasz cout<<w1<<" "<<w2; natomiast jeśli chodzi o postać szesnastkową cout.setf(ios::hex,ios::basefield); if(w1<0) { w1=w1*(-1); cout<<"-"<<w1; } else { cout<<w1; } i powtarzasz to dla w2 P.S zakładam że w1 i w2 są całkowite (int). A teraz pytanie ode mnie. Piszę program w javie na pojemniki i ambitnie mam coś takiego: package baza0; import javax.swing.*; import java.util.*; class Osoba { String imie=""; String nazwisko=""; float srednia=0; int indeks=0; public void Nadaj_imie(String imie_) { imie=imie_; } public String Podaj_imie() { return imie; } public void Nadaj_nazwisko(String nazw_) { nazwisko=nazw_; } public String Podaj_nazwisko() { return nazwisko; } public void Nadaj_srednia(float srednia_) { srednia=srednia_; } public float Podaj_srednia() { return srednia; } public void Nadaj_indeks(int indeks_) { indeks=indeks_; } public int Podaj_indeks() { return indeks; } public String OsobatoString() { String napis=""; napis+="Imię: "+imie; napis+="\nNazwisko: "+nazwisko; napis+="\nŚrednia: "+srednia; napis+="\nNumer indeksu: "+indeks; return napis; //zwraca dane zamienione na napis } public boolean Szukaj(String S1,String S2) { return (imie.equals(S1)&&nazwisko.equals(S2)); } } class Tablica { Osoba Dane[]=null; int ile=0; public boolean Pusta() { return ile==0; } public boolean Pelna() { return ile==Dane.length; } public int Podaj_ile() { return ile; } public void alokuj_tablice(int N) { ile=0; Dane=new Osoba[N]; //utworzenie tablicy } public void Wstaw(String imie_,String nazwisko_,float srednia_,int indeks_) { Osoba dana=new Osoba(); //tworzy aktualną osobę dana.Nadaj_imie(imie_); dana.Nadaj_nazwisko(nazwisko_); dana.Nadaj_srednia(srednia_); dana.Nadaj_indeks(indeks_); Dane[ile]=dana; //wstawia na odpowiednią pozycję wpisane dane ile++; } public Osoba Wyszukaj(String S1,String S2) { for(int i=0;i<ile;i++) { if (Dane[i].Szukaj(S1,S2)) { return Dane[i]; } } return null; //zwraca 0 jak nie znalazlo } public String TablicatoString() { String S=""; for(int i=0;i<ile;i++) { S+=Dane[i].OsobatoString()+"\n"; } return S; //zwraca zawartość całej tablicy } } public class Baza0 { protected Tablica tablica=new Tablica(); public void Wyswietl() { if (tablica.Pusta())//jesli tablica nie istnieje, to nie można wyswietlac { JOptionPane.showMessageDialog(null,"Brak danych"); } else { JOptionPane.showMessageDialog(null,tablica.TablicatoString()); } } public void Wypelnij() { String S1,S2,S3,S4; S1=JOptionPane.showInputDialog(null,"Podaj rozmiar tablicy"); int N=Integer.parseInt(S1); tablica.alokuj_tablice(N); //utworzenie tablicy while(!tablica.Pelna()) //jeśli tablica jest zapełniona, tak jest równe false { S1=JOptionPane.showInputDialog(null, "Podaj imię"); S2=JOptionPane.showInputDialog(null, "Podaj nazwisko"); S3=JOptionPane.showInputDialog(null, "Podaj średnią"); S4=JOptionPane.showInputDialog(null, "Podaj nr indeksu"); tablica.Wstaw(S1,S2,Float.parseFloat(S3),Integer.parseInt(S4));//dopisanie danych na końcu danych } } public void Wyszukaj() { if (tablica.Pusta())//jesli tablica nie istnieje, to nie można wyszukać { JOptionPane.showMessageDialog(null,"Brak danych"); } else { String S1=JOptionPane.showInputDialog(null,"Podaj Imię"); String S2=JOptionPane.showInputDialog(null,"Podaj Nazwisko"); Osoba osoba=tablica.Wyszukaj(S1,S2); if(osoba!=null) { JOptionPane.showMessageDialog(null,osoba.OsobatoString()); } else { JOptionPane.showMessageDialog(null,"Nic nie znalazłem!", "Błąd", 0); } } } static public void main(String args[]) { Baza0 baza=new Baza0(); //referencja do tablicy, która jest tworzona w opcji 1 char a; String S; do { S=JOptionPane.showInputDialog(null, "Progam nie jest zabezpieczony przed\n" + "złym formatem danych\n i naciskaniem Cancel w okienkach dialogowych\n"+ "Podaj wybor"+ "\n1 - Wypelnij tablice,"+ "\n2 - Wyswietl dane osob"+ "\n3 - Wyszukaj osobe i wyswietl jej dane"+ "\nk - Koniec programu"); a=S.charAt(0); //pobranie opcji switch(a) { case '1': baza.Wypelnij(); break; case '2': baza.Wyswietl(); break; case '3': baza.Wyszukaj(); break; case 'k': JOptionPane.showMessageDialog(null, "Koniec programu"); break; default : JOptionPane.showMessageDialog(null,"Zla opcja"); } }while(a!='k'); System.exit(0); } } Moje pytanie brzmi: Jeżeli dodam Osoba nastepny; do klasy Osoba i później jak będę usuwał powiedzmy element Tablica Dane[3]; wykonując: Tablica Dane[2].nastepny=Dane[4]; Dane[3]=null; , to czy ta tablica obiektów klasy Osoba będzie widziała nowy układ czy muszę zrobić to na samych referencjach do kolejnych obiektów lub przenosząc ostatni element i usuwając go?
-
Jako debiutant przed wyjazdem miałem pewne obawy jak to będzie. Zaraz po przywitaniu się ze wszystkimi wiedziałem, że nie może być źle i oczywiście nie było. Dzięki za mile spędzonych kilka dni (szkoda tylko, że nie mogłem zostać do końca). Oby więcej tak udanych zjazdów, na których mam nadzieję się pojawić .
-
pytanie trochę z innej beczki :P jak w html-u (może być z użyciem css) sprawić, że zawartość strony będzie wyśrodkowana w zależności od rozdzielczości (np. tak jak na nk :P)
-
OK więc ja poproszę LBL do tego czarny napis rozmiar S
-
Witam mam pytania dwa . Czy mógłbym przelać kasę we wtorek np? bo rodzice wyjechali, a ja wyczyściłem swoje konto więc do poniedziałku nie dam rady. A drugie bardziej związane z koszulkami :P jak wygląda złoty metalik (napis)? :P
-
logowanie do youtube jest na połączeniu zabezpieczonym (https) które korzysta z innego portu niż zwykłe strony. Najlepszym sposobem na rozwiązanie problemu będzie udanie się lub telefon do providera i zgłoszenie problemu bo najprawdopodobniej coś jest nie tak u nich skoro po formacie nie ma zmian.
-
po pierwsze cin>> i cout<< nie obsługują stringów więc powinno to wyglądać tak: #include <iostream> #include <iomanip> #include <fstream> #define MIN 1 #define MAX 49 #define N 20 using namespace std; struct kupon { int liczby[6]; }; struct glowna { int ile_zakladow; char nazwisko[30]; kupon a; }; struct lista { string nazwa_pliku; }; void lista_plikow(lista &p, string nazwa, ofstream &plik3); void wczytaj (glowna p[], ifstream &plik2, ofstream &plik); void losuj(int tab[6]); void wypisz(int tab[6]); void otworz(glowna p[], lista r[], ifstream &plik5, ifstream &plik4); string nazwa; string nazwa2; int main() { //int licznik=0; int wylosowane_liczby[6]; int pula_nagrod, ile_losowan; int wybor; while(wybor!=3){ cout<<"Witam w symulatorze duzego lotka\n"<<"Autor: Misiek\n\n"<<"Co chcesz wykonac?\n"<<"(1) Wprowadz kupon\n"; cout<<"(2) Rozpocznij symulacje\n"<<"(3) Wyjscie\n"; cout<<endl; ofstream plik, plik3; ifstream plik2, plik4, plik5; cin>>wybor; switch(wybor) { case 1:{ //licznik=licznik+1; lista zmienna; glowna tab[N]; cout<<"Podaj nazwe pliku(format: numer.txt gdzie \"numer\" to kolejna liczba zaczynajac od 1, a konczac na 20)\n"; nazwa=getchar(); //nazwa=licznik; lista_plikow(zmienna, nazwa, plik3); wczytaj(tab, plik2, plik); break; } case 2:{ /* cout<<"Podaj pule nagrod:\n"; cin>>pula_nagrod; cout<<"Ile losowan chcesz wykonac?\n"; cin>>ile_losowan; for(int i=0; i<ile_losowan; i++) { cout<<"W kasetach maszyn losujacych znajduje sie odpowiednia ilosc kul."; _sleep(3000); system("cls"); cout<<"Komory maszyn losujacych sa puste."; _sleep(3000); system("cls"); cout<<"Nastepuje zwolnienie blokady i rozpoczynamy losowanie 6 liczb."; _sleep(3000); system("cls"); srand(time(NULL)); losuj(wylosowane_liczby); cout<<"Wylosowano nastepujace liczby: \n"; wypisz(wylosowane_liczby); float trojka, czworka, piatka, szostka; trojka=((pula_nagrod*10)/100); czworka=((pula_nagrod*15)/100); piatka=((pula_nagrod*20)/100); szostka=pula_nagrod; cout<<"Pula nagrod wynosi: "<<pula_nagrod<<endl; cout<<"Za trafienie trojki mozna wygrac: "<<trojka<<"\n"; cout<<"Za trafienie czworki mozna wygrac: "<<czworka<<"\n"; cout<<"Za trafienie piatki mozna wygrac: "<<piatka<<"\n"; cout<<"Za trafienie szostki mozna wygrac: "<<szostka<<"\n"; */ glowna tab2[N]; lista taba[N]; otworz(tab2, taba, plik5, plik4); cout<<endl; //} break; } case 3: break; default: cout<<"Zly klawisz"; } } system("Pause"); } void wczytaj (glowna p[], ifstream &plik2, ofstream &plik) { plik.open(nazwa.c_str(), ios::out); cout<<"Podaj liczbe zakladow, ktore chcesz zagrac\n"; cin>>p[0].ile_zakladow; plik <<p[0].ile_zakladow<<endl; plik2.open(nazwa.c_str(), ios::in); plik2 >> p[0].ile_zakladow; int zm=p[0].ile_zakladow; //cout<<zm<<endl; for (int i=0; i<zm; i++) { cout<<"Wypelnij "<<i+1<<" zaklad, wpisujac kolejno nazwisko, a potem 6 liczb z zakresu <1,49>\n"; cout<<"Podaj nazwisko\n"; cin.get(); cin.getline(p[i].nazwisko, 30); plik <<p[i].nazwisko<<endl; for (int j=0; j<6; j++) { do{ cout<<"Podaj "<<j+1<<" liczbe: __\b\b"; cin>>p[i].a.liczby[j]; if (p[i].a.liczby[j]<1 || p[i].a.liczby[j]>49) { cout<<"Przekroczono zakres. Dostepne liczby z zakresu <1,49>\n Wpisz jeszcze raz\n"; } }while(p[i].a.liczby[j]<1 || p[i].a.liczby[j]>49); } for (int k=0; k<6; k++) { plik<<p[i].a.liczby[k]<<endl; } } plik2.close(); plik.close(); } void losuj(int tab[6]) { int i=0; while(i<6) { tab[i]=rand()%(MAX-MIN+1)+MIN; for(int z=0; z<i; z++) { if (tab[z]==tab[i]) i=i-1; } i+=1; } } void wypisz(int tab[6]) { for (int i=0; i<6; i++) { cout<<setw(4)<<tab[i]; } cout<<"\n"; } void otworz(glowna p[], lista r[], ifstream &plik5, ifstream &plik4) { plik4.open("lista.txt", ios::in); for (int k=0; k<EOF; k++) for (int g=0; g<EOF; g++) { plik4 >>r[k].nazwa_pliku[g]; plik5.open(r[k].nazwa_pliku[g], ios::in); plik5>>p[0].ile_zakladow; int zm=p[0].ile_zakladow; for (int i=0; i<zm; i++) { plik5.ignore(); plik5.getline(p[i].nazwisko, 30); for (int j=0; j<6; j++) { plik5 >> p[i].a.liczby[j]; } } //test czy dobrze wyswietla kazdy kolejny otworzony plik for (int m=0; m<zm; m++) { cout<<endl; cout<<"ile zakladow: "<<zm<<endl; cout<<"nazwisko: "<<p[m].nazwisko<<endl; for (int n=0; n<6; n++) { cout<<p[m].a.liczby[n]<<endl; } } } plik5.close(); plik4.close(); } void lista_plikow(lista &p, string nazwa, ofstream &plik3) { plik3.open("lista.txt", ios::app); p.nazwa_pliku=nazwa; plik3<<p.nazwa_pliku.c_str()<<endl; plik3.close(); } kolejnym problemem jest otwieranie plik5 ponieważ funkcja open przyjmuje jako pierwszy parametr wskaźnik na ciąg znaków więc musiałbyś wrzucić tą nazwe z r.nazwa... do jakiejś tablicy char (nie wiem jaki format mają te pliki więc nie dodawałem tego) i w parametrze przekazujesz wtedy wskaźnik na tą tablice.
-
ok moze pomysł mój był nie przemyślany ale można po prostu utworzyć tablice charów w formie nazwa["i.txt"] dzięki czemu odwołując się do 1 wiersza dostaniemy 1.txt i to można wrzucić do wczytaj.
-
a nie dało by jakoś na ciągu znaków zrobić np char nazwa [10]="temp0.txt"; i później w pętli przy tworzeniu plików dawać nazwa [4]=(char)i; nazwa[9]='\0'; przez to po kazdym dodaniu mozna zwiekszać i i rzutować jako czar do nazwy pliku a później już normalnie pli.open(nazwa,ios::out);
-
if (p[i].a.liczby[j]<1 [color="#FF0000"][font="Arial Black"]||[/font][/color] p[i].a.liczby[j]>49) { cout<<"Przekroczono zakres. Dostepne liczby z zakresu <1,49>\n"; system("Pause"); } Dałeś iloczyn zamiast sumy co powodowało, że zdarzenia wzajemnie się wykluczały ja tutaj bym się jeszcze pokusił o małą modernizacje i zamiast if dał: do { cout<<"Podaj "<<j+1<<" liczbe: __\b\b"; cin>>p[i].a.liczby[j]; if (p[i].a.liczby[j]<1 || p[i].a.liczby[j]>49) { cout<<"Przekroczono zakres. Dostepne liczby z zakresu <1,49>\nWpisz jeszcze raz\n"; } }while(p[i].a.liczby[j]<1 || p[i].a.liczby[j]>49) Co pozwoli na poprawienie ewentualnej pomyłki bez ponownego uruchamiania.
-
Hejka ja dalej mecze się nad tym projektem... Wydaje mi się, że poczyniłem duże postępy ale mimo wszystko brakuje mi jeszcze jednej opcji ostatniej już, której bym potrzebował i jest to wykluczenie, jednego lub kilku odcinków z poprzednich tras podstawowych w celu wyznaczenia kolejnej trasy podstawowej. Poniżej zamieszczam kod (funkcja która powinna usuwać te połączenia zaznaczona na czerwono). I tutaj rodzi się moje pytanie/prośba czy wie ktoś lub ma chociaż pomysł na to jak tego dokonać ponieważ jak na razie ta funkcja nie działa :doh!: #include "stdafx.h" #include <iostream> #include <fstream> #define INFINITY 4194304 using namespace std; void printD(int n,long *d) { cout<<"Odleglosc:"; cout.width(10); cout<<d[n]; cout<<endl; } /* * Wyświetla najkrótszą trasę pomiedzy początkiem a końcem. * * dijkstra(int) musi być przynajmnije raz wywołana przed wyświetleniem */ void printPath(int dest,int *prev,long **dist) { if(prev[dest]!=-1) { dist[prev[dest]][dest]=0; printPath(prev[dest],prev,dist); } cout<<dest<<" "; } [color="red"]void wyklucz(int dest,int *prev,long **dist,int ile) { ile=0; if(prev[dest]!=-1) { for(int j=0;j<dest;j++) { if(dist[prev[dest]][j]>0&&dist[prev[dest]][j]<INFINITY) { ile++; } } if(ile>2) { dist[prev[dest]][dest]=0; wyklucz(prev[dest],prev,dist,ile); } else wyklucz(prev[dest],prev,dist,ile); } }[/color] void printBackup(int dest,int *prev) { if(prev[dest]!=-1) printBackup(prev[dest],prev); cout<<dest<<" "; } void get(int &u, int &v,int &w,int &e,long **dist,char *source) { ifstream plik; plik.open(source,ifstream::in); plik>>e; for(int i=0;i<e;++i) { plik>>u; plik>>v; plik>>w; dist[u][v]=w; } plik.close(); } void dijkstra(int s,int n,int e,int *prev,long *d,long **dist,int al) { int mini; int *visited; visited=new int[al]; for (int i=1;i<=n;++i) { d[i]=INFINITY; prev[i]=-1; // droga do i jeszcze nie znaleziona visited[i]=0; // i-ty element nie odwiedzony } d[s]=0; for(int k=1;k<=n;++k) { mini=-1; for(int i=1;i<=n;++i) if (!visited[i]&&((mini==-1)||(d[i]<d[mini]))) mini=i; visited[mini]=1; for(int i=1;i<=n;++i) { if(dist[mini][i]) { if(d[mini]+dist[mini][i]<d[i]) { d[i]=d[mini]+dist[mini][i]; prev[i]=mini; } } } } } int MAX(int a,int b) { if(a>b) return a; else return b; } int main(int argc, char *argv[]) { int u=0,v=0,w=0; //u- wierzchołek początkowy v- końcowy w- waga int e=0,n=0; //e- Ilość niezerowych krawędzi n- ilosc wierzchołków int ile=0,al; //ile - przechowuje ilość krawędzi wierzchołka aby nie zrywać połączenia przy blokowaniu krawędzi al- wielkosc tablic long **dist; // dist[i][j] odległość pomiędzy i,j jeżeli brak =0 long *d; // d[i] odległość pomiędzy początkiem, a wierzchołkiem i int *prev; // prev[i] wiechołek poprzedzający i na wyszukanej trasie int *temp; //zmienna zapasowa do wyznaczania trasy zaasowej ifstream plik; char source[1000]; cout<<"Podaj sciezke do pliku:\n"; cin>>source; plik.open(source,ifstream::in); if(plik.is_open()) { plik>>e; n=-1; for(int i=0;i<e;++i) { plik>>u>>v>>w; n=MAX(u,MAX(v,n)); } plik.close(); al=MAX(e,n); al++; d=new long[al]; prev=new int[al]; dist=new long*[al]; for(int i=0;i<al;i++) { dist[i]=new long[al]; } for(int i=0;i<al;++i) { for(int j=0;j<al;++j) { dist[i][j]=0; } } get(u,v,w,e,dist,source); dijkstra(1,n,e,prev,d,dist,al); temp=new int[al]; for(int i=0;i<al;i++) temp[i]=prev[i]; cout<<"Droga podstawowa: "; printPath(n,temp,dist); cout<<endl; printD(n,d); cout<<endl; dijkstra(1,n,e,temp,d,dist,al); cout<<"\nDroga zapasowa: "; printBackup(n,temp); cout<<endl; printD(n,d); get(u,v,w,e,dist,source); wyklucz(n,prev,dist,ile); cout<<endl; cout<<endl; dijkstra(1,n,e,prev,d,dist,al); for(int i=0;i<al;i++) temp[i]=prev[i]; cout<<"Droga podstawowa: "; printPath(n,temp,dist); cout<<endl; printD(n,d); cout<<endl; dijkstra(1,n,e,temp,d,dist,al); cout<<"\nDroga zapasowa: "; printBackup(n,temp); cout<<endl; printD(n,d); get(u,v,w,e,dist,source); int x =0; wyklucz(n,prev,dist,ile); cout<<endl; cout<<endl; dijkstra(1,n,e,prev,d,dist,al); for(int i=0;i<al;i++) temp[i]=prev[i]; cout<<"Droga podstawowa: "; printPath(n,temp,dist); cout<<endl; printD(n,d); cout<<endl; dijkstra(1,n,e,temp,d,dist,al); cout<<"\nDroga zapasowa: "; printBackup(n,temp); cout<<endl; printD(n,d); } else { cout<<"Blad otwarcia pliku.\n"; } cout<<endl; system("PAUSE"); return 0; }
-
ok coś mi sie udało ogarnąć z dużą pomocą wójka googla. Na chwilę obecną mam coś takiego: #include "stdafx.h" #include <stdio.h> #define GRAPHSIZE 2048 #define INFINITY GRAPHSIZE*GRAPHSIZE #define MAX(a, b) ((a > b) ? (a) : (b)) int e; /* The number of nonzero edges in the graph */ int n; /* The number of nodes in the graph */ long dist[GRAPHSIZE][GRAPHSIZE]; /* dist[i][j] is the distance between node i and j; or 0 if there is no direct connection */ long d[GRAPHSIZE]; /* d[i] is the length of the shortest path between the source (s) and node i */ int prev[GRAPHSIZE]; /* prev[i] is the node that comes right before i in the shortest path from the source to i*/ void printD() { int i; printf("Distances:\n"); for (i = 1; i <= n; ++i) printf("%10d", i); printf("\n"); for (i = 1; i <= n; ++i) { printf("%10ld", d[i]); } printf("\n"); } /* * Prints the shortest path from the source to dest. * * dijkstra(int) MUST be run at least once BEFORE * this is called */ void printPath(int dest) { if (prev[dest] != -1) printPath(prev[dest]); //wyznacza trase printf("%d ", dest); } void dijkstra(int s) { int i, k, mini; int visited[GRAPHSIZE]; for (i = 1; i <= n; ++i) { d[i] = INFINITY; prev[i] = -1; /* no path has yet been found to i */ visited[i] = 0; /* the i-th element has not yet been visited */ } d[s] = 0; for (k = 1; k <= n; ++k) { mini = -1; for (i = 1; i <= n; ++i) if (!visited[i] && ((mini == -1) || (d[i] < d[mini]))) mini = i; visited[mini] = 1; for (i = 1; i <= n; ++i) if (dist[mini][i]) if (d[mini] + dist[mini][i] < d[i]) { d[i] = d[mini] + dist[mini][i]; prev[i] = mini; } } } int main(int argc, char *argv[]) { int i, j; int u, v, w; FILE *fin = fopen("dist.txt", "r"); fscanf(fin, "%d", &e); for (i = 0; i < e; ++i) for (j = 0; j < e; ++j) dist[i][j] = 0; n = -1; for (i = 0; i < e; ++i) { fscanf(fin, "%d%d%d", &u, &v, &w); dist[u][v] = w; n = MAX(u, MAX(v, n)); } fclose(fin); dijkstra(1); printD(); printf("\n"); for (i = 1; i <= n; ++i) { printf("Path to %d: ", i); printPath(i); printf("\n"); } getchar(); return 0; } póki co nie jest to wersja optymalna bo nie bawiłem się w usuwanie zmiennych globalnych i ustalanie tablic dynamicznych bo dopiero co znalazłem jakiś sensowny algorytm który w dużej częsci mi sie przydał. Dodałem też funkcje, która wyznacza trasę. Teraz mam pytanie czy da sie w jakiś prosty sposób na wykluczenie tej wyznaczonej trasy z kolejnego sprawdzania?