Esercizio C...perché non funziona!?

di il
8 risposte

Esercizio C...perché non funziona!?

https://scontent-a-fra.xx.fbcdn.net/hphotos-xpf1/v/t1.0-9/10464114_658408544233757_6906904685170336481_n.jpg?oh=d8effada796cb06dbfddd0ffb1b6b301&oe=54230B51


Salve praticamente non so per quale motivo non riesce a trovare la differenza minima fra le massime relative ad ogni colonna...posto sotto il codice per chiedervi in quale parte della compilazione ho commesso errori...

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

void CreaMat (int A[50][50], int n, int m);
void PrintMat(int A[50][50], int n, int m);
int FindMinMax(int A[50][50],int n, int m);
void PrintCol(int A[50][50], int n, int m, int maxCol);


int main(){
	int n,m,maxCol;
	int A[50][50];
	printf("Inserisci il numero di righe\n");
	scanf("%d",&n);
	printf("Inserisci il numero di colonne\n");
	scanf("%d",&m);
	CreaMat(A,m,n);
	PrintMat(A,m,n);
	maxCol=FindMinMax(A,n,m);
	printf("\nLa differenza minore fra le maggiori si trova nella colonna N.%d:\n",maxCol);
	PrintCol(A,m,n,maxCol);
	return 0;
}


void CreaMat (int A[50][50], int n, int m){
	int i,j;
	srand(time(NULL));
	for(j=0;j<m;j++){
		for(i=0;i<n;i++){
			A[i][j]=rand()%9+1;
		}
	}
}


void PrintMat(int A[50][50], int n, int m){
	int i,j;
	for(j=0;j<m;j++){
		for(i=0;i<n;i++){
			printf("%d \t",A[i][j]);
		}
		printf("\n");
	}
}



int FindMinMax(int A[50][50],int n, int m){
	int i,j,minGlob,minGlobInd,maxCol=0;
	for(j=0;j<m;j++){
		for(i=0;i<n-1;i++){
			if(abs(A[i][j]-A[i+1][j])>maxCol){ 
				maxCol=abs(A[i][j]-A[i+1][j]); 
			}
		}
		if(j==0){ 				
			minGlob=maxCol;		
			minGlobInd=j;
			maxCol = 0;		
		}else if(maxCol<minGlob){	
				minGlob=maxCol;	
				minGlobInd=j;
				maxCol = 0;
			
		}
	}
	return minGlobInd;	
}



void PrintCol(int A[50][50], int n, int m, int maxCol){
	int i;
			for(i=0;i<n;i++){
				printf("\n%d\n", A[maxCol][i]);}
			}
			

8 Risposte

  • Re: Esercizio C...perché non funziona!?

    Inserisci i tag CODE per mostrare il codice ...

    Perché parli di errori di compilazione ? Hai dei messaggi d'errore in compilazione ?
  • Re: Esercizio C...perché non funziona!?

    Nessun errore di compilazione, ma semplicemente il programma non funziona " a dovere", nel senso che non sempre restituisce il valore esatto
  • Re: Esercizio C...perché non funziona!?

    In effetti esiste un bel po' di confusione nelle varie funzioni fra "riga" e "colonna".

    Quando crei la matrice usi come primo indice le righe e come secondo le colonne.
    Ma nella PrintMat visualizzi in maniera sbagliata ...

    Se n e m ti confondono, utilizza r e c (e solo alla fine cambiale con n e m per il compito ...).
  • Re: Esercizio C...perché non funziona!?

    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    
    void CreaMat (int A[50][50], int n, int m);
    void PrintMat(int A[50][50], int n, int m);
    void PrintCol(int A[50][50], int n, int m, int maxCol);
    int FindMinMax(int A[50][50],int n, int m);
    
    
    int main(){
    	int n,m,maxCol;
    	int A[50][50];
    	printf("Inserire righe\n");
    	scanf("%d",&n);
    	printf("Inserire colonne\n");
    	scanf("%d",&m);
    	CreaMat(A,n,m);
    	PrintMat(A,n,m);
    	maxCol=FindMinMax(A,n,m);
    	printf("\nLa colonna con la differenza minore fra le maggiori e' la N.%d:\n",maxCol);
    	PrintCol(A,n,m,maxCol);
    	return 0;
    }
    
    
    
    
    void CreaMat (int A[50][50], int n, int m){
    
    	int i,j;
    	srand(time(NULL));
    	for(i=0;i<n;i++){
    		for(j=0;j<m;j++){
    			A[i][j]=rand()%10;
    		}
    	}
    }
    
    
    void PrintMat(int A[50][50], int n, int m){
    	int i,j;
    	for(i=0;i<n;i++){
    		for(j=0;j<m;j++){
    			printf("%d \t",A[i][j]);
    		}
    		printf("\n");
    	}
    }
    
    
    void PrintCol(int A[50][50], int n, int m, int maxCol){
    	int i,j;
    	for(i=0;i<n;i++){
    		for(j=0;j<m;j++){
    			if(j==maxCol){
    				printf("%d \t",A[i][j]);
    			}
    		}
    	}
    }
    
    
    int FindMinMax(int A[50][50],int n, int m){
    	int i,j,minGlob,minGlobInx,maxCol=0;
    	for(j=0;j<m;j++){
    		for(i=0;i<n-1;i++){
    			if(abs(A[i][j]-A[i+1][j])>maxCol){ 
    				maxCol=abs(A[i][j]-A[i+1][j]);
    			}
    		}
    		if(j==0){ 				
    			minGlob=maxCol;		
    			minGlobInx=j;
    			maxCol = 0;	
    		}else{
    			if(minGlob>maxCol){	
    				minGlob=maxCol;
    				minGlobInx=j;
    				maxCol = 0;
    			}
    		}
    	}
    	return minGlobInx;	
    }
    
  • Re: Esercizio C...perché non funziona!?

    Scusa ma vedo ancora problemi ... devi essere coerente ... basta questo per far funzionare il programma ...

    Nei prototipi scrivi

    void CreaMat (int A[50][50], int n, int m);
    void PrintMat(int A[50][50], int n, int m);

    indicando che passi n e m ma nelle chiamate scrivi

    CreaMat(A,m,n);
    PrintMat(A,m,n);

    passando m e n invertiti ...
  • Re: Esercizio C...perché non funziona!?

    Dacci un'occhiata ora
  • Re: Esercizio C...perché non funziona!?

    Un paio di modifiche ...

    Una importante ... la riga
    
    maxCol = 0;   
    
    va messa fra le due for e non dove l'hai messa.

    La seconda, anche se non fondamentale, la funzione PrintCol può essere semplicemente così
    
    void PrintCol(int A[50][50], int n, int maxCol)
    {
    	int i;
    	for(i=0; i<n; i++)
    		printf("%d \t", A[i][maxCol]);
    }
    
    dato che conosci la colonna.
  • Re: Esercizio C...perché non funziona!?

    Prima di tutto grazie mille per l'aiuto!

    Effettivamente mettendo il maxCol = 0 fra i due for posso levarlo sia dagli if che da dopo le dichiarazioni di variabili interne alla funzione
Devi accedere o registrarti per scrivere nel forum
8 risposte