Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    536

    allocazione dinamica di stringhe in cicli

    ciao

    Allora.. vediamo se riesco a spiegarmi
    il codice sotto permette all'utente di
    inserire per due ipotetiche famiglie un numero tot
    di nomi e ne calcola il più lungo in caratteri:

    codice:
    #include <iostream>
    #include <string>
    #include <stdlib.h>
    #include <iomanip>
    using namespace std;
    char responso[256];
    /* Prototipi di funzione */
    void legginomi(string *source,int numelementi);
    void visualizzanomi(string *source,int numelementi);
    int leggiMassimo(string *source, int numelementi, int &max);
    int Lunghezza(string source);
    
    int main()
    {
    int QUANTISONO = 0;
    int QUANTISONO2 = 0;
    int max1, max2;
    int indice1, indice2;
    cout << "Quante persone ci sono nella prima famiglia?: ";
    cin.getline(responso,256);
    QUANTISONO = atoi(responso);
    string* pNomi = new string[QUANTISONO];
    
    cout << "Quante persone ci sono nella seconda famiglia?: ";
    cin.getline(responso,256);
    QUANTISONO2 = atoi(responso);
    string* pNomi2 = new string[QUANTISONO2];
    
    cout <<endl<<"Inserisci i nomi della prima famiglia:"<<endl;
    legginomi(pNomi,QUANTISONO);
    
    cout <<endl;
    cout <<endl<<"Inserisci i nomi della seconda famiglia:"<<endl;
    legginomi(pNomi2,QUANTISONO2);
    
    cout << endl << "I " << QUANTISONO << " nomi che hai inserito della prima famiglia sono:" << endl;
    visualizzanomi(pNomi,QUANTISONO);
    
    cout << endl << "I " << QUANTISONO2 << " nomi che hai inserito della seconda famiglia sono:" << endl;
    visualizzanomi(pNomi2,QUANTISONO2);
    
    //calcola il nome più lungo in caratteri e visualizzazione
    	indice1=leggiMassimo(pNomi, QUANTISONO, max1);
    	cout<<endl<<"Il massimo della prima famiglia e': "<<max1<<" in posizione: "<<indice1+1;
    	cout  << " (";
    	cout << pNomi[indice1] << ")" << endl;
    
    //calcola il nome più lungo in caratteri e visualizzazione
    	indice2=leggiMassimo(pNomi2, QUANTISONO2, max2);
    	cout<<endl<<"Il massimo della seconda famiglia e': "<<max2<<" in posizione: "<<indice2+1;
    	cout  << " (";
    	cout << pNomi2[indice2] << ")" << endl<<endl;
     
     if(max1>max2)
    	{
    		cout<<"il massimo tra le due famiglie e': "<< setw(3) << max1;
    		cout << " (" << pNomi[indice1];
    		cout << " - nella prima famiglia)" << endl<<endl;
    		
    	}
    	else if(max1<max2)
    	{
    		cout<<"Il massimo tra le due famiglie e': "<< setw(4)<<max2;
    		cout << " (" << pNomi2[indice2];
    		cout << " - nella seconda famiglia)" << endl<<endl;
    	}
    	
    	else if(max1==max2)
    	{
    		cout<<"Il massimo dei nomi delle 2 famiglie e' identico"<< endl<<endl;
    	}
    
    delete [] pNomi; //Cancella l'array dal free store
    delete [] pNomi2; //Cancella l'array dal free store
    pNomi = 0; //Assegna un valore null al puntatore
    pNomi2 = 0; //Assegna un valore null al puntatore
    system ("PAUSE");
    return 0;
    }
    void legginomi(string *source,int numelementi)
    {
    for (int riga = 0; riga < numelementi; riga++)
    {
    cout << "Inserisci il nome #" << riga+1 << " ";
    cin.getline(responso,256);
    source[riga] = responso;
    }
    }
    
    void visualizzanomi(string *source,int numelementi)
    {
    for (int riga = 0; riga < numelementi; riga++)
    {
    cout << source[riga] << endl;
    }
    }
    
    int leggiMassimo(string *source, int numelementi, int &max)
    {
    	max = 0;
    	int i;
    	int index;
    	for(i=0;i<numelementi;i++)
    	{
    		
    		if(Lunghezza(source[i]) > max)
    		{
    			max=Lunghezza(source[i]);
    			
    			index=i;
    			
    		}
    	}
    	return index; //Ritorno l'indice del più lungo
    }
    
    int Lunghezza(string source)
    {
    int i=0;
    int contatore=0;
    
    	//finche' la stringa non termina
    	while(source[i] != '\0')
    	{
    		//Se non è uno spazio
    		if(source[i] != ' '&& source[i] != '_')
    		{
    			//Aumenta il conteggio di 1
    			contatore++;
    		}
    		//Passa al prossimo carattere
    		i++;
    	}	
    	//Quando ha finito ritorna il numero di caratteri trovati
    	return contatore;
    }
    volevo implementarlo permettendo all'utente di inserire all'inizio anche
    un numero variabile di famiglie, invece delle solite due fisse.
    Avevo provato questo (riporto solo la parte più significativa):

    cout << "Quante famiglie ci sono?: ";
    cin.getline(responso,256);
    quantefam = atoi(responso);
    string* pNomifam = new string[quantefam];
    leggifam(pNomifam,quantefam);
    cout<<endl;

    for (int i = 0; i < quantefam; i++)
    {
    cout << "Quante persone ci sono nella famiglia "<<pNomifam[i]<< "?: ";
    cin.getline(responso,256);

    ..e qui mi sono perso.

    Il problema a questo punto è che dopo aver scelto il numero di famiglie
    e assegnato loro i relativi nomi, per ogni famiglia bisognerebbe creare
    un array che contenga i nomi il cui numero dei membri è deciso sempre
    dall'utente..riprenda cioè le funzionalità del mio programma sopra postato..
    Chi mi aiuta?
    grazie e ciao

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    536
    difficile?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.