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:

 

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

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.

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

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

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

Ładowanie


×
×
  • Dodaj nową pozycję...