Witam serdecznie,
Około dwa tygodnie temu napisałem program, który w najbliższych dniach muszę oddać, mamy także wyjaśnić słownie co program robi. Dane mam pięć punktów, program ma przejść przez wszystkie punkty, obliczyć najkrótszą trasę oraz powrócić do wskazanego przez nas punktu startowego. Chciałbym zapytać o ewentualne sugestie - czy warto o czymś dodatkowo wspomnieć lub może zmienić, aby program był bardziej funkcjonalny? Opisy znajdują się w komentarzach.
#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;
float dlugosc(int x1,int x2, int y1, int y2)
float dlugosc;
dlugosc=sqrt(pow(x2-x1,2)+pow(y2-y1,2)); //wzór, z którego będziemy korzystać
return dlugosc;
}
int main()
{
float suma_drogi=0,odleglosc_do_pierwszego=0; //wyzerowane zmienne, pomaga w uniknęciu błędów
int sasiad;
int x=0,y=0;
int iloscpkt=5;
int punkt_start=0;
float wspolrzedne[100][100]; // tablica na 100 zankow[?]
cout<<"Domyslna ilosc punktow: 5, "<<"podaj wspolrzedne x i y tych punktow: "<<endl;
for (int i=0,j=1;i<iloscpkt;i++,j++) //petla - wczytuje wspolrzedne punktow
{
cout<<"PUNKT "<<j<<" - "<<"wpolrzedna x"<< ": ";
cin>>x;
wspolrzedne[i][0]=x; //
cout<<"PUNKT "<<j<<" - "<<"wpolrzedna y"<< ": ";
cin>>y;
wspolrzedne[i][1]=y;
}
cout << "\nPunkt startowy: ";
cin>>punkt_start;
punkt_start--; // dekrementacja, wartosci w tablicy zaczynają się od zera, wybierajac punkt startowy 4, chodzilo nam o pozycje 3 w tablicy.
bool odwiedzone[iloscpkt];
for(int i=0;i<iloscpkt;i++)
odwiedzone[i]=false; //oznacza nam wszystkie miasta jako nieodwiedzone
odwiedzone[punkt_start]=true; //potem pierwszy punkt oznacza jako odwiedzony i kazdy kolejny, ktory zostanie odwiedzony
cout<<punkt_start+1; //miejsce w tablicy zaczyna sie od 0, stad dodajemy wartosc 1, bo chcemy wartość o 1 większą.
int temp = punkt_start; //zmienna tymczasowa, coś jak schowek [(pytanie po co)]
for(int i=0;i<iloscpkt-1;i++){
int x1=wspolrzedne[temp][0]; //pobiera dane z tablicy, wspolrzedne x,y
int y1=wspolrzedne[temp][1];
float dystans=0, najblizsza_odleglosc=0;
bool first = true; //oznacza miasto jako odwiedzone
for(int i=0;i<iloscpkt;i++){
cout<<setprecision(2); // precyzja - ilosc miejsc po przecinku
if(odwiedzone[i]==false) // jezeli punkt jest nieodwiedzony to liczymy odleglosc
{
dystans=dlugosc(x1,wspolrzedne[i][0],y1,wspolrzedne[i][1]); //wstawia do wzoru z metody wsporzedne
// cout<<"dyst: "<<dystans<<endl;
if(first == true){ // jesli odwiedzono punkt to juz go nie liczy
najblizsza_odleglosc = dystans+1;
first = false;
}
if(dystans != 0 && dystans < najblizsza_odleglosc)
{
najblizsza_odleglosc = dystans;
sasiad=i;
}
}
}
suma_drogi += najblizsza_odleglosc; //sumuje juz droge przebyta przez wszystkie pinkty
temp = sasiad;
odwiedzone[temp] = true;
cout<<" -> "<<sasiad+1;
}
cout<<setprecision(2);
cout<<" --> "<<punkt_start+1;
odleglosc_do_pierwszego=dlugosc(wspolrzedne[punkt_start][0],wspolrzedne[sasiad][0],wspolrzedne[punkt_start][1],wspolrzedne[sasiad][1]); //odleglosc z ostatniego pkt do pkt 1 startowego
cout<<"\nCalkowita dlugosc trasy: "<<odleglosc_do_pierwszego+suma_drogi;
return 0;
}
Wstawiam także przykład, na którym będę to przedstawiać - dla jasności.
