PDA

View Full Version : [C]Ordinare una matrice


B-jo
25-01-2010, 09:19
Salve a tutti,
Stavo provando una serie di algoritmi inerenti alle matrici e non sono riuscito a ordinare una matrice....o meglio un giorno mi funziona e il giorno dopo vado a riscriverla e non mi funziona più nonostante me la compili mi ordina solo le righe


di seguito vi riporto il codice:
il main
#include "header.h"


int main (){

matrice mat;
int select=0;
int rig=0;
int col=0;

do{
printf("Premere:\n");
printf("1 Per inserire la matrice da tastiera\n");
printf("2 Per salvare la matrice su file da file\n");
printf("3 Per ordinare la matrice\n");
printf("4 Per caricare la matrice da file\n");
printf("5 per stampare la matrice\n");
printf("\nInserire la scelta: ");
scanf("%d",&select);




if(select==1){
do{
printf("\nInserire il numero delle colonne desiderato (Max%d): ",DIM);
scanf("%d",&col);
printf("\nInserire il numero delle colonne desiderato (Max%d): ",DIM);
scanf("%d",&rig);
}while(col<=0 || col>DIM && rig<=0 || rig>DIM);
}




switch (select){
case(1):
leggi_tastiera(mat,rig,col);
break;
case(2):
salva_matrice(mat,rig,col);
break;
case(3):
ordina_matrice(mat,rig,col);
stampa_matrice(mat,rig,col);
break;
case(4):
rig=carica_matrice(mat);
col=rig;
break;
case(5):
stampa_matrice(mat,rig,col);
break;
case(6):
inserisci_valore(mat,&rig,&col);
break;




}


printf("\n\nPer continuare premere 1 altrimenti 0: ");
scanf("%d",&select);


}while(select==1);

system("PAUSE");
return 0;
}



le funzioni
#include "header.h"



void leggi_tastiera(matrice mat,int col,int rig){
register int i,j;

for(i=0;i<rig;i++){
for(j=0;j<col;j++){
printf("\nInserire la stringa nella posizione %d-%d: ",i,j);
scanf("%s",&mat[i][j]);
}
}


}

void salva_matrice(matrice mat,int col,int rig){
FILE*f1;
register int i,j;

f1 = fopen("matrice.txt","w");

if(!f1){
printf("Errore apertura file");
}

for(i=0;i<rig;i++){
for(j=0;j<col;j++){
fprintf(f1,"%s\n",mat[i][j]);
}
}

fclose(f1);

if(fclose(f1)){
printf("File salvato con successo");
}else{
printf("Errore nel salvataggio del file");
}
}

//risolvere funzionamento!!!!!
void ordina_matrice(matrice mat,int col,int rig){
register int i,j,z;

stringa temp;

for(z=0;z<col;z++){
for(i=0;i<rig;i++){

for(j=0;j<col;j++){
if(strlen(mat[i][j-1])>strlen(mat[i][j])){
strcpy(temp,mat[i][j-1]);
strcpy(mat[i][j-1],mat[i][j]);
strcpy(mat[i][j],temp);
}
}
}
}



}

int carica_matrice(matrice mat){
printf("\nCarico una matrice 4X4\n");
register int i,j;
FILE* f1;

f1 = fopen("matrice.txt","r");

for(i=0;i<4;i++){
for(j=0;j<4;j++){
fscanf(f1,"%s",&mat[i][j]);
}
}
if(feof(f1)){
printf("\nIl file e' stato caricato con successo\n");
}else{
printf("\nErrore caricamento file\n");
}
fclose(f1);

return 4;
}

void stampa_matrice(matrice mat,int rig,int col){
printf("\nLa matrice attuale e':\n\n");
register int i,j;
for(i=0;i<rig;i++){
printf("\n");
for(j=0;j<col;j++){
printf("%s ",mat[i][j]);
}
}



}




e l'header

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DIM 10
#define DIM1 10
#define MAX 100


typedef char stringa[MAX];
typedef stringa matrice[DIM][DIM1];

//int leggi_file(matrice mat,int *col,int *rig);

void leggi_tastiera(matrice mat,int col,int rig);
void salva_matrice(matrice mat,int col,int rig);
void ordina_matrice(matrice mat,int col,int rig);
int carica_matrice(matrice mat);
void stampa_matrice(matrice mat,int rig,int col);
int inserisci_valore(matrice mat,int *rig,int *col);



vi ringrazio in anticipo
un saluto a tutti

B-jo
25-01-2010, 12:23
Vorrei aggiungere delle mie supposizioni che ho fatto:
1.L'errore sta effettivamente nella funzione ordina_matrice e non me ne accorgo...
2.Puo essere che il problema sia scaturito dal while che al termine di un ciclo mi stravolge la matrice(Anche se ho provato ad avviare le funzioni una dopo l'altra ma nulla da fare)
3.Nel verificare qualche errore ho provato anche ad immettere la matrice da tastiera e non caricarla da file
4.La cosa che mi da i nervi è che l'altro ieri avevo fatto un programmino di prova con questo algoritmo e funzionava....perchè adesso no?ho provato anche a copiare ed incollare il codice ma nulla.... :dhò:

B-jo
25-01-2010, 16:46
up

cionci
25-01-2010, 19:48
Prima di tutto:

scanf("%s", &mat[i][j]);

mat[i][j] è un char [MAX], quindi non bisogna usare la '&' per leggere con scanf.
Prova così.

B-jo
25-01-2010, 22:30
ho provato ma nulla da fare....grazie cmq per la dritta è un errore pesantuccio quello che ho fatto...