PDA

View Full Version : [c] ordinamento di una matrice di struct


spaistik
24-05-2010, 12:48
raga ho dei problemi ad ordinare questa matrice di struct, se fosse un'array magari ci riuscirei ma con una matrice non ci riesco, cosa cambia? :help:
vi posto il codice:



#include <stdlib.h>
#include <stdio.h>
#include <time.h>
struct Casa{
char nome[15];
char cognome[15];
int num_civ;
int posta;
int num_str;};
typedef struct Casa casa;
casa pop(casa ab[][10],int,int,int[]);
void ord_sel_max(casa ab[][10],int,int);
void max_val_ind (casa[][10], int n, int m,int *, int *);

void scambiare_c(casa *,casa *);
int main()
{int i,j,n,m,cnt[10];
casa ab[10][10];
srand(time(NULL));
printf("inserisci il numero di strade: ");
scanf("\n%d",&n);
printf("inserisci il numero di case per strada: ");
scanf("\n%d",&m);
ab[n][m];
pop(ab,n,m,cnt);
ord_sel_max(ab,n,m);
}
casa pop(casa ab[][10],int n,int m,int cnt[10])
{int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++){
printf("Inserisci il Cognome del proprietario della %d^ abitazione %d strada: ",j+1,i+1);
scanf("\n%s",ab[i][j].cognome);
printf("Inserisci il Nome del proprietario della %d^ abitazione %d strada: ",j+1,i+1);
scanf("\n%s",ab[i][j].nome);
ab[i][j].num_civ=j+1;
ab[i][j].num_str=i+1;}}
for(i=0;i<n;i++){
for(j=0;j<m;j++){
ab[i][j].posta=rand()%11;}}
}
void ord_sel_max (casa ab[][10],int n,int m)

{

int i,j, indiceN_max,indiceM_max;

int max_ab;



for(i=0;i<n-1;i++)
for(j=0;j<m-1;j++)

{

max_val_ind(ab,n-i, m-j,&max_ab, &indiceN_max);

scambiare_c(&ab[i][j], &ab[indiceN_max+i][indiceM_max+j]);

}
}
void max_val_ind (casa ab[][10], int n, int m,int *max_array, int *i_max)

{

int i,j;



*max_array = ab[0][0].posta;

*i_max = 0;

for(i=1;i<n;i++)

for(j=1;j<m;j++)

if( *max_array < ab[i][j].posta)

{

*max_array = ab[i][j].posta;

*i_max =i;

}

}



void scambiare_c(casa *c1,casa *c2)
{

char temp_nome[15];

char temp_cognome[15];

int temp_num_civ;

int temp_posta;
int temp_num_str;


temp_nome= c1->nome;

temp_cognome=c1->cognome;

temp_num_civ= c1->num_civ;

temp_posta=c1->posta;
temp_num_str=c1->num_str;



c1->nome = c2->nome;

c1->cognome = c2->cognome;

c1->num_civ = c2->num_civ;

c1->posta = c2->posta;
c1->num_str = c2->num_str;



c2->nome = temp_nome;

c2->cognome = temp_cognome;

c2->num_civ = temp_num_civ;

c2->posta = temp_posta;
c2->num_str = temp_num_str;

}

gugoXX
24-05-2010, 15:27
devi definire cosa vuol dire "Ordinare" la tua matrice.

Per un array (una retta) e' implicito. Per una matrice non lo e'.

spaistik
24-05-2010, 15:48
Praticamente io dovrei ordinare la matrice in base al campo 'posta' cosi da poter visualizzare poi chi ha pił 'posta' fino a chi ne ha di meno...!

vi prego aiutatemi!!!!

gugoXX
24-05-2010, 16:16
Cerco di spiegarmi altrimenti.
Questa e' una matrice:


1 5 7 4 7 3
2 6 3 6 1 0
1 5 8 3 6 3


Cosa vorrebbe dire per te, ordinarla?

spaistik
24-05-2010, 16:37
Cerco di spiegarmi altrimenti.
Questa e' una matrice:


1 5 7 4 7 3
2 6 3 6 1 0
1 5 8 3 6 3


Cosa vorrebbe dire per te, ordinarla?

Ecco, forse non mi sono spiegato bene e me ne scuso;

praticamente mettiamo che la tua matrice sia il mio campo 'posta' e dove le righe sono le strade e le colonne sono le case, quindi abbiamo una matrice 3x6 con tre strade contenenti ognuna sei case, io devo visualizzare questa matrice in base alle strade che hanno ricevuto pił posta, quindi devo sommare gli elementi di ogni riga cosi che poi so quali sono le strade con pił posta e le visualizzo in maniera decrescente....ma non riesco a farlo!!!!!!!!!

gugoXX
24-05-2010, 16:52
Io creerei una nuova struttura, con 2 soli campi:
identificativo della strada
e
posta ricevuta.

Costruirei quindi un Array di tali strutture, popolandolo a partire dalla tua matrice originale.
A questo punto e' sufficiente ordinare l'array ottenuto secondo il campo "Posta ricevuta", e una volta ordinato potrai scorrerlo ricavando l'ordine delle strade ricercato.

spaistik
24-05-2010, 17:09
ok grazie, ci provo e ti faccio sapere!!!!