Wczytywanie danych z pliku.
Ostatnio zmodyfikowano 2017-06-08 08:43
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. |
|
zinu96 Temat założony przez niniejszego użytkownika |
» 2017-06-08 01:22:09 #include <cstdlib> #include <iostream> #include <fstream> #include <vector> #include <math.h>
using namespace std;
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. |
|
darko202 |
» 2017-06-08 07:41:02 |
|
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). #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; stringstream bufor; plik.open( "test.txt", ios::in ); vector < Wektor2D > dane; Wektor2D wektor; string tekst; while( !plik.eof() ) { plik >> tekst; bufor << tekst; 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. |
|
« 1 » |