Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it L'avatar di bovy
    Registrato dal
    Nov 2006
    Messaggi
    269

    [C++ ordinamento rubrica]

    devo creare una rubrica telefonica in cui l'utente inserisce il nome,il cognome e il numero di telefono, dopodichè deve poter stampare la rubrica, modificare un elemento della rubrica, cercare un elemento nella rubrica e ordinare la rubrica in ordine alfabatico (in base al cognome)ogni volta. adesso vi scrivo il codice ( quello che ho fatto), x la modifica e la ricerca penso di farcela, ma x l'ordinamento non ho propio idea di come fare, mi potete dare una mano? grazie

    tutto quello che posso usare è già nel programma ( come strutture fondamentali if while for ecc), se avete dei dubbi su quanche cosa ( se la posso usare o no) chiedete.

    codice:
    #include <iostream.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
    
    typedef struct rubrica{
            char cognome[15];
            char nome[15];
            char numero[20];
            }rubrica;
            
    rubrica riga[20];
    
    int scelta=0,a=0,cont=0,vuoto=0;
    void inserimento(),stampa(),modifica(),cerca(),ordina();
    char risp='s';
    
    main()
    {
          do{
                  
                  cout<< "(1)-(Inserisci un elemento nella rubrica)\n";
                  cout<< "(2)-(Stampa la rubrica)\n";
                  cout<< "(3)-(Modifica un numero nella rubrica)\n";
                  cout<< "(4)-(Cerca un numero nella rubrica)\n";
                  cout<< "(5)-(Esci)\n\n";
                  cin>>scelta;
                  
                  switch (scelta)
                  {
                         case 1:
                              inserimento();
                              ordina();
                              break;
                         case 2:
                              if(vuoto==1)
                              {
                              stampa();
                              ordina();
                              }else{cout<<"La rubrica e' vuota"<<endl;                             
                                 system("Pause");
                                 system("cls");
                                 break;}
                              break;
                         case 3:
                              modifica();
                              ordina();
                              break;
                         case 4:
                              cerca();
                              ordina();
                              break;
                         case 5:
                              break;
                         default:
                                 cout<<"Scelta errata!\n\n";
                                 system("Pause");
                                 system("cls");
                                 break;
                                 }
                                 }while(scelta!=5);
                                 return 0;
                                 
                                 getchar();
                                 getchar();
       }
    
    
    
    void inserimento()
    {
         vuoto=1;
         do{
                      system("cls");
                      cout<<"Cognome:"<<" ";       cin>>riga[cont].cognome;
                      cout<<"Nome:"<<" ";           cin>>riga[cont].nome;
                      cout<<"Numero di telefono:"<<" ";                 cin>>riga[cont].numero;
                      cout<<"Vuoi inserire un altro elemento? (s/n)";
                      cin>>risp;
                      cont++;
                      }while(risp=='s');
                      system("cls");
                      a=cont;
                      }
                      
    void stampa()
    {
         for(cont=0; cont<a; cont++)
         {
                     cout<<"Cognome:"<<riga[cont].cognome<<endl;
                     cout<<"Nome:"<<riga[cont].nome<<endl;
                     cout<<"Numero di telefono:"<<riga[cont].numero<<endl;
                     }
                                                  system("Pause");
                                 system("cls");
                     }
                     
    void ordina()
    {
         cout<<"In costruzione"<<endl;
     }
     
     void cerca()
    {
         cout<<"In costruzione"<<endl;
     }
     
     void modifica()
    {
         cout<<"In costruzione"<<endl;
     }
    Windows più che un sistema operativo è un sistema nervoso....

  2. #2
    spero che non ti sia troppo ostico,
    codice:
    #include <iostream>
    #include <algorithm>
    #include <vector>
    
    using namespace std;
    
    typedef struct rubrica{
            char cognome[15];
            char nome[15];
            char numero[20];
            } rubrica ;
    
                    
    
    rubrica riga[] = {
                    {"b","",""},
                    {"d","",""},
                    {"a","",""},
                    {"c","",""}
            };
      
    int key[] = {0, 1, 2, 3};
    
    vector<int> key_vector (key, key+4);      
    vector<int>::iterator it;
    
    bool mycompare (int i, int j) { 
       
            return strcmp(riga[i].cognome, riga[j].cognome) < 0;
    }
    
    
    int main () {
      
     
      cout << "Inizio :  "  << endl;
      for (int i = 0; i < 4; i++)
        cout << " " << riga[key_vector[i]].cognome << endl;
    
      sort (key_vector.begin(), key_vector.end(), mycompare); 
    
      cout << "Fine :  "  << endl ;
      for (int i = 0; i < 4; i++)
        cout << " " << riga[key_vector[i]].cognome << endl;
      
      cout << endl;
    
      return 0;
    }

  3. #3
    Utente di HTML.it L'avatar di bovy
    Registrato dal
    Nov 2006
    Messaggi
    269
    #include <algorithm>
    #include <vector>


    using namespace std;

    {"b","",""},
    {"d","",""},
    {"a","",""},
    {"c","",""}

    vector<int> key_vector (key, key+4);
    vector<int>::iterator it;

    bool mycompare (int i, int j) {

    return strcmp(riga[i].cognome, riga[j].cognome) < 0;
    }

    cout << " " << riga[key_vector[i]].cognome << endl;

    sort (key_vector.begin(), key_vector.end(), mycompare);

    cout << " " << riga[key_vector[i]].cognome << endl;

    queste cose non le ho mai usate, a parte strcmp; le 2 librerie,using namespace std, questo e tutto quello che c'è dopo non le ho mai usate e non so cosa siano, quindi non le posso usare. praticamente posso usare tutto quello che ti ho messo nel codice in più la random ( ma non credo serva) e gli algoritmi come il bubble sort e il sequenziale x ordinamento di vettori numerici
    Windows più che un sistema operativo è un sistema nervoso....

  4. #4
    Utente di HTML.it L'avatar di bovy
    Registrato dal
    Nov 2006
    Messaggi
    269
    almeno che non ci sia qualcosa ( di quello che tu hai scritto) che serva propio per fare ciò che voglio io
    Windows più che un sistema operativo è un sistema nervoso....

  5. #5
    se fai un copia incolla del codice che ti ho postato e lo lanci questo fa proprio quello che chiedi.
    Hai identificato questo thread con C++, quindi presumo che tu conosca le librerie standard e l'uso dei namespace. Per quest'ultimo cerca su google "namespace c++" per avere informazioni.

    Ho usato la classe template (sai cosa sono?) vector come vettoro di int, ma puoi tranquillamente usare un vettore di int creato con int *.

    Il concetto del codice che ti ho postato si basa sul fatto di non spostare fisicamente i record della tua rubrica, cosa che può diventare molto pesante quando fossero diverse centinaia e fossero memorizzate su un file. Invece di spostare fisicamente i record si riordinano dei riferimenti ai vari record. Così nel vettore che ti ho indicato all'inizio memorizzi la sequenza naturale dei record, se sono 4, come nel mio esempio, il vettore conterrà {0,1,2,3}, cioè la sequenza non ordinata (il primo elemento del vettore punta al record numero 0, il secondo al numero 1 e così via).
    Per il riordinamento ho utilizzato la funzione standard sort , perchè è già fatta ma tu se vuoi ne puoi scrivere una a tuo uso e consumo che utilizzi l'algoritmo di riordinamento che meglio conosci.

    Alla funzione sort standard puoi passare gli iteratori alla classe vettore (questo lo puoi studiare in rete o sui libri di testo in tuo possesso) e il puntatore ad una funzione di riordinamento che agisce sulla struttura della tua rubrica. Cerca su google "sort c++" per avere più informazioni sulla sort.

    codice:
    bool mycompare (int i, int j) {
      return strcmp(riga[i].cognome, riga[j].cognome) < 0;
    }
    la funzione di confronto riceve i valori del tuo vettore che sono riferimenti alla tua struttura, li trasformi nel valore del membro della struttura che vuoi ordinare (io ho usato il cognome) e tutto va a posto.

    Se questo è troppo difficile per te prova a scriverti una funzione di riordinamento utilizzando l'algoritmo che trovi più semplice che vediamo come va modificata per soddisfare le tue consegne.
    ciao
    sergio

  6. #6
    Utente di HTML.it L'avatar di bovy
    Registrato dal
    Nov 2006
    Messaggi
    269
    il fatto non è tanto di conoscere le librerie standard e i namespace, ma il fatto è che non le posso usare, xke visto che sto studiando questo linguaggio a livello scolastico, non posso introdurre nel codice cose non ancora fatte
    stessa cosa per la classe template

    al posto della sort, io potrei utilizzare questa ( bubble sort):

    codice:
    do{
    flag=0;
    for(k=0; k<num-1; k++)
    {
        if(vett[k]> vett[k+1])
        {
            com=vett[k];
            vett[k]= vett[k+1];
            vett[k+1]= com;
            flag=1;
        } 
       }
    }while(flag==1);
    ma come faccio ad utilizzarla per le stringhe?
    Windows più che un sistema operativo è un sistema nervoso....

  7. #7
    codice:
    #include <iostream>
    
    typedef struct rubrica{
            char cognome[15];
            char nome[15];
            char numero[20];
            } rubrica ;
    
                    
    
    rubrica riga[] = {
                    {"b","",""},
                    {"d","",""},
                    {"a","",""},
                    {"c","",""}
            };
      
    int vett[] = {0, 1, 2, 3};
    
    
    
    int main () {
      
     
    	std::cout << "Inizio :  "  << std::endl;
    	for (int i = 0; i < 4; i++)
    		std::cout << " " << riga[vett[i]].cognome << std::endl;
    
    
    	int num = sizeof(vett) / sizeof(int) ;
    
    	int flag = 0;
    	do {
    		flag = 0;
    		for(int k=0; k<num-1; k++)	{
    			if(strcmp(riga[vett[k]].cognome, riga[vett[k+1]].cognome) > 0)   {
    				int com = vett[k];
    			        vett[k]= vett[k+1];
    			        vett[k+1]= com;
    			        flag=1;
    			} 
    		}
    	} while(flag==1);
    
    	std::cout << "Fine :  "  << std::endl ;
    	for (int i = 0; i < 4; i++)
    		std::cout << " " << riga[vett[i]].cognome << std::endl;
      
    	std::cout << std::endl;
    
    	return 0;
    }

  8. #8
    Utente di HTML.it L'avatar di bovy
    Registrato dal
    Nov 2006
    Messaggi
    269
    ok..più o meno ci sono, però non ho capito perchè se metto:

    codice:
    rubrica riga[] = {
                    {"b","",""},
                    {"d","",""},
                    {"a","",""},
                    {"c","",""}
            };
      
    int vett[] = {0, 1, 2, 3};
    funziona, ma se metto :

    codice:
    rubrica riga[20];
    int vett[20];
    non funziona, mi potete spiegare il xke?!
    Windows più che un sistema operativo è un sistema nervoso....

  9. #9
    adesso devi inserire l'ordinamento nel tuo codice, il mio era solo un esempio con una struttura parzialmente inizializzata.
    Inserisci il codice nel tuo programma e postalo lasciando solo le funzioni Inserisci e Ordina.
    ciao
    sergio

  10. #10
    Utente di HTML.it L'avatar di bovy
    Registrato dal
    Nov 2006
    Messaggi
    269
    codice:
    #include <iostream.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
    
    typedef struct rubrica{
            char cognome[15];
            char nome[15];
            char numero[20];
            }rubrica;
            
    //rubrica riga[20];
    //int vett[20];
    
    rubrica riga[] = {
                    {"b","",""},
                    {"d","",""},
                    {"a","",""},
                    {"c","",""}
            };
      
    int vett[] = {0, 1, 2, 3};
    
    int scelta=0,a=0,cont=0,vuoto=0;
    void inserimento(),stampa(),cerca(),modifica(),ordina();
    char risp='s';
    
    
    void inserimento()
    {
         vuoto=1;
         do{
                      system("cls");
                      cout<<"Cognome:"<<" ";       cin>>riga[cont].cognome;
                      cout<<"Nome:"<<" ";           cin>>riga[cont].nome;
                      cout<<"Numero di telefono:"<<" ";                 cin>>riga[cont].numero;
                      cout<<"Vuoi inserire un altro elemento? (s/n)";
                      cin>>risp;
                      cont++;
                      }while(risp=='s');
                      system("cls");
                      a=cont;
                      }
                      
    void stampa()
    {
         for(cont=0; cont<a; cont++)
         {
                     cout<<"Cognome:"<<riga[vett[cont]].cognome<<endl;
                     cout<<"Nome:"<<riga[cont].nome<<endl;
                     cout<<"Numero di telefono:"<<riga[cont].numero<<endl;
                     }
                                                  system("Pause");
                                 system("cls");
                     }
    
    void ordina()
    {
    int flag = 0;
    	do {
    		flag = 0;
    		for(int k=0; k<a-1; k++)	{
    			if(strcmp(riga[vett[k]].cognome, riga[vett[k+1]].cognome) > 0)   {
    				int com = vett[k];
    			        vett[k]= vett[k+1];
    			        vett[k+1]= com;
    			        flag=1;
    			} 
    		}
    	} while(flag==1);
    
    }
    ho tolto la funzione modifica ,cerca e il main ( dalla risposta), però li potete vedere nel mio primo messaggio

    così funziona, però come vedi ho commentato //rubrica riga[20]; //int vett[20]; e non ho commentato quelli che mi hai scritto te: se faccio il contrario non va
    Windows più che un sistema operativo è un sistema nervoso....

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.