Kompletne początki z C# - banalne pytania

2014-09-18 04:15
0

Witam i z gory przepraszam za moje banalne dla wielu pytanie. Postawilem sobie za cel nauczyc sie (lub na poczatek przynajmniej "zalapac") programowania w C# z ksiazek i innych publikacji szerokodostepnych w sieci. Wpadla mi w rece, a raczej w monitor ksiazka Adama Boducha Wstep Do Programowania C# i chcialem o cos zapytac.

Pytanie dotyczy prostej gry zaprezentowanej przez autora, w ktorej komputer losuje liczbe, a dwoje graczy "strzela" odgadujac liczbe czytajac jednoczesnie podpowiedzi komputera czy szukana liczba jest wyzej, czy nizej.

konkretnie chodzi o ten kawalek kodu:

Console.WriteLine(player + ", strzelaj!");
// należy przekonwertować tekst na liczbę
Number = Convert.ToInt32(Console.ReadLine());

pytanie: dlaczego nalezy przekonwertowac tekst na liczbe, jesli juz na poczatku zadeklarowalismy ze Number bedzie liczba?

int Number;

Jest pozno w nocy i moze nie mysle juz zbyt trzezwo :-)


Hmm... Probuje nauczyc sie C#
edytowany 1x, ostatnio: furious programming, 2014-09-18 17:15

Pozostało 580 znaków

2014-09-18 04:47
x
0

Pobierasz z konsoli tekst. Musisz przekonwertować go na inta, bo w zmiennej int możesz przechowywać tylko liczby.... Nie można tak po prostu przypisać innego typu do inta. Idź spać...

Pozostało 580 znaków

2014-09-18 04:54
jakiśtam
0

Co prawda nie znam C#, ale kiedyś pisałem w C++ oraz PHP i wydaje mi się, że:

Skoro zmienną "Number" zadeklarowałeś jako "int", to teraz nie masz wyjścia i możesz w niej zapisywać tylko liczby. Deklaracja jako "int" nie sprawia, że zmienna automatycznie będzie przerabiać wszystko co otrzyma na liczbę. Przeciwnie, tylko liczby będzie przyjmować, a jak nie, to wyskoczy błąd.

Istnieje też coś takiego jak dynamiczne typowanie zmiennych (w przeciwieństwie do statycznego, w którym z góry określasz charakter zmiennej). Nie wiem, jak jest w C#, ale w PHP ono występuje. Wtedy nie deklarujesz "int Number", tylko po prostu "Number", a tak właściwie to "$Number". Taka zmienna automatycznie dostosuje się do materiału, który chcesz w niej zapisać (dasz inta, będzie intem; dasz stringa, to będzie stringiem itd...), ale sama też go nie przerabia (w sumie nawet nie wiadomo na co by miała, bo nie określiłeś w deklaracji). Od tego (zmiany typu zmiennej) nawet w PHP są osobne funkcje.

Przepraszam za miejscami mało profesjonalny język, ale wydaje mi się, że język potoczny ma miejscami większe walory edukacyjne, zwłaszcza w dziale Newbie.

Pozostało 580 znaków

2014-09-18 05:13
0

Dzieki za obie odpowiedzi. Wszystko co piszecie ma oczywiscie sens, to ja tu czegos nie rozumiem. Napisze moze jak ja to widze.
Zadeklarowalismy na poczatku ze Number bedzie intem. Komunikat konsoli dla grajacego playera bedzie STRZELAJ!. Skoro gracz zna zasady gry to wie, ze musi podac liczbe czyli jak ja to rozumiem inta. Wiec skoro program oczekuje ze do konsoli zostanie wpisana liczba (w innym przypadku gra nie mialaby sensu) to dlaczego musimy mimo wszystko deklarowac konwersje tekstu na liczbe? Wcale nie spodziewamy sie tam przeciez tekstu.
Sorry za taka dociekliwosc szczegolnie wynikajaca z niezrozumienia. Jestem w pracy na nocnej zmianie i to w sumie jedyny czas kiedy moge poswiecic kilka godzin na nauke.


Hmm... Probuje nauczyc sie C#

Pozostało 580 znaków

2014-09-18 05:31
jakiśtam
0

program oczekuje ze do konsoli zostanie wpisana liczba (w innym przypadku gra nie mialaby sensu)

Wcale nie spodziewamy sie tam przeciez tekstu.

Nie widziałem reszty kodu, ale być może to nieprawda. Być może program oczekuje właśnie stringa, a nie inta. Ma to taką zaletę, że jeżeli użytkownik wpisze coś innego niż inta (np. przez pomyłkę), to program nie zgłupieje od przypisywania zmiennej liczbowej tekstu. Możesz wtedy sprawdzić jej zawartość przed dalszą obróbką i wyświetlić ładny komunikat o błędzie, ewentualnie poprosić o ponowne wpisanie.

Sorry za taka dociekliwosc szczegolnie wynikajaca z niezrozumienia

Nic się nie stało ;). Przeciwnie, to się chwali. Właśnie tak się nauczysz.

Pozostało 580 znaków

2014-09-18 05:37
0

Ma to taką zaletę, że jeżeli użytkownik wpisze coś innego niż inta (np. przez pomyłkę), to program nie zgłupieje od przypisywania zmiennej liczbowej tekstu.

I prawdopodobnie o to wlasnie chodzi. To w sumie rozwiewa wszystkie moje dotychczasowe watpliwosci. Dzieki bardzo za odpowiedz i do nastepnego pytania :-)

Ponizej zamieszczam caly kod gry:

 using System;

class Program
{
    static void Main(string[] args)
    {
        // imiona graczy
        string player1, player2;
        // gra zakończona (true) czy nie (false)
        bool Done = false;
        // liczba podana przez użytkownika
        int Number;

        Console.Write("Podaj imię gracza nr 1:  ");
        player1 = Console.ReadLine();

        Console.Write("Podaj imię gracza nr 2:  ");
        player2 = Console.ReadLine();

        // tworzenie nowej instancji klasy
        Random RandomObj = new Random();

        // wylosowanie liczby z zakresu 0-999
        int X = RandomObj.Next(1000);

        // zmienna przechowuje imię gracza, który wykonuje „ruch”
        string player = player1;

        while (!Done)
        {
            // zamiana graczy
            player = player == player1 ? player2 : player1;

            Console.WriteLine(player + ", strzelaj!");
            // należy przekonwertować tekst na liczbę
            Number = Convert.ToInt32(Console.ReadLine());

            if (X > Number)
            {
                Console.WriteLine("Strzelaj wyżej!");
            }
            else if (X < Number)
            {
                Console.WriteLine("Strzelaj niżej!");
            }
            else
            {
                Console.WriteLine("Gratulacje! Wygrał gracz " + player);
                Console.Beep();

                Done = true;
            }
        }        
        Console.Read();
    }
}

Hmm... Probuje nauczyc sie C#

Pozostało 580 znaków

2014-09-18 05:43
jakiśtam
1

Jak już wspomniałem, w C# nigdy nie pisałem, ale wydaje mi się , że metoda Console.ReadLine() domyślnie zwraca stringa.

edytowany 1x, ostatnio: furious programming, 2016-12-13 18:26

Pozostało 580 znaków

2014-09-18 05:55
0

Masz w 100% racje. Console.ReadLine oczekuje stringa, wlasnie wrocilem do poczatku i doczytalem. Dziekuje jeszcze raz za naprowadzenie.


Hmm... Probuje nauczyc sie C#
edytowany 1x, ostatnio: furious programming, 2014-09-18 17:16

Pozostało 580 znaków

2015-03-31 09:34
Mały Orzeł
0

Jeśli mogę się podkleić pod temat.
Ja za to nie rozumiem linijki dot. zamiany graczy. Może mnie ktoś oświecić? 0_o

player = player == player1 ? player2 : player1;

dodanie znacznika <code class="csharp"> - @furious programming

edytowany 1x, ostatnio: furious programming, 2016-12-13 18:26
if(player == player1)player = player2 else player = player1; https://msdn.microsoft.com/pl-pl/library/ty67wk28.aspx - QwertzOne 2015-03-31 09:38

Pozostało 580 znaków

2015-03-31 09:44
0

To jest taki "cukier skladniowy" i jest rownoznaczny z:

if(player == player1)
{
    player = player2;
}
else
{
    player = player1;
}

wiecej info -> https://msdn.microsoft.com/pl-pl/library/ty67wk28.aspx

Pozostało 580 znaków

2015-03-31 09:56
gdsfgsfd
0

Ale gracze są rozpoznawani po imieniu więc jeśli wprowadzi się takie same imiona to pomijając że ciężko by było rozróżnić graczy to program nie będzie ich nawet zmieniał

W przypadku tych samych imion ciągle będzie działać, ponieważ stringi są porównywane porównywane po referencji, nie po wartości. W przypadku player = player.Equals(player1) ? player2 : player1; faktycznie nie powinno działać. - QwertzOne 2015-03-31 12:46
@QwertzOne, no chyba nie... == porównuje stringi na podstawie zawartości, a nie referencji. - some_ONE 2015-03-31 12:49
@QwertzOne Niesmaczne jest takie "ujavawianie" C#. - n0name_l 2015-03-31 12:50

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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