PDA

Visualizza la versione completa : Programma sul punto di sella di una matrice quadrata


ferdinando994
13-02-2014, 18:04
Salve ragazzi ho la seguente traccia da svolgere, potete aiutarmi??

Sia data una matrice quadrata M di interi positivi memorizzata in un file di testo (Mat.txt), che contiene nella prima riga il riempimento (riemp) e nelle successive gli elementi della matrice (come illustrato negli esempi che seguono). Si ipotizzi che gli elementi della matrice contengano tutti valori diversi.
Il “punto di sella” di una matrice quadrata è definito come l’elemento minimo della riga e massimo della colonna a cui appartiene. Nel caso in cui tutti i valori della matrice sono diversi, il punto di sella, se esiste, è unico.
Si progettino (almeno) tre funzioni:
- leggi_mat, che legge da file il riempimento ed i valori di una matrice quadrata di interi positivi;
- calc_ind_min, che riceve in ingresso un vettore e restituisce come parametro di uscita l'indice del valore minimo in esso contenuto;
- trova_punto_sella, che riceve in ingresso una matrice quadrata M ed il suo riempimento e, sfruttando (almeno) la funzione calc_ind_min, restituisce come parametro d'uscita una struttura contenente due campi: un campo booleano (sella) che indica se esiste o meno il punto di sella ed un campo di tipo intero (val) che rappresenta il valore del punto di sella. Nel caso in cui il punto di sella non esiste (e quindi sella è uguale a false) il valore val sarà indefinito. La funzione trova_punto_sella può anche utilizzarne altre, opportunamente definite;
e si scriva un programma che, utilizzando queste funzioni, legga M da file, verifichi se esista o meno il punto di sella e ne stampi il valore in caso affermativo, o un opportuno messaggio nel caso in cui il punto di sella non esiste (vedi esempi - nel primo il valore del punto di sella è riportato in grassetto).

Il programma dovrà essere suddiviso in moduli, uno contenente prototipi e dichiarazioni, uno contenente (almeno) le funzioni leggi_mat, calc_ind_min, trova_punto_sella ed un terzo contenente il main.

Esempi
INPUT:
Mat.txt
4
2 17 19 22
3 20 7 9
25 23 32 40
13 21 27 39

OUTPUT:
Punto di sella: 23


INPUT:
Mat.txt
4
1 6 6 4
7 18 4 2
1 2 13 7
12 4 3 7

OUTPUT:
La matrice non ha un punto di sella

oregon
13-02-2014, 18:23
Cosa hai fatto fino ad ora? Errori? Problemi sul codice?

ferdinando994
13-02-2014, 20:12
Ho fatto questo ma con scarsi risulati:

main.cpp



#include <cstdlib>
#include <iostream>
#include "lib.h"
using namespace std;

int main(){
matrice m;
int riemp, ind_min, ind_max;
sella s;


leggi_mat (m, riemp, "mat.txt");
stampa_mat (m, riemp);
calcola_ind_min (m, riemp);
calcola_ind_max (m, riemp);
trovasella (m, riemp, ind_min, ind_max, s);





system("PAUSE");
return EXIT_SUCCESS;
}


lib.cpp

#include <iostream>
#include <cstdlib>
#include "lib.h"
using namespace std;


void leggi_mat ( matrice m, int & riemp, const char* filename){
int i, j;
FILE* fp;
fp= fopen (filename, "r");
if (!fp){
cout << " il file" <<filename <<" non e' stato trovato, impossibile proseguire l'elaborazione.";
system ("pause");
exit (1);
}
fscanf (fp, "%d", &riemp);
for (i=0; i<riemp; i++)
for (j=0; j<riemp; j++)
fscanf (fp, "%d", & m[i][j]);

fclose (fp);
}


void stampa_mat (const matrice m, int riemp){
int i, j;
for (i=0; i<riemp; i++){
cout<< "\n";
for (j=0; j<riemp; j++)
cout << m[i][j] <<" ";
}
}



int calcola_ind_min ( const matrice m, int riemp) {
int i, ind_min=0;
int min_riga = m[riemp][i];

for (i=0; i<riemp; i++)
if( m[riemp][i] < min){
min_riga= m[riemp][i];
ind_min= i;
}

return ind_min;
}

int calcola_ind_max (const matrice m, int riemp){
int j, ind_max=0;
int max_col = m[j][riemp];

for (j=0; j<riemp; j++)
if (m[j][riemp]> max_col){
max_col= m[j][riemp];
ind_max= i;
}
return ind_max;
}



void trovasella (const matrice, int riemp, int ind_min, int ind_max, sella s){

bool puntosella= true;

while (! s.puntosella ){
for (i=0; i<riemp; i++)
for (j=0; i<riemp; j++)
if ( m [ ind_min][riemp] == m[riemp][ind_max]){
s.puntosella=true;
i++;
}
}
if (s.puntosella=true){
s.val= m[ind_min][ind_max];
cout <<"\nIl valore di sella e' : " << s.val;
}
else cout <<"\n Il punto di sella non esiste";

}


lib.h

const int MAX_DIM = 30;
typedef int matrice [MAX_DIM][MAX_DIM];

struct dati {
bool puntosella;
int val;
};
typedef dati sella [MAX_DIM];

void leggi_mat (matrice, int &, const char*);
void stampa_mat (const matrice, int);
int calcola_ind_min ( const matrice, int);
int calcola_ind_max ( const matrice, int);
void trovasella (const matrice, int, int, int, sella);

Loading