Skocz do zawartości
::snoopy::

Programik W C++

Rekomendowane odpowiedzi

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:

 

  Cytat

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 przez ::snoopy::

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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 przez PelzaK

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  PelzaK napisał(a):

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.

  Cytat

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.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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".

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  ::snoopy:: napisał(a):

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 przez s0n1c

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  ::snoopy:: napisał(a):

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...

 

  s0n1c napisał(a):

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 przez PelzaK

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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 :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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 ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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 przez PelzaK

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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 przez ::snoopy::

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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 :).

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.



×
×
  • Dodaj nową pozycję...