gigant w c++ - nieco błędów

czacha

gigant w c++ - nieco błędów

Post autor: czacha »

Oto program. Nie jest on jeszcze kompletny, dlatego niektore zmienne sa bezuzyteczne. Nie mniej jednak nie kompiluje sie on

plik main.cpp

Kod: Zaznacz cały

#include "klasy.h"
#include "inicjalizacja klas.h"

int main(int argc, char *argv[])
{
    Tekst Jezyk;
    
    cout << "Podaj jezyk, w ktorym chcesz korzystac z programu\n";
    cout << "1 - polski\n";
    cout << "2 - angielski\n";
    
    int decyzja;
    cin >> decyzja;//wybieramy jezy,
    
    switch (decyzja)//wczytanie wybranego jezyka
    {
        case 1:
             Jezyk.Wczytaj("polski.txt");
             break;
        case 2:
             Jezyk.Wczytaj("angielski.txt");
             break;
        default: continue;
    }
        
    while(1)//petla glowna
    {    
        cout << Jezyk[1] << endl;
        cout << "1 - " << Jezyk[2] << endl;
        cout << "2 - " << Jezyk[3] << endl;
        cout << "3 - " << Jezyk[4] << endl;
        cout << "4 - " << Jezyk[9] << endl;
        cout << "5 - " << Jezyk[15] << endl;
        cout << "6 - " << Jezyk[17] << endl;
        cout << "7 - " << Jezyk[26] << endl;
    
        double number;//zmienna uzywana do pobierania liczby w pierwiastkach i potedze
        cin >> decyzja;
        
        //menu
        Oblicz Zadanie;
        switch(decyzja)
        {
         case 1:
              //pierwiastek kwadratowy
              cout << Jezyk[5] << endl;
              cin >> number;
              Zadanie.Sqrt(number);
              cout << Jezyk[7] << Zadanie.GetItsVal() << endl;
              break;
         case 2:
              //pierwiastek szescienny
              cout << Jezyk[5] << endl;
              cin >> number;
              Zadanie.Cbrt(number);
              cout << Jezyk[7] << Zadanie.GetItsVal() << endl;
              break;
         case 3:
              //potega
              double wykladnik;
              cout << Jezyk[5] << endl;
              cin >> number;
              cout << Jezyk[6] << endl;
              cin >> wykladnik;
              Zadanie.Pow(number,wykladnik);
              cout << Jezyk[7] << Zadanie.GetItsVal() << endl;
              break;
         case 4:
              //srednia
              double arytmSrednia;
              arytmSrednia = Zadanie.Srednia();
              cout << Jezyk[27] << arytmSrednia << endl;
              break;
        }
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}
plik klasy.h

Kod: Zaznacz cały

#include <iostream>
#include <fstream>
#include <string>
#include <cmath>

using namespace std;


//wczytywanie plikow z jezykami
class Tekst 
{
 public:
     bool Wczytaj(const char * nazwa) 
     {
       ifstream plik(nazwa);
       if(!plik) { cerr << "Nie mozna wczytac '" << nazwa << "'\n"; return false; }
       char temp[1024]; int tmp;
       plik.getline(temp, 1024, '\n');
       ile = atoi(temp);
       if(ile < 1 || ile > 9999) { cerr << "Nieprawidlowe dane\n"; return false; }
       tekst = new string[ile];
       
       while(plik) 
       {
           plik.getline(temp, 16, ' ');
           tmp = atoi(temp);
           plik.getline(temp, 1024, '\n');
           if(tmp > 0 && tmp <= ile) tekst[tmp-1] = temp;
       }
       return true;
     }
     
     const char* operator [](int indeks) 
     {
       if(indeks > 0 && indeks <= ile) return tekst[indeks-1].c_str();
       return NULL;   
     }
     ~Tekst() { delete [] tekst; }
 protected:
     string* tekst;
     int ile;
};

class Oblicz
{
 public:
    //konstruktory
        Oblicz();
        ~Oblicz(){}
    
    //akcesory
        double GetItsVal()const { return itsVal; }
        double GetItsVal2()const { return itsVal2; }//jeszcze bez zastosowania
    
    //metody
        //pierwiastek kwadratowy
        double Sqrt(itsVal);
        
        //pierwiastek szescienny
        double Cbrt(itsVal);
                
        //potega
        double Pow(itsVal,itsWykladnik);
        
        //srednia
        double Srednia();
        
 protected:
        double itsVal;
        double itsVal2;//jeszcze bez zastosowania
        double itsWykladnik;
};
plik inicjalizacje klas.h

Kod: Zaznacz cały

//pierwiastek kwadratowy
Oblicz::Sqrt(itsVal)
{
    itsVal = sqrt(itsVal);
    return itsVal;
}

//pierwiastek szescienny
Oblicz::Cbrt(itsVal)
{
    itsVal = cbrt(itsVal);
    return itsVal;
}

//potega
Oblicz::Pow(itsVal,itsWykladnik)
{
    itsVal = pow(itsVal,itsWykladnik)
    return itsVal;
}

//srednia
Oblicz::Srednia()
{
    double tablica[50];
    int i, j;
    double srednia;
                          
    //petla zbierajaca liczby
    for (i = 0; i < 50; i++)//BLAD!funkcja bedzie dzialac az i<50. nie ma innego przerwania
    {
        cout << Jezyk[5] << endl;
        double liczba;
        cin >> liczba;
        tablica[i] = liczba;
    }
               
    if (i == 50)cout << "Nie mozesz wpisac wiecej znakow!\n";
               
    //petla sumujaca           
    for(j = 0; j != i; j++)
    {
        srednia += tablica[j];
    }
    
    //ostateczny wynik
    srednia = srednia / j;
    return srednia;
}
Sedno problemu:

kompilator uwaza ze w pliku klasy.h nie postawilem średnika przed '(' w deklaracjach metod od pierwiastka kwadratowego poczawszy, skonczywszy na potedze. W pliku inicjalizacje.h
twierdzie, ze
"2 C:\Dev-Cpp\Biblioteka\matematyka reconstructed\inicjalizacja klas.h expected constructor, destructor, or type conversion before '(' token "
oraz:
"2 C:\Dev-Cpp\Biblioteka\matematyka reconstructed\inicjalizacja klas.h expected `,' or `;' before '(' token "

to sie tyczy kazdego naglowka definiowanej funkcji. Jest jeszcze szereg roznych bledow, ale jest ich tak wiele ze nie sposob ich wyliczyc, a napewno czesc powstala na skutek wczesniejszych.
bagin
Użytkownik
Użytkownik
Posty: 14
Rejestracja: 18 paź 2006, o 19:49
Płeć: Mężczyzna
Lokalizacja: Częstochowa
Pomógł: 3 razy

gigant w c++ - nieco błędów

Post autor: bagin »

double Sqrt(itsVal);
double Cbrt(itsVal);
double Pow(itsVal,itsWykladnik);

nie podałeś typu parametru który przyjmują te funkcje
mimo tego że nazwałeś parametry funkcji jak pola składowe klasy to są to zupełnie inne zmienne. Musisz sprecyzować ich tym. Na przyszłość radze nazywać parametry metod innymi nazwami niż tymi użytymi już wewnątrz klasy
Xfly
Użytkownik
Użytkownik
Posty: 174
Rejestracja: 13 mar 2006, o 20:44
Płeć: Mężczyzna
Lokalizacja: Nowogard
Podziękował: 33 razy
Pomógł: 10 razy

gigant w c++ - nieco błędów

Post autor: Xfly »

Dokładnie jeśli usuniesz nazwy argumentów i wpiszesz ich typy, to plik nagłowkowy się skompiluje - zresztą DEV ma dziwne komunikaty błęódw kompilatora

W deklaracji funkcji składowej wystarczy podać jedynie typ argumentu przekazywanego

I na przyszłóść formatuj kod źródłowy - bo ten źle się czyta niestety
czacha

gigant w c++ - nieco błędów

Post autor: czacha »

Troche to zreperowalem, ale pojawia sie blad "undefined reference to Oblicz::Oblicz()","Id returnet 1 exit status"

Co do przejrzystości kodu, to po raz wtóry przepraszam, ale naprawde niewiem jak go formatowac bo kazdemu sie podoba cos innego. Ja np nie lubie jak nawias klamrowy rozpoczyna sie w tej samej linii co naglowek lub cos innego. Pocwicze nad formatowaniem, ale naprawde niewiem.
bagin
Użytkownik
Użytkownik
Posty: 14
Rejestracja: 18 paź 2006, o 19:49
Płeć: Mężczyzna
Lokalizacja: Częstochowa
Pomógł: 3 razy

gigant w c++ - nieco błędów

Post autor: bagin »

zadeklarowałeś konstruktor w klasie Oblicz a nie zaimplementowałeś jego kodu.

Usuń deklaracje tego konstruktora lub napisz co ma on robić;
Xfly
Użytkownik
Użytkownik
Posty: 174
Rejestracja: 13 mar 2006, o 20:44
Płeć: Mężczyzna
Lokalizacja: Nowogard
Podziękował: 33 razy
Pomógł: 10 razy

gigant w c++ - nieco błędów

Post autor: Xfly »

Moim zdaniem w każdym dobrym projekcie programistycznym powinien występować konstruktor i destruktor zdefiniownay przez programistę - bo jeśli tego nie uczynimi to kompilator sam utworzy domyślne destruktory i konstruktory - funkcje te mają zbyt duże znaczenie dla obiektów, dlatego nie należy pozostawiać maszynie możliwości na decydowanie za nas
czacha

gigant w c++ - nieco błędów

Post autor: czacha »

Dzieki:)a nie wiecie jak rozwiazac ten problem ze srednia??co nie mozna skonczyc przed piecdziesiatka?bo ja jakos nie bardzo mam pomysl.
Xfly
Użytkownik
Użytkownik
Posty: 174
Rejestracja: 13 mar 2006, o 20:44
Płeć: Mężczyzna
Lokalizacja: Nowogard
Podziękował: 33 razy
Pomógł: 10 razy

gigant w c++ - nieco błędów

Post autor: Xfly »

Możesz albo pobawić się dynamicznymi tablicami - co jest rozwiązaniem trudniejszym i mniej wydajnym

albo wykorzystać kontenery znajdujące się w standardowej bibliotece C++

polecam kontener vector

1. dołączasz plik nagłowkowy przez dyrektywe #include

2. tworzysz kontener : vector nazwa_kontenera;

3. funkcja składowa push_back() - dodaje na końcu kontenera nowy element, który jest jej argumentem

4. odwołanie do elementu jak w tablicy przez operator [] - tez indeksowane od 0

5. funkcja składowa size() - podaje ilośc elementów w kontenerze

powinno wystarczyć
półpasiec
Gość Specjalny
Gość Specjalny
Posty: 534
Rejestracja: 8 lip 2004, o 17:05
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 1 raz
Pomógł: 17 razy

gigant w c++ - nieco błędów

Post autor: półpasiec »

pod jakim wzgledem uwazasz vector za bardziej wydajny od tablicy??
czacha

gigant w c++ - nieco błędów

Post autor: czacha »

Nie bardzo pojmuje istote vectora, dlatego skorzystam z dynamicznych tablic, tym bardziej, ze juz nieco o nich slyszalem. Dziekuje i pozdrawiam.
Xfly
Użytkownik
Użytkownik
Posty: 174
Rejestracja: 13 mar 2006, o 20:44
Płeć: Mężczyzna
Lokalizacja: Nowogard
Podziękował: 33 razy
Pomógł: 10 razy

gigant w c++ - nieco błędów

Post autor: Xfly »

Oki w tym przypadku tablica dynamiczna będzie bardziej wydajna - ale i tak tego nie odczujesz przy tym programie - a kontenery są łatwiejsze w użyciu i co za tym idzie są mniej narażone na błędy - o których trzeba pamiętać cały czas

Zresztą kiedy korzystamy z kontenera to używamy szablonu, który jest bardziej sprawdzony i jak najlepiej zoptymalizowany moim zdaniem - dlatego prawie nigdy w projektach C++ nie stosuje tablic dynamicznych
czacha

gigant w c++ - nieco błędów

Post autor: czacha »

Ok. Dzieki, pozdrawiam
półpasiec
Gość Specjalny
Gość Specjalny
Posty: 534
Rejestracja: 8 lip 2004, o 17:05
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 1 raz
Pomógł: 17 razy

gigant w c++ - nieco błędów

Post autor: półpasiec »

tak to prawda vectory sa bardzo wygodne i znacznie czesciej ich uzywam, ale jesli chodzi o szybkosc to lepsze sa zwykle tablice, jednak nie w przypadku tak niewielkich danych
Xfly
Użytkownik
Użytkownik
Posty: 174
Rejestracja: 13 mar 2006, o 20:44
Płeć: Mężczyzna
Lokalizacja: Nowogard
Podziękował: 33 razy
Pomógł: 10 razy

gigant w c++ - nieco błędów

Post autor: Xfly »

Tak sa bardziej wydajne i nie wymagaja takiego narzutu jak kontenery - ale roznicy nie zauwazymy przy niewielkiej liczbnie danych - zreszta kontener nie zmusza nas do myslenia o ilosci danego miejsca w pamieci dla obiektow - wszystko robią same za nas
czacha

gigant w c++ - nieco błędów

Post autor: czacha »

zrobilem inaczej. Poprosilem uzytkownika o podanie z ilu liczb bedzie liczona srednia, a nastepnie powtarzalem petle az nie bedzie tyle razy.
ODPOWIEDZ