[RIsolto][C++] Gestione Social Network: problema stampa

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
SteveSicily
Prode Principiante
Messaggi: 58
Iscrizione: mercoledì 30 dicembre 2009, 13:18

[RIsolto][C++] Gestione Social Network: problema stampa

Messaggio da SteveSicily »

Salve a tutti, dovrei fare un programma che gestisce un Social Network, il menu dovrebbe essere questo:

Codice: Seleziona tutto

1) Aggiungi utente
2) Aggiungi gruppo
3) Iscrivi utente a gruppo
4) Stampa elenco iscritti a gruppo
5) Stampa elenco gruppi per utente
Questo è il programma che ho scritto io:

header.h:

Codice: Seleziona tutto

typedef struct{
			std::string codice, nome, cognome, eMail;
			std::vector<std::string> nome_gruppo;
	} Utente;

typedef struct{
			std::string data, nomeGruppo;
			std::vector<std::string> nomeUtente;
	} Gruppo;

class Rete{
    public:
        Rete();
        ~Rete();

        void insGruppo();
        void insUtente();
        void UtoG();
        void stampa(int );
		int  menu();
    private:
        std::vector<Utente> u;
        std::vector<Gruppo> g;
};
impl.cpp:

Codice: Seleziona tutto

#ifndef F
#define F
#include <iostream>
#include <list>
#include <vector>
#include "header.h"
#endif // F

Rete::Rete(){
	{
		Utente temp;
		for(auto i: temp.nome_gruppo){
			i=" ";
		}
		temp.nome={" "};
		for (int i=0; i!=5000; ++i){		
			u.push_back(temp);
		}
		
	}

	{
		Gruppo temp;
		for(auto i: temp.nomeUtente){
			i=" ";
		}
		temp.nomeGruppo={" "};
		for (int i=0; i!=500; ++i){	
			g.push_back(temp);
		}
	}
};

Rete::~Rete(){};

//Metodi
void Rete::insUtente(){
	Utente temp;
	std::cout<<"Inserisci Codice: "<<std::endl;
	std::cin>>temp.codice;
	std::cout<<"Inserisci Nome: "<<std::endl;
	std::cin>>temp.nome;
	std::cout<<"Inserisci Cognome: "<<std::endl;
	std::cin>>temp.cognome;
	std::cout<<"Inserisci E-Mail: "<<std::endl;
	std::cin>>temp.eMail;
	u.push_back(temp);
}

void Rete::insGruppo(){
	Gruppo temp;
	std::cout<<"Inserisci Data Creazione: "<<std::endl;
	std::cin>>temp.data;
	std::cin.ignore();
	std::cin.clear();
	std::cout<<"Inserisci Nome Gruppo: "<<std::endl;
	std::getline(std::cin, temp.nomeGruppo);
	g.push_back(temp);
}

void Rete::UtoG(){
	std::string nUt;
	std::cout<<"Inserisci il nome dell'utente: ";
	std::cin>>nUt;
	std::string nGr;
	std::cout<<"Inserisci nome gruppo: ";
	std::cin>>nGr;
	
	for(auto i: u){
		if(i.nome==nUt){
			Utente temp=i;
			for(auto j: temp.nome_gruppo){
				if(j==" "){
					j=nGr;
					u.push_back(temp);
					break;
				}
			}
		}
	}
	for(auto i: g){
		Gruppo temp=i;
		if(i.nomeGruppo==nGr){
			for(auto j: i.nomeUtente){
				if(j==" "){
					j=nUt;
					g.push_back(temp);
					break;
				}
			}
		}
	}
}

void Rete::stampa(int i){
	switch(i){
		case 1:
			for(auto j: g){
				for(auto iter: j.nomeUtente){
					std::cout<<iter<<std::endl;
				}
			}
			break;
		case 2:
			for(auto j: u){
				for(auto iter: j.nome_gruppo){
					std::cout<<iter<<std::endl;		
				}
			}
			break;
	}
}

int Rete::menu(){
	int scelta=0;
	std::cout<<"1) Aggiungi utente"<<std::endl;
	std::cout<<"2) Aggiungi gruppo"<<std::endl;
	std::cout<<"3) Iscrivi utente a gruppo"<<std::endl;
	std::cout<<"4) Stampa elenco iscritti a gruppo"<<std::endl;
	std::cout<<"5) Stampa elenco gruppi per utente"<<std::endl;
	std::cin>>scelta;

	return scelta;
}
main.cpp:

Codice: Seleziona tutto

#ifndef F
#define F
#include <iostream>
#include <vector>
#include "header.h"
#endif // F

int main(){
	Rete r;
	while(true){
		switch(r.menu()){
			case 1:
				r.insUtente();
				break;
			case 2:
				r.insGruppo();
				break;
			case 3:
				r.UtoG();
				break;
			case 4:
				r.stampa(1);
				break;
			case 5:
				r.stampa(2);
				break;
			default:
				return 0;
		}
	}
}
Il programma mi compila e parte, tutto ok, ma eseguendo questi comandi:
aggiungi utente, aggiungi gruppo, iscrivi utente a gruppo, stampa (quindi o 4 o 5 ), non stampa nulla, ho fatto un casino di cose (ho provato con 4 liste, con 2 vector e 2 liste, con 4 vector ecc.), sempre stesso risultato, non stampa!
io sinceramente non so cosa provare più, per favore, potreste darmi una dritta?
Grazie in anticipo.
Ultima modifica di SteveSicily il sabato 11 giugno 2016, 12:38, modificato 1 volta in totale.
Dahman
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1013
Iscrizione: mercoledì 31 ottobre 2007, 8:29
Località: Torino

Re: [C++] Gestione Social Network: problema stampa

Messaggio da Dahman »

Senza parlare dell'approccio che non mi sembra ottimale, l'errore principale se ho capito bene il tuo intento, é questo:
Quando vai ad associare un utente ad un gruppo, tu ti aspetti che quel utente abbia almeno un nome di gruppo nullo (o meglio uguale ad uno spazio), per infilarci il nuovo nome del gruppo, giusto?
Nella funzione di inserimento di utenti nuovi, non risulta questa assegnazione (nome_gruppo = " ").
Guardando l'inizializzazione della classe Rete, sembra che questo avvenga qui
Utente temp;
for(auto i: temp.nome_gruppo){
i=" ";
}
Ma non é cosi, perché inizialmente, l'utente temp ha un vettore nome_gruppo vuoto, quindi quel ciclo non si attiva neanche.

Prova ad eliminare tutto il contenuto del costruttore di Rete e aggiungi questo

Codice: Seleziona tutto

.....
   temp.nome_gruppo.push_back(" ");
   u.push_back(temp);
nella funzione insUtente().
Ci saranno sicuramente altri errori...

L'altro problema grosso e che tu non lavori con i puntatori e quindi bisogna fare molta attenzione nelle varie assegnazioni,
tipo questa
if(j==" "){
j=nGr;
u.push_back(temp);
break;
ciao
dahman
SteveSicily
Prode Principiante
Messaggi: 58
Iscrizione: mercoledì 30 dicembre 2009, 13:18

Re: [C++] Gestione Social Network: problema stampa

Messaggio da SteveSicily »

Perfetto adesso funziona! Grazie mille!
Un'ultima cosa:
A cosa ti riferivi? Potresti darmi qualche consiglio? :)
Dahman
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1013
Iscrizione: mercoledì 31 ottobre 2007, 8:29
Località: Torino

Re: [C++] Gestione Social Network: problema stampa

Messaggio da Dahman »

Sicuro che funziona?
Per funzionare dovresti ancora correggere altri errori.
Per esempio devi correggere la funzione insGruppo nello stesso modo di insUtente.
E sopratutto qui
if(j==" "){
j=nGr;
u.push_back(temp);
break;
Tu assegni a j, una stringa locale, il nome del gruppo, ma certamente non a temp.
Dovresti sostituire quella assegnazione con

Codice: Seleziona tutto

               temp.nome_gruppo.push_back(nGr);
Lo stesso errore qui
if(j==" "){
j=nUt;
g.push_back(temp);
break;
}
A cosa ti riferivi? Potresti darmi qualche consiglio?
Per esempio, non c'é bisogno che tu assegni inizialmente un gruppo nullo all'utente per poi "sostituirlo" con quello nuovo.
Ogni volta che vuoi assegnare un gruppo ad un utente qualsiasi, dovresti solo controllare che non gli é già stato assegnato prima, e in questo caso lo aggiungi alla sua lista di gruppi.
Stesso discorso con i gruppi.

Ma sopratutto, non conviene assegnare ad ogni utente l'intero gruppo oppure al gruppo l'intero utente.
Hai già considerato un codice per ogni utente, fai la stessa cosa con i gruppi e usa il codice come chiave di inserimento e ricerca.
In altre parole, ogni utente dovrà avere solo una lista di codici (int) di gruppi e ogni gruppo dovrà avere una lista di codici di utenti.
E per risalire ad un utente oppure ad un gruppo, partendo dal proprio codice, fai una ricerca nella relativa lista e tiri fuori l'oggetto intero.
Questo ti semplifica molte cose che potresti aggiungere dopo (per esempio modificare i dati di un utente o un gruppo).

Comunque, direi che dovresti comunque cercare di correggere completamente il tuo programma cosi come l'hai impostato e poi un passo alla volta, cercherai di migliorarlo.

ciao
dahman
SteveSicily
Prode Principiante
Messaggi: 58
Iscrizione: mercoledì 30 dicembre 2009, 13:18

Re: [C++] Gestione Social Network: problema stampa

Messaggio da SteveSicily »

Dahman [url=http://forum.ubuntu-it.org/viewtopic.php?p=4889828#p4889828][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Sicuro che funziona?
Per funzionare dovresti ancora correggere altri errori.
Per esempio devi correggere la funzione insGruppo nello stesso modo di insUtente.
E sopratutto qui
if(j==" "){
j=nGr;
u.push_back(temp);
break;
Tu assegni a j, una stringa locale, il nome del gruppo, ma certamente non a temp.
Dovresti sostituire quella assegnazione con

Codice: Seleziona tutto

               temp.nome_gruppo.push_back(nGr);
Lo stesso errore qui
if(j==" "){
j=nUt;
g.push_back(temp);
break;
}
A cosa ti riferivi? Potresti darmi qualche consiglio?
Per esempio, non c'é bisogno che tu assegni inizialmente un gruppo nullo all'utente per poi "sostituirlo" con quello nuovo.
Ogni volta che vuoi assegnare un gruppo ad un utente qualsiasi, dovresti solo controllare che non gli é già stato assegnato prima, e in questo caso lo aggiungi alla sua lista di gruppi.
Stesso discorso con i gruppi.

Ma sopratutto, non conviene assegnare ad ogni utente l'intero gruppo oppure al gruppo l'intero utente.
Hai già considerato un codice per ogni utente, fai la stessa cosa con i gruppi e usa il codice come chiave di inserimento e ricerca.
In altre parole, ogni utente dovrà avere solo una lista di codici (int) di gruppi e ogni gruppo dovrà avere una lista di codici di utenti.
E per risalire ad un utente oppure ad un gruppo, partendo dal proprio codice, fai una ricerca nella relativa lista e tiri fuori l'oggetto intero.
Questo ti semplifica molte cose che potresti aggiungere dopo (per esempio modificare i dati di un utente o un gruppo).

Comunque, direi che dovresti comunque cercare di correggere completamente il tuo programma cosi come l'hai impostato e poi un passo alla volta, cercherai di migliorarlo.

ciao
dahman
Si si, no l'avevo corretto e diciamo che ho ridotto i for, e ho aumentato i push_back, ho fatto come avevi detto tu, praticamente. Comunque cercherò di implementare i tuoi consigli. Grazie Mille.
Avatar utente
tokijin
Moderatore Globale
Moderatore Globale
Messaggi: 4624
Iscrizione: mercoledì 3 giugno 2009, 23:10
Desktop: plasma 5.27.4
Distribuzione: Kubuntu 23.04
Località: Abruzzo

Re: [RIsolto][C++] Gestione Social Network: problema stampa

Messaggio da tokijin »

@SteveSicily
A me paiono decisamente simili ma se ci sono quali sono le differenze tra questa discussione e quest'altra che hai aperto qualche settimana fa?
http://forum.ubuntu-it.org/viewtopic.php?f=33&t=611356
Sei abbruzzese se dopo che ti sei strafogato un chilogrammo di pasta, hai il coraggio di dire alla cuoca "cacc ch'è cott" - Se entra un piccione in casa..chiudi le finestre!
Ubuntu User #28657 - Il mio vecchio hardware - Tag Codice
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti