Pomoc przy programie C# - początkujący pilne :/

0

Witam, jestem bardzo początkujący jeśli chodzi o C#, jednak potrzebuję pilnie wykonać pewne zadanie na studia
Chodzi dokładniej o kalkulator walutowy, wykonany on jednak ma być poprzez użycie klas - przysiadłem do nauki klas i oto efekty.
Na samym początku podszedłem do napisania działania programu standardowo - później przystąpiłem do przeniesienia tego wszystkiego na obiekty.
Poległem - nie wiem co dalej, jak odwołać się do zmiennej z 1 klasy do klasy 2.
Proszę o pomoc

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace walutt
{
	class Program
	{
		class Wybor 
		{
			public int waluta, waluta2;
			public double wartosc;
			public void pierwszaWaluta()
			{
				Console.WriteLine("Wprowadź pierwszą walutę?");
				Console.WriteLine("1 - PLN");
				Console.WriteLine("2 - EURO");
				Console.WriteLine("3 - DOLAR");
				waluta = Convert.ToInt32(Console.ReadLine());
			}
			public void wartoscDoObliczen()
			{
				Console.WriteLine("Jaką wartość chcesz przeliczyć?");
				wartosc = Convert.ToDouble(Console.ReadLine());
			}

			public int drugaWaluta()
			{
				Console.WriteLine("Wprowadź drugą walutę?");
				if (waluta == 1)
				{
					Console.WriteLine("1 - EURO");
					Console.WriteLine("2 - DOLAR");
					waluta2 = Convert.ToInt32(Console.ReadLine());
				}
				else if (waluta == 2)
				{
					Console.WriteLine("1 - PLN");
					Console.WriteLine("2 - DOLAR");
					waluta2 = Convert.ToInt32(Console.ReadLine());
				}
				else if (waluta == 3)
				{
					Console.WriteLine("1 - EUR");
					Console.WriteLine("2 - PLN");
					waluta2 = Convert.ToInt32(Console.ReadLine());
				}
				return waluta2;
			}
		}
		class Obliczenia : Wybor{
			public double wynik;
			public void obliczeniaWalut() {
				switch (waluta2) {
					case 1:

				}

			
			}

		}
	}




		static void Main(string[] args)
		{
			int waluta, waluta2;
			double wartosc;
			Console.WriteLine("Wprowadź pierwszą walutę?");
			Console.WriteLine("1 - PLN");
			Console.WriteLine("2 - EURO");
			Console.WriteLine("3 - DOLAR");
			waluta = Convert.ToInt32(Console.ReadLine());
			Console.WriteLine("Jaką wartość chcesz przeliczyć?");
			wartosc = Convert.ToDouble(Console.ReadLine());

			double mnoznikPln;
			double mnoznikEur;
			double mnoznikDol;

			switch (waluta)
			{
				case 1:
					mnoznikEur = wartosc * 0.21;
					mnoznikDol = wartosc * 0.24;
					Console.WriteLine("Wprowadź drugą walutę?");
					Console.WriteLine("1 - EURO");
					Console.WriteLine("2 - PLN");
					waluta2 = Convert.ToInt32(Console.ReadLine());
					if (waluta2 == 1)
					{
						Console.WriteLine(mnoznikEur);
					}
					else if (waluta2 == 2){
						Console.WriteLine(mnoznikDol);
					}
					else
					{
						Console.WriteLine("Podano nieprawidłowe dane");
					}

					break;
				case 2:
					mnoznikPln = wartosc * 4.66;
					mnoznikDol = wartosc * 1.10;
					Console.WriteLine("Wprowadź drugą walutę?");
					Console.WriteLine("1 - PLN");
					Console.WriteLine("2 - DOLAR");
					waluta2 = Convert.ToInt32(Console.ReadLine());
					if (waluta2 == 1)
					{
						Console.WriteLine(mnoznikPln);
					}
					else if (waluta2 == 2)
					{
						Console.WriteLine(mnoznikDol);
					}
					else
					{
						Console.WriteLine("Podano nieprawidłowe dane");
					}
					break;
				case 3:
					mnoznikEur = wartosc * 0.91;
					mnoznikPln = wartosc * 4.23;
					Console.WriteLine("Wprowadź drugą walutę?");
					Console.WriteLine("1 - EURO");
					Console.WriteLine("2 - PLN");
					waluta2 = Convert.ToInt32(Console.ReadLine());
					if (waluta2 == 1)
					{
						Console.WriteLine(mnoznikEur);
					}
					else if (waluta2 == 2)
					{
						Console.WriteLine(mnoznikPln);
					}
					else
					{
						Console.WriteLine("Podano nieprawidłowe dane");
					}
					break;
				default:
					Console.WriteLine("Podano nieprawidłową wartość");
					break;
			}
			Console.ReadLine();
		}
	}
6

No dobra, tylko jak się coś robi, to wypada to najpierw zaplanować. W programowaniu obiektowym nie chodzi o to, aby po prostu podzielić kod proceduralny na kilka kawałków i poumieszczać je w różnych klasach, tylko o to, aby każda klasa miała jakąś swoją odpowiedzialność, jakąś część zadania, którą się zajmie, ukrywając swój sposób działania przed innymi klasami, ale udostępniając im pewne swoje publiczne informacje i funkcje.
A więc pytanie do Ciebie - co Ty tu masz zrobić i jakich w związku z tym klas potrzebujesz?

A co do Twojego pytania o dostęp do zmiennych między klasami to sposobów jest kilka, najczęściej robi się to przez właściwość.

0

@somekind: takie są mniej-więcej założenia, im dłużej się w to zagłębiam tym cięższe wydaje mi się to do realizacji

/*
Program oparty na klasach na początku ma pobierać wybór użytkownika co do wprowadzanej waluty
Następnie ma pozwalać użytkownikowi na wprowadzenie wartości na jakiej przeprowadzane będą operacje
Pozwala na dokonanie drugiego wyboru "odnośnie waluty na jaką ma zostać zmieniona" podana wcześniej
Program w klasie Obliczenia dokonuje przemnożeń i wyświetla wyniki w miejscu outputu
 */

namespace walutt
{
	class Program //główny program
	{
		class Wybor  //klasa stworzona po to aby się do niej odwołać
		{
			public int waluta, waluta2; //zdefiniowanie zmiennych
			public double wartosc;

			public void pierwszaWaluta() //void stworzony by pobierać do zmiennej "waluta" wybór użytkownika
			{
				Console.WriteLine("Wprowadź pierwszą walutę?");
				Console.WriteLine("1 - PLN");
				Console.WriteLine("2 - EURO");
				Console.WriteLine("3 - DOLAR");
				waluta = Convert.ToInt32(Console.ReadLine());
			}
			public void wartoscDoObliczen() //void stworzony by pobierać do zmiennej "wartosc" wartość podaną przez użytkownika w celu ustalenia początkowej wielkości jaką będę mnożyć przez kurs walutowy
			{
				Console.WriteLine("Jaką wartość chcesz przeliczyć?");
				wartosc = Convert.ToDouble(Console.ReadLine());
			}

			public void drugaWaluta() //void stworzony by pobierać do zmiennej "waluta2" 2 wybór podany przez użytkownika, w zależności od wyboru pierwszego
			{
				Console.WriteLine("Wprowadź drugą walutę?");
				if (waluta == 1)
				{
					Console.WriteLine("1 - EURO");
					Console.WriteLine("2 - DOLAR");
					waluta2 = Convert.ToInt32(Console.ReadLine());
				}
				else if (waluta == 2)
				{
					Console.WriteLine("1 - PLN");
					Console.WriteLine("2 - DOLAR");
					waluta2 = Convert.ToInt32(Console.ReadLine());
				}
				else if (waluta == 3)
				{
					Console.WriteLine("1 - EUR");
					Console.WriteLine("2 - PLN");
					waluta2 = Convert.ToInt32(Console.ReadLine());
				}
			}
		}
		class Obliczenia //klasa stworzona po to aby się do niej odwołać w celu obliczeń walutowych w zależności od wyborów
		{
			public double wynik;
			public void obliczeniaWalut() {
			
			}

		}
	}

	static void Main(string[] args)
		{
			
		}
	}
1
MIR0 vol.13 napisał(a):

@somekind: takie są mniej-więcej założenia, im dłużej się w to zagłębiam tym cięższe wydaje mi się to do realizacji

Zadanie nie specyfikuje JAK mają być zaprojektowane klasy, więc ten słabiutki (delikatnie mówiac) projekt jest Twoim przemyśleniem, ale nie narzucony.

W 100% zgadzam się z @somekind
W programowaniu obiektowym nie chodzi o to, aby po prostu podzielić kod proceduralny na kilka kawałków i poumieszczać je w różnych klasach, tylko o to, aby każda klasa miała jakąś swoją odpowiedzialność

@MIR0 vol.13:

Myśl o klasach (obiektach klas) jako o rzeczownikach, a o metodach jako o czasownikach. Tu jesteś jak najdalszy od tego wzoru, w najmniejszym stopniu nie jest to obiektowe.

Masz mieć klasy, może mniej złe będą :
Waluta (w sensie identyfikator waluty)
Kwota (liczba z walutą)
Klasa Kalkulator w której metoda przelicz (oblicz, obojętne) dostaje jako argument jedną Kwotę i docelową Walutę a zwraca drugą Kwotę.
Ciekawe z dydaktycznego punktu może też być podanie w konstruktorze waluty docelowej

class Kalkulator1 {
   public Kwota oblicz(Kwota wej, Waluta docelowa) ... 
}

albo

class Kalkulator2 {
   Waluta docelowa;
   public Kalkulator2(Waluta doc) {
       docelowa =  doc;
   }
   public Kwota oblicz(Kwota wej) ... 
}

ps. męka z uzyskaniem wartości z innej klasy dość często jest dowodem na to, ze są źle zaprojektowane.

pps. inną męką, jaką sam na siebie ściągnąłeś, są metody void które drukują - zamiast np zwracania wartości

0

@ZrobieDobrze: voidy przez to, że inspirowałem się tym kodem

class Prostokat
{
    protected double length, width;
    public void getdata()
    {
        Console.WriteLine("Wprowadź długość i szerokość prostokąta !!");
        length = Convert.ToDouble(Console.ReadLine());
        width = Convert.ToDouble(Console.ReadLine());
    }
    public double GetArea()
    {
        return length * width;
    }
    public void Display()
    {
        Console.WriteLine("Długość: {0}", length);
        Console.WriteLine("Szerokość: {0}", width);
        Console.WriteLine("Pole: {0}", GetArea());
    }
}//end class Prostokat
class Tabletop : Prostokat
{
    private double cena;
    public double GetCost()
    {
        double cena;
        cena = GetArea() * 70;
        return cena;
    }
    public void Display()
    {
        base.Display();
        Console.WriteLine("Cost: {0}", GetCost());
    }
}
class ExecuteProstokat
{
    static void Main(string[] args)
    {
        Tabletop t = new Tabletop();
        t.getdata();
        t.Display();
        Console.ReadKey();
    }
}

i próbowałem niejako przekształcić "podpasować" na currency converter
odnośnie tego co napisałeś to no ewidentnie będę musiał sobie to przeanalizować ze 100 razy - gdyż niewiele z tego rozumiem.
Rozumiem jednak że tych założeń nie da się wykonać postepując w sposób w jaki próbowałem ten kod poprowadzić i muszę zaczynać od początku - ok.

1
MIR0 vol.13 napisał(a):

@ZrobieDobrze: voidy przez to, że inspirowałem się tym kodem

jesteś studentem, więc pełnoletni, to zapytam: skąd wynalazłeś takie g**no ?
Dawno już byś zrobił od zera, wg chłopskiego rozsądku, a nie podpierniczając kod ludzi bardziej zielonych od Ciebie

1
MIR0 vol.13 napisał(a):

Rozumiem jednak że tych założeń nie da się wykonać postepując w sposób w jaki próbowałem ten kod poprowadzić i muszę zaczynać od początku - ok.

Klasa : rzeczownik, metoda: czasownik.
W profesjonalnym programowaniu ten rzeczownik bywa bardziej abstrakcyjny, ale na tym etapie nie myślmy o tym.

Póki co (oprócz kopiowania kiepskiego kodu) MYSLISZ proceduralnie

ps. moze pomocna będzie sugestia: bardziej myśl, jaki układ obiektów (więc i klas) wyraza problem, go modeluje (czyli akcent na rzeczowniki), niż na sekwencję w jakiej będziesz postępował (to jest myślenie proceduralne)

0

"klasa stworzona po to aby się do niej odwołać" :D
a na studia pewnie poszedłeś po to żeby je skończyć

a Twoim problemem wydaje się to że nie odróżniasz klasy od instancji. Nie możesz odwołać się do zmiennej innej klasy (chyba że jest statyczna). Możesz się odwołać do zmiennej instancji innej klasy, więc najpierw musisz utworzyć instancje przez new:

var kalkulator = new Kalkulator();
kalkulator.Oblicz();

Tak nawiasem mówiąc jest wiele zasad programowania obiektowego, na przykład "tell, don't ask" - czyli w zasadzie nie powinieneś się odwoływać do zmiennych innych klas (pytać o wartości), tylko powinieneś tym klasom mówić co mają robić (wywoływać ich metody). Ale widać że nie jesteś zainteresowany tematem więc rób po swojemu.

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