::snoopy:: Opublikowano 19 Stycznia 2008 Zgłoś Opublikowano 19 Stycznia 2008 (edytowane) Mam problemy z napisaniem programiku konsolowego w C++. Pracuję w Dev-Cpp. Z treści zadania wynika, że program ma opierać się na klasach. Przewertowałem różne www z googli, kurs "Od zera do gier kodera" ale nie mogę sobie do końca z tym poradzić, choć bawię się z tym ponad tydzień. Znam zasady tego działu więc dlatego zwracam się z prośbą. Trudno opisać własnymi słowami o co chodzi więc podam podam wam treść zadania + mój wyjściowy kod programu. Głównym problemem jest to że nie wiem jak zaimplementować te metode char* Sprawdz(void). Proszę jedynie o wskazówki i porady co powinienem zamieścić. ------------------------------------------------------------------------------- Treść zadania: Stwórz program sprawdzający do jakiej grupy w układzie okresowym pierwiastków należy podany z klawiatury pierwiastek chemiczny. Program powinien pobrać z klawiatury nazwę pierwiastka oraz jego liczbę atomową. Zdefiniuj klasę TPierwiastek z polami w części prywatnej: - nazwa, - latomowa, - grupa, W części publicznej definicji klasy należy zadeklarować metody wprowadzające dane do pól np.: void WstawNazwe (char *) i metody wyświetlające dane z pól np.: char PodajNazwe (void) oraz metode: - char *Sprawdz (void) - zwracającą nazwę grupy do której należy dany pierwiastek (wyznaczoną na podstawie liczby atomowej pierwiastka). Po znalezieniu nazwy grupy dla podanego pierwiastka wstaw ją do pola grupa obiektu klasy Tpierwiastek i wyświetl tę nazwę na ekranie. -------------------------------------------------------------------------------- Wyjściowy kod programu: #include <iostream>#include <string.h>#include <stdio.h>#include <conio.h>using namespace std;// ----- definicja klasy TPierwiastek -------------------- class TPierwiastek { private: char nazwa[30]; // nazwa pierwiastka int latomowa; // liczba atomowa pierwiastka int grupa; // grupa pierwiastka public: void WstawNazwe(char*); // --- deklaracje metod char*PodajNazwe(void); void WstawLatomowa(int); int PodajLatomowa(void); char* Sprawdz(void); }; // ----- definicje metod wprowadzjacych dane void TPierwiastek::WstawNazwe(char* na){ strcpy(nazwa,na); } char* TPierwiastek::PodajNazwe(void){ return nazwa; } void TPierwiastek::WstawLatomowa(int la){ latomowa=la; } int TPierwiastek::PodajLatomowa(void){ return latomowa; } int main(void){ TPierwiastek pierw1; char tempc[30]; int tempi; cout<<"Podaj nazwe pierwiastka: "<<endl; cin>>tempc; pierw1.WstawNazwe(tempc); cout<<"Podaj liczbe atomowa pierwiastka: "<<endl; cin>>tempi; pierw1.WstawLatomowa(tempi); cout<<"-------------------"<<endl; // -------- wyswietlanie wyniku ------ cout<<"Dane o pierwiastku: "<<endl; cout<<"Nazwa: "<<pierw1.PodajNazwe()<<endl; cout<<"Liczba atomowa: "<<pierw1.PodajLatomowa()<<endl; system("pause");return 0;}Powyższy kod kompiluje się i uruchamia. Edytowane 19 Stycznia 2008 przez ::snoopy:: Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 19 Stycznia 2008 Zgłoś Opublikowano 19 Stycznia 2008 (edytowane) jako że chemię miałem ostatnio w podstawówce... nie wiem czy z liczby atomowej można wysnuć jakąś prostą zależność w której grupie jest pierwiastek. Jeśli się nie da, to pozostaje Ci prosta sprawa. Funkcja sprawdź przelatuje sobie tablicę zawierającą powiązane ze sobą elementy typu liczba atomowa - grupa i jak znajdzie daną liczbę atomową to masz grupę... Swoja drogą, zwracanie stringów przez char* to zalatuje trochę archaizmem C a nie nowoczesnym C++. :) I zrób sobie dobrze, wyrzuć devCpp, zainstaluj Visual Studio 2005/2008 Express :). 2008 jest łatwiejsze w konfiguracji, ale nie ma jeszcze do niego paczek redystrybucyjnych, więc programy napisane w nim działają tylko tam gdzie jest VS2008. Edytowane 19 Stycznia 2008 przez PelzaK Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
::snoopy:: Opublikowano 19 Stycznia 2008 Zgłoś Opublikowano 19 Stycznia 2008 Jeśli się nie da, to pozostaje Ci prosta sprawa. Funkcja sprawdź przelatuje sobie tablicę zawierającą powiązane ze sobą elementy typu liczba atomowa - grupa i jak znajdzie daną liczbę atomową to masz grupę...Mógłbyś rozwinąć te myśl? Albo tak: Bo szczerze to nie dokońca nawet rozumiem te zadanie a czytałem wielokrotnie. Czy może już w kodzie programu umieścić trochę danych z układu okresowego a potem wklepać nazwę i liczbę atom. aby wyświetliło grupę. Tylko jak? Innych pomysłów nie mam. Swoja drogą, zwracanie stringów przez char* to zalatuje trochę archaizmem C a nie nowoczesnym C++. :) I zrób sobie dobrze, wyrzuć devCpp, zainstaluj Visual Studio 2005/2008 Express :). 2008 jest łatwiejsze w konfiguracji, ale nie ma jeszcze do niego paczek redystrybucyjnych, więc programy napisane w nim działają tylko tam gdzie jest VS2008. Nie jestem programistą wysokich lotów :wink: , nawet nie widziałem na oczy Visual Studio, nie stać mnie na niego a poza tym tylko się uczę i DevCpp ma wystarczyć do tego celu. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
pc81 Opublikowano 20 Stycznia 2008 Zgłoś Opublikowano 20 Stycznia 2008 Wyznaczanie grupy zrobiłbym najprościej jak się da, czyli w kodzie metody sprawdz zaszyc jednowymiarową tablice, ktora zawiera odwzorowanie liczba atomowa na grupę (indeksem w tablicy jest liczba atomowa a wartością właśnie grupa). Mając wypełnioną taką tablicę sprawdzanie grupy opierało by się na odczytaniu komórki o indeksie będącym liczbą atomową (ewentualnie l.atomowa-1, bo tablice w c++ indeksowane są od zera). Do pełni szczęścia dobrze by było dać test, czy nie zachodzi próba odczytania czegoś "poza tablica". Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
tukamon Opublikowano 20 Stycznia 2008 Zgłoś Opublikowano 20 Stycznia 2008 test, czy nie zachodzi próba odczytania czegoś "poza tablica". http://www.doc.ic.ac.uk/~phjk/BoundsChecking.html i wszystko jasne ;) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
s0n1c Opublikowano 20 Stycznia 2008 Zgłoś Opublikowano 20 Stycznia 2008 (edytowane) Nie jestem programistą wysokich lotów :wink: , nawet nie widziałem na oczy Visual Studio, nie stać mnie na niego a poza tym tylko się uczę i DevCpp ma wystarczyć do tego celu.Brzmi to jak: "Nie jezdze za długo, dlatego lepiej bedzie mi w maluchu niz w mercedesie". Zreszta Visual Studio Express jest calkowice darmowy. (nawet do uzytku komercyjnego!) VS 2008 EE (niestety pojedyncze sa tylko web install). A co do paczek redystrybucyjnych juz dawno sa. Edytowane 20 Stycznia 2008 przez s0n1c Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 22 Stycznia 2008 Zgłoś Opublikowano 22 Stycznia 2008 (edytowane) Albo tak: Bo szczerze to nie dokońca nawet rozumiem te zadanie a czytałem wielokrotnie. Czy może już w kodzie programu umieścić trochę danych z układu okresowego a potem wklepać nazwę i liczbę atom. aby wyświetliło grupę. Tylko jak? Innych pomysłów nie mam. Nie jestem programistą wysokich lotów :wink: , nawet nie widziałem na oczy Visual Studio, nie stać mnie na niego a poza tym tylko się uczę i DevCpp ma wystarczyć do tego celu. no właśnie o to chodzi.. Liczba atomowa jest po kolei od 1.... 120 czy coś... wiec robisz taką tablicę i pod odpowiedni indeks wpisujesz odpowiedni pierwiastek, tab[1] = wodór, tab[2] = hel itd... Najlepiej od razu wpisac po kolei wszystkie pierwiastki przy inicjacji tablicy lub po prostu zrobić switch..case'a np za pomocą makra jakiegoś.. #define SPRAWDZ(la, pierwiastek) (case x: return (char*)&pierwiastek; )// kod Sprawdz()char* TPierwastek::Sprawdz(){ switch(latomowa) { SPRAWDZ( 1, "wodor"); SPRAWDZ( 2, "hel"); ... default: return (char*)&"Niepoprawna liczba atomowa"; }}powinno działać, moze w kwestii zwracania wskaźnika zrobiłem błąd :) bo bez debugera nie pamięta się takich rzeczy... A co do paczek redystrybucyjnych juz dawno sa.Nie tak od dawna, bo niedawno szukałem i nie było jeszcze :). Ale dzięki... :) Edytowane 22 Stycznia 2008 przez PelzaK Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
::snoopy:: Opublikowano 22 Stycznia 2008 Zgłoś Opublikowano 22 Stycznia 2008 Dzięki Pelzak za podsunięcie przykładu. Spróbuję coś z tym pokombinować. I pytanko: Indeksowanie tablic zaczyna się od 0. Więc można poprostu ominąć to sobie i deklarować od 1 nie umieszczając nic w indeksie 0 tablicy? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 23 Stycznia 2008 Zgłoś Opublikowano 23 Stycznia 2008 i tak i nie.. zalezy jak to zrobisz :). Jeśli będziesz chciał wypełnić jakąś tablicę wartościami przy tworzeniu tej tablicy to siłą rzeczy musisz coś wpisać w zerowy element, zeby pierwszy był pierwszym. W moim przykładzie problem ten nie występuje, bo nie ma tablicy :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
::snoopy:: Opublikowano 25 Stycznia 2008 Zgłoś Opublikowano 25 Stycznia 2008 Nie moge. :mur: Kiedy wstawiam ten fragment podany przez Pelzak'a to dla: ... // kod Sprawdz() char* TPierwastek::Sprawdz() ... komunikuje mi błąd że 'TPierwiastek' has not been declared (że nie jest zadeklarowany), gdziekolwiek bym go nie wstawił a przecież to ma się opierać na istniejącej klasie TPierwiastek która jest zadeklarowana więc o co tu chosi? ps. Czy #define SPRAWDZ(la, pierwiastek) (case x: return (char*)&pierwiastek; ) ma byc wstawione w metodach a reszta w sekcji int main ? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
KrOOliK89 Opublikowano 25 Stycznia 2008 Zgłoś Opublikowano 25 Stycznia 2008 Rozumiem że w klasie TPierwastek masz zadeklarowaną funkcję Sprawdz() ? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
::snoopy:: Opublikowano 25 Stycznia 2008 Zgłoś Opublikowano 25 Stycznia 2008 (edytowane) Zerknij na mój kod w 1 poście. W public jest: char* Sprawdz(void); Edytowane 25 Stycznia 2008 przez ::snoopy:: Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 25 Stycznia 2008 Zgłoś Opublikowano 25 Stycznia 2008 (edytowane) jak mówi że nie jest zadeklarowany znaczy że nie jest. A jeśli Ty patrzysz i widzisz że jest, to z doświadczenia wiem, że jest gdzieś literówka :). Najlepiej wtedy skopiować wszystkie napisy z deklaracji do definicji (nazwy klas, funkcji i parametów). Czarów nie ma (przynajmniej w tak prostych programach) char* TPierwastek::Sprawdz() class TPierwiastek widzisz różnice? :) Edytowane 25 Stycznia 2008 przez PelzaK Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
::snoopy:: Opublikowano 25 Stycznia 2008 Zgłoś Opublikowano 25 Stycznia 2008 (edytowane) OK, była literówka... warto zapamiętać twoje motto :wink: Tylko teraz gdzie to umieścić w moim kodzie i o co chodzi w tej linijce #define SPRAWDZ(la, pierwiastek) (case x: return (char*)&pierwiastek; )? Czy to co podałeś wyżej ma być u mnie w kodzie w // ----- definicje metod wprowadzjacych dane, a na samym końcu przed system("pause") ma być wywołanie tej metody - pierw1.Sprawdz(); ? Edytowane 25 Stycznia 2008 przez ::snoopy:: Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 26 Stycznia 2008 Zgłoś Opublikowano 26 Stycznia 2008 to jest małe makro, kompilator widząc w kodzie SPRAWDZ(1, "wodor") zamieni to na case 1: return (char*)&"wodor"; po prostu skrót żeby nie pisać całego wyrażenia takiego samego 100 razy :). Możesz to wpisać gdziekolwiek, żeby tylko było znane przed wykorzystaniem - może być pod inkludami. Z tym że nie mam kompliatora w oczach i nie zagwarantuję że nie pomerdałem czegoś ze wskaźnikami :). Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...