Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - matrici
Forum - C/C++ - matrici

Avatar
giocala88 (Normal User)
Expert


Messaggi: 248
Iscritto: 23/04/2008

Segnala al moderatore
Postato alle 14:40
Venerdì, 25/04/2008
salve ragazzi volevo sapere cosa fossero le matrici nel linguaggio ANSI C e se possono essere utilizzate per ordinare dalla a alla z in base al nome o alla città, una rubrica telefonica...????

ad es:

nome cognome numero civico numero telefonico...

grazie...

PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 23:00
Venerdì, 25/04/2008
No ... le matrici sono solamente dei "contenitori" per dati organizzati secondo certe regole.

Ma se stai studiando il C, dovresti usare un libro, non un forum ...

PM Quote
Avatar
FHF93 (Ex-Member)
Pro


Messaggi: 132
Iscritto: 13/11/2007

Segnala al moderatore
Postato alle 11:47
Sabato, 26/04/2008
si le matrici sono vettori bidimensionali , un uso tipico è usarle come tabelle indicando righe e colonne ...
riguardo la seconda domanda non credo si possa fare quel che dici tu , l'unico algoritmo di ordinamento con le matrici che conosco è il bucket sort ma non serve per i tuoi scopi

PM Quote
Avatar
Zonzo (Ex-Member)
Rookie


Messaggi: 34
Iscritto: 21/04/2008

Segnala al moderatore
Postato alle 16:25
Martedì, 13/05/2008
Le matrici sono degli array multidimensionali, possono avere delle due alle n dimensioni.
Sicuramente per risolvere il tuo problema, abbiamo bisogno di una matrice bidimensionale, che ha come righe il numero delle parole e come colonne la loro lunghezza.
A questo messaggio di allego un file, che è il programma che svolge l'ordinamento di stringhe all'interno di una matrice, l'ho implementato prendendo spunto dal BubbleSort.


Codice sorgente - presumibilmente C++

  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <iostream>
  4.  
  5. #define m 5      //Numero parole
  6. #define n 15    //Lunghezza parole
  7.  
  8. int main()
  9.  
  10. {
  11.     int i,k,j;
  12.     char appoggio[n];
  13.     char nomi[m][n]={"Milano","Firenze","Torino","Venezia","Roma"};
  14.         bool flag=true,verifica=true;
  15.        
  16.           k=m;  
  17.           while(flag==true && k>1)
  18.           {
  19.                   flag=false;
  20.               for(i=0,j=0;i<m-1;i++)
  21.                    {
  22.                          verifica=true;                                          
  23.                          while(verifica==true)
  24.                           {
  25.                              if(nomi[i][j]>nomi[i+1][j])         
  26.                                {
  27.                                           j=0;
  28.                                           strcpy(appoggio,nomi[i]);
  29.                                           strcpy(nomi[i],nomi[i+1]);
  30.                                           strcpy(nomi[i+1],appoggio);
  31.                                           flag=true;
  32.                                           verifica=false;
  33.                     }
  34.                              else if(nomi[i][j]==nomi[i+1][j])
  35.                                   j++;
  36.                                  else
  37.                                           verifica=false;            
  38.                           }
  39.               }
  40.                    k--;          
  41.           }
  42.        
  43.        
  44.    for(i=0;i<m;i++)
  45.           puts(nomi[i]);
  46.  
  47. system("pause");
  48. return 0;
  49. }



Naturalmente io ho implementato l'algoritmo tenendo conto di una matrice già inizializzata con nomi di Città, tu puoi modificare il contenuto della matrice con altri nomi o indirizzi o numeri, oppure chiedere in input.
Insomma basta che siano stringhe.
Una cosa fondamentale è quella di variare le dimensioni "m" ed "n" rispettivamente per il numero delle parole e per la loro lunghezza,lo devi fare dalla istruzione "#define".
Se hai altri problemi o non hai capito qualcosa fammi sapere.
Ciao

Ultima modifica effettuata da Zonzo il 13/05/2008 alle 16:30
PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 17:14
Martedì, 13/05/2008
@Zonzo ... per gli array di char in C puoi usare una funzione di libreria apposita, per esempio la strcmp

Ultima modifica effettuata da gantonio il 15/05/2008 alle 7:46
PM Quote
Avatar
Zonzo (Ex-Member)
Rookie


Messaggi: 34
Iscritto: 21/04/2008

Segnala al moderatore
Postato alle 0:23
Giovedì, 15/05/2008
Testo quotato

Postato originariamente da gantonio:

@Zonzo ... gli array di char in C non si confrontano in quel modo ... altrimenti confronti i puntatori e non e' la stessa cosa.

Devi usare una funzione di libreria apposita, per esempio la strcmp



Comunque ai fini pratici non cambia nulla, ho solo usato un confronto invece di un'altro, non so che male ci sia, è comunque implementato in C; non esite la regola che i "char" vadano per forza comparati con la strcmp.
Apparte questo, nel problema vanno confrontati solo i singoli caratteri di ciascuna parola, e strcmp serve solo per comparare due stringhe.
Esempio, se voglio sapere tra la parola "Roma" e "Milano" quale viene prima in ordine alfabetico, devo comparare solo la "R" di Roma e la "M" di Milano e non le due stringhe intere, e se per caso ci fossero due stringhe come "Milano" e "Modena", va a confrontare la "M" e nota che sia la prima stringa che la seconda iniziano con la "M", quidni passa alla seconda lettera e così via.


P.S. Invece di giudicare i lavori di altre persone, perchè non te ne fai uno tuo, potrebbe anche essere migliore del mio, io ho cercato di fare del mio meglio.
Prima di giudicare, prova anche tu.


Ultima modifica effettuata da Zonzo il 15/05/2008 alle 0:34
PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 7:29
Giovedì, 15/05/2008
Okay ... mi sono espresso male ... ma non c'e' bisogno di prendersela ...

Non c'e' assoluto bisogno della strcmp ma ti voglio solo dire che e' bene usare le funzioni di libreria ... tutto qui.

Del resto hai usato la strcpy per scambiare le stringhe mica hai usato un ciclo con tutti i caratteri ...

Intendevo dire (per chi inizia a programmare ...) che con la strcmp il codice diventa piu' leggibile

Codice sorgente - presumibilmente C++

  1. int main()
  2. {
  3.     int i;
  4.     char appoggio[N];
  5.     char nomi[M][N]={"Milano", "Firenze", "Torino", "Venezia", "Roma"};
  6.     bool flag=true;
  7.      
  8.         while(flag)
  9.         {
  10.                 flag=false;
  11.                 for(i=0; i<M-1; i++)
  12.                         if(strcmp(nomi[i],nomi[i+1])>0)      
  13.                         {
  14.                                 strcpy(appoggio,nomi[i]);
  15.                                 strcpy(nomi[i],nomi[i+1]);
  16.                                 strcpy(nomi[i+1],appoggio);
  17.                                 flag=true;
  18.                         }
  19.         }
  20.      
  21.      
  22.    for(i=0;i<M;i++)
  23.         puts(nomi[i]);
  24.  
  25.         system("pause");
  26.         return 0;
  27. }


Ultima modifica effettuata da gantonio il 15/05/2008 alle 7:53
PM Quote
Avatar
Zonzo (Ex-Member)
Rookie


Messaggi: 34
Iscritto: 21/04/2008

Segnala al moderatore
Postato alle 21:36
Giovedì, 15/05/2008
Testo quotato

Postato originariamente da gantonio:

Okay ... mi sono espresso male ... ma non c'e' bisogno di prendersela ...

Non c'e' assoluto bisogno della strcmp ma ti voglio solo dire che e' bene usare le funzioni di libreria ... tutto qui.

Del resto hai usato la strcpy per scambiare le stringhe mica hai usato un ciclo con tutti i caratteri ...

Intendevo dire (per chi inizia a programmare ...) che con la strcmp il codice diventa piu' leggibile

Codice sorgente - presumibilmente C++

  1. int main()
  2. {
  3.     int i;
  4.     char appoggio[N];
  5.     char nomi[M][N]={"Milano", "Firenze", "Torino", "Venezia", "Roma"};
  6.     bool flag=true;
  7.      
  8.         while(flag)
  9.         {
  10.                 flag=false;
  11.                 for(i=0; i<M-1; i++)
  12.                         if(strcmp(nomi[i],nomi[i+1])>0)      
  13.                         {
  14.                                 strcpy(appoggio,nomi[i]);
  15.                                 strcpy(nomi[i],nomi[i+1]);
  16.                                 strcpy(nomi[i+1],appoggio);
  17.                                 flag=true;
  18.                         }
  19.         }
  20.      
  21.      
  22.    for(i=0;i<M;i++)
  23.         puts(nomi[i]);
  24.  
  25.         system("pause");
  26.         return 0;
  27. }




Ok, scusami perchè avevo capito male io, comunque è meglio con strcmp.

Ultima modifica effettuata da Zonzo il 15/05/2008 alle 21:36
PM Quote
Avatar
eddiewrc (Member)
Expert


Messaggi: 560
Iscritto: 30/04/2006

Segnala al moderatore
Postato alle 2:34
Domenica, 18/05/2008
secondo me è il caso di prendere in prestito qualche concetto dalla gestione dei database e salvare i dati in un array monodimensionale di strutture.
le strutture ovviamente contengono i dati sensibili che hai scelto e ogni elemento dell'array rappresenta un contatto. poi devi scrivere delle funzioni di ordinamento: una che ordina in base al campo nome, una in base al campo cognome o città, quello che vuoi. il funzionamento è simile a una query!
inoltre dato che un array ha dimensione fondamentalmente fissa e una rubrica telefonica può crescere o decrescere secondo me ti conviene usare le liste per implementare la rubrica: risparmi spazio (occupi solo quello che usi) e la dimensione è dinamica e non fissa.
:k:

PM Quote