Kalkulator - jak dobrze zadeklarować instrukcję switch case?

Kalkulator - jak dobrze zadeklarować instrukcję switch case?
JU
  • Rejestracja:ponad 8 lat
  • Ostatnio:prawie 6 lat
  • Postów:105
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

Kopiuj
 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));

Kopiuj
 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?

edytowany 2x, ostatnio: Jumpeq
flowCRANE
Wywułuj wątki opisowo, po raz kolejny przypominam
L1
  • Rejestracja:ponad 9 lat
  • Ostatnio:9 dni
  • Postów:104
1
Kopiuj
Console.WriteLine("Różnica = " + Convert.ToDouble(a) - Convert.ToDouble(b));  

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

Kopiuj
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ć.

edytowany 1x, ostatnio: loki121212
xfin
  • Rejestracja:ponad 11 lat
  • Ostatnio:8 miesięcy
  • Lokalizacja:Genewa
  • Postów:597
1

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

Kopiuj
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:

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

I liczy i działa.

JU
  • Rejestracja:ponad 8 lat
  • Ostatnio:prawie 6 lat
  • Postów:105
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ć?

Nomysz
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 6 lat
  • Postów:60
1

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

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

"Use of unassigned local variable 'wybor' "

Wczytać wybór :)

edytowany 1x, ostatnio: Nomysz
xfin
  • Rejestracja:ponad 11 lat
  • Ostatnio:8 miesięcy
  • Lokalizacja:Genewa
  • Postów:597
1

Żeby wczytać char do wyboru:

Kopiuj
wybor = Console.ReadKey().KeyChar;
edytowany 1x, ostatnio: xfin
JU
  • Rejestracja:ponad 8 lat
  • Ostatnio:prawie 6 lat
  • Postów:105
0
xfin napisał(a):

Żeby wczytać char do wyboru:

Kopiuj
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?

L1
  • Rejestracja:ponad 9 lat
  • Ostatnio:9 dni
  • Postów:104
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:

Kopiuj
 string wybor = Console.ReadLine()

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

edytowany 2x, ostatnio: loki121212
xfin
  • Rejestracja:ponad 11 lat
  • Ostatnio:8 miesięcy
  • Lokalizacja:Genewa
  • Postów:597
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!

Kopiuj
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".

JU
  • Rejestracja:ponad 8 lat
  • Ostatnio:prawie 6 lat
  • Postów:105
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?

xfin
  • Rejestracja:ponad 11 lat
  • Ostatnio:8 miesięcy
  • Lokalizacja:Genewa
  • Postów:597
1

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

AL
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 8 lat
  • Postów:29
0

Przerobiłem trochę i działa elegancko:

Kopiuj
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();
        }
    }
}
edytowany 1x, ostatnio: bogdans
bogdans
!Umieszczaj kod w znacznikach <code=csharp></code>
xfin
  • Rejestracja:ponad 11 lat
  • Ostatnio:8 miesięcy
  • Lokalizacja:Genewa
  • Postów:597
0

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

xfin
czyli 2 + 5 = 25? C'mon!
AL
Już wiem o co ci chodzi. Jednak nie jestem pewien ;D
xfin
No tak działa console.writeln ;)
JU
  • Rejestracja:ponad 8 lat
  • Ostatnio:prawie 6 lat
  • Postów:105
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 :)

xfin
Jak nie chcesz pisać N takich samych switchy jeden po drugim, to pętla jest jedyną opcją ;) Ew. Możesz też opakować całego switcha w funkcję i wywoływać ją rekurencyjnie z jakimś warunkiem... ale weź pętlę ;)
JU
  • Rejestracja:ponad 8 lat
  • Ostatnio:prawie 6 lat
  • Postów:105
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ć?

Wheliee
  • Rejestracja:ponad 9 lat
  • Ostatnio:7 miesięcy
  • Postów:44
1
Kopiuj
{
    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.

edytowany 1x, ostatnio: Wheliee
JU
Właśnie o coś takiego mi chodziło, bardzo dziękuję! :)
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)