problem z klasami

Odpowiedz Nowy wątek
2011-08-25 23:49
marek
0

Witam.Mam taki mały problem z wywołaniem metody z klasy,nie będę pokazywał całego kodu ponieważ nie ma takiej konieczności tylko 2 fragmenty w których kryje się błąd

 using System;

class Start
{
    public string jezyk;
    static void Main()
    {
        Start S = new Start();
        PisanieWspak P=new PisanieWspak();
        Jezyk J = new Jezyk();
        string _odp="";
        while ((_odp != "1") && (_odp != "2"))
        {

            Console.WriteLine("Select language");
            Console.WriteLine("1.PL");
            Console.WriteLine("2.ENG");
            ConsoleKeyInfo odp = Console.ReadKey();
            _odp = Convert.ToString(odp.KeyChar);
            S.jezyk = _odp;
            if (_odp == "1") J.jezykPL();
            if (_odp == "2") J.jezykENG();
            if ((_odp != "1") && (_odp != "2"))

I

using System;

class PisanieWspak
{
    public void wpsak()
    {
        Jezyk J = new Jezyk();
        Start S = new Start();

        if (S.jezyk == "1") J.jezykPL();    
        if (S.jezyk == "2") J.jezykENG();

        Console.WriteLine(J.zd);  // TEGO NIE CHCE MI WYŚWIETLIĆ
        string wyraz = Console.ReadLine();
        string odwrocon = "";
        for (int i = 1; i <= wyraz.Length; i++) 

Mam też 3 klasę ze wszystkimi słówkami ( te skróty ) i w klasie 'Start' działa wsszystko Ok a w tej coś nie chce tego mi wyświetlić...
Pozdrawiam
Marek

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

Pozostało 580 znaków

2011-08-26 00:03
PcSA
0

Polecam breakpoint, debugger oraz klawisze F5, F10 i F11. Z kodu, który dałeś nic nie wynika - nie ma nigdzie chociażby wywołania metody wpsak() klasy PisanieWspak.

Pozostało 580 znaków

2011-08-26 00:03
0

Wszystko fajnie, tylko co to jest to

(J.zd)

Jeśli ma być to metoda, to wywołujesz ją w zły sposób. Pokaż kod tej metody.


Idiots, idiots everywhere.
edytowany 1x, ostatnio: allocer, 2011-08-26 00:04
IMO on po prostu tworzy nową instancję klasy i spodziewa się że w magiczny sposób stanie się ona tą samą co w mainie - msm 2011-08-26 00:07
jeszcze lepiej, patrz niżej - allocer 2011-08-26 00:10

Pozostało 580 znaków

2011-08-26 00:06
msm
0

Co to znaczy że TEGO NIE CHCE MI WYŚWIETLIĆ? Wyjątek? Nic się nie pokazuje na ekranie?

Gdybyś miał wątpliwości, zmienne J i S w metodzie wspak nie mają nic wspólnego ze zmiennymi w Main. To znaczy że

Start S = new Start(); 
if (S.jezyk == "1") J.jezykPL();    
if (S.jezyk == "2") J.jezykENG();

Jest kodem bezsensownym.

Pozostało 580 znaków

2011-08-26 00:08
marek
0

dobra macie cały kod są 3 klasy :class Jezyk
{
public string ccz, sjwzpw, pc, zwzlis, zdp,zd,ow;
public void jezykPL()
{

    ccz = "Co chcesz zrobić?";
    sjwzpw = "1.Sprawdzić jak wygląda zdanie pisane wspak";
    pc = "2.Policzyć coś";
    zwzlis = "3.Zagrać w zgadywanie liczb i słów";
    zdp = "4.zakończyć działanie programu";
    zd = "wprowadź jakieś zdanie";
    ow = "odwrócony wyraz to: ";
}
public void jezykENG()
{
    ccz = "What you want to do";
    sjwzpw = "1.Look how it looks sentence written backwards";
    pc = "2.count something";
    zwzlis = "3.Play the guessing of numbers and words";
    zdp = "4.quit";
    zd = "enter the phrase";
    ow = "inverted word is: ";
}

}

using System;

class Start
{
public string jezyk;
static void Main()
{
Start S = new Start();
PisanieWspak P=new PisanieWspak();
Jezyk J = new Jezyk();
string _odp="";
while ((_odp != "1") && (_odp != "2"))
{

        Console.WriteLine("Select language");
        Console.WriteLine("1.PL");
        Console.WriteLine("2.ENG");
        ConsoleKeyInfo odp = Console.ReadKey();
        _odp = Convert.ToString(odp.KeyChar);
        S.jezyk = _odp;
        if (_odp == "1") J.jezykPL();
        if (_odp == "2") J.jezykENG();
        if ((_odp != "1") && (_odp != "2"))

        {
            Console.Clear();
            Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("ERROR!\nTRY AGAIN");
            Console.ResetColor();

        }

    }

    Console.WriteLine(J.ccz);
    Console.WriteLine(J.sjwzpw);
    Console.WriteLine(J.pc);
    Console.WriteLine(J.zwzlis);
    Console.WriteLine(J.zdp);
    ConsoleKeyInfo odpo = Console.ReadKey();
    Console.Clear();
    switch (odpo.KeyChar)
    {
        case '1':
            {

                P.wpsak();

                break;
            }
        case '2':
            {
                break;
            }
        case '3':
            {
                break;
            }
        case '4':
            {
                break;
            }

        default:
            {

                break;
            }

    }
}

}

using System;

class PisanieWspak
{
public void wpsak()
{
Jezyk J = new Jezyk();
Start S = new Start();

    if (S.jezyk == "1") J.jezykPL();
    if (S.jezyk == "2") J.jezykENG();

    Console.WriteLine();
    string wyraz = Console.ReadLine();
    string odwrocon = "";
    for (int i = 1; i <= wyraz.Length; i++)
    {
        char znak = wyraz[wyraz.Length - i];
        odwrocon += znak;
    }
    Console.WriteLine(J.ow + odwrocon);
    Console.ReadLine();
}

}

Co to jest?! Idź poczytaj o metodach, które przyjmują parametry i o właściwościach. - allocer 2011-08-26 00:11

Pozostało 580 znaków

2011-08-26 00:22
PcSA
0

MSN miał rację.

Tak to nie zadziała. Obiekt klasy, który deklarujesz w metodzie nie jest widoczny nigdzie poza samą metodą, w której deklarujesz zmienną. Aby ominąć ten problem musisz wywołać metodę wpsak razem z parametrami, w których przekażesz instancje wykorzystywanych w Main'e klas - Jezyk i Start.

Pozostało 580 znaków

2011-08-26 00:27
marek
0

Męczę się już z tymi metodami i klasami 2 tydzień,a kiedy myślę że już to rozumiem ,wychodzi że tego nie rozumiem ;/

Pozostało 580 znaków

2011-08-26 00:30
1

Może mi ktoś wyjaśnić, o co w tym wszystkim chodzi? Bo może ja czegoś nie rozumiem, ale dla mi to wygląda na perełkę jakąś.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2011-08-26 00:34
1
marek napisał(a)

Męczę się już z tymi metodami i klasami 2 tydzień,a kiedy myślę że już to rozumiem ,wychodzi że tego nie rozumiem ;/

Nawet nie opisałeś co ma ten program robić. Dałeś kod, który ma z programowaniem tyle wspólnego ile Wisła z Ligą Mistrzów.
Znajdź jakiś kurs/książkę i porządnie poczytaj o programowaniu obiektowym. To nie jest rzecz, którą można opanować za jeden wieczór, szczególnie na początku.


Idiots, idiots everywhere.

Pozostało 580 znaków

2011-08-26 00:51
marek
0

Mam kurs z tej stronki ( Rozdział 5 ) ale kiedy próbuje siętego uczyć to gdzieś w połowie "programowania obiektowego" po prostu gubie się :/

http://si-szarp.pl/ - to tu masz inny, wytłumaczone na chłopski rozum - allocer 2011-08-26 12:22

Pozostało 580 znaków

2011-08-26 09:13
msm
2

No tak, bo w połowie zaczynają się informacje o klasach... :P

OK, małe podsumowanie o czym jest programowanie w C# w ogóle

Klasy
Klasy służą jako 'pojemniki' na różne rzeczy. W C# nic nie może się znajdować 'poza klasą', wszystko należy do którejś klasy. Przykład klasy:

class C
{
    // ...
}

Zapis new C() oznacza wywołanie konstruktora klasy C, czyli stworzenie nowej instancji tej klasy. Np. jeśli masz klasę Ciastko to zapis new Ciastko() da ci dostęp do kolejnego ciastka (bo mogłeś wcześniej stworzyć jakieś inne). Bez użycia konstruktora nie da się stworzyć żadnego obiektu.

Metody
Najmniejszą jednostką z jakiej składa się twój kod są metody. Przykład metody:

class C // każda metoda musi być w jakiejś klasie. 
{
    void Metoda() // tu się zaczyna metoda
    {
        // ... 
    } // tu się kończy metoda
}

W metodzie umieszczasz kod programu. Co charakteryzuje kod programu nie będę nawet się starał opisywać bo to chyba oczywiste.
Wywołanie tej metody wygląda po prostu tak: Metoda().
Metoda może przyjmować parametry. Może też zwracać wartość. Wtedy wygląda tak:

class C // klasa
{
    int Metoda(float parametr1, bool parametr2)
    {
        return 1;
    }
}

To jest metoda przyjmująca parametry typu float (parametr1) i bool (parametr2) i zwracająca wartość typu int. W tym przypadku widać że zawsze zwraca 1. Do tego też jeszcze wrócimy...

Tymczasem mały program pokazujący o co mi chodzi:

class C
{
    static void Main(string[] args)
    {
        C c = new C(); // tworzymy nowy obiekt typu C. Bez tego nie moglibyśmy używać jego metod.
 
        c.Metoda1(); // zwykłe wywołanie metody.
        c.Metoda2(1); // ta metoda wymaga parametru (patrz w dół) więc go przekazujemy
        c.Metoda2(5); // ta sama metoda ale z innym parametrem.
        c.Metoda3(); // ta metoda wykonuje trochę bardziej skomplikowane rzeczy, przyjrzyj się jej.
    }
 
    void Metoda1()
    {
        Console.WriteLine("Wywołano metodę 1!");
    }
 
    void Metoda2(int param)
    {
        Console.WriteLine("Wywołano metodę 2 z parametrem " + param.ToString());
    }
 
    void Metoda3()
    {
        int i = MetodaZwracajacaWartosc1(); // jeszcze nie omówiłem zmiennych, ale chyba wiesz czym są. Przypisujemy to co zwróciła metoda do zmiennej.
        Console.WriteLine("MetodaZwracajaca zwróciła wartość " + i.ToString()); // i wypisujemy tą zmienną
 
        Metoda2(MetodaZwracajacaWartosc1()); // Wow, co się tu dzieje?
        // wywołujemy metodę2 z parametrem który sam jest wywołaniem metody... Będzie to wykonywane
        // mniej więcej tak:
        // zmienna_tymczasowa = MetodaZwracajacaWartosc1();
        // Metoda2(zmienna_tymczasowa);
 
        int j = MetodaZwracajacaWartosc2(2); // ta metoda wymaga parametru.
        Console.WriteLine("MetodaZwracajaca zwróciła : " + j.ToString()); // wypisujemy wynik
 
        // jeszcze jedno - w tej metodzie nie trzeba było pisać c.Metoda2, wystarczyło Metoda2(). W sumie to nie można było. Dlaczego?
        // c to **obiekt klasy** C. Jeśli chcemy wywołać metodę tej klasy to musimy wiedzieć na jakim obiekcie ją wywołać. Zapis c.Metoda2()
        // oznacza że wywołujemy Metodę2 na zmiennej c. Za to w tej metodzie już nie musimy tak robić bo... Już jesteśmy w obiekcie c.
        // Wszystko co tam robimy odnosi się właśnie do tego obiektu c. Wiem że to by wymagało chyba dalszego tłumaczenia, ale nie mam siły :)
    }
 
    int MetodaZwracajacaWartosc1() // ta metoda zawsze zwraca 2
    {
        return 2;
    }
 
    int MetodaZwracajacaWartosc2(int parametr) // ta metoda zwraca **swój parametr pomnożony przez 2**.
    {
        return parametr * 2;
    }
}

Zmienne
To jest właśnie część na której poległeś. O zmiennej możesz myśleć jak o nazwie jakiejś wartości. Na przykład (żeby to działało cały kod musi być umieszczony w metodzie która z kolei jak pisałem musi być umieszczona w klasie.)

int i; // czytając - deklarujemy zmienną typu int (liczba całkowita) i nazywamy ją i
float f; // czytając - deklarujemy zmienną typu float (liczba rzeczywista) i nazywamy ją f
i = 1; // przypisujemy zmiennej i wartość 1. Dopóki zmienna nie miała wartości nie możemy z nią niczego zrobić.
f = 2; // chyba oczywiste?
Console.WriteLine(i); // wypisanie zmiennej i na ekran.

To były przykłady prostych zmiennych lokalnych. W C# (i każdym innym języku C-like... W sumie to prawie w każdym języku. Albo i każdym.) istnieje coś takiego jak zasięg zmiennych. Objawia się to tym że zmienna o nazwie a w metodzie Met1() jest inną zmienną niż zmienna a w metodzie Met2(). Przykład:

class C
{
    static void Main(string[] args)
    {
        C c = new C(); // tworzymy nowy obiekt typu C. Bez tego nie moglibyśmy używać jego metod.
 
        int i = 1; // wiadomo.
        Console.WriteLine(i);
 
        Metoda1();
        Metoda2();
        Metoda3();
        Metoda4(i); // Wywołujemy tą metodę z parametrem i
    }
 
    void Metoda1()
    {
        Console.WriteLine(i); // To NIE ZADZIAŁA (błąd kompilacji) bo nie ma w zasięgu takiej zmiennej jak i.
        // żeby skompilować kod po prostu usuń tą instrukcję.
    }
 
    void Metoda2()
    {
        int i;
        Console.WriteLine(i); // To NIE ZADZIAŁA (błąd kompilacji) bo zmienna i nie ma przypisanej wartości a takiej zmiennej **nie można używać**.
        // żeby skompilować kod po prostu usuń tą instrukcję.
    }
 
    void Metoda3()
    {
        int i = 123;
        Console.WriteLine(i); // To zadziała - i wypisze 123. Ta zmienna i nie ma nic wspólnego ze zmienną i w metodzie Main i są kompletnie niezależne.
    }
 
    void Metoda4(int a)
    {
        Console.WriteLine(a); // Tutaj wypisujemy zmienną którą dostaliśmy w parametrze. Tylko w tym przypadku metoda dostaje tą samą zmienną jaka jest w innym miejscu programu.
    }
}

Mam nadzieję że chociaż trochę ci to wyjaśni pewne podstawy. Wiem że w sumie niedużo tutaj opisałem, ale te prawa po można rozszerzać na coraz bardziej skompikowane zagadnienia. Na przykład twój oryginaly kod jest oczywistym błędem:

public void wpsak()
{
    Jezyk J = new Jezyk();
    Start S = new Start();
 
    if (S.jezyk == "1") J.jezykPL();    
    if (S.jezyk == "2") J.jezykENG();

I może, jeśli umiem tłumaczyć chociaż trochę, już wiesz dlaczego. Metoda wspak tworzy sobie NOWE obiekty typu Jezyk i Start. Za to ty oczekujesz że S będzie zmienną która znajdowała się w poprzedniej metodzie. Żeby to osiągnąć, musisz zmienną S jakoś przekazać do tej metody, a do tego służą patametry:

public void wpsak(Jezyk J, Start S)
{
    if (S.jezyk == "1") J.jezykPL();    
    if (S.jezyk == "2") J.jezykENG();

Musisz wtedy też zmienić wywołanie tej metody:

 P.wpsak(); // NIE!
 P.wpsak(J, S); // tak!
edytowany 4x, ostatnio: msm, 2011-08-26 09:15
Jak na razie, to gość uprawia programowanie liniowo-strukturalne. Do obiektowego mu jeszcze daleko. - somekind 2011-08-26 16:44

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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