URGENTISSIMO!Problema con matrice sparsa

di il
23 risposte

URGENTISSIMO!Problema con matrice sparsa

Questa è la traccia dell'esercizio:
Scrivere funzioni di lettura e stampa da file di una matrice sparsa;per la
stampa utilizzare una ricerca:se esiste un elemento nelle coordinate,stampalo,
altrimenti stampa 0.

ESER.H

#ifndef ESER_H
#define ESER_H
#include <cstdlib>
#include <iostream>
#include <fstream>
#define N 100

using namespace std;

typedef struct matrice{
int elemento;
int riga;
int colonna;
};

typedef matrice vett[N];
typedef matrice s[N];

void leggiFile(vett v,int &r);
void ordina(vett v,int r);
void stampa(vett v,int r);

#endif

ESER.CPP

#include "eser.h"

void leggiFile(vett v,int &r){
fstream f1("leggi.txt",ios::in);
r=0;
int i=1;
if(!f1)cout<<"FILE NON APERTO CORRETTAMENTE!\n";
else cout<<"FILE APERTO CORRETTAMENTE!\n";
while(!f1.eof()){
f1>>v.elemento;
f1>>v.riga;
f1>>v.colonna;
i++;
r++;
}
f1.close();
}

void ordina(vett v,int r){
int i,j;
matrice s;
for(i=1;i<=r;i++){
for(j=i+1;j<=r;j++){
if(v.riga>v[j].riga){
s=v;
v=v[j];
v[j]=s;
}
if(v.riga==v[j].riga&&v.colonna>v[j].colonna){
s=v;
v=v[j];
v[j]=s;
}
}
}
cout<<"QUESTO E' IL CONTENUTO ORDINATO DEL FILE:\n";
for(i=1;i<=r;i++){
cout<<"Elemento:"<<v[i].elemento<<" ";
cout<<"Riga: ["<<v[i].riga<<"] ";
cout<<"Colonna : ["<<v[i].colonna<<"] ";
cout<<"\n";
}
cout<<"\n\n";
}

void stampa(vett v,int r){
cout<<"VEDIAMO GLI ELEMENTI PRESENTI NELLE VARIE COORDINATE:\n";
int i,j;
for(i=1;i<=r;i++){
for(j=1;j<=r;j++){
if(v[i].riga==i&&v[i].colonna==j)cout<<"Elemento:"<<v[i].elemento<<" ";
else cout<<"Elemento:"<<0<<" ";
cout<<"Riga: ["<<i<<"] ";
cout<<"Colonna: ["<<j<<"] ";
cout<<"\n";
}
}
}

MAIN

#include "eser.h"

int main(int argc, char *argv[])
{
vett v;
int r;
leggiFile(v,r);
ordina(v,r);
stampa(v,r);
system("PAUSE");
return 0;
}

GRAZIE MILLE PER L'AIUTO!!!

23 Risposte

  • Re: URGENTISSIMO!Problema con matrice sparsa

    Ciao,
    ci devi dire che problema hai, altrimenti non possiamo aiutarti. Non si riesce a capire niente se posti un sacco di codice così, senza commentare il tuo problema. Ti conviene riformulare la domanda e postare solo il codice errato o che ti dà problemi.

    Saluti
  • Re: URGENTISSIMO!Problema con matrice sparsa

    ...poi metti il tag code sul codice per renderlo leggibile.

    ~Max~
  • Re: URGENTISSIMO!Problema con matrice sparsa

    Avete ragione...scusate...
    comunque il dev non mi da errori il problema è che leggendo da file non riesco a far comparire gli elementi nelle coordinate indicate sempre nel file...
    il file che ho creato contiene:
    14 \\elemento
    1 \\riga
    2 \\colonna
    14 \\elemento
    3 \\riga
    3 \\colonna
    14 \\elemento
    4 \\riga
    3 \\colonna

    ...e cosi via...volevo capire come posso fare per eseguire quasta parte di programma..."se esiste un elemento nelle coordinate,stampalo,altrimenti stampa 0"
  • Re: URGENTISSIMO!Problema con matrice sparsa

    Se ho ben capito, dovresti iterare per il numero massimo di righe e colonne rilevato nella lettura della matrice.
    Poi, farei una funzioncina di ricerca tipo questa... da richiamare nel giro di stampa
    
    int ricerca (vett v, int n, int riga, int colonna)
    {
      int i,elemento;
      
      elemento=0;
      for(i=1;i<=n;i++)
      {
        if (v[i].riga==riga && v[i].colonna==colonna)
        {
          elemento=v[i].elemento;
          break;
        }
      }
      return elemento;
    }
    
    Saluti,
    Max

    PS Perchè non sfrutti l'array dall'elemento 0?
  • Re: URGENTISSIMO!Problema con matrice sparsa

    Scusa ma non vedo a cosa possa servirmi questa funzione...io ho bisogno di vedere se alla riga x colonna y c'è presente o meno un elemento...nel caso in cui c'è lo stampo altrimenti stampo zero...mi puoi dire come potrebbe servirmi la funzione che hai scritto???
  • Re: URGENTISSIMO!Problema con matrice sparsa

    Si, in effetti quel codice non risolve il tuo problema. Ecco una possibile soluzione:

    1) setti tutti gli elementi del tuo vettore a zero, in questo modo assumi prima di leggere il file che la tua matrice non ha elementi. Dopo l'operazione di lettura verranno sovrascritti nelle posizioni riga e colonna solo i valori presenti nel file.
    
    for (i = 0; i < n; i++){ 
       v[i].elemento = 0;
    }
    
    2) ora basta semplicemente che stampi a video tutti i valori della tua matrice. Nota che senza bisogno di fare nulla hai gia` gli zeri nelle posizioni dove nn sono specificati valori nel tuo file.
    
    for (i = 0; i < n; i++){   
       printf("%d\n", v[i].elemento);
    }
    
    Se hai problemi anche nell'operazione di lettura, fammi sapere che ti posto il codice.

    Saluti.
  • Re: URGENTISSIMO!Problema con matrice sparsa

    La funzione che ho scritto è esattamente simile al tuo pezzo di codice presente nella funzione stampa (lo vedi sotto).
    Se non ti piacciono le funzioni, oppure preferisci fare tutto all'interno della stampa...fai pure, ma la traccia
    diceva di utilizzare una ricerca

    Comunque, il problema principale è il giro che fai nella stampa. E' limitato dal numero di righe lette e non dall'effettivo numero di colonne e righe. In parole povere devi ciclare i per MAX_ROWS e j per MAX_COLS
    
    ...
    for(i=1;i<=r;i++)
    {
      for(j=1;j<=r;j++)
      {
        if(v[i].riga==i&&v[i].colonna==j)cout<<"Elemento:"<<v[i].elemento<<" ";
        else cout<<"Elemento:"<<0<<" ";
        cout <<v[i].elemento<<" ";
        
        cout<<"Riga: ["<<i<<"] ";
        cout<<"Colonna: ["<<j<<"] ";
        cout<<"\n";
      }
    }
    ...
    
    ... sempre se è questo il problema...

    Saluti,
    Max
  • Re: URGENTISSIMO!Problema con matrice sparsa

    No ragazzi scusate forse sono io che nn sono riusito a spiegarmi bene...la lettura da file è fatta bene...ora devo stampare per ogni coordinata(1-1,1-2,1-3...ecc) se è presente o meno un elemento...se l'elemento non è presente stampo zero altrimenti stampo l'elemento...visto che non riesco a farlo,potete postarmi il codice della ricerca e della successiva stampa a video di come lo fareste voi???

    Il mio risultato finale dovrà essere:
    [1][1] 15
    [1][2] 0
    [1][3] 14
    [2][1] 0
    [2][2] 0

    ...e cosi via...

    Vi ringrazio comunque lo stesso per l'interesse!!!
  • Re: URGENTISSIMO!Problema con matrice sparsa

    Già, già... avevo capito bene

    ~Max~
  • Re: URGENTISSIMO!Problema con matrice sparsa

    Ok, allora e` esattamente il codice che ti ho postato che risolve il tuo problema. Usa quello e devi solo aggiungere alla printf i paramentri per stampare la riga e la colonna. Mi raccomando, la matrice la devi azzerare come ti ho detto prima di leggere il file per inserire i valori.
  • Re: URGENTISSIMO!Problema con matrice sparsa

    @Intel
    Non è questione di azzerare. La sua matrice è di strutture!
    Equivarrebbe a inserire tutti gli elementi a zero per tutte le coordinate riga/colonna...


    ~Max~
  • Re: URGENTISSIMO!Problema con matrice sparsa

    Che vuol dire devi ciclare i per MAX_ROWS e j per MAX_COLS???
  • Re: URGENTISSIMO!Problema con matrice sparsa

    Ahhhh.. ok.. ora ho capito. Ad es. in una matrice 10x10 dove pero` nel file sono presenti solo due elementi, allora il vettore conterra` solo quei due.. giusto??

    Nel codice illustrato da ixamit risparmi sull'allocazione di memoria, ma ci perdi sul tempo computazionale. Se devi progettare un algoritmo efficente che ordina in O(n*m), con n numero di righe e m numero di colonne, puoi intraprendere questa strada:

    1) ti allochi in memoria una matrice M e la setti a zero: M[n][m] = {0};

    2) esegui una sola visita sul tuo vettore V[] e riempi i rispettivi valori di M come segue:
    M[V.riga][V.colonna] = V.elemento;
    per ogni i = 1,..., k con k numero di elementi del vettore.

    3) procedi con la stampa di M.

    Beh, direi che ora hai abbastanza elementi per decidere anche che strada prendere , meglio di cosi`!!
  • Re: URGENTISSIMO!Problema con matrice sparsa

    Scusa intel mi diresti tu come lo risolveresti il mio problema...postandomi il codice??GRAZIE
Devi accedere o registrarti per scrivere nel forum
23 risposte