[C#] Problem z wywołaniem metody


(Marcinj10) #1

Witam,

Jestem kompletnie początkujący jeśli chodzi o C#, uczę się od przedwczoraj i już mam problemy. W ramach ćwiczeń chciałem zrobić rozkład jazdy w tablicy dwuwymiarowej (pierwsza kolumna - miasto wyjazdu, druga kolumna - godzina wyjazdu, trzecia kolumna - miasto przyjazdu, czwarta kolumna - godzina przyjazdu). Użytkownik podawałby miasto, którego szuka a program wyszukiwałby je w tablicy (zarówno w miastach wyjazdu jak i przyjazdu) i wyświetlał pozostałe dane (godziny i miasto wyjazdu/przyjazdu).

Napisałem już kod programu, problemem jest dla mnie odpowiednie umieszczenie w kodzie wywołania metody.

Oto kod:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


namespace Tablica_dwuwymiarowa

{

    class Program

    {


        public void Szukanie(string miasto)

        {

            int i,j;


            i = 0;

            j = 0;


            while(i<=2)

            {

                if(rozklad[i, j] == miasto)

                {

                    Console.WriteLine(rozklad[i, 0]);

                    Console.WriteLine(rozklad[i, 1]);

                    Console.WriteLine(rozklad[i, 2]);

                    Console.WriteLine(rozklad[i, 3]);

                }

                else

                {

                    if(j == 0)

                    {

                        j = 2;

                    }

                    else

                    {

                        j = 0;

                        i = i++;

                    }


                }

            }

        }




        static void Main(string[] args)

        {

            string [,] rozklad = new string[3, 4];


            rozklad[0, 0] = "Pabianice";

            rozklad[0, 1] = "1:10";

            rozklad[0, 2] = "Łódź";

            rozklad[0, 3] = "2:10";


            rozklad[1, 0] = "Dłutów";

            rozklad[1, 1] = "3:10";

            rozklad[1, 2] = "Bełchatów";

            rozklad[1, 3] = "4:10";


            rozklad[2, 0] = "Londyn";

            rozklad[2, 1] = "5:10";

            rozklad[2, 2] = "Manchester";

            rozklad[2, 3] = "6:10";



            Console.WriteLine("Podaj miasto:");

            string szukane = Console.ReadLine();

            Console.WriteLine();

            Console.WriteLine();

            Szukanie(szukane);


            Console.ReadLine();


        }



    }

}

Wydaje mi się, że sama metoda jest napisana dobrze, ale właśnie nie wiem jak ją wywołać.

Ćwiczenie pochodzi ze strony http://si-szarp.pl/kurs/tablice (korzystam z tego kursu przy nauce C#), jest tam rozwiązanie zadania, ale korzysta ono z obiektów klas, których ja nie użyłem (nie wiem po co miałbym je tu używać).

Mógłby mi ktoś pomóc i powiedzieć co mam dodać/zmienić?


(Grzelix) #2

Ale w czym jest problem?

Nie kompilowałem źródła więc nie wiem czy wszystko jest ok. Natomiast stwierdzenie

jest dla mnie nie zrozumiałe w kontekście kodu, który zawiera wywołanie metody. I moim zdaniem w dobrym miejscu.


(Marcinj10) #3

Napisałem to, ponieważ po kompilacji mam 6 błędów:

5 x Nazwa „rozklad” nie istnieje w bieżącym kontekście.

1 x Dla niestatycznego pola, metody lub właściwości „Tablica_dwuwymiarowa.Program.Szukanie(string)” wymagane jest odwołanie do obiektu.

Nie wiem z czego te błędy wynikają. Jak to naprawić?

Dlaczego metoda “Szukanie” nie rozpoznaje tablicy “rozklad”?


(Latos 89) #4

Z tego co widać to tablicę rozkład musisz zainicjować w klasie “program”, a w klasie “main” stworzyć “uchwyt” do klasy “program”. Tak jak jest w przykładnie z strony z której podałeś.

class program

{

string [,] rozklad = new string[3, 4];}

class main

{

program xx = new program();

}


(Marcinj10) #5

Tylko, że wygląda to na bardzo niewygodne. Nie rozumiem po co mam tworzyć obiekt klasy program.

Z tego co czytałem, to obiekty klas tworzymy wtedy, gdy chcemy z jednej klasy skorzystać kilka razy, ale z innymi zmiennymi. W moim przykładzie raczej nie ma czegoś takiego.

Nie wystarczy tablicy rozklad zainicjować w taki sposób, aby była widoczna po za jedną klasą? Próbowałem dopisywać public, ale tylko powiększała się liczba błędów.


(Grzelix) #6
class Program

    {

       string [,] rozklad;


...

 static void Main(string[] args)

        {

            rozklad = new string[3, 4];


            rozklad[0, 0] = "Pabianice";

...

w drugim poście dopiero napisałeś o co chodzi, jak zadajesz pytanie na forum to pozwól poznać szczegóły na temat problemu. Informatycy to nie wróżki :slight_smile:


(Marcinj10) #7

@grzelix - poprawiłem kod zgodnie z tym co zaproponowałeś, teraz mam:

13 błędów “Dla niestatycznego pola, metody lub właściwości „Tablica_dwuwymiarowa.Program.rozklad” wymagane jest odwołanie do obiektu.”

oraz

1 błąd "Dla niestatycznego pola, metody lub właściwości „Tablica_dwuwymiarowa.Program.Szukanie(string)” wymagane jest odwołanie do obiektu. "

Wygląda na to, że VS wymaga ode mnie użycia obiektów - tylko po co? Może czegoś nie zrozumiałem do końca jeśli chodzi o obiekty?


(system) #8
using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


namespace _123

{

    class Program

    {

        static void Main(string[] args)

        {

            string[,] rozklad = new string[3, 4];


            rozklad[0, 0] = "Pabianice";

            rozklad[0, 1] = "1:10";

            rozklad[0, 2] = "Łódź";

            rozklad[0, 3] = "2:10";


            rozklad[1, 0] = "Dłutów";

            rozklad[1, 1] = "3:10";

            rozklad[1, 2] = "Bełchatów";

            rozklad[1, 3] = "4:10";


            rozklad[2, 0] = "Londyn";

            rozklad[2, 1] = "5:10";

            rozklad[2, 2] = "Manchester";

            rozklad[2, 3] = "6:10";



            Console.WriteLine("Podaj miasto:");

            string szukane = Console.ReadLine();

            Console.WriteLine();

            Console.WriteLine();

            Szukanie(szukane,rozklad);


            Console.ReadLine();


        }

        static void Szukanie(string miasto, string [,] rozklad)

        {

            int i, j;

            for (i = 0; i <= 2; ++i)

            {

                if (rozklad[i, 0] == miasto)

                {

                    Console.WriteLine(rozklad[i, 0]);

                    for (j = 0; j <= 3; ++j)

                    {

                        Console.WriteLine(rozklad[i, j]);

                    }

                    break;

                }

            }

        }

    }

}

Średnio znam C#, ale ten przykład powinien działać i ja w tego typu prostych programach trzymałbym się tej metody. Ale oczywiście mogę się mylić


(Grzelix) #9

czytanie błędów ze zrozumieniem to też ważna umięjętność

pole oznaczyć jako statyczne i teraz nie jest pewien ale chyba wówczas należy od razu zadeklarować jego warotść czyli

static string [,] rozklad = new string[4,3];

(Marcinj10) #10

@Protected_48

Przejrzałem Twój kod i wkleiłem do swojego zmiany, które ty zapisałeś.

Teraz kod wygląda tak:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


namespace Tablica_dwuwymiarowa

{

    class Program

    {

        static void Main(string[] args)

        {

            string[,] rozklad = new string[3, 4];


            rozklad[0, 0] = "Pabianice";

            rozklad[0, 1] = "1:10";

            rozklad[0, 2] = "Łódź";

            rozklad[0, 3] = "2:10";


            rozklad[1, 0] = "Dłutów";

            rozklad[1, 1] = "3:10";

            rozklad[1, 2] = "Bełchatów";

            rozklad[1, 3] = "4:10";


            rozklad[2, 0] = "Londyn";

            rozklad[2, 1] = "5:10";

            rozklad[2, 2] = "Manchester";

            rozklad[2, 3] = "6:10";



            Console.WriteLine("Podaj miasto:");

            string szukane = Console.ReadLine();

            Console.WriteLine();

            Console.WriteLine();

            Szukanie(szukane,rozklad);


            Console.ReadLine();


        }


        public void Szukanie(string miasto, string [,] rozklad)

        {

            int i, j;


            i = 0;

            j = 0;


            while (i <= 2)

            {

                if (rozklad[i, j] == miasto)

                {

                    Console.WriteLine(rozklad[i, 0]);

                    Console.WriteLine(rozklad[i, 1]);

                    Console.WriteLine(rozklad[i, 2]);

                    Console.WriteLine(rozklad[i, 3]);

                }

                else

                {

                    if (j == 0)

                    {

                        j = 2;

                    }

                    else

                    {

                        j = 0;

                        i = i++;

                    }


                }

            }

        }


    }

}

Po kompilacji otrzymuję 1 błąd: Dla niestatycznego pola, metody lub właściwości „Tablica_dwuwymiarowa.Program.Szukanie(string, string[*,*])” wymagane jest odwołanie do obiektu. Błąd ten odwołuje się do linii

Szukanie(szukane,rozklad);

(Grzelix) #11

i metoda też musi być oznaczona jako statyczna

czyli

public static void Szukanie(string miasto, string [,] rozklad)

        {

zarówno rozwiązaniu ze zmienną na zewnątrz metod jak i w tym które podał @Protected_48


(Marcinj10) #12

Ok, oznaczyłem je jako statyczne i działa. Problemem jest jeszcze jedynie metoda Szukanie, która działa poprawnie tylko gdy szukam miasta z pierwszego wiersza tablicy - myślę jednak, że z tym jakoś sobie poradzę.

Nie uczyłem się jeszcze o metodach statycznych. Co to właściwie znaczy? Dlaczego powodowało to błędy?

Po za tym bardzo dziękuję za pomoc, bez was bym sobie nie poradził.

Możecie mi jeszcze powiedzieć czemu na stronie http://si-szarp.pl/kurs/tablice w rozwiązaniu użyte są obiekty? Czy to rzeczywiście ma sens? Zrobilibyście to w ten sposób czy raczej mój (a może zupełnie inaczej)?


(Tomek Matz) #13

Moim zdaniem powinieneś zainwestować w jakąś książkę. Jeśli C# nie jest pierwszym językiem programowania z jakim masz styczność, to zainteresuj się tą pozycją: http://ksiegarnia.pwn.pl/produkt/104381/jezyk-c-2010-i-platforma-net-40.html (niedługo pojawi się nowa wersja tej książki, przy czym będzie ona w j.angielskim). Jeśli C# to Twój pierwszy język programowania, to poszukaj czegoś innego (nie podam Ci jakiegoś fajnego tytułu, bo nie znam).

Spojrzałem na kurs, do którego już dwukrotnie podałeś link. Pierwsze co rzuca się w oczy, to brak wcięć w kodzie (ała :P). Poza tym ćwiczenie, które sugeruje autor kursu nie uczy najlepszych nawyków. Przechowywanie w tablicy dwuwymiarowej rozkładu jazdy ? Nie, tak nie powinno to wyglądać. Natomiast obecność klasy Stacja ma jak najbardziej sens. Przecież na każdym dworcu będziesz miał inny rozkład jazdy.


(Marcinj10) #14

@matzu Jeśli chodzi o książkę, którą zaproponowałeś, to jej cena zdecydowanie przerasta moje możliwości (tak gdzieś o ok. 120zł).

Jeśli chodzi o ten kurs, to rzeczywiście wcięcia są problemem. W kilku pierwszych lekcjach kod był bardzo ciekawie przedstawiony, ale w kolejnych nagle zabrakło wcięć. Na szczęście znalazłem też wersję w .doc, która wcięcia posiada. Plusem tego kursu jest to, że wszystko jest dosyć przejrzyście wytłumaczone.

O co chodzi z tymi statycznymi metodami? Co one oznaczają?


(Grzelix) #15

Teraz jeszcze jedno ważne pytanie, jak u Ciebie ze znajomością angielskiego. W takich sytuacjach jak teraz - poznajesz nową rzecz i nie wiesz za wiele o niej, dobrą praktyką jest zapoznanie się z dokumentacją danej metody, klasy czy jak tym przypadku właściwości. Tutaj masz opisane, podane są przykłady użycia, i inne ważne informacje.

http://msdn.microsoft.com/en-us/library … s3(v=vs.80.aspx