Как я могу вычесть определенные столбцы определенных строк? - PullRequest
0 голосов
/ 10 ноября 2019

Я действительно запутался, как решить эту проблему. У меня есть такой текстовый файл:

STEP
10
NUMBER line
2
cc
aa
ab
ac
ad
1 1 81 91 101
2 1 82 92 102
STEP
20
NUMBER line
2
cc
aa
ab
ac
ad
1 1 51 61 71
2 1 52 62 72 

с этим фрагментом кода:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main () 
{
  string line;
  double x0, y0, z0, x1, y1, z1, type ;
  int NUMBER_line,id ;

  ifstream myfile ("1.txt");
  string namefile;
    if (myfile.is_open()){
        for (int lineno = 0; getline (myfile,line) && lineno < 7; lineno++)
        {
            if (lineno == 2)  myfile>>NUMBER_line;
        }
        cout <<" NUMBER_line: "<<NUMBER_line<<endl;

        for (int linenoq = 0; getline (myfile,line) && linenoq < NUMBER_line; linenoq++){
            myfile>>id>>type>>x0>>y0>>z0;
            cout<<id<<" "<<type<<" "<<x0<<" "<<y0<<" "<<z0 <<endl;
        }


        for (int lineno = 0; getline (myfile,line) && lineno < 7; lineno++)
        {
        }

        for (int linenoq = 0; getline (myfile,line) && linenoq < NUMBER_line; linenoq++){
            myfile>>id>>type>>x1>>y1>>z1;
            cout<<id<<" "<<type<<" "<<x1<<" "<<y1<<" "<<z1 <<endl;
        }

    }


  else cout << "Unable to open file"; 
  return 0;
}

Я могу показать строки, имеющие номер, мой вывод:

 NUMBER_line: 2
1 1 81 91 101
2 1 82 92 102
 NUMBER_line: 2
1 1 51 61 71
2 1 52 62 72

Но я не знаю, как я могу сделать вычитание между, например, 81 и 51, или 82 и 52, и т. Д. Я думаю, что я должен поместить четвертый цикл где-то во второй цикл, но я несекрет производства. Другое дело про третий цикл, он мне не нужен. но я должен поместить это, потому что, если я не помещу это там, стартовая строка четвертого цикла становится неправильной. Я имел в виду, что четвертый цикл начинает строку 12 вместо строки 21.

1 Ответ

0 голосов
/ 10 ноября 2019
#include <algorithm>
#include <fstream>
#include <iostream>
#include <string>
using namespace std;

// if the dimensions are constant, then you could use std::array instead of std::vector.
using Matrix = std::vector<std::vector<int>>;

void addRow(Matrix& M, const int rowNum, const int id, const int type, const int x, const int y, const int z) {
    M[rowNum][0] = id;
    M[rowNum][1] = type;
    M[rowNum][2] = x;
    M[rowNum][3] = y;
    M[rowNum][4] = z;
}

int main() {
    string line;
    int x0, y0, z0, x1, y1, z1, type;
    int NUMBER_line, id;

    ifstream myfile("1.txt");
    string namefile;
    if (myfile.is_open()) {
        for (int lineno = 0; getline(myfile, line) && lineno < 7; lineno++) {
            if (lineno == 2)  myfile >> NUMBER_line;
        }
        cout << " NUMBER_line: " << NUMBER_line << endl;

        Matrix Input0(2, std::vector<int>(5));
        for (int linenoq = 0; getline(myfile, line) && linenoq < NUMBER_line; linenoq++) {
            myfile >> id >> type >> x0 >> y0 >> z0;
            addRow(Input0, linenoq, id, type, x0, y0, z0);
            cout << id << " " << type << " " << x0 << " " << y0 << " " << z0 << endl;
        }

        for (int lineno = 0; getline(myfile, line) && lineno < 7; lineno++) {
        }

        Matrix Input1(2, std::vector<int>(5));
        for (int linenoq = 0; getline(myfile, line) && linenoq < NUMBER_line; linenoq++) {
            myfile >> id >> type >> x1 >> y1 >> z1;
            addRow(Input1, linenoq, id, type, x1, y1, z1);
            cout << id << " " << type << " " << x1 << " " << y1 << " " << z1 << endl;
        }

        Matrix Output(2, std::vector<int>(5));
        for (size_t row = 0; row < Output.size(); ++row) {
            for (size_t col = 0; col < Output[0].size(); ++col) {
                if (col < 2) {
                    Output[row][col] = Input0[row][col];
                }
                else {
                    Output[row][col] = Input0[row][col] - Input1[row][col];
                }
            }
        }

        std::for_each(Output.cbegin(), Output.cend(),
            [](auto const& row) {
                std::for_each(row.cbegin(), row.cend(),
                    [](const int value) { cout << value << " "; });

                cout << endl;
            });
    }
    else cout << "Unable to open file";
    system("pause");
    return 0;
}
...