Matrici:massimo elemento e riga corrispondente

di il
4 risposte

Matrici:massimo elemento e riga corrispondente

Salve a tutti, di seguito vi posto la traccia dell'esercizio:
Traccia.JPG
Traccia.JPG

Il punto (a) è svolto; nel punto (b) funziona l'algoritmo di ricerca del massimo e stampa degli elementi della riga che contengono il massimo tranne in un caso.
In pratica se l'elemento più grande della matrice è il primo, il programma non lo calcola. Ho fatto un po' di tracing ma non trovo l'errore, allora ho pensato che il problema sarebbe potuto saltare all'occhio a chi non lo aveva scritto il programma.
lo svolgimento vero e proprio del punto (b) parte dalle linee di codice:
fflush(stdin);
lettura_mat(&m,&r1,&c1);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_DIM 10

typedef int matrice[MAX_DIM][MAX_DIM];

void lettura_mat(matrice *m, int *r, int *c){
	int i,j;
	printf("Inserire il numero di righe: ");
	scanf("%d",r);
	printf("Inserire il numero di colonne: ");
	scanf("%d",c);
	for(i=0;i<*r;i++){
		printf("\n Riga %d \n",i+1);
		for(j=0;j<*c;j++){
			//printf("\n");
			scanf("%d",&((*m)[i][j]));
		}
	}
}

void stampa_mat(matrice m, int r, int c){
	int i,j;
	for(i=0;i<r;i++){
		printf("\n");
		for(j=0;j<c;j++){
			printf(" %d ",m[i][j]);
		}
	}
	printf("\n");
}

int confronto(int n,int m){
	int max;
	if(n>m)
		max=n;
	else
		max=m;
	return max;
}

int main(){
	int r1,c1,r2,c2,i,j,k,st,maxt,maxr,it; //st= somma temporanea 
	matrice m1,m2,s,p,m;
	lettura_mat(&m1,&r1,&c1);
	lettura_mat(&m2,&r2,&c2);
	
	printf("\n La somma delle due matrici e':");
	if(r1==r2 && c1==c2){
		for(i=0;i<r1;i++){
			for(j=0;j<c1;j++){
				s[i][j]=m1[i][j]+m2[i][j];
			}
		}
		stampa_mat(s,r1,c1);
	}else printf("\nNon e' possibile effettuare la somma di due matrici di dimensioni diverse");
	
	printf("\n il prodotto delle due matrici e'");
	if(c1==r2){
		for(i=0;i<r1;i++){
			for(k=0;k<c2;k++){
				st=0;
				for(j=0;j<r2;j++){
					st=st+(m1[i][j]*m2[j][k]);
				}
				p[i][k]=st;
			}
		}
		stampa_mat(p,r1,c2);
	}else printf("\nNon e' possibile effettuare il prodotto righe per colonne:");
	//printf("test) %d %d\n",confronto(2,3),confronto(7,5));
	fflush(stdin);
	lettura_mat(&m,&r1,&c1);
	maxt=0;
	it=0;
	maxr=m[0][0];
	for(i=0;i<r1;i++){
		j=0;
		//printf("\ntest) i=%d maxr=%d maxt=%d it=%d\n",i,maxr,maxt,it);
			while(j<(c1-1)){
				maxr=confronto(m[i][j+1],m[i][j]);
				j++;
			}
		if(maxt!=confronto(maxt,maxr))
			it=i;
		maxt=confronto(maxt,maxr);
	}
	printf("\nLa riga con l'elemento maggiore della matrice e'(se il valore massimo si trovi in piu' righe verra' stampata a video la prima):\n");
	for(j=0;j<c1;j++){
		printf("%d ",m[it][j]);
	}
	
	system("PAUSE");
	return 0;
}
Esempio emblematico:
Risultato.JPG
Risultato.JPG

4 Risposte

  • Re: Matrici:massimo elemento e riga corrispondente

    Prima nota:

    Dallo standard C http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

    Capitolo 7.21.5.2

    The fflush function, fflush works only with output/update stream, not input stream.

    If stream points to an output stream or an update stream in which the most recent operation was not input, the fflush function causes any unwritten data for that stream to be delivered to the host environment to be written to the file; otherwise, the behavior is undefined.


    Che in poche parole vuol dire che non puoi "flushare" uno stream di input.
  • Re: Matrici:massimo elemento e riga corrispondente

    Altra cosda che salta subito all'occhio è che
    maxr = confronto(m[i][j + 1], m[i][j]);
    accede alla riga eccedendo di un carattere nell'ultima iterazione (accessing array out of bounds)

    Nell'ultimo loop
    j=max_colonna (c1 - 1) 
    e quindi
     [j + 1]
    andrà a puntare un elemento alla colonna c1 che è 1 elemento oltre quelli disponibili.

    Dal punto di vista dell'allocazione della matrice per le prime righe non fa altro che accedere alla prima colonna della riga successiva, ma per l'ultima riga accede proprio fuori dalla memoria dedicata alla matrice!
  • Re: Matrici:massimo elemento e riga corrispondente

    Cercando di correggere il tuo ciclo finale di ricerca della riga con il numero massimo potresti semplicemente fare:
    	
    	// variabile che contiene il numero max trovato
    	maxr = m[0][0];
    	// variabile che contiene temporaneamente il risulato del confronto
    	int max_temp = maxr;
    
    	for (i=0; i<r1; i++)
    	{
    		for (j=0; j<c1; j++)
    		{
    			// Assegno temporaneamente il massimo fra il massimo attualemente
    			// trovato e il valore della cella della matrice che sto scorrendo
    			max_temp = confronto ( maxr, m[i][j]);
    
    			// se la cella corrente ha un valore maggiore rispetto a quello trovato fino a ora
    			if (maxr < max_temp)
    			{
    				// salvo il valore della riga che contiene il nuovo max
    				it=i;
    				// salvo il valore max
    				maxr= max_temp;
    			}
    		}
    	}
    
    Che potrebbe essere semplificata senza utilizzare la funzione (che non è necessaria...)
    
    	// variabile che contiene il numero max trovato
    	maxr = m[0][0];
    	
    	for (i=0; i<r1; i++)
    	{
    		for (j=0; j<c1; j++)
    		{
    			// se la cella corrente ha un valore maggiore rispetto a quello trovato fino a ora
    			if (maxr < m[i][j])
    			{
    				// salvo il valore della riga che contiene il nuovo max
    				it=i;
    				// salvo il valore max
    				maxr= m[i][j];
    			}
    		}
    	}
    
  • Re: Matrici:massimo elemento e riga corrispondente

    Ho eliminato fflush che in effetti non ha un senso messo lì.
    L'algoritmo da te proposto funziona. Grazie mille per l'aiuto!
Devi accedere o registrarti per scrivere nel forum
4 risposte