Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Zdravím všechny,
Prosím Vás poradil by mi někdo mám problém s čtením souboru v Javě, jsem úplný začátečník. Můj problém je takový mám napsat program na násobení matic metoda na násobení funguje bez problémů akorát tak, že zatím mám deklarované dvě dvojrozměrné pole m1 a pole m2 a v těchto polích na "pevno" uložené hodnoty. Já bych ale potřeboval mít soubor a v tom souboru mít uložené dvě matice a potřeboval bych tyto matice (jednotlivé složky, čísla matice) přečíst a uložit do dvojrozměrných polí m1 a m2. Čili matici1 přečíst ze souboru a uložit do dvojrozměrného pole m1, matici2 přečíst ze souboru a uložit do dvojrozměrného pole m2 abych následně mohl povést vlastní operaci násobení. A pak bych ještě výsledek vynásobených matic měl uložit do nového souboru. Soubor, kde budou uloženy matice1 a matice2, které uživatel zadá a které program mezi sebou bude násobit bude již předem vytvořen. Prosím poradil by mi někdo s tímto problémem hledal jsem všude možně, jak číst ze souboru, ale fungovalo mi jen čtení po řádcích a dokázal jsem si jen daný přečtený řádek vypsat na obrazovku, ale vůbec nevím jak bych měl přečíst celý soubor a jak v tom souboru odlišit dvě matice, už jsi nevím vůbec rady tak se zkouším obrátit sem. Jinak celý projekt píšu v NetBeans a rámci jedné třídy matice.
Předem bych chtěl poděkovat za jakékoliv rady a tipy a ochotu pomoci děkuji.
Offline
Zdravím,
záleží na tom, jak to budeš mít strukturované v tom vstupním souboru. Pokud takhle, tak je to přece jednoduché:
Toto by byly dvě matice (2x2):
45, 55, 25, 33
78, 58, 23, 47
Kde, první řádek je první matice a ukládáš si čísla, které samozřejmě mají následující posloupnost indexů:
[1,1], [1,2], [2,1], [2,2].
Offline
↑ RePRO:
Děkuji no je to na mě jakou si zvolím strukturu souboru, pokud bych to měl, jak jste mi naznačil, tak by tedy oddělovačem mezi jak mezi hodnotami matic a byla čárka a na prvním řádku by byla matice1 a na druhém řádku by byla matice2 chápu dobře? A mohl byste mě prosím nějak navést, co bych měl studovat, jaký způsob čtení souboru a jak pak ty hodnoty ty přečtené hodnoty uložit do dvojrozměrného pole abych pak mohl provést vlastní operaci násobení. Co jsem zatím zkoušel čtení souboru tak jsem jen dokázal vypsat první řádek souboru na obrazovku a tím jsem skončil. Děkuji moc za každou radu.
Offline
Zdravím,
opravíme prvně první věc a to tu, že bychom vstupní data v souboru viděli takto (bez těch čárek, bude to lepší):
45 55 25 33
73 58 23 47 58 99 36 87 11
A teď k samotnému programu. Nějak jsem nevěděl, jak to udělat jednoduše. Tak je to naprogramováno trošku složitěji. Strávil jsem nad tím asi 2 hodiny. Doufám, že aspoň trochu se půjde inspirovat.
Nejdůležitější jsou 2 funkce/metody a to:
- public static String[] readLines(String filename);
Tato funkce/metoda vrací jednoduché pole, kde v každé buňce je celý řádek ze souboru. Jako parametr funkce se dává cesta k souboru.
- public static int[][] getMatrix(int selectArray, int ROW, int COL);
Tato funkce/metoda vrací dvourozměrné pole (tedy už naší požadovanou matici). Jako parametr funkce se dává index. To znamená, že pro index 0 se vybere první řádek ze souboru (první matice). Pro index 1 potom se vybere druhá matice... Analogicky až do x. ROW pak značí, kolik má matice v souboru řádků a COL (sloupců).
package mujProjekt;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static String[] readLines(String filename) throws IOException
{
FileReader fileReader = new FileReader(filename);
BufferedReader bufferedReader = new BufferedReader(fileReader);
List<String> lines = new ArrayList<String>();
String line = null;
while ((line = bufferedReader.readLine()) != null) {
lines.add(line);
}
bufferedReader.close();
return lines.toArray(new String[lines.size()]);
}
public static int[][] getMatrix(int selectArray, int ROW, int COL) throws IOException
{
String[] lines = readLines("testFile.txt");
String[] pole;
String delimiter = " ";
pole = lines[selectArray].split(delimiter);
int matice[][] = new int[ROW][COL];
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
matice[i][j] = Integer.parseInt(pole[(i*ROW) + j]);
}
}
return matice;
}
public static void main(String[] args) throws IOException
{
int matice1[][] = getMatrix(0, 2, 2);
// vypíše nám 45
System.out.print(" " + matice1[0][0]);
// vypíše nám 55
System.out.print(" " + matice1[0][1]);
// vypíše nám 25
System.out.print(" " + matice1[1][0]);
// vypíše nám 33
System.out.print(" " + matice1[1][1]);
int matice2[][] = getMatrix(1, 3, 3);
// vypíše nám 73
System.out.print(" " + matice2[0][0]);
// vypíše nám 58
System.out.print(" " + matice2[0][1]);
// vypíše nám 23
System.out.print(" " + matice2[0][2]);
// vypíše nám 47
System.out.print(" " + matice2[1][0]);
// vypíše nám 58
System.out.print(" " + matice2[1][1]);
// vypíše nám 99
System.out.print(" " + matice2[1][2]);
// vypíše nám 36
System.out.print(" " + matice2[2][0]);
// vypíše nám 87
System.out.print(" " + matice2[2][1]);
// vypíše nám 11
System.out.print(" " + matice2[2][2]);
}
}Offline
↑ RePRO:
Supr děkuji mockrát já už nad tím také trávím čas od oběda děkuji za inspiraci, ale teď jak na to koukám máte tam definované konstatní proměnné řádky a sloupce public static final int ROW = 2; public static final int COLS = 2;
a vlastně každý řádek souboru je jedna matice, ale nejspíše jsem ještě nenapsal, což se omlouvám, že matice uložené v souboru mohou mít každá různé rozměry takže mohou mít např. matice 2x3, 3x4 a ještě musím ověřit podmínku násobitelnosti matic. Kontrétně u těchto dvou typů matic 2x3 a 3x4 lze spolu vynásobit protože počet sloupců první matice se rovná počtu řádků druhé matice a výsledná matice bude mít rozměry 2x4. Takže jestli jsem to pochopil dobře toto by fungovalo pokud by matice byli např. 2x2 3x3 4x4? Omlouvám se předem pokud jsem to špatně pochopil, ale každopádně děkuji mockrát za tento tuto radu a ochotu pomoci.
Offline
Upravil jsem zdrojový kód a text (nahoře). Smazal jsem konstanty a dal jsem je jako parametry pro metodu getMatrix().
Nyní to tedy funguje pro matice 2x2, 3x3, 4x4 atd.
Pro ostatní typy matic (2x3), (3x5) atd. to zatím nefunguje jak má. Šachrujou indexy. Zdroj problému vím, zkusím se na to podívat zítra, pokud bude čas.
Nebudu sem vkládat nový zdroják, budu upravovat vždy ten jeden, co je nahoře.
Offline