Forum zamknięte. Zapraszamy do grupy na Facebooku
Odpowiedz 
 
Ocena wątku:
  • 0 Głosów - 0 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
Program UnitMemoryConversion
11-10-2014, 03:56 PM (Ten post był ostatnio modyfikowany: 11-11-2014 01:49 PM przez lolo.)
Post: #1
Program UnitMemoryConversion
Otóż jest pewien problem związany z moim programem, bo mam kilka pomysłów na udoskonalenie go, lecz nie wiem jak je zaimplementować w kod. Moim pierwszym zadaniem było stworzenie - dla użytkownika - możliwości poprawy błędu, czyli jakby użytkownik się pomylił w menu wyboru, które ma zakres 1-6 i podał, np. 7 to żeby powtórzyło mu te menu i dostał następną szansę (i tak do skutku). Zawsze używałem do tego mechanizmu do...while, ale tym razem zawiodłem się na nim, bo po prostu nie działa. Kiedy użytkownik się pomyli to kod jest wykonywany dalej. Ogólnie rzecz biorąc to najpierw mi działało, ale po dodaniu bloku try...catch to zaczęły się problemy. Zastosowałem też pomysł użytkownika lolo, ale coś nie działa.

Drugim problemem - choć już nie takim dużym - jest optymalizacja kodu, bo mam takie pytanie: Czy da się trochę skrócić ilość tego kodu, bo mi wydaje się, że trochę to niezbyt dobrze napisałem tym względem? Myślę, że jest jakaś możliwość, aby trochę skrócić ten kod, bo jakbym miał, np. stworzyć 100 przycisków to posłużyłbym się pętlą, a tu nie bardzo widzę opcję użycia pętli.

Jeszcze w skrócie przedstawię poprawne/oczekiwane działanie tego programu:
Najpierw powinien się pojawić tytuł, potem menu wyboru, następnie możliwość wybrania opcji z tego menu, dalej możliwość podania wartości wybranej z menu wyboru - jednostki pamięci, kolejno drugie menu wyboru, po tym możliwość wybrania opcji z tego menu i na koniec wyświetlenie oczekiwanego wyniku w postaci liczb zmiennoprzecinkowych lub całkowitoliczbowych(dodałem to rozwiązanie ze względów estetycznych, żeby nie było, np. 10.0, skoro może być samo 10).

A teraz podam kod źródłowy:
package paczka_program;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;

public class UnitMemoryConversion {
	public static void main(String args[]) {
		Scanner podaj = new Scanner(System.in);
		int z = -1, na;
		BigDecimal wartosc, wynik, licz1024 = new BigDecimal("1024"), licz8 = new BigDecimal("8");
		System.out.println("---| Przelicznik jednostek pamięci komputerowej |---");
		System.out.println("Czy zastanawiałeś/aś się kiedyś, np. ile bitów mieści się w terabajcie?");
		System.out.println("Jeśli tak to dobrze trafiłeś/aś.");
		
		do {
		System.out.println("\nNajpierw wybierz jednostkę z jakiej chcesz przeliczyć " +
						   "wpisując odpowiednią liczbę z podanych:");
		System.out.println("1. bity (b)");
		System.out.println("2. bajty (B)");
		System.out.println("3. kilobajty (KB)");
		System.out.println("4. megabajty (MB)");
		System.out.println("5. gigabajty (GB)");
		System.out.println("6. terabajty (TB)");
		System.out.print("Liczba: ");
		try {
		z = Integer.parseInt(podaj.nextLine());
		}catch(NumberFormatException e) {
			
		}
		if(z > 0 && z < 7) {
			System.out.println("Wybrałeś/aś opcję nr " + z);
		}
		else {
			System.out.println("BŁĄD! Nie ma takiej opcji. Spróbuj ponownie.");
		}
		}while(z < 0 && z > 7);
		
		System.out.println("\nTeraz podaj wartość wybranej przez Ciebie jednostki.");
		System.out.print("Wartość: ");
		wartosc = podaj.nextBigDecimal();
		
		System.out.println("\nNa jaką jednostkę chcesz to przeliczyć? Podaj odpowiednią liczbę z podanych poniżej:");
		System.out.println("1. bity (b)");
		System.out.println("2. bajty (B)");
		System.out.println("3. kilobajty (KB)");
		System.out.println("4. megabajty (MB)");
		System.out.println("5. gigabajty (GB)");
		System.out.println("6. terabajty (TB)");
		System.out.print("Liczba: ");
		na = podaj.nextInt();

		switch(z) {
			case 1:
				switch(na) {
				case 1:
					wynik = wartosc;
					System.out.println(wartosc + "b to " + wynik + "b");
					System.out.println("Czy był sens przeliczać na tą samą jednostkę?");
					break;
				case 2:
					wynik = wartosc.divide(licz8);
					System.out.println(wartosc + "b to " + wynik + "B");
					break;
				case 3:
					wynik = wartosc.divide(licz8).divide(licz1024);
					System.out.println(wartosc + "b to " + wynik + "KB");
					break;
				case 4:
					wynik = wartosc.divide(licz8).divide(licz1024).divide(licz1024);
					System.out.println(wartosc + "b to " + wynik + "MB");
					break;
				case 5:
					wynik = wartosc.divide(licz8).divide(licz1024).divide(licz1024).divide(licz1024);
					System.out.println(wartosc + "b to " + wynik + "GB");
					break;
				case 6:
					wynik = wartosc.divide(licz8).divide(licz1024).divide(licz1024).divide(licz1024).divide(​licz1024);
					System.out.println(wartosc + "b to " + wynik + "TB");
					break;
				}
				break;
			case 2:
				switch(na) {
				case 1:
					wynik = wartosc.multiply(licz8);
					System.out.println(wartosc + "B to " + wynik + "b");
					break;
				case 2:
					wynik = wartosc;
					System.out.println(wartosc + "B to " + wynik + "B");
					System.out.println("Jaki był sens przeliczać na tą samą jednostkę?");
					break;
				case 3:
					wynik = wartosc.divide(licz1024);
					System.out.println(wartosc + "B to " + wynik + "KB");
					break;
				case 4:
					wynik = wartosc.divide(licz1024).divide(licz1024);
					System.out.println(wartosc + "B to " + wynik + "MB");
					break;
				case 5:
					wynik = wartosc.divide(licz1024).divide(licz1024).divide(licz1024);
					System.out.println(wartosc + "B to " + wynik + "GB");
					break;
				case 6:
					wynik = wartosc.divide(licz1024).divide(licz1024).divide(licz1024).divide(licz1024);
					System.out.println(wartosc + "B to " + wynik + "TB");
					break;
				}
				break;
			case 3:
				switch(na) {
				case 1:
					wynik = wartosc.multiply(licz8).multiply(licz1024);
					System.out.println(wartosc + "KB to " + wynik + "b");
					break;
				case 2:
					wynik = wartosc.multiply(licz1024);
					System.out.println(wartosc + "KB to " + wynik + "B");
					break;
				case 3:
					wynik = wartosc;
					System.out.println(wartosc + "KB to " + wynik + "KB");
					System.out.println("Jaki był sens przeliczać na tą samą jednostkę?");
					break;
				case 4:
					wynik = wartosc.divide(licz1024);
					System.out.println(wartosc + "KB to " + wynik + "MB");
					break;
				case 5:
					wynik = wartosc.divide(licz1024).divide(licz1024);
					System.out.println(wartosc + "KB to " + wynik + "GB");
					break;
				case 6:
					wynik = wartosc.divide(licz1024).divide(licz1024).divide(licz1024);
					System.out.println(wartosc + "KB to " + wynik + "TB");
					break;
				}
				break;
			case 4:
				switch(na) {
				case 1:
					wynik = wartosc.multiply(licz8).multiply(licz1024).multiply(licz1024);
					System.out.println(wartosc + "MB to " + wynik + "b");
					break;
				case 2:
					wynik = wartosc.multiply(licz1024).multiply(licz1024);
					System.out.println(wartosc + "MB to " + wynik + "B");
					break;
				case 3:
					wynik = wartosc.multiply(licz1024);
					System.out.println(wartosc + "MB to " + wynik + "KB");
					break;
				case 4:
					wynik = wartosc;
					System.out.println(wartosc + "MB to " + wynik + "MB");
					System.out.println("Jaki był sens przeliczać na tą samą jednostkę?");
					break;
				case 5:
					wynik = wartosc.divide(licz1024);
					System.out.println(wartosc + "MB to " + wynik + "GB");
					break;
				case 6:
					wynik = wartosc.divide(licz1024).divide(licz1024);
					System.out.println(wartosc + "MB to " + wynik + "TB");
					break;
				}
				break;
			case 5:
				switch(na) {
				case 1:
					wynik = wartosc.multiply(licz8).multiply(licz1024).multiply(licz1024).multiply(licz1024)​;
					System.out.println(wartosc + "GB to " + wynik + "b");
					break;
				case 2:
					wynik = wartosc.multiply(licz1024).multiply(licz1024).multiply(licz1024);
					System.out.println(wartosc + "GB to " + wynik + "B");
					break;
				case 3:
					wynik = wartosc.multiply(licz1024).multiply(licz1024);
					System.out.println(wartosc + "GB to " + wynik + "KB");
					break;
				case 4:
					wynik = wartosc.multiply(licz1024);
					System.out.println(wartosc + "GB to " + wynik + "MB");
					break;
				case 5:
					wynik = wartosc;
					System.out.println(wartosc + "GB to " + wynik + "GB");
					System.out.println("Jaki był sens przeliczać na tą samą jednostkę?");
					break;
				case 6:
					wynik = wartosc.divide(licz1024);
					System.out.println(wartosc + "GB to " + wynik + "TB");
					break;
				}
				break;
			case 6:
				switch(na) {
				case 1:
					wynik = wartosc.multiply(licz8).multiply(licz1024).multiply(licz1024).multiply(licz1024)​.multiply(licz1024);
					System.out.println(wartosc + "TB to " + wynik + "b");
					break;
				case 2:
					wynik = wartosc.multiply(licz1024).multiply(licz1024).multiply(licz1024).multiply(licz10​24);
					System.out.println(wartosc + "TB to " + wynik + "B");
					break;
				case 3:
					wynik = wartosc.multiply(licz1024).multiply(licz1024).multiply(licz1024);
					System.out.println(wartosc + "TB to " + wynik + "KB");
					break;
				case 4:
					wynik = wartosc.multiply(licz1024.multiply(licz1024));
					System.out.println(wartosc + "TB to " + wynik + "MB");
					break;
				case 5:
					wynik = wartosc.multiply(licz1024);
					System.out.println(wartosc + "TB to " + wynik + "GB");
					break;
				case 6:
					wynik = wartosc;
					System.out.println(wartosc + "TB to " + wynik + "TB");
					System.out.println("Jaki był sens przeliczać na tą samą jednostkę?");
					break;
				}
				break;
		}
		
	}
}
Znajdź wszystkie posty użytkownika
Odpowiedz cytując ten post
11-11-2014, 02:45 PM (Ten post był ostatnio modyfikowany: 11-11-2014 02:53 PM przez lolo.)
Post: #2
RE: Program UnitMemoryConversion
Cytat: Zastosowałem też pomysł użytkownika lolo, ale coś nie działa.
Mógłbyś przypomnieć jaki to był pomysł?

Powiedz mi jak długo myślałeś nad tym warunkiem:
while(z < 0 && z > 7);

A przy okazji to znasz jakieś inne języki programowania? I tak w ogóle to Ty znasz coś więcej poza podstawami typu pętle, instrukcje if-else oraz switch-case?

GG: 2802571
Znajdź wszystkie posty użytkownika
Odpowiedz cytując ten post
11-21-2014, 11:12 PM
Post: #3
RE: Program UnitMemoryConversion
To był pomysł na program, który oblicza jednostki pamięci komputerowej, przelicza, np. z bajtów na bity itp.

Nad tym fragmentem kodu myślałem może ok. 5 min., a później zastanawiałem się nieco dłużej.

Znam trochę C++, bo jest podobny do Javy, ale to tylko takie postawy konsolowe, jak np. cout << "Witaj!" << endl; lub cin >> a; Czyli wejście i wyjście, dlatego z tego języka nie mam zbyt dużej wiedzy, lecz z Javy umiem dość sporo (aż do Grafiki włącznie z nią, oprócz Pól tekstowych). Obecnie ćwiczę trochę przemawianie przed klasą, bo tak właściwie to miało być kółko inf. i zaproponowałem, że ja spróbuję napisać z kolegami jedną grę (oczywiście z gotowca), więc pierw uczę ich podstaw, potem prog. obiektowego i grafiki (tak, jak w tym kursie, lecz po mojemu i jeszcze z innymi informacjami, których nie ma na tym kursie). Zresztą to wszystko ma swoje plusy, bo oni mają jakąś wiedzę, a ja mam z tego to, że sobie powtarzam to, czego się dotychczas nauczyłem i opanowuję tremę, z którą bym się w przyszłości spotkał (pewnie na studiach). Poza tym uczyłem się HTML, robiłem też serwer minecraft, więc zajmowałem się nim od strony technicznej (kojarzę język YAML i umiem go obsługiwać), CSS też widziałem, lecz pobieżnie wiem, jak go tworzyć (chociaż jeśli zna się angielski i ma dobry program to nie trzeba zbytnio się uczyć zmiennych CSS-a). Ogólnie to interesowałem się hackingiem, więc wiem już jak, np. dostać się na Windows bez podawania hasła - oczywiście za pomocą linuksa), a z informatyki dobrze już rozumiem wiele pojęć i nie tylko z programowania, ale też z całej dziedziny informatycznej, np. protokół SSL, TCP/IP itp.
Znajdź wszystkie posty użytkownika
Odpowiedz cytując ten post
11-21-2014, 11:29 PM
Post: #4
RE: Program UnitMemoryConversion
(11-21-2014 11:12 PM)aleksanderwiel napisał(a):  To był pomysł na program, który oblicza jednostki pamięci komputerowej, przelicza, np. z bajtów na bity itp.

Ja niby taki pomysł Ci podsunąłem i on nie działa?
(11-21-2014 11:12 PM)aleksanderwiel napisał(a):  Nad tym fragmentem kodu myślałem może ok. 5 min., a później zastanawiałem się nieco dłużej.

Czyli jak rozumiem problem już rozwiązany.

GG: 2802571
Znajdź wszystkie posty użytkownika
Odpowiedz cytując ten post
11-25-2014, 12:25 AM
Post: #5
RE: Program UnitMemoryConversion
Nie podsunąłeś mi pomysłu na ten program i problem w dalszym ciągu nie jest rozwiązany. Jak wspominałem, mam problem z pogodzeniem pętli do...while z blokiem try...catch w tym programie. Chcę zabezpieczyć się przed błędnym podaniem wartości, np. zamiast podać liczbę 10 to użytkownik mi poda jakiś tekst i już program kończy działanie. A w pętli mam jakiś problem, bo mi też nie działa, chociaż wcześniej wydawało mi się, że raz działa poprawnie, ale teraz tak nie jest (być może poprzednio mi się tylko wydawało). Reasumując to pętla miała powtarzać podane instrukcje, dając tym samym użytkownikowi - możliwość ponownego wyboru, lecz tym razem poprawnego. Pomysł z pętlą może nie został poruszony na tym kursie, ponieważ podsunął mi go pewien profesor, jak byłem na Politechnice i ja uznałem, że jest przydatny, więc zaimplementowałem to własnych programów.
Znajdź wszystkie posty użytkownika
Odpowiedz cytując ten post
11-25-2014, 08:04 AM
Post: #6
RE: Program UnitMemoryConversion
I niewidzisz nic złego w przytoczonym wczesneij przeze mnie fragmencie Twojego kodu?
Tak, w kursie w ogóle nie był poruszany temat pętli.

GG: 2802571
Znajdź wszystkie posty użytkownika
Odpowiedz cytując ten post
11-28-2014, 12:22 AM (Ten post był ostatnio modyfikowany: 11-28-2014 12:26 AM przez aleksanderwiel.)
Post: #7
RE: Program UnitMemoryConversion
No dobrze, może trochę źle to zrobiłem, ale chodziło mi o to, żeby te instrukcje powtarzał program dopóki zmienna "z" będzie miała jakąś wartość z zakresu od 1 do 6. A teraz się tak zastanawiam, czy nie lepiej byłoby wcześniej dać zmienną typu boolean z tym zakresem, a w pętli dać warunek (z != war), kiedy "war" to ta zmienna boolean.
Znajdź wszystkie posty użytkownika
Odpowiedz cytując ten post
11-28-2014, 07:45 PM
Post: #8
RE: Program UnitMemoryConversion
A jak chcesz coś takiego zrealizować niby?

GG: 2802571
Znajdź wszystkie posty użytkownika
Odpowiedz cytując ten post
11-29-2014, 10:58 PM (Ten post był ostatnio modyfikowany: 11-29-2014 11:00 PM przez aleksanderwiel.)
Post: #9
RE: Program UnitMemoryConversion
Czy taki warunek zdałby egzamin?
boolean zakres = z > 1 && z < 7;
...
...
}while( z =! zakres);

Kiedy zmienna "zakres" będzie stworzona po podaniu wartości zmiennej "z".
Znajdź wszystkie posty użytkownika
Odpowiedz cytując ten post
11-30-2014, 08:23 AM
Post: #10
RE: Program UnitMemoryConversion
A to nie możesz dać tego warunku z > 1 && z < 7 w while?

GG: 2802571
Znajdź wszystkie posty użytkownika
Odpowiedz cytując ten post
Odpowiedz 


Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości