Strumienie - zapisywanie tablicy w pliku tekstowy i odczyt.

0

Witam, mam do wykonania poniższe zadanie:

Napisać program (składający się z kilku metod), który:
a) generuje 2-wym. tablicę liczb rzeczywistych i wyświetla ją w sposób sformatowany wierszami na ekran,
Odpowiednie dane (wymiary tablicy, zakres liczb) czyta z klawiatury
b) zapisuje tablicę do pliku tekstowego wg schematu:
-- wiersz 1: tekst "Macierz"
-- wiersz 2: liczba wierszy
-- wiersz 3: liczba kolumn
-- dalsze wiersze: kolejne wiersze tablicy w postaci sformatowanej
c) odczytuje macierz zapisaną w powyższym formacie z pliku do tablicy typu double w pamięci,
d) oblicza i wyświetla wartość średnią wyrazów macierzy.
Uwaga:
Nie należy korzystać ze scannera w przypadku operacji na plikach.
Nie należy w jakikolwiek wiązać programu odczytu z pliku z macierzą wcześniej wygenerowaną.

Mam problem z odczytem danych i zapisem ich tablicy ponownie, bardzo proszę o pomoc. Załączam pierwszą część mojego kodu (działa poprawnie).

import java.util.Scanner;
import java.util.Random;
import java.io.*;

public class Macierz2D {

private double [][] macierz;
private int n,m;

public Macierz2D () {
	
	Scanner konstruktor = new Scanner (System.in);
	System.out.println("Podaj liczbę wierszy.");
	n=konstruktor.nextInt();
	System.out.println("Podaj liczbę kolumn.");
	m=konstruktor.nextInt();
	
	macierz = new double [n][m];
	
}

public void wypelnij() {
	
	double max;
	double min;
	
	Scanner w = new Scanner(System.in); 
	System.out.println("Podaj zakres liczb w macierzy.");
	min=w.nextDouble();
	max=w.nextDouble();
	
	Random rand = new Random();
	for(int i=0;i<n;i++) {
		for(int j=0;j<m;j++) {
			macierz[i][j]=min+(max-min)*rand.nextDouble();
		}
	}	
}

public void wyswietl() {
	for(int i=0;i<n;i++) {
		for(int j=0;j<m;j++) {
			System.out.printf("%.2f \t", macierz[i][j]);
		} System.out.println();
	} System.out.println();
}

public boolean zapisz() {
	
	try {
		PrintWriter zapis = new PrintWriter("macierz.txt");
		zapis.println("Macierz");
		zapis.println(n);
		zapis.println(m);
	
		for(int i=0;i<n;i++) {
			for(int j=0;j<m;j++) {
				zapis.printf("%.2f \t", macierz[i][j]);
			} zapis.println();
		}
	zapis.close();
	} catch (Exception ex) {
		return false;
	}
	
	
	return true;
}

}

0

Cześć @meg_33,
Po pierwsze Twój konstruktor jest dosyć średni. Konstruktory obiektów powinny być dosyć intuicyjne. Co przez to rozumiem? Konstruktor standardowy tworzy obiekt, którego wszystkie parametry wynoszą null. A konstruktor, który dostaje jakieś wartości powinien stworzyć obiekt z parametrami podanymi do konstruktora.
Twój konstruktor powinien wyglądać mniej więcej tak:

public Macierz2D (int columns, int rows) {
    this.columns = columns;
    this.rows = rows;
    matrix = new double [rows][columns];
}

Jak widzisz staram się używać nazw w języku angielskim. Jest to bardzo dobra praktyka na przyszłość. Na prawdę pomaga :)
Osobno do tego masz metody Input/Output.

Co do zapisu i wczytywania to szczerze powiedziawszy PrintWriter jest bardzo słabą opcją. Poszukaj i zaimplementuj u siebie rozwiązania z ObjectOutput/InputStream. To jest bodajże najnowsza implementacja zapisywania i wczytywania danych. Oczywiście nie wolno zapomnieć o :

implements Serializable

w nagłówku klasy. Dzięki temu stworzone obiekty da się zapisywać i wczytywać.

W razie pytań pisz!
Pozdrawiam,
adaszewski95

1 użytkowników online, w tym zalogowanych: 0, gości: 1