• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

iloczyn macierzy na plikach

Object Storage Arubacloud
0 głosów
158 wizyt
pytanie zadane 22 grudnia 2018 w C i C++ przez korfim123 Nowicjusz (160 p.)

ileWpier=0;
while( !macierzPierwsza.fail()) //pętla nieskończona
    {
        string wartoscPier;
        macierzPierwsza >> wartoscPier;
             ileWpier++;
    }
    cout << ileWpier;

// druga wersja (tez nie dziala):

while( true ) //pętla nieskończona
    {
        string wartoscDrug;
        macierzDruga >> wartoscDrug;
        if( !macierzDruga.fail() )
           ileWdrug++;
        else
             break; //zakończ wczytywanie danych - wystąpił jakiś błąd (np. nie ma więcej danych w pliku)
    }
    cout<< ileWdrug;

Hej, dopiero zaczynam programować w c ++. Moim zadaniem jest obliczenie iloczynu dwóch macierzy, które są umieszczone w dwóch plikach txt. Problem polega na tym, że w macierzy są wartości sin, cos i sgrt oraz nie mogę wczytać zawartości całego pliku do tablicy.  Najpierw muszę sprawdzić czy mnożenie jest możliwe, obliczyłąm ilość wierszy w każdym pliku, teraz chce zliczyć wszystkie elementy i podzielić przez ilość wierszy, co da mi ilość kolumn, nie wiem jak to zrobić. próbowałam tak jak w kodzie, ale nie działa. Nie wiem też jak mam dostać się do poszczególnych wyrazów tablicy, jak je wybierać z pliku?  Jak przechodzić np do drugiego elementu w pierwszym wierszu, jeśli ilość spacji między wartościami i ilość znaków każdej wartości jest różna ?

komentarz 22 grudnia 2018 przez Benek Szeryf (90,870 p.)
To musi być w C++, czy może być w innym języku?
komentarz 22 grudnia 2018 przez korfim123 Nowicjusz (160 p.)
Musi być w c++.

1 odpowiedź

0 głosów
odpowiedź 23 grudnia 2018 przez RafalS VIP (122,820 p.)
edycja 23 grudnia 2018 przez RafalS

Operator >> posiada przeciążenia dla input stream'a z lewej i różnych typów z prawej. Zalozmy, że plik dane.txt wyglada tak:

123 456 789
11 22 33

W tym momencie robisz tak:

ifstream in("dane.txt");
string value;
in >> value; // value = "123"

wczyta do value string "123", bo operator >> rozdziela dane po spacji. Ale możesz też od razu intepretować te liczby jako liczby a nie stringi:

ifstream in("dane.txt");
int value;
in >> value; // value = 123

Dodając pętle while(in.good()) wczytamy wszystkie liczby po kolei aż do końca pliku, ale nie wiemy kiedy przeszlismy do nowego linii (drugiego wiersza), no chyba, że znamy długość wiersza.

Potrzebujemy zatem wczytać pojedyńczą linie:

getline(in,line);

I wyciągnąc ze stringa line inty, co załatwia klasa istringstream, która działa podobnie jak ifstream, ale źródłem danych jest string, a nie plik:

        istringstream stream( line );
        int dlugosc_wiersza = 0;
        while (stream.good()) {
            stream >> value;
            dlugosc_wiersza++;
        }

Można w ten sposób policzyć dlugosc wiersza, ale można wykorzystać fakt, że jednocześnie czytamy liczby:

	ifstream in("dane.txt");
	vector <vector<int>> matrix;
	string line;
	int value;
	while (getline(in,line)) {
		istringstream stream{ line };
		vector<int> row;
		while (stream >> value) {
			row.push_back(value);
		}
		matrix.push_back(row);
	}

Skróciłem warunki w pętlach, bo operator >> zwraca strumień, który można rzutować do wartosci logicznej równej !stream.fail().

Wykorzystując iteratorowy konstruktor wektora mozna to skrócić jeszcze bardziej:

	while (getline(in,line)) {
		istringstream stream( line );
		matrix.push_back(vector<int>(istream_iterator<int>(stream), istream_iterator<int>()));
	}

A najbardziej można to skrócić zmieniając język na python:

matrix = []
for line in open('dane.txt'):
    matrix.append([int(x) for x in line.split()])

lub w jednej linijce :D

matrix = [[int(x) for x in line.split()]for line in open('dane.txt')]

Podobne pytania

–1 głos
1 odpowiedź 934 wizyt
0 głosów
1 odpowiedź 205 wizyt

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...