Dane z pliku

0

W ramach zadania na studiach mam do napisania trzy programy, których wspólną cechą jest wczytywanie danych z pliku (ze sprawdzeniem ich poprawności) a następnie wykonanie jakichś operacji na tych danych.
Mam już wszystkie kody, tylko mam wrażenie, że sprawdzanie poprawności danych "oprogramowałem" jakoś strasznie naokoło i byłbym wdzięczny za jakieś sprawdzenie. Nie wiem tylko jak to zrobić najlepiej, bo nie chcę wrzucać tych kodów na forum, żeby za bardzo nie zaśmiecać (ale jeśli ktoś chciałby rzucić okiem, to mogę np. przesłać na maila albo w jakiś inny sposób).
Dzięki z góry,
Jarek

0

Skorzystaj z Pastebin na forum.

0

dzięki za podpowiedź :)
no to mam tak:
1) program pierwszy ma pobierać z pliku trzy liczby całkowite rozdzielone spacjami (początek koniec limit); po wczytaniu ma sumować liczby całkowite od początek do koniec (ale nie dłużej niż do osiągnięcia limitu) i wypisać wynik na konsoli. W przypadku błędu program wypisuje ***
kod: http://4programmers.net/Pastebin/4527

2) program drugi pobiera z pliku liczby całkowite rozdzielone dowolnymi białymi znakami, tworzy z nich tablice, a następnie wypisuje wszystkie jej elementy (w pierwszym wierszu), wartość maksymalną (w drugim wierszu) i indeksy tablicy z wartością maksymalną (w trzecim wierszu); w przypadku błędu program wypisuje ***
kod: http://4programmers.net/Pastebin/4528

3) program trzeci pobiera z pliku dwie liczby całkowite rozdzielone białymi znakami (pierwsza to wielkość pakietu danych w bajtach a druga wolna przestrzeń dyskowa w megabajtach). W kolejnych wierszach ma wypisać: ile pakietów danych się zmieści na dysku, numer pakietu i jego wielkość (jeśli pakiet mieści się na dysku), całkowity zajęty rozmiar. pakiety od drugiego do piątego są dwa razy większe niż pakiet poprzedni, a od pakietu szóstego - trzy razy; w przypadku błędu program wypisuje ***
kod: http://4programmers.net/Pastebin/4529

nazwy plików są wykomentowane, bo nie ma to znaczenia dla istoty sprawy
będę wdzięczny za sugestie czy można to jakoś usprawnić
Jarek

0

Spojrzałem na pierwszy program (wypadałoby udostępniać poprawny kod, ten jest niekompilowalny - brakuje klamry zamykającej } przed catch).

  1. Kod nie spełnia warunków zadania, pobiera liczby z pliku również wtedy gdy są rozdzielone spacjami i znakiem nowego wiersza. Powinieneś czytać tylko jeden wiersz.
  2. Podczas sumowania przekraczasz limit, dodajesz kolejny składnik jeśli dotychczasowa suma nie przekracza limitu. Suma z tych składnikiem może już limit przekraczać.
0

sorry, nawias zniknął jak usuwałem komentarze i za dużo mi się usunęło..
co do czytania to faktycznie tego nie zauważyłem. natomiast czytanie tylko jednej linii to za mało. jeżeli dane w pliku będą następujące:
1 5 6
7
to tak naprawdę struktura danych w pliku jest nieprawidłowa, bo mają tam być tylko trzy liczby. w związku z tym dodałem jeszcze sprawdzenie liczby linii w pliku i po modyfikacji wygląda to tak:

Scanner scan = new Scanner (new File(fname));
        String dane = scan.nextLine()
        while (scan.hasNextLine()) {
            scan.next();
            liczbaLinii++;
        }
        StringTokenizer st = new StringTokenizer (dane, " ");
        if ((st.countTokens() != 3) || (liczbaLinii>1)) wynik = "***";

jeśli chodzi o sumowanie to też masz rację. wiem jak to poprawić, ale okazuje się (po dopytaniu), że prowadzący chciałby żeby w takiej sytuacji wyświetlał się wynik po dodaniu ostatniego elementu, dla którego suma limitu jeszcze nie przekraczała

1

Może tak:

for (; poczatek <= koniec && suma + poczatek + 1 <= limit; poczatek++) suma = suma + poczatek;

W drugim zadaniu źle wyświetlasz indeksy z wartością maksymalną. Prostsze rozwiązanie, to pętla wyświetlająca

for (int i=0; i < tablica.length; i++) {
    if (Integer.parseInt(tablica[i]) == max){
        System.out.print(i + " ");
    }
}

Jeśli upierasz się przy swoim rozwiązaniu, to musisz rozpatrywać trzy przypadki:

  • odczytana liczba jest mniejsza od max - nic nie robisz,
  • odczytana liczba jest równa max - "wydłużasz" zmienną indeksy,
  • odczytana liczba jest większa od max- zaczynasz od początku budować zmienną indeksy.

Ja bym zapamiętywał odczytane liczby w kolekcji liczb. Kod się uprości.

List <Integer> lista = new ArrayList();
while (scan.hasNextInt()) {
    lista.add(scan.nextInt());
}
Integer[] tablica = lista.toArray(new Integer[lista.size()]);
0

Ja zerknęłam na 3. zadanie. Przyznam, ze treść wydaje się trochę dziwna, ale zakładam, ze w pliku są dwie liczby dla pierwszego pakietu, a kolejne pakiety są generowanie w kodzie.

W kolejnych wierszach ma wypisać: ile pakietów danych się zmieści na dysku, numer pakietu i jego wielkość

Ile pakietów danych rozmiaru danego pakietu? Ile pakietów w sumie? Nie bardzo wiem co autor miał na myśli.

  • Jak przeliczasz bajty, używasz jednostek SI (1000). W informatyce 1KB=1024B
  • Możesz użyć try-with-resources:
    try (Scanner scan = new Scanner(new File(fname))) {...}
  • Wrzuć zamkniecie scannera w blok finally lub patrz punkt wyżej
  • Obliczenia jaki rozmiar ma następny pakiet powinny być w oddzielnej metodzie, do tego możesz, np. użyć switcha (jak dla mnie bardziej czytelny, ale to kwestia gustu)
    switch (idx) {
            case 1:
                return size;
            case 2:
            case 3:
            case 4:
            case 5:
                return size * 2;
            default:
                return size * 3;
        }
  • oprócz nr pakietu, jego rozmiaru, powinieneś jeszcze wypisać całkowite zajęte miejsce na dysku i ile pakietów zmieści się na dysku
0

jeśli chodzi o zadanie drugie to pętla wyświetlająca jest o wiele lepszym rozwiązaniem. mogę też wtedy zrezygnować z budowania Stringa do wyświetlania zawartości tablicy i też skorzystać z pętli. będzie bardziej elegancko :)

co do trzeciego to tak - w pliku są dwie liczby całkowite: pierwsza to wielkość pierwszego pakietu, a druga wolny rozmiar
liczba pakietów i całkowite zajęte miejsce jest wypisywane w tej linii:

System.out.println((liczbaPakietow-1) + "\n" + pakiety + sumaPakietow);
0

W sumie w drugim zadaniu nie jest powiedziane, że max ma być znaleziony w tablicy więc można wykorzystać listę, która jest dostępna.

int max = Collections.max(lista);

Tutaj cały kod z sugestiami @bogdans: http://4programmers.net/Pastebin/4530

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