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

Wczytywanie danych z pliku.

Ostatnio zmodyfikowano 2017-06-08 08:43
Autor Wiadomość
zinu96
Temat założony przez niniejszego użytkownika
Wczytywanie danych z pliku.
» 2017-06-08 01:18:09
Cześć, piszę z problemem w C++.

Mam za zadanie stworzyć program do aproksymacji liniowej, wczytujący dane punkty tj. współrzędne x i y z pliku tekstowego, a następnie liczący i podający parametry linii prostej. Program stworzyłem, ale taki w którym podaję liczbę punktów oraz x i y z klawiatury. Jak zrobić to z pliku? Zakładając, że w pliku będę miał dwie kolumny: wartości x oraz wartości y. W danym wierszu x i y będa odzielone jakimś separatorem. Czy jest ktoś w stanie pomóc z napisaniem takiego programu? Jak dobrze rozumiem. Dane x i y z notatnika trzeba wrzucić do dwóch tablic, a następnie liczyć analogicznie jak w przypadku wczytywania z klawiatury. Co do wczytywania znam tylko funkcję getline. Chciałbym zaznaczyć, że jestem początkującym. Cały wieczór spędziłem nad rozwiązaniem problemu i nic nie znalazłem.
P-162226
zinu96
Temat założony przez niniejszego użytkownika
» 2017-06-08 01:22:09
C/C++
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <vector>
#include <math.h>

using namespace std;

/*
struct punkt
{
    double x;
    double y;
};


*/

/* cout << "Wczytywanie danych x, y" << endl << endl;
    fstream plik;
    plik.open("X:\\Mikołaj Pilch Projekt\\dane.txt");
    if (plik.good())
    {
        vector<punkt> wspolrzedne;
        while (!plik.eof())
            {
                getline(plik, );
                n++;
            }
    }
    */

//plik.close();

int main( int argc, char * argv[] )
{
   
    int i;
    int n;
   
    double sum_x = 0,
    sum_y = 0,
    sum_xy = 0,
    sum_x2 = 0,
    a,
    b,
    ub,
    ua,
    s,
    pierwua,
    pierwub,
    sum_y2 = 0,
    pierws,
    sumxs2 = 0,
    sumys2 = 0,
    sredniax = 0,
    sumax = 0,
    sumay = 0,
    sredniay = 0,
    licznik = 0,
    r;
   
   
   
   
    cout << "Podaj ilosc punktow: ";
   
    cin >> n;
    cout << endl << endl;
    double x[ n ];
    double y[ n ];
   
    for( i = 0; i < n; i++ )
    {
        cout << "Podaj x: ";
        cin >> x[ i ];
        cin.ignore();
        cout << endl;
        cout << "Podaj y: ";
        cin >> y[ i ];
        cin.ignore();
        cout << endl;
    }
    cout << "Aproksymacja liniowa do postaci y=ax+b " << endl;
   
    for( i = 0; i < n; i++ )
    {
        sumax = sumax + x[ i ];
        sumay = sumay + y[ i ];
    }
   
    sredniax = sumax / n;
    sredniay = sumay / n;
   
   
    for( i = 0; i < n; i++ )
    {
        sum_x = sum_x + x[ i ];
        sum_y = sum_y + y[ i ];
        sum_xy = sum_xy + x[ i ] * y[ i ];
        sum_x2 = sum_x2 + x[ i ] * x[ i ];
        sum_y2 = sum_y2 + y[ i ] * y[ i ];
        sumxs2 = sumxs2 +( x[ i ] - sredniax ) *( x[ i ] - sredniax );
        sumys2 = sumys2 +( y[ i ] - sredniay ) *( y[ i ] - sredniay );
        licznik = licznik +( x[ i ] - sredniax ) *( y[ i ] - sredniay );
       
    }
   
    a =( n * sum_xy - sum_x * sum_y ) /( n * sum_x2 - sum_x * sum_x );
   
    b =( sum_y - a * sum_x ) / n;
   
    ua =( n *( sum_y2 - a * sum_xy - b * sum_y ) ) /(( n - 2 ) *( n * sum_x2 - sum_x * sum_x ) );
   
    pierwua = sqrt( ua );
    ub =( pierwua * pierwua * sum_x2 ) / n;
    pierwub = sqrt( ub );
   
   
   
    cout << "Rownanie lini prostej wynosi y=" << a << "x+" << b << endl;
   
    cout << "Blad u(a) wynosi: " << pierwua << endl;
    cout << "Blad u(b) wynosi: " << pierwub << endl;
   
   
   
    s = sumxs2 * sumys2;
    pierws = sqrt( s );
    r = licznik / pierws;
    cout << "Wspołczynnik korelacji Pearsona wynosi: " << r << endl;
   
   
   
   
   
    cin.get();
    return EXIT_SUCCESS;
}

To mój kod.
P-162227
darko202
» 2017-06-08 07:41:02
P-162238
czaffik
» 2017-06-08 08:43:51
Dla separatora który jest spacją
(plik .txt wygląda tak:
1 2
2 3
4 2
)

można napisać tak: (zwróć uwagę na instrukcję plik >> tekst).
C/C++
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
using namespace std;

struct Wektor2D
{
    float x;
    float y;
};

int main( int argc, char * argv[] )
{
    fstream plik; // "wskaźnik" na plik
    stringstream bufor;
    plik.open( "test.txt", ios::in );
   
    vector < Wektor2D > dane;
    Wektor2D wektor;
   
    string tekst;
    while( !plik.eof() ) // powtarzaj dopóki wskaźnik czytający nie trafi na znak końca pliku
    {
        plik >> tekst; // instrukcja odczytuje łańcuchy znaków do napotkania pierwszego białego znaku
       
        bufor << tekst; // konwersja stringa na float
        bufor >> wektor.x;
        bufor.str( "" );
        bufor.clear();
       
        plik >> tekst;
        bufor << tekst;
        bufor >> wektor.y;
        bufor.str( "" );
        bufor.clear();
       
        dane.push_back( wektor );
    }
   
    for( const auto & d: dane ) cout << d.x << " " << d.y << "\n";
   
    return 0;
}

dla innych separatorów będziesz musiał trochę się namęczyć z własnościami klasy string.
Przykład dla przecinka: https://stackoverflow.com/questions/11719538/how-to-use-stringstream-to-separate-comma-separated-strings.
P-162240
« 1 »
  Strona 1 z 1