szukanie max

0

Witam pisze prace domowa i dostałem takie zadanko z c++
Proszę zdefiniować klasę bazową T zawierającą jako atrybuty liczbę rzeczywistą i znak; oraz jako metody: konstruktor domyślny nadający atrybutom wartości -2, 5.55, konstruktor przeciążony nadający wartości atrybutom poprzez parametry, destruktor, metodę wydruk. Jako pochodną od bazowej proszę stworzyć klasę S dziedziczącą od klasy bazowej atrybuty – oprócz znaku - i metody, zawierającą dodatkowo jako atrybut tablicę 5-elementową liczb rzeczywistych oraz własną metodę konstruktor, max – szukającą wartości maksymalnej w tablicy i wyświetl.

zrobiłem prawie wszytko oprócz tego zdania z zadania

"oraz własną metodę konstruktor, max – szukającą wartości maksymalnej w tablicy i wyświetl."- i tego nie wiem jak zrobić.

a oto mój kod ktory do tej pory zrobilem:

 
#include <iostream>
#include <vector>

using namespace std;
void stop(void)
{
     char j;
     cin>>j;
}

class T
{
      private:
      char z;
      public:
      int a;
      
       T()//konstruktor domyślny
       {
           a=-2;
           z='5.55'; 
       }
       T(int b, char c)//konstruktor przeciazony
       { 
             cout<<"oto liczba: "<<b<<" i znak: "<<c<<endl;
       } 
      ~T(){}    
};


class S:public T
{
      int tab[4];
      
};


main()

{
 int x;
 char y;
 cout<<"podaj liczbe";
 cin>>x;
 cout<<"podaj znak";
 cin>>y;
 T wypisz(x,y);
 wypisz.~T();
     
     stop();
     return 0;      
}
              

jezeli ktos ma chwile zeby mi pomóc to bede bardzo wdzieczny, z gory dziekuje

0
#include <iostream>
#include <cstring>
using namespace std;

class T
  {
   private:
   char z;
   public:
   double a; // liczba rzeczywista
   T():z(-2),a(5.55) {} // konstruktor domyślny
   T(char z,double a):z(z),a(a) {} //konstruktor nadający wartości atrybutom poprzez parametry, u ciebie nie nadaje
   ~T() {}
   virtual ostream &wydruk(ostream &s)const { return s<<"znak="<<z<<"; liczba="<<a<<";"; } // metoda wydruk
  };
ostream &operator<<(ostream &s,const T &t) { return t.wydruk(s); } // dla wygody

class S:public T
  {
   public:
   double Tb[5];
   S():T() { memset(Tb,0,sizeof(Tb)); }
   S(double *src):T() { memcpy(Tb,src,sizeof(Tb)); }
   S(char z,double a,double *src):T(z,a) { memcpy(Tb,src,sizeof(Tb)); }
   virtual ostream &wydruk(ostream &s)const;
  };

ostream &S::wydruk(ostream &s)const
  {
   T::wydruk(s)<<" tablica: { "<<Tb[0];
   for(const double *p=Tb+1;p<Tb+5;++p) s<<", "<<*p;
   return s<<" };";
  }

int main()
  {
   T t1,t2('a',3.3);
   cout<<"t1 => "<<t1<<endl;
   cout<<"t2 => "<<t2<<endl;
   S s1,s2('b',4.4,(double[]){1.1,2.2,3.3,4.4,5.5}),s3((double[]){0,1.1,2.2,3.3,4.4});
   cout<<"s1 => "<<s1<<endl;
   cout<<"s2 => "<<s2<<endl;
   cout<<"s3 => "<<s3<<endl;
   cin.sync();
   cin.get();
   return 0;      
  }
0

dziekuje za pomoc jestem poczatkujacy wiec duzo popelniam bledow

1

Modyfikatory to co innego, pisałem o przyjmowaniu wartości...

Powtórzę poprzedni cytat ze standardu, nieco szerszy:

Objects declared as characters (char) shall be large enough to store any member of the implementation’s basic character set. If a character from this set is stored in a character object, the integral value of that character object is equal to the value of the single character literal form of that character. It is implementation-defined whether a char object can hold negative values.

Mam nadzieję, że się czegoś nauczysz, chłopcze.

0
_13th_Dragon napisał(a)

Stwierdziłeś że mój kod się nie skompiluje.

Nie, nie kompiluje się. http://comeaucomputing.com/tryitout/ - sprawdź. Ten kompilator to wyznacznik standardu. Sprawdź też na kilku innych kompilatorach jeżeli masz pod ręką. Obowiązujący standard języka to rewizja 2003, Twój kod nawet koło niej nie leżał.

Jak się okazało że jednak się kompiluje to przyczepiłeś się do inicjalizacji char'a liczbą ujemną nawet nie zwracając uwagę na to że tak brzmiało zadanie.

Nigdy nie używa się chara jako wartości numerycznej w ten sposób bo nie wiesz co otrzymasz, ew. pisząc pod konkretny kompilator.

Stwierdziłeś że CL jest lepiej trzyma się standardu niż GCC, a nie możesz podać żadnego przykładu nie trzymania standardu przez GCC.

Przecież Ci podałem:

int main() { typedef void VOID; VOID().VOID::~VOID(); }

Widocznie nie rozumiesz tego kodu... Za trudny? Masz tu drugi, prostszy:

template <class T>
class debil { 
    friend int main(); 
};

int main() {}

Masz coś do dodania?

0

Deus ma rację, G++ nie radzi sobie z jego przykładami, ZGODNYMI ZE STANDARDEM


int main() { typedef void VOID; VOID().VOID::~VOID(); }

g++.exe "C:\test.cpp" -o "C:\test.exe"    -I"C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include"  -I"C:\Dev-Cpp\include\c++\3.4.2\backward"  -I"C:\Dev-Cpp\include\c++\3.4.2\mingw32"  -I"C:\Dev-Cpp\include\c++\3.4.2"  -I"C:\Dev-Cpp\include"   -L"C:\Dev-Cpp\lib" 
C:\test.cpp: In function `int main()':
C:\test.cpp:1: error: invalid use of `void'
C:\test.cpp:1: error: expected `;' before '::' token

a teraz CL:

C:\>cl test.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

test.cpp
test.cpp(1) : warning C4508: 'main' : function should return a value; 'void' ret
urn type assumed
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:test.exe
test.obj


template <class T>
class debil { 
    friend int main(); 
};
 
int main() {}

g++.exe "C:\test.cpp" -o "C:\test.exe"    -I"C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include"  -I"C:\Dev-Cpp\include\c++\3.4.2\backward"  -I"C:\Dev-Cpp\include\c++\3.4.2\mingw32"  -I"C:\Dev-Cpp\include\c++\3.4.2"  -I"C:\Dev-Cpp\include"   -L"C:\Dev-Cpp\lib" 
C:\test.cpp:3: error: cannot declare `::main' to be a template

a teraz CL:

C:\>cl test.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

test.cpp
test.cpp(6) : warning C4508: 'main' : function should return a value; 'void' ret
urn type assumed
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:test.exe
test.obj

Panie smok, chyba Pan przegrał z kretesem :)

0

Deus ma rację, G++ nie radzi sobie z jego przykładami, ZGODNYMI ZE STANDARDEM

Pierwszy przykład to jakiś niuans absolutnie bez znaczenia, drugi to rzeczywiście dziwne, poważny bug.
Słowo export zostało w ciemno włączone do standardu mimo że żaden kompilator nie miał takiej funkcjonalności jako rozszerzenie. Zatwierdzali więc coś, co nie miało działającego prototypu.
Później okazało się kosmicznie trudne w implementacji, dlatego większość kompilatorów go nie obsługuje.

0

Niuans czy nie, ale GCC sobie nie radzi, a niektórzy powinni chyba nabrać troszkę pokory zanim zaczną mówić farmazony i zgrywać C++ ekspertów (vide dragon), bo jak widać, niektórzy faktycznie dobrze się znają na C++ i obowiązujących standardach!

0

C++ i obowiązujących standardach!

Z tym obowiązywaniem tobym trochę przyhamował. Standard służy po temu, by jeden „kompilator C++” i drugi „kompilator C++” robiły mniej-więcej to samo, by kod źródłowy był przenośny przynajmniej do momentu użycia zewnętrznych bibliotek, API systemu i niestandardowych rozszerzeń składni.

Nie po to, by mówić że getch() jest złe bo jest „tylko na Windowsa” (jakby to był jakiś problem by wreszcie dodali go do gcc pod Linuksa, tak dla świętego spokoju).

Wiadomo też że kompilatory mają bugi i braki, nie ma się co podniecać że jakiś wspiera 100,00% standardu.

Z dwóch przytoczonych (gcc i Visual) stawiałbym jednak na gcc jeśli chodzi o standardy teraz i w przyszłości. Microsoftowi wolniej idą nowinki, bo każdy ficzer muszą przeanalizować w kategorii biznesowej opłacalności, i wychodzi im że lepiej napisać n-tą bibliotekę komponentów webowych (co się da potem sprzedać), niż implementować jakieś export.

0

Udajesz ślepego? To GCC się nie trzyma standardów, co zostało udowodnione, a ty nadal twierdzisz, że GCC trzyma się lepiej standardów? Heh ochłoń

0

Czy możesz nazwać trzymaniem standardów wywalenie wyjątku podczas wykonania następującego kodu:
char z=(char)255;
cout<<isalpha(z)<<endl;
VS 2010 w trybie debug wywala wyjątek!

0

_13th_Dragon ale z ciebie EPIC C++ FAIL :)

0

Dla niedowiarków.
user image

0

Ale ciekawostka, przed chwilą (post wyżej) ci wszystko działało.
A teraz nie działa to już masz usprawiedliwienia że nie powinno działać, to jak powinno a nie działa czy nie powinno a działa?
No ok, skoro nie jest dozwolone przekazanie do isalpha() zmiennej typu char to gdzie przynajmniej ostrzeżenie podczas kompilacji że robię coś źle?
To że nie mogę do isalpha() przekazać zmienną typu char, samo z siebie jest niedorzeczne.
Czy przed sprawdzeniem czy wczytany np z pliku znak jest literą mam go najpierw skonwertować na coś innego niż znak?
A taki kod wg ciebie to też zabroniony i powinien wywalać wyjątek?

char str[]="\x81";
cout<<isalpha(str[0])<<endl;

A taki:

char z;
cin>>z;
cout<<isalpha(z)<<endl;

Tak oto działa WC oraz jego obrońcy - całkowity brak konsekwencji.

0

_13th_Dragon - nie chcę się wtrącać do waszego flejma, ale choćby z jednego powodu Twój kod nie jest czystym kodem C++. W ISO C++ nie ma compound literals, czyli:

(double[]){1.1, 2.2, 3.3, 4.4, 5.5}

działa tylko dzięki niestandardowemu rozszerzeniu składni C++ o tę właściwość C99. ;)

0

Tam nie było compound literal.

char str[]="\x81";

jest jak najbardziej dozwolone przez ISO C++.

0

To jaka linijka z tego super skomplikowanego kodu jest niedozwolona?

char str[]="\x81";
cout<<isalpha(str[0])<<endl;

Bo cholerny WC w trybie debug wywala mi wyjątek, śmiać się chce z tych którzy nawet próbują myśleć że firma M$ przyjmuje się jakimikolwiek standardami.

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