Oppure

Loading
25/04/08 12:40
giocala88
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...
aaa
25/04/08 21:00
gantonio
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 ...
aaa
26/04/08 9:47
FHF93
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
aaa
13/05/08 14:25
Zonzo
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.


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

#define m 5      //Numero parole
#define n 15	//Lunghezza parole

int main()

{
    int i,k,j;
    char appoggio[n];
    char nomi[m][n]={"Milano","Firenze","Torino","Venezia","Roma"};
 	bool flag=true,verifica=true;
 	
	  k=m; 	 
 	  while(flag==true && k>1)
 	  { 
		  flag=false;
	      for(i=0,j=0;i<m-1;i++)
		   {
			 verifica=true;						 
			 while(verifica==true)
			  {
   			     if(nomi[i][j]>nomi[i+1][j])	  
			       {
				  	  j=0;
					  strcpy(appoggio,nomi[i]);
				  	  strcpy(nomi[i],nomi[i+1]);
				  	  strcpy(nomi[i+1],appoggio);
				  	  flag=true;
				  	  verifica=false;
      	            }
	  		     else if(nomi[i][j]==nomi[i+1][j])
	   		          j++;
				 else 
				 	  verifica=false;	      
			  }
	      }
		   k--;		  
	  }
 	
 	
   for(i=0;i<m;i++) 
  	  puts(nomi[i]);

system("pause");
return 0;
}


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 13/05/08 14:30
aaa
13/05/08 15:14
gantonio
@Zonzo ... per gli array di char in C puoi usare una funzione di libreria apposita, per esempio la strcmp
Ultima modifica effettuata da gantonio 15/05/08 5:46
aaa
14/05/08 22:23
Zonzo
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 14/05/08 22:34
aaa
15/05/08 5:29
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

int main() 
{ 
    int i; 
    char appoggio[N]; 
    char nomi[M][N]={"Milano", "Firenze", "Torino", "Venezia", "Roma"}; 
    bool flag=true;
     
	while(flag) 
	{ 
		flag=false; 
		for(i=0; i<M-1; i++) 
			if(strcmp(nomi[i],nomi[i+1])>0)       
			{ 
				strcpy(appoggio,nomi[i]); 
				strcpy(nomi[i],nomi[i+1]); 
				strcpy(nomi[i+1],appoggio); 
				flag=true; 
			} 
	} 
     
     
   for(i=0;i<M;i++) 
        puts(nomi[i]); 

	system("pause"); 
	return 0; 
}
Ultima modifica effettuata da gantonio 15/05/08 5:53
aaa
15/05/08 19:36
Zonzo
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

int main() 
{ 
    int i; 
    char appoggio[N]; 
    char nomi[M][N]={"Milano", "Firenze", "Torino", "Venezia", "Roma"}; 
    bool flag=true;
     
	while(flag) 
	{ 
		flag=false; 
		for(i=0; i<M-1; i++) 
			if(strcmp(nomi[i],nomi[i+1])>0)       
			{ 
				strcpy(appoggio,nomi[i]); 
				strcpy(nomi[i],nomi[i+1]); 
				strcpy(nomi[i+1],appoggio); 
				flag=true; 
			} 
	} 
     
     
   for(i=0;i<M;i++) 
        puts(nomi[i]); 

	system("pause"); 
	return 0; 
}


Ok, scusami perchè avevo capito male io, comunque è meglio con strcmp.
Ultima modifica effettuata da Zonzo 15/05/08 19:36
aaa