Kalkulator - jak dobrze zadeklarować instrukcję switch case?

0

Cześć! Chciałbym poznać instrukcję switch case ale nie wiem do końca jak ją dobrze deklarować. Napisałem prosty programik z użyciem tej operacji, jednak jest tam parę podstawowych błędów których nie mogę wyeliminować jak to że

 switch (wybor) 

jak przypisuje coś takiego to wywala mi błąd. W casie gdzie chce odjąć dane liczby Console.WriteLine("Różnica = " + Convert.ToDouble(a) - Convert.ToDouble(b));

 mimo że są przekonwertowanie pokazuje że nie może odejmować stringów od double. No i także chciałbym zamknąć ten program ale nie wiem za bardzo czego mam użyć.

A oto mój cały kod:

```csharp
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Próbne
{
    class Program
    {
        static void Main(string[] args)
        {
            char wybor;
            string a, b;
            Console.WriteLine("Podaj 1 liczbę: ");
            a = Console.ReadLine();
            

            Console.WriteLine("Podaj 2 liczbę: ");
            b = Console.ReadLine();
            Console.ReadKey();
            Console.Clear();

            Console.WriteLine("MENU GŁÓWNE");
            Console.WriteLine("------------");
            Console.WriteLine("1.Dodawanie");
            Console.WriteLine("2.Odejmowanie");
            Console.WriteLine("3.Mnożenie");
            Console.WriteLine("4.Dzielenie");
            Console.WriteLine("5.Koniec programu");

            switch (wybor)
            {
                case '1':
                    Console.WriteLine("Suma = " + Convert.ToDouble(a) + Convert.ToDouble(b));
                    break;
                case '2':
                    Console.WriteLine("Różnica = " + Convert.ToDouble(a) - Convert.ToDouble(b));
                    break;
                case '3':
                    Console.WriteLine("Mnożenie = " + Convert.ToDouble(a) * Convert.ToDouble(b));
                    break;
                case '4':
                    if (Convert.ToDouble(b) == 0)
                        Console.WriteLine("Nie dzielimy przez 0!");
                    else
                        Console.WriteLine("Iloraz = " + Convert.ToDouble(a) /Convert.ToDouble(b));
                    break;
                case '5':                    
                    // tu chciałbym wpisać cos w stylu Console.Exit() ale czy jest coś takiego?
                    break;
                default:
                    Console.WriteLine("Nie ma takiej opcji");
            }



            Console.ReadKey();
        }
        
    }
}
 

Gdzie popełniłem błędy?

1
Console.WriteLine("Różnica = " + Convert.ToDouble(a) - Convert.ToDouble(b));  

Takie działanie jest niedozwolone, bo nie można odjąć tekstu. Poprawny zapis:

Console.WriteLine("Różnica = " + (Convert.ToDouble(a) - Convert.ToDouble(b)));  

poza tym gdzie przypisujesz wartość zmiennej wybor? Zmień to! Na końcu instrucji default dodaj break i program powinien się wykonać.

1

Ujmij operację w dodatkowe nawiasy, bo to nie jedyny problem.

Console.WriteLine("Suma= " + Convert.ToDouble(a) + Convert.ToDouble(b));

Po podaniu a=2 i b=5 dostaniesz 25, bo liczby zostaną skonwertowane na string i sklejone.

Zrób:

Console.WriteLine("Suma= " + ( Convert.ToDouble(a) + Convert.ToDouble(b) ) );
Console.WriteLine("Suma= " + ( Convert.ToDouble(a) - Convert.ToDouble(b) ) );

I liczy i działa.

0

Poprawiłem nawiasy, gdzie mam przypisać wartość zmiennej wybor? Jedyne co mi pokazuje w błędach to komunikat: "Use of unassigned local variable 'wybor' "
I co ja mam z tym zrobić?

1

Można wczytywać liczbę w ten sposób :

double first_n;
while (!double.TryParse(Console.ReadLine(), out a))
    Console.WriteLine("Enter again : ");

"Use of unassigned local variable 'wybor' "

Wczytać wybór :)

1

Żeby wczytać char do wyboru:

wybor = Console.ReadKey().KeyChar;
0
xfin napisał(a):

Żeby wczytać char do wyboru:

wybor = Console.ReadKey().KeyChar;

czy mogę wybor przypisać funkcji int, double albo obojętnie jakiej? Czy zawsze muszę dać char?
Zawsze trzeba wczytywać w taki oto sposób? Czy można to zrobić prościej?

0

Możesz dać int, ale wtedy będziesz musiał uzależnić swój wybór od liczby całkowitej. Jak dasz string to musisz zmienić metodę wczytywania na:

 string wybor = Console.ReadLine()

Jednocześnie zmieniasz wszystkie case np. case "1": (tutaj kod ) case "2": (kod) itd.

1
Jumpeq napisał(a):

7
czy mogę wybor przypisać funkcji int, double albo obojętnie jakiej? Czy zawsze muszę dać char?
Zawsze trzeba wczytywać w taki oto sposób? Czy można to zrobić prościej?

Wczytuj jak tylko zechcesz!

int wybor= Convert.ToInt32(Console.ReadLine());
double wybor = Convert.ToDouble(Console.ReadLine());

Ale! Wybor raczej nie dawaj double - ze względu na dokładność w standardzie IEEE raczej nie powinno się porównywać double. Po prostu reprezentacja może się różnić, dlatego double zawsze porównuje się z "dokładnością do".

0

Rozumiem, dziękuję za wyjaśnienie!

Mam jeszcze jedno pytanie. Jeżeli wpisze już dane liczby to daną operację (mnożenia, dodawania, dzielenia) mogę zrobić tylko raz. Jak zrobić to abym mógł zrobić wybór wielokrotny? Np jak kliknę 1 to policzy mi dodawanie, po tym aplikacja się nie zamknie ale np wyświetli się znowu menu kontekstowe z wyborem poleceń, i także z możliwością podania nowych liczb. Czy muszę zrobić zagnieżdżeine switch case'a?

I poza tym jaka instrukcja zamyka program po kliknięciu?

1

Ja bym dał MENU GŁÓWNE na początek maina, a resztę w pętlę ;)

0

Przerobiłem trochę i działa elegancko:

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

namespace Kurs4
{
    class Program
    {
        static void Main(string[] args)
        {
            char wybor;
            string a, b;
            Console.WriteLine("Podaj 1 liczbę: ");
            a = Console.ReadLine();


            Console.WriteLine("Podaj 2 liczbę: ");
            b = Console.ReadLine();
            Console.ReadKey();
            Console.Clear();

            Console.WriteLine("MENU GŁÓWNE");
            Console.WriteLine("------------");
            Console.WriteLine("1.Dodawanie");
            Console.WriteLine("2.Odejmowanie");
            Console.WriteLine("3.Mnożenie");
            Console.WriteLine("4.Dzielenie");
            Console.WriteLine("5.Koniec programu");

            wybor = Console.ReadKey().KeyChar;
            switch (wybor)
            {
                case '1':
                    Console.WriteLine("Suma = " + Convert.ToDouble(a) + Convert.ToDouble(b));
                    break;
                case '2':
                    Console.WriteLine("Różnica = " + (Convert.ToDouble(a) - Convert.ToDouble(b)));
                    break;
                case '3':
                    Console.WriteLine("Mnożenie = " + Convert.ToDouble(a) * Convert.ToDouble(b));
                    break;
                case '4':
                    if (Convert.ToDouble(b) == 0)
                        Console.WriteLine("Nie dzielimy przez 0!");
                    else
                        Console.WriteLine("Iloraz = " + Convert.ToDouble(a) / Convert.ToDouble(b));
                    break;
                case '5':
                    // tu chciałbym wpisać cos w stylu Console.Exit() ale czy jest coś takiego?
                    break;
                
                    Console.WriteLine("Nie ma takiej opcji");
            }



            Console.ReadKey();
        }
    }
}
0

@alekplus
Jesteś pewien funkcji dodającej? ;)
http://rextester.com/MFAZD91735

0

A jest możliwość bez pętli? Jeszcze jej nie miałem na zajęciach, bynajmniej spróbuję to zastosować tak jak mówisz :)

0

Przeczytałem o pętli i wiem jak ona działa ale w jaki sposób mam ją wpisać w mój kod? Czy można zapisać żeby pętla wykonywała się w nieskończoność? Tzn żebym mógł ciągle wpisywać liczby i liczyć (tak jak na kalkulatorze gdy skończe coś liczyć, klikam aby wyczyścił się ekran i robię nowe działania) w tym celu musze mieć nieograniczoną możliwość wpisywania liczb. Do tego muszę mieć nieograniczoną możliwość wyboru opcji co chce zrobić (odjąć, podzielić itp.) a dopiero kiedy wcisnę odpowiedni "guzik" mój kalkulator się wyłączy? Jak to pogodzić? Jak to połączyć?

1
{
    class Program
    {
        static void Main(string[] args)
        {
            char wybor;
            string a, b;
            do
            {
                Console.WriteLine("Podaj 1 liczbę: ");
                a = Console.ReadLine();


                Console.WriteLine("Podaj 2 liczbę: ");
                b = Console.ReadLine();
                Console.ReadKey();
                Console.Clear();

                Console.WriteLine("MENU GŁÓWNE");
                Console.WriteLine("------------");
                Console.WriteLine("1.Dodawanie");
                Console.WriteLine("2.Odejmowanie");
                Console.WriteLine("3.Mnożenie");
                Console.WriteLine("4.Dzielenie");
                Console.WriteLine("5.Koniec programu");
                Console.Write("Twój wybór:");
                wybor = Console.ReadKey().KeyChar;
                Console.WriteLine();
                switch (wybor)
                {
                    case '1':
                        Console.WriteLine("Suma = " + (Convert.ToDouble(a) + Convert.ToDouble(b)));
                        break;
                    case '2':
                        Console.WriteLine("Różnica = " + (Convert.ToDouble(a) - Convert.ToDouble(b)));
                        break;
                    case '3':
                        Console.WriteLine("Mnożenie = " + (Convert.ToDouble(a) * Convert.ToDouble(b)));
                        break;
                    case '4':
                        if (Convert.ToDouble(b) == 0)
                            Console.WriteLine("Nie dzielimy przez 0!");
                        else
                            Console.WriteLine("Iloraz = " + (Convert.ToDouble(a) / Convert.ToDouble(b)));
                        break;
                    case '5':
                        Console.WriteLine("Program się zakończy po naciśnięciu kaliwsza.");
                        Console.ReadLine();
                        Environment.Exit(0);
                        break;
                    default:
                        Console.WriteLine("Nie ma takiej opcji");
                        break;
                }
            } while (wybor != 5);
        }
    }
}
 

Coś takiego, opakowałem tylko w pętlę do...while i dodałem do numerka 5 odpowiedni komunikat o zamknięciu i zamknięcie programu, to tak z palca w 2 minuty może inni zaproponują Tobie inne rozwiązanie.

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