Liste C++

di il
2 risposte

Liste C++

Ciao a tutti,
Ho provato a svolgere un esercizio sulle liste che consiste nel gestire le richieste di cassa/accodamento di una struttura sanitari, vi copio una parte della consegna : "Per poter effettuare visite specialistiche presso un ospedale sono necessarie due differenti fasi:
cassa, ovvero presentarsi agli sportelli per prenotare la visita e pagare il ticket dovuto; accodamento,
ovvero presentarsi sempre agli sportelli il giorno della visita per essere effettivamente inseriti
nell’elenco ordinato del medico/ambulatorio che chiamerà il paziente per la visita, tenendo conto
dell’orario assegnato in fase di prenotazione."
In seguito viene richiesto di creare una funzione che ordini la lista in base all'orario di prenotazione..fin qui tutto ok, poi viene chiesto : "Una funzione principale avrà il compito di gestire le richieste di cassa o di accodamento
avvalendosi di opportune altre funzioni. Scrivere, in linguaggio C++, la funzione che, ricevuta in ingresso la lista delle prenotazioni per la
chiamata allo sportello ed il numero di accodamenti consecutivi effettuati,stampi l’identificativo
di chi si deve presentare allo sportello, rispettando i vincoli sopra indicati, e il numero di
accodamenti consecutivi aggiornato. Scrivere una seconda funzione che, chiamata dalla funzione principale, permetta all’operatore di
sportello di inserire i dati necessari (anagrafe semplificata, id ambulatorio, ora prenotazione) ed
accodare il paziente nella lista dello specifico medico/ambulatorio mantenendo la lista ordinata
secondo l’orario di prenotazione. Per semplicità si ipotizzi che vi siano solo tre medici/ambulatori
attivi." Ho provato a scrivere questo codice, non è ancora completo, so che non è perfetto e che non rispetta tutte le richieste, (sono alle prime armi), ma la mia domanda principale è : perchè mi dà errore nelle righe dove ho commentato con ******? un puntatore a elemento della struct non può puntare ad una stringa?

CODICE:
#include <iostream>
#include <string.h>
#include <stdlib.h>

using namespace std;

struct paziente 
{
	string nome;
	string cognome;
	int id_ambulatorio;
	float orario_pren;
	string tipo_pren;    // c se operazione cassa, a se accodamento
	paziente* next;
};

//definisco puntatore a struct
typedef paziente* punt;

typedef paziente pazient;

//inizializzazione lista che verra' usata
punt inizio=NULL;
//variabile struct
paziente nuovo;

int cont=0; //variabile contatrice degli accodamenti 
int cont_p=0; //variabile che conta richieste di cassa presenti in lista 

pazient Richieste (int a) //funzione che gestisce richiesta di cassa o accodamento
{
	
	switch (a) {
		case 1 : {
			cout<<"Inserisca il proprio nome:  "<<endl;
			cin>>nuovo.nome;
			cout<<"Inserisca il proprio cognome:  "<<endl;
			cin>>nuovo.cognome;
			cout<<"Inserisca ID ambulatorio:  "<<endl;
			cin>>nuovo.id_ambulatorio;
			cout<<"Inserisca l'orario di prenotazione:  "<<endl;
			cin>>nuovo.orario_pren;
			nuovo.tipo_pren='C';
			break;
		}
		
		case 2 : {
			cout<<"Inserisca il proprio nome:  "<<endl;
			cin>>nuovo.nome;
			cout<<"Inserisca il proprio cognome:  "<<endl;
			cin>>nuovo.cognome;
			cout<<"Inserisca ID ambulatorio:  "<<endl;
			cin>>nuovo.id_ambulatorio;
			cout<<"Inserisca l'orario di prenotazione:  "<<endl;
			cin>>nuovo.orario_pren;
			nuovo.tipo_pren='A';
			break;
		}
	}
	
	return nuovo;
}

void ListOrd (paziente nuovo)    //lista ordinata secondo l'orario di prenotazione
{
	punt p,q,r;
	
	for (q=inizio; q!=NULL && q->orario_pren < nuovo.orario_pren; q=q->next) p=q;
	
	r=new paziente;
	r->nome=nuovo.nome;
	r->cognome=nuovo.cognome;
	r->id_ambulatorio=nuovo.id_ambulatorio;
	r->orario_pren=nuovo.orario_pren;
	r->tipo_pren=nuovo.tipo_pren;
	r->next=q;
	if (q==inizio) inizio=r;			//caso lista vuota
	else p->next=r;
}

void ChiamataSportello (punt& start)
{
	punt p,q;
	
	if (start==NULL) cout<<"Lista vuota"<<endl;
	
	//ciclo che fa arrivare p all'ultimo elemento della lista
	for (q=inizio; q!=NULL; q=q->next) {
		p=q;
		if (q->tipo_pren =='C') cont_p++;		//*************
	}
	
	if (p->tipo_pren =='A')			//*************
	{
		cout<<"ID del prossimo:  "<<p->id_ambulatorio<<endl;
		cont++;
		delete p;
	}
	
	if (p->tipo_pren =='C')         //*************
	{
		if (cont<3) {
			cout<<"ID del prossimo:  "<<p->tipo_pren<<endl;
			delete p;
			cont=0;
		}
		
		if (cont_p==1) {
			cout<<"ID del prossimo:  "<<p->tipo_pren<<endl;
			delete p;
			cont_p=0;
		}
	}
}

void StampaLista (punt& starte)
{
	punt temp=starte;
	
	while (temp!=NULL) 
	{
		cout<<endl<<"Nome:  "<<temp->nome<<"  Cognome:  "<<temp->cognome<<"  ID: "<<temp->id_ambulatorio<<"  Orario prenotaione:  "<<temp->orario_pren<<endl;
		temp=temp->next;
	}
}


int main ()

{
	int scelta=0;
	cout<<"Benvenuto!"<<endl;
	//ciclo di prova
		for (int i=0; i<5;i++) {
		cout<<"Inserisci (1) se vuoi eseguire un'operazione di cassa, altrimenti (2) per un'operazione di accodamento"<<endl;
		cin>>scelta;
		paziente temp=Richieste (scelta);
	
		ListOrd (temp);
		}
	
	int m;
	cout<<"Inserisca (3) per visualizzare lista pazienti in attesa "<<endl;
	cin>>m;
	if (m==3) {
		StampaLista (inizio);
	}
	
	return 0;
}

2 Risposte

  • Re: Liste C++

    La butto lì, perché non ho mai usato <string>...

    Non è che la classe string non prevede che l'operatore di confronto == sia usato con una costante di tipo char? Magari prova con if (*(q->tipo_pren.c_str()) =='C') cont_p++; , chissà che funzioni. Ora non ho il tempo per fare io stesso la verifica.

    Se funzionasse, sarebbe perché il metodo c_str() della classe string restituisce restituisce il puntatore a un array di char nel quale è contenuta la stringa dell'oggetto string (nella sua versione C) e a essere confrontato con la costante 'C' sarebbe il "contenuto" del primo elemento di quell'array, non l'oggetto string in sè.
  • Re: Liste C++

    Il problema è quello che ti ha detto AldoBaldo.
    Soluzioni:
    - o confronti due stringhe:
    tipo_pren == "C"
    - o confronti due char:
    tipo_pren[0] == 'C'
    In ogni caso per il membro tipo_pren è inutile scomodare le stringhe, basta un char.

    Non ho tempo di mettermi alla ricerca di eventuali errori, ma dal poco che ho visto debbo dire che il codice poteva essere organizzato un po' meglio!
Devi accedere o registrarti per scrivere nel forum
2 risposte