Parsowanie pliku

Parsowanie pliku
Artur Grabowski
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 7 lat
  • Postów:19
0

Witam
Mam taki problem :
Staram się napisać programik, który na podstawie wczytanego pliku :

oznacza krok symulacji

Wynikiem ma być tablice dla każdej z wartości w każdej symulacji : 0.5,0.48045,0.52556…itd.
Tablica taka powinna mieć wartość przykładowo dla 1 danej każdej symulacji {0.5,0.5+0,48045,0.5+0.48045+0,52556…..itd….} : żeby zczytywała po kolei z 1.1 pierwszą wartość z 2.1 pierwszą wartosć + tą poprzednią do momemtu skończenia symulacji.
I tak wszystkie wartości w pliku .txt

#1.1
0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5
#2.1
0.48045 0.37837 0.36096 0.43248 0.65979 0.51712 0.5 0.77353 0.24566
#3.1
0.52556 0.32728 0.37208 0.45111 0.62236 0.52216 0.5 0.72307 0.25144
#4.1
0.52224 0.33494 0.36821 0.44961 0.62323 0.53737 0.5 0.72748 0.24834
#5.1
0.52248 0.33424 0.36727 0.45013 0.62276 0.5352 0.5 0.72661 0.24619
#6.1
0.52284 0.3344 0.36735 0.45026 0.62244 0.53539 0.5 0.72631 0.24646
#7.1
0.52277 0.33444 0.36731 0.45025 0.62248 0.53539 0.5 0.72637 0.24642
#8.1
0.52278 0.33443 0.36731 0.45026 0.62247 0.53538 0.5 0.72636 0.24642
#9.1
0.52278 0.33443 0.36731 0.45025 0.62247 0.53538 0.5 0.72636 0.24642
#10.1
0.52278 0.33443 0.36731 0.45025 0.62247 0.53538 0.5 0.72636 0.24642

Póki co mam tylko kod do dodawania floatóworaz usuwania #

Kopiuj
#include <iostream>
#include <functional>
#include <numeric>
#include <vector>
using namespace std;
int main()
{
  vector <float> data= { 0.1, 0.2, 0.3, 0.4, 0.5 };
std::partial_sum(data.begin(), data.end(), data.begin());

    for (unsigned i = 0; i < data.size(); ++i)
    cout << "Zliczanie[" << i << "]: " << data[i] << "\n";
}

Kopiuj
string out_pats;
    while ( !netfile.atEnd() )
    {
        QString line(netfile.readLine());
        if(line.contains("#"))
        {
            out_pats.append("#");//line);
            break;
        }
        raw.append(line);
    }

Jak zrobić by tak zliczał jak wcześniej napisałem?

kq
Kompletnie nie rozumiem co "tablica ma zliczać". Weź to opisz czytelniej.
ŁF
Popraw temat na opisowy, albo wątek poleci do kosza
Artur Grabowski
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 7 lat
  • Postów:19
0

Chodzi o to że mamy plik z rozszerzeniem .res w którym są dane. #1.1, #2.1,#3.1..... itd to jest krok symulacji zadaniem programu jest stworzenie tylu tablic ile jest danych w kroku : w pliku jest to 100 zmiennych w kroku.Takblica ta brała by po każdej pierwszej zmiennej z kroku i je dodawała np {0,5, 0,5+0.48045,0,5+0.48045+0.52556 itd do końca kroków

edytowany 1x, ostatnio: Artur Grabowski
carlosmay
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 5 lat
  • Lokalizacja:Pabianice
0

Rozpisz na kratce kolejne kroki.

Z twojego opisu wynika, że chcesz, aby każda kolejna komórka w tablicy miała wartość o wczytaną wartość wyższą wartość, a na koniec do każdego elementu tablicy dodać 0.5.


edytowany 2x, ostatnio: carlosmay
Artur Grabowski
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 7 lat
  • Postów:19
0

Mamy przykład :
#1.1
0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5
#2.1
0.48045 0.37837 0.36096 0.43248 0.65979 0.51712 0.5 0.77353 0.24566
#3.1
0.52556 0.32728 0.37208 0.45111 0.62236 0.52216 0.5 0.72307 0.25144

tablica1={0.5,0.5+0.48045,0.5+0.48045+0.52556}
tablica2={0.5,0.5+0.37837,0.5+0.37837+0.32728}
tablica3={0.5,0.5+0.36096,0.5+0.36096+0.37208)
itd... do końca wartości

carlosmay
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 5 lat
  • Lokalizacja:Pabianice
0

Załaduj wszystkie wiersze do osobnych tablic i zliczaj kolumnami jak w tablicy dwuwymiarowej.


Sparrow-hawk
  • Rejestracja:prawie 13 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Katowice
  • Postów:189
0

Chodzi Ci o takie działanie:

Kopiuj
#include <iostream>
#include <iomanip>

const size_t N = 5;

int in[N][N];
int out[N][N];

void show(const int array[N][N]);

int main() {

  for (size_t r = 0; r < N; ++r) {
    for (size_t c = 0; c < N; ++c) {
      in[r][c] = c + N * r;
    }
  }

  show(in);

  for (size_t c = 0; c < N; ++c) {
    out[c][0] = in[0][c];
  }

  for (size_t r = 0; r < N; ++r) {
    for (size_t c = 1; c < N; ++c) {
      out[r][c] = out[r][c - 1] + in[c][r];
    }
  }

  show(out);

  return 0;
}

void show(const int array[N][N]) {
  for (size_t r = 0; r < N; ++r) {
    for (size_t c = 0; c < N; ++c) {
      std::cout << std::setw(2) << array[r][c] << " ";
    }
    std::cout << std::endl;
  }
  std::cout << std::endl;
}
Kopiuj
 0  1  2  3  4 
 5  6  7  8  9 
10 11 12 13 14 
15 16 17 18 19 
20 21 22 23 24 

 0  5 15 30 50 
 1  7 18 34 55 
 2  9 21 38 60 
 3 11 24 42 65 
 4 13 27 46 70 
Artur Grabowski
U mnie wartości sie nie zmieniają regularnie niestety :/
Sparrow-hawk
I co w związku z tym? Przecież powyższy algorytm nie zakłada, żadnej regularności. Jedynym uproszceniem, jest założenie stałego rozmiaru tablic i tego, że są to tablice kwadratowe.
Artur Grabowski
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 7 lat
  • Postów:19
0

Jakiś przykład na tych wierszach ? Bo troszkę nie rozumiem :)

carlosmay
Czytaj kod. To są proste tablice. Linijka po linijce i zrozumiesz.
carlosmay
Kartka twoim przyjacielem.
Sparrow-hawk
Przecież to twój algorytm ;-). Tab[0] = {0, 0 + 5, 0 + 5 + 10, 0 + 5 + 10 + 15, 0 + 5 + 10 + 15 + 20};
carlosmay
Możesz zrobić vector vectorów jeśli nie wiesz jakie długie są linie i ile jest kroków.
carlosmay
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 5 lat
  • Lokalizacja:Pabianice
0

Hasło w gugiel 'tablica dwuwymiarowa' i wynik http://www.algorytm.edu.pl/tablice-w-c/tablice-wielowymiarowe.html


edytowany 1x, ostatnio: carlosmay
Sparrow-hawk
  • Rejestracja:prawie 13 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Katowice
  • Postów:189
0

Można jeszcze wykorzystać Boost i bibliotekę uBLAS: Basic Linear Algebra Library

A tu przykład:

Kopiuj
#include <iostream>
#include <random>
#include <chrono>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>

using namespace boost::numeric::ublas;

int main() {
  unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();

  std::minstd_rand0 generator (seed);

  // Na typie int łatwiej zobaczyć, czy działa
  matrix<int> m(4, 5);

  for (size_t i = 0; i < m.size1(); ++i) {
    for (size_t j = 0; j < m.size2(); ++j) {
      m(i, j) = generator() % 20;
    }
  }

  for (size_t i = 0; i < m.size1(); ++i) {
    for (size_t j = 0; j < m.size2(); ++j) {
      std::cout << m(i, j) << " ";
    }
    std::cout << std::endl;
  }
  std::cout << std::endl;

  // Tu jest główna logika twojej operacji
  m = trans(m);

  for (size_t i = 0; i < m.size1(); ++i) {
    for (size_t j = 1; j < m.size2(); ++j) {
      m(i, j) = m(i, j) + m(i, j - 1);
    }
  }
  // Tu jest koniec

  for (size_t i = 0; i < m.size1(); ++i) {
    for (size_t j = 0; j < m.size2(); ++j) {
      std::cout << m(i, j) << " ";
    }
    std::cout << std::endl;
  }

  return 0;
}
Artur Grabowski
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 7 lat
  • Postów:19
0

Dobra zrozumiałem...... w moim przypadku to ma być coś w stylu 100x100

MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:12 minut
0

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.