Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Missä on vika?!

hajtsu [09.12.2008 19:06:54]

#

Terve vaa kaikille..olis tarkoituksena saada aikaan ohjelman jonka kautta voidaan lisätä/poistaa/printata seuraavat henkilöt(lääkärit/huoltajat/sairaanhoitajat) ja olen rakentanu jonkun verran mutta esim en saa kun yksi nimi näytölle!!

Sairaala.cpp
#include "StdAfx.h"
#include "Sairaala.h"
void Sairaala::initTables()
{


	// taulukon nollaaminen
	memset(laakarit,'\0',laakarit_size * sizeof(Laakari*));
	memset(sairaanhoitajat,'\0',sairaanhoitajat_size * sizeof(Shoitaja*));
	memset(huoltajat,'\0',huoltajat_size * sizeof(Huoltaja*));
}

Sairaala::Sairaala(void)
{
	Laakari* laakarit[100]={0};
	Shoitaja* sairaanhoitajat[100]={0};
	Huoltaja* huoltajat[100]={0};

}

Sairaala::~Sairaala(void)
{

}
void Sairaala::run()
{
	char choice;

	do
	{
		printf("Enter your choice\n"
			"(A)Lisaa uusi laakari\n"
			"(S)Lisaa uusi sairaanhoitaja\n"
			"(H)Lisaa uusi huoltaja\n"
			"(P)Tulosta laakarin tiedot \n"
			"(F)Tulosta Sairaanhoitajan tiedot \n"
			"(T)Tulosta huoltajan tiedot \n"
			"(R)emove \n"
			"e(X)it\n");
		choice = getchar();
		choice=tolower(choice);
		fflush(stdin);
		switch(choice)
		{
		case 'a':
			addlaakari();
			break;
		case 's':
			adds();
			break;
		case 'h':
			addh();
			break;
		case 'r':
			remove();
			break;
		case 'p':
			printlaakari();
			break;
		case 'f':
			prints();
			break;
		case 't':
			printh();
			break;
		case 'x':
			break;
		default:
			printf("Illegal choice!\n");
			break;
		}

	}while(choice != 'x');

}



int Sairaala::addlaakari()
{

	for (int ind=0;ind < 100 &&laakarit[ind] != NULL;ind++)

	{
	if (ind < 100)
	{
		laakarit[ind] = new Laakari ;
		laakarit[ind]->kysy();
		cout<<"\nLisatty laakari: ";
		cout<<laakarit[ind]->sukunimi<< endl;



		return 1;
	}
	else

	return 0;

	}
}
int Sairaala::adds()
{
	for (int i=0;i < 100 && sairaanhoitajat[i] != NULL;i++)

	{
	if (i < 100)
	{
		sairaanhoitajat[i] = new Shoitaja ;
		sairaanhoitajat[i]->kysy();
		cout<<"\nLisatty sairaanhoitaja: ";
		cout<<sairaanhoitajat[i]->sukunimi<< endl;



		return 1;
	}
	else

	return 0;

	}
}
int Sairaala:: addh()
{
	for (int i=0;i < 100 && huoltajat[i] != NULL;i++)

	{
	if (i < 100)
	{
		huoltajat[i] = new Huoltaja ;
		huoltajat[i]->kysy();
		cout<<"\nLisatty huoltaja: ";
		cout<<huoltajat[i]->sukunimi<< endl;



		return 1;
	}
	else

	return 0;

	}
}

void Sairaala::printlaakari()
{
	int ind=0;
	//for(ind=0;ind<100;ind++)
	//{
		if(laakarit[ind]!= NULL)
		{
			laakarit[ind]->nayta();
			ind++;
		}


	//}





}
void Sairaala::prints()
{
	for (int ind=0;sairaanhoitajat[ind] != NULL;ind++)

	{

			sairaanhoitajat[ind]->nayta();
	}


}
void Sairaala::printh()
{
	for (int ind=0;huoltajat[ind] != NULL;ind++)

	{

			huoltajat[ind]->nayta();
	}

}
void Sairaala::remove()
{
}
=================Hkunat.cpp===============
#include "StdAfx.h"
#include "Hkunta.h"


Hkunta::Hkunta(void)
{
}

Hkunta::~Hkunta(void)
{
}
void Laakari::nayta()
{

		cout<<"\n****LAAKARIN TIEDOT****\n";
		cout<<"\nEtunimi: "
		<<this->getEtunimi()<< "\nSukunimi: \n"
		<<this->getSukunimi()<<"\nId: \n"
		<<this->getId();



}
void Shoitaja::nayta()
{
		cout<<"\n****SAIRAANHOITAJAN TIEDOT****\n";
		cout<<"\nEtunimi: "
		<<this->getEtunimi()<< "\nSukunimi: \n"
		<<this->getSukunimi()<<"\nId: \n"
		<<this->getId();

}
void Huoltaja::nayta()
{


		cout<<"\n****HUOLTAJAN TIEDOT****\n";
		cout<<"\nEtunimi: "
		<<this->getEtunimi()<< "\nSukunimi: "
		<<this->getSukunimi()<<"\nId: "
		<<this->getId();


}
void Laakari::kysy()
{
	int ind=0;
	if (ind < 100)
	{
		cout<<"\nSyota Laakarin tiedot\n";
		cout<<"\nEtunimi:";
		getline(cin,etunimi);
		cout<<"Sukunimi:";
		getline(cin,sukunimi);
		cout<<"Id:";
		cin>>id;

	}



}
void Shoitaja::kysy()
{
	int ind=0;
	if (ind < 100)
	{
		cout<<"\nSyota Sairaanhoitajan tiedot\n";
		cout<<"\nEtunimi:";
		getline(cin,etunimi);
		cout<<"Sukunimi:";
		getline(cin,sukunimi);
		cout<<"Id:";
		cin>>id;

	}
}
void Huoltaja::kysy()
{
		int ind=0;
	if (ind < 100)
	{
		cout<<"\nSyota Huoltajan tiedot\n";
		cout<<"\nEtunimi:";
		getline(cin,etunimi);
		cout<<"Sukunimi:";
		getline(cin,sukunimi);
		cout<<"Id:";
		cin>>id;

	}
}
Laakari::Laakari()
{


}
Shoitaja::Shoitaja()
{


}
Huoltaja::Huoltaja()
{

}
=================harjoitustyo1.cpp========================
#include "stdafx.h"
#include"Sairaala.h"


int _tmain(int argc, _TCHAR* argv[])
{
	Sairaala app;
	app.run();
	return 0;
}

================Sairaala.h==================
#pragma once
#include"Hkunta.h"


class Sairaala
{

public:
	static const int laakarit_size=100;
	static const int sairaanhoitajat_size=100;
	static const int huoltajat_size=100;
	Sairaala(void);
	~Sairaala(void);
	void run();
	void initTables();

private:
	Laakari *laakarit[laakarit_size];
	Shoitaja *sairaanhoitajat[sairaanhoitajat_size];
	Huoltaja *huoltajat[huoltajat_size];



	int addlaakari();
	int adds();
	int addh();
	void printlaakari();
	void prints();
	void printh();
	void remove();
};
===============Hkunta.h========================
#pragma once

class Hkunta
{
public:
	Hkunta(void);
	~Hkunta(void);
	virtual void nayta() = 0;
	virtual void kysy() =0;






};
class Laakari: // lääkärit
	public Hkunta
{
private:



public:

	string etunimi; //osoitin jolle tila varataan dynaamisesti
	string sukunimi; //osoitin jolle tila varataan dynaamisesti
	int id;
	string getEtunimi(){return etunimi;}
	bool setEtunimi(string etunimi);
	string getSukunimi(){return sukunimi;}
	bool setSukunimi(string sukunimi);
	int getId(){return id;}
	void setId(int id){this->id=id;}
	Laakari(void);
	~Laakari(void);
	void nayta();
	void kysy();


};
class Shoitaja: //sairaanhoitajat
	public Hkunta
{
private:


public:

	string etunimi; //osoitin jolle tila varataan dynaamisesti
	string sukunimi; //osoitin jolle tila varataan dynaamisesti
	int id;
	string getEtunimi(){return etunimi;}
	bool setEtunimi(string etunimi);
	string getSukunimi(){return sukunimi;}
	bool setSukunimi(string sukunimi);
	int getId(){return id;}
	void setId(int id){this->id=id;}

	Shoitaja(void);
	~Shoitaja(void);
	void nayta();
	void kysy();



};
class Huoltaja:
	public Hkunta
{
private:


public:

	string etunimi; //osoitin jolle tila varataan dynaamisesti
	string sukunimi; //osoitin jolle tila varataan dynaamisesti
	int id;
	string getEtunimi(){return etunimi;}
	bool setEtunimi(string etunimi);
	string getSukunimi(){return sukunimi;}
	bool setSukunimi(string sukunimi);
	int getId(){return id;}
	void setId(int id){this->id=id;}
	Huoltaja(void);
	~Huoltaja(void);
	void nayta();
	void kysy();


};

Mod. lisäsi kooditagit

ville-v [09.12.2008 20:07:26]

#

Ymmärtääkseni sizeof(mitä_tahansa*) kertoo pointterin koon, eli neljä. Tarvitset siis tähän kohtaan sizeof(mitä_tahansa). Koska käytät C++:aa, voisit kuitenkin siirtyä std::vectorin käyttöön.

Voisitko vielä kertoa enemmän ongelmastasi?

hajtsu [10.12.2008 11:49:57]

#

siis esim kun painan A(lisaa laakaria)eli pari lääkäriä lisään muistiin, niin se ei näytä kun viimeisen lisätyn kääkärin tiedot kun painan p(print laakaria) ihan kun se ei tallentaisi kaikki nimet :(
kiitos.

Teuro [10.12.2008 12:56:00]

#

Alla on ainakin yksi ihan selkeä virhe, jonka vuoksi tulostuu aina indeksin 0 mukainen lääkäri. Keksit ehkä itsekin miksi...

hajtsu kirjoitti:

void Sairaala::printlaakari(){
	int ind=0;
	//for(ind=0;ind<100;ind++)
	//{
		if(laakarit[ind]!= NULL)
		{
			laakarit[ind]->nayta();
			ind++;
		}


	//}

Olet ehkä kommentoinut tuon for-lauseen pois, koska kääntäjä kiukuttelee uudelleen määritellystä ind muuttujasta, jonka ole juuri edellisellä rivillä määritellyt.

EDIT:

etpäs olekaan eihän tuolla olekaan määrittelyä, vaan ainoastaan sijoitus.

Teuro [10.12.2008 17:00:24]

#

Samalla kannattaa miettiä voisiko periytyminen olla avain koodin lyhentymiseen tähän tapaan.

class Henkilosto{
	protected:

		std::string etunimi;
		std::string sukunimi;
		int id;
		int osasto;

		Henkilosto( std::string en, std::string sn, int id, int os ){
			this -> etunimi = en;
			this -> sukunimi = sn;
			this -> id = id;
			this -> osasto = os;
		}
	public:

		std::string annaEtunimi(){
			return this -> etunimi;
		}
};

class Laakari : public Henkilosto{
	private:
		std::string tyohuone;
	public:
		Laakari( std::string th, std::string en, std::string sn, int id, int os ) : Henkilosto( en, sn, id, os ){
			this -> tyohuone = th;
		}
};

class Sairaanhoitaja : public Henkilosto{
	public:
		Sairaanhoitaja( std::string en, std::string sn, int id, int os ) : Henkilosto( en, sn, id, os ){

		}
};

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta