Łamana otwarta!

0

Hej!
Czy mógłby mi ktoś pomóc dokończyć zadanie? Jakoś nie mam pomysłu co z tym dalej zrobić...

/*
Napisz program polygonal, który czyta ze standardowego wejścia współrzędne punktów na płaszczyznie
aż do napotkania końca pliku i wypisuje na standardowe wyjście długość łamanej otwartej łączącej te
punkty, od pierwszego do ostatniego
np:
-0.3 7.5
9.5 -3.7
5.0 0.4
Wynik:
20.9699
*/

#include <iostream>
#include <cmath>

using namespace std;

double polygonal()
{
    double x1,x2,y1,y2,sume=0, sum=0;
    for(int index=0; cin>>x1>>y1>>x2>>y2; index++)
    {
        sum = pow((x2-x1),2)+pow((y2-y1),2);
        sume = sume + pow(sum,1/2);
        x1=x2;
        x2=x1;
    }
    cout<<sume;
}

int main()
{
    polygonal();
    return 0;
}
0

Najsampierw to ja bym zaczał od zrobienia funkcji obliczającej euklidesową (bo chyba o taką chodzi...) odległość między dwoma współrzędnymi.

0

A ile danych otrzymujesz w każdej linijce?

1
  1. liczysz długość dla co drugiego odcinka
  2. 1/2 to jest dzielenie całkowite wynik 0, a cokolwiek do potęgi zero daje 1
0

Chodzi o to, że program ma za zadanie obliczyć tyle odcinków ile poda użytkownik, np 2,8 albo 20.
Powinienem dodać zmienną x2 i y2, aby ją odjąć od x1 i y1?

#EDIT:
Nie jestem pewien, ale wynik mi wychodzi zupelnie inny niż w odpowiedzi do zadania.
14.8822.
Licząc odcinek AB wychodzi prawidłowo.

double polygonal()
{
    double x1,x2,y1,y2,sume=0;
    for(int index=0; cin>>x1>>y1>>x2>>y2; index++)
    {
        sume = sume + sqrt(pow(x2-x1,2)+pow(y2-y1,2));
    }
    cout<<sume;
}
0

Wczytujesz za dużo wartości. Wczytujesz 4 wartości, pozostają dwie. Musisz przypisać wczytane wartości do odpowiednich zmiennych i odczytywać po 2 wartości, a nie 4.

Tutaj prosty działający przykład bez walidacji, więc plik wejściowy MUSI BYĆ IDEALNY

#include <fstream>
#include <iostream>
#include <string>
#include <sstream>
#include <cmath>

class Point{
    double x,y;
public:
    double len(Point &point_two){
        double deltax = std::abs(x - point_two.x);
        double deltay = std::abs(y - point_two.y);
        return sqrt(deltax*deltax + deltay*deltay);
    }
    Point(double xi,double yi) : x(xi),y(yi){}
    Point(std::string &line) : x(0),y(0){
        std::stringstream ss(line);
        ss >> x;
        ss >> y;
    }
    ~Point(){}
};

double len_line_broken(std::fstream &file){
    //variables
    double sum = 0.0;
    std::string str;

    //initialize
    std::getline(file,str);
    Point p1(str);

    //summing
    while(std::getline(file,str)){
        Point p2(str);
        sum += p1.len(p2);
        p1 = p2;
    }
    return sum;
}

int main(int argc,char **argv){
    if(argc == 2){
        std::fstream file;
        file.open(argv[1]);
        if(file.is_open()){
            std::cout << "Broken line length: " << len_line_broken(file) << std::endl;
        }else{
            std::cout << "Bad file\n";
            return -1;
        }
        file.close();
    }
    return 0;
}

Wywołujesz to w konsoli tak:

skompilowany_program  plik_z_danymi.txt

przykład pliku z danymi (nie może zawierać dodatkowych pustych wierszy, bo program dodaje współrzędną 0.0 0.0):

-0.3 7.5
9.5 -3.7
5.0 0.4
1
double lengthOf2DCurve(istream& input)
{
     double x1, x2, y1, ,y2;
     double sum = 0;

     input >> x1 >> y1;
     while (input >> x2 >> y2) {
           sum += sqrt((x2-x1)*(x2-x1) +(y2-y1)*(y2-y1));
           x1 = x2; y1 = y2;
     }
     return sum;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0