Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Pierwszy program pisany obiektowo, blad w kompilacji

Ostatnio zmodyfikowano 2012-09-19 14:08
Autor Wiadomość
cyklopek11
» 2012-09-18 20:50:59
Tablica alokowana statycznie:
C/C++
Typ tablica[ ilosc ];
ilosc - musi być zmienną typu całkowitego ZNANĄ W CHWILI KOMPILACJI.Więc masz trzech uczniów nagle zachce ci się 10, 100, 100000 ...Za każdym razem musisz zmieniać to w kodzie i ponownie kompilować. Nie lepiej by było żeby określać rozmiar tablicy w chwili gdy z tej tablicy masz skorzystać? (albo niech program sam to określa) Do tego służy dynamiczna alokacja tablicy:
C/C++
Typ * wskaznik = new Typ[ ilosc ];
ilosc - zmienna typu calkowitego ktora bedzie znana dopiero w momencie skorzystania z tablicy. Program raz skompilowany a może mieć elementów ile ci się w danym momencie zachce.
P-65177
Sk_uter
Temat założony przez niniejszego użytkownika
» 2012-09-18 22:55:30
ok dopiero wrocilem i tylko jedno pytanie, bo kodowac jutro bede

Typ * wskaznik = new Typ[ ilosc ];

wskaznik, co tutaj dac? ja myslalem, ze wskaznik to wlasnie to ta gwiazdka po typie.

PS a w ilosci dac tablice, czy dac cos poczatkowego?

PS masz moze gadu, bo widze, ze fajnie tlumaczysz, a potrzebowalbym kogos takiego jak ty :)
P-65181
cyklopek11
» 2012-09-19 01:06:58
Ty potrzebujesz wiedzy i tego forum (tu też jest ogrom wiedzy). A teraz przyznaj się tak szczerze:
1.) Na której części naszego kursu c++ jesteś ???
2.) Czytasz chociaż jedną z zalecanych do nauki c++ książek ???

Jak chcesz się bawić obiektowo to wskaźniki musisz mieć opanowane do perfekcji !!!
Wiem że są trudne bo ja z nimi też walczyłem kilka miesięcy :)
Poza tym musisz dużo kodować, popełniać błędy i znajdywać to gdzie zrobiłeś błąd. Ja myślę, że tu na forum jest mnóstwo rzetelnych osób których można nazwać GURU więc korzystaj z tego portalu - i zadawaj pytania - po to on jest. Jednak przed zadaniem pytania warto sprawdzić czy już przypadkiem ktoś na to pytanie 100 razy nie odpowiadał. Poprawiłem Twój pierwotny kod (programowo i estetycznie). Przeanalizuj go i jako zadanie domowe masz dopisać:
metodę klasy Uczniowie która będzie:
A. (łatwiejsze) usuwać ucznia z końca tablicy (dla największego indeksu)
B. (trudniejsze) usuwać ucznia spod dowolnego indeksu tablicy

C/C++
#include <iostream>
#include <string>
using namespace std;


class Uczen
{
   
public: // na samej gorze klasy najwazniejsi czlonkowie tzn public bo te sa najwazniejsze dla osoby ktora uzywa Twojej klasy
   
    Uczen(); // konstruktor domniemany, "tworzy" pusta metryke ucznia ktora pozniej mozna uzupelnic
    virtual ~Uczen(); // Moze sie kiedys przydac
    Uczen( string i, string n, int p, int m, int a, int pr ); // tworzy konkretnego ucznia np. Tomka Kowalskiego
    void wypisz(); // wypisuje dane ucznia
   
private:
   
    string imie, nazwisko;
    int polski, matematyka, angielski, programowanie;
   
};

// implementacja metod
Uczen::Uczen()
    : imie( string( "bezimienny" ) )
    , nazwisko( string( "bez nazwiska" ) )
    , polski( 0 )
    , matematyka( 0 )
    , angielski( 0 )
    , programowanie( 0 )
{
    // w konstruktorze zmienne klasy inicjalizujemy w liscie inicjalizacujnej
}

Uczen::Uczen( string i, string n, int p, int m, int a, int pr )
    : imie( i )
    , nazwisko( n )
    , polski( p )
    , matematyka( m )
    , angielski( a )
    , programowanie( p ) // tworzy konkretnego ucznia np. Tomka Kowalskiego
{
    //ciało konstruktora moze sie przydac w przyszlosci do czegos
}

Uczen::~Uczen()
{
    // Moze sie kiedys przydac
}

void Uczen::wypisz()
{
    cout << "Imie: " << imie << endl
    << "Nazwisko: " << nazwisko << endl
    << "Ocena z j. polskiego: " << polski << endl
    << "Ocena z matematyki: " << matematyka << endl
    << "Ocena z j. angielskiego: " << angielski << endl
    << "Ocena z programowania: " << programowanie << endl;
}
////////////////////////////////////////////////////////////////////////////////


class Uczniowie
{
   
public:
    Uczniowie(); // konstruktor domniemany (tylko taki do Twoich celów ci spokojnie wystarczy)
    ~Uczniowie();
    void dodajUcznia( const Uczen & var ); // dodaje ucznia
    int ileUczniow(); // zwraca ile jest uczniow
    void wypiszDaneUcznia( int numer ); // wypisuje dane ucznia o numerze numer (uczniowie numerowani od jeden nie od zera)
   
private:
    Uczen * uczniowie_tab;
    int liczbaUczniow;
   
};
// implementacja metod klasy
Uczniowie::Uczniowie()
    : uczniowie_tab( NULL )
    , liczbaUczniow( 0 )
{
   
}

Uczniowie::~Uczniowie()
{
    delete[] uczniowie_tab;
    uczniowie_tab = NULL;
}

void Uczniowie::dodajUcznia( const Uczen & var )
{
    Uczen * tempWsk_tab = new Uczen[ liczbaUczniow + 1 ];
    if( liczbaUczniow == 0 )
    {
        // jesli nie ma jeszcze zadnych uczniow dodajemy pierwszego
        * tempWsk_tab = var;
        uczniowie_tab = tempWsk_tab;
        liczbaUczniow++;
    }
    else
    {
        int i = 0; // przed petla for aby mozna bylo wykorzystac jeszcze tutaj |
        for(; i < liczbaUczniow; i++ ) //        |
        { //        |
            //zawartosc starej tablicy uczniow                                 |
            //kopiujemy do nowej tablicy uczniow                               |
            tempWsk_tab[ i ] = uczniowie_tab[ i ]; //        |
            //        |
            //przed wyjsciem z petli i = liczbaUczniow                         |
        } //        |
        tempWsk_tab[ i ] = var; // dodajemy dodatkowego ucznia na koniec    <----|
        delete[] uczniowie_tab; // zwalniamy pamiec zawierajaca stara tablice uczniow
        uczniowie_tab = tempWsk_tab; //wskaznikiem z klasy przestawiamy na nowa tablice uczniow
        liczbaUczniow++; // zwiekszamy liczbe uczniow o jeden
       
    }
}


int Uczniowie::ileUczniow()
{
    return liczbaUczniow;
}

void Uczniowie::wypiszDaneUcznia( int numer )
{
    if( numer > liczbaUczniow )
    {
        cout << "Nie ma tylu uczniow" << endl;
        return;
    }
    else
    {
        uczniowie_tab[ numer - 1 ].wypisz();
    }
}


int main()
{
    Uczen jakis1; // pierwszy nieopisany uczen
    Uczen tomek( "Tomek", "Kowalski", 5, 5, 4, 2 ); // drugi konkretny uczen
   
    Uczniowie listaUczniow; // tablica uczniow w Twojej klasie
    cout << listaUczniow.ileUczniow() << endl; // zero uczniow
    listaUczniow.dodajUcznia( jakis1 );
    listaUczniow.dodajUcznia( tomek );
    listaUczniow.dodajUcznia( jakis1 );
    cout << listaUczniow.ileUczniow() << endl;
    listaUczniow.wypiszDaneUcznia( 1 );
    listaUczniow.wypiszDaneUcznia( 2 );
    listaUczniow.wypiszDaneUcznia( 3 );
   
    return 0;
}
P-65183
Sk_uter
Temat założony przez niniejszego użytkownika
» 2012-09-19 14:08:26
oo widze, ze konkretnie moj program podrasowales, dzisiaj mi cos wyskoczylo i nie bede mogl programowac, odpalilem program i chodzi tak jak chcialem, bede musial go dokladnie przeanalizowac :)

Co do szczerosci to z waszego kursu nie korzystalem, jestem w technikum informatycznym i mam przedmiot programowanie i tam mnie podstaw nauczono, teraz przechodzimy do obiektowki i podobno w C najlepiej mozna zrozumiec to obiektowe pisanie a potem mamy przejsc na jave, aby pisac konkretne aplikacje, a pozniej nawet cos na telefon.

Widze, ze tutaj c++ mozna sie spokojnie z wami nauczyc, szkoda, ze nie macie jeszcze PHP-a, bo to ogolnie bardziej mnie interesuje, ale c++ na pewno sie przyda
P-65191
1 2 « 3 »
Poprzednia strona Strona 3 z 3