PDA

View Full Version : Aiuto urgente programma C!!!


Toni85
05-09-2005, 13:22
Una matrice sparsa è una matrice nella quale la maggior parte degli elementi valgono zero. Una matrice sparsa può essere convenientemente rappresentata utilizzando delle liste (relative alle righe o alle colonne) che riportano i valori non nulli, anziché un array bidimensionale.

Scrivere una libreria ANSI C che esporta le funzioni per la lettura da tastiera di una matrice sparsa, la stampa a video di una matrice sparsa, il calcolo della somma di due matrici sparse, e il calcolo del prodotto di due matrici sparse.

Devo fare sto programma ma non so da dove iniziare, chi mi può aiutare???
Grazie dell'aiuto
Toni

71104
05-09-2005, 13:29
scusa, ma se la matrice inserita dall'utente con la tastiera non è sparsa...?

Toni85
05-09-2005, 13:33
la matrice deve essere sparsa per forza

71104
05-09-2005, 14:09
e se l'utente non ne scrive una sparsa che fai, lo ammazzi? :D

Fenomeno85
05-09-2005, 15:48
e se l'utente non ne scrive una sparsa che fai, lo ammazzi? :D

ogni tanto in modo random ci ficchi qualche zero :asd:

~§~ Sempre E Solo Lei ~§~

cionci
05-09-2005, 16:03
e se l'utente non ne scrive una sparsa che fai, lo ammazzi? :D
Se l'utente vuole scrivere un migliaio di input buon per lui...

Per prendere in input una matrice sparsa basta chiedere le coordinate di ogni elemento diverso da zero ed il rispettivo valore ;)
Nella lista memorizzerai le coordinate e il valore...

Somma e prodotto sono banali... Ti do un suggerimento per la somma, che è la più facile (così il prodotto te lo studi da solo) : A + B = C

C è formata dall'unione delle liste di A e di B se non hanno elementi con le stesse coordinate... In tal caso il nuovo elemento di C avrà valore pari alla somma dei rispettivi elementi di A e di B a quelle coordinate...

Toni85
06-09-2005, 10:40
Grazie dell 'aiuto, il mio problema è che non ho idea di come deve essere scritta sta libreria che esporta le funzioni per la lettura di codesta matrice sparsa.
Per la somma e il prodotto non c'e problema

cionci
06-09-2005, 10:48
Un libreria suppongo che sia intesa come un .h e un .cpp...

Toni85
06-09-2005, 12:33
#include <stdio.h>
#include <stdlib.h>

/*prototipo della funzione MATRICE_SPARSA */
int MATRICE_SPARSA(int m, int p, int *ALFA, int *V1, int *V2, int *V3);

main( )
{
/*dichiarazione di variabili */
int m, p, k, j, num;
int Alfa [10] [10] , V1[15], V2[15], V3[16];

printf("Memorizzazione di una matrice sparsa \n");
printf("Digitare la dimensione della matrice (Righe Colonne)\n");
scanf("%d %d", &m, &p);
printf("Digitare i %d elementi della matrice \n");


printf("Digitare i %d elementi della matrice \n");

for (k = 0; k < m; k++)
{
for (j = 0; j < p; j++)
{
scanf("%d", &Alfa[k][j]);
}
}

/*chiamata della funzione MATRICE_SPARSA */
num = MATRICE_SPARSA(m, p,Alfa,V1,V2,V3);

if (num == 0)
printf("La matrice è nulla!\n");
else
{
printf("\n1°vettore: \n");
for (k = 0; k < V3[num-1]; k++)
printf("%d ", V1[k]);

printf("\n2°vettore: \n");
for (k = 0; k< V3[num -1]; k++)
printf("%d ", V2[k]);

printf("\n3°vettore: \n");
for (k = 0; k <= num; k++)
printf("%d ", V3[k]);
}
}

/*--------------------------------------*/
/* Inizio funzione della matrice sparsa */
/*--------------------------------------*/
int MATRICE_SPARSA (int m, int p, int *Alfa, int *V1, int *V2, int *V3)
{

typedef enum { true, false } logical;
int Ind, Ind2, e, f;
logical Trovato;

/* "Ind" e "Ind2" sono due contatori che ci servono per riempire i 3 array:
"Ind" viene utilizzato per i primi 2 e ci restituire il numero di elementi
non nulli della matrice, "Ind2" viene utilizzato per il terzo, la cui
dimensione (generalmente minore di quella degli altri 2) deve essere
restituito come valore della funzione. */

Ind = Ind2 = 0;
Trovato = false;

for (e = 0; e < m; e++)
{
for (f = 0; f < p; f++)
{
if (*(Alfa +e*10+f) != 0)
{
*(V1 + Ind) = *(Alfa + e * 10 + f );
*(V2 + Ind) = f + 1;
if (Trovato == false)
{
*(V3 + Ind2) = Ind + 1;
Trovato = true;
Ind2++;
}
Ind++;
}
}

Trovato = false;

}

*(V3 + Ind2) = Ind + 1;
return Ind2;
}

Potrebbe andare bene una roba cosi?????

cionci
06-09-2005, 14:13
No...devi fare 2 file...

sparsa.h

che contiene tutti i prototipi delle funzioni...

sparsa.c

che contiene le implementazioni delle funzioni dichiarate in sparsa.h

Poi ovviamente ti serve un altro file .c in cui metterai il main con le istruzioni per testare la funzionalità delle matrici... Per usare le funzioni di sparse.h in questo file, basta fare #include "sparsa.h"

Ma non dovevi implementarle con le liste ?!?!?!? E poi perchè fai inserire tutti gli elementi della matrice ????

cionci
06-09-2005, 14:28
Tanto epr cominciare... In input devi chiedere la dimensione della matrice, poi il numero di elementi diversi da zero... In base a questi con un solo for prendi in ingresso riga, colonna e valore di ogni elemento...

Quindi ti consiglio di implementare una struct "sparsa":

struct elem
{
int riga;
int colonna;
int valore;
struct elem *next;
};

struct sparsa
{
int righe;
int colonne;
struct elem *lista;
}

Tanto per iniziare ti propogono delle funzioni:

//alloca una struttura "sparsa" e la ritorna al chiamante (riempiendo le dimensioni)
struct sparsa *crea_matrice_sparsa(int righe, int colonne);

//distrugge la matrice sparsa deallocandone tutte le varie componenti,
//alla fine deve andare a mettere NULL in *m
void distruggi_matrice_sparsa(struct sparsa **m);

//alloca e inserisce un elemento nella lista
void inserisci_elemento(struct sparsa *m, int riga, int colonna, int valore);

//input testuale di numero_elementi elementi della matrice
void input(struct sparsa *m, int numero_elementi);

//rende in output la matrice come se fosse non sparsa
void output(struct sparsa *m);

Toni85
07-09-2005, 10:42
Grazie mille dell'aiuto magico cionci ora vedo cosa posso fare

Toni85
07-09-2005, 10:59
Scusa cionci se abuso del tuo tempo, è un mese che provo a fare sto programma e fra pochi giorni lo devo consegnare!!!
Non è che mi scriveresti una bozza te ne sarei grato per sempre!!!

Fenomeno85
07-09-2005, 11:13
Scusa cionci se abuso del tuo tempo, è un mese che provo a fare sto programma e fra pochi giorni lo devo consegnare!!!
Non è che mi scriveresti una bozza te ne sarei grato per sempre!!!

che cosa non capisci scusa? ti ha detto tutto :D ... adesso devi solo realizzare quelle funzioni alcune davvero delle banalità assurde

~§~ Sempre E Solo Lei ~§~

fantoibed
07-09-2005, 11:58
Per il calcolo matriciale, ti consiglio di dare un'occhiata alle librerie blas e lapack. Offrono delle funzioni ad hoc per il trattamento di matrici sparse, sia di tipo generico sia di particolari sottoclassi (come le tridiagonali cicliche o le pentadiagonali cicliche, ecc..) e contengono gli algoritmi che sono lo stato dell'arte in quanto a schemi risolutivi per l'inversione di queste matrici.
Tra l'altro, sui siti di Intel, AMD, IBM, ecc... trovi delle versioni particolari che sfruttano le istruzioni SIMD implementate nei rispettivi processori...

Toni85
07-09-2005, 17:37
Non riesco a realizzare queste funzioni, il mio livello di C non è così alto come il vostro, ormai è tutto il pomeriggio che ci sbatto la testa, forse andrò a vedere l' italia!! Vi prego aiutatemi !!!!

cionci
07-09-2005, 18:14
Per il calcolo matriciale, ti consiglio di dare un'occhiata alle librerie blas e lapack.
Mi sa che lod eve fare per esercizio ;)

Ziosilvio
07-09-2005, 22:39
che cosa non capisci scusa? ti ha detto tutto :D ... adesso devi solo realizzare quelle funzioni alcune davvero delle banalità assurde
Quoto.
Noi ti possiamo aiutare, e come vedi lo facciamo volentieri: però l'esercizio lo devi svolgere tu, o non impari niente.

Toni85
08-09-2005, 10:48
Sta buttando giu il programma fra un po ve lo faccio vedere!!!
Spero che vada bene

Fenomeno85
08-09-2005, 10:52
Sta buttando giu il programma fra un po ve lo faccio vedere!!!
Spero che vada bene

ok aspettiamo ;)


~§~ Sempre E Solo Lei ~§~

Toni85
08-09-2005, 13:35
{
printf("\nInserire la dimensione della matrice m:");
scanf("%d",&n);
m=(int**)calloc(n,sizeof(int*));
for (k=0;k<n;k++)
m[k]=(int*)calloc(n,sizeof(int));
elem=(int*)calloc(n,sizeof(int));
col=(int*)calloc(n,sizeof(int));
nnul=(int*)calloc(n,sizeof(int));
for (h=0;h<n;h++)
for (k=0;k<n;k++)
{
printf("\nInserire l'elemento [%d][%d] di m: ",h+1,k+1);
scanf("%d",(*(m+h)+k));
}
matspar(n,m,elem,col,nnul);
printf("\n Vettore dei coefficienti non nulli: ");
for (k=0;k<nnul[n];k++)
printf("%d",*(elem+k);
printf("\n Vettore degli indici di colonna: ");
for (k=0;k<nnul[n];k++)
printf("%d",*(col+k);
printf("\n Vettore contente il numero di elementi non nulli: ");
for (k=0;k<nnul[n];k++)
printf("%d",*(nnul+k);
printf("\nNumero di elementi non nulli: %d",nnul[n]);
free(m);
free(elem);
free(col);
free(nnul);
}


Potrebbe andare bene???

cionci
08-09-2005, 14:53
Potrebbe andare bene???
Come ti ho già detto non devi allocare l'intera matrice, ma usare una lista e metterci solo gli elementi diversi da zero...
Inolrte non devi chiedere tutti gli elementi in input, ma solo quelli diversi da zero...e per ogni elemento devi chiedere riga, colonna e valore...
Ti ho dato le strutture dati, ma almeno implementale...

Toni85
08-09-2005, 15:12
povero me !!!!!! sono davanti al pc da sta mattina per fare sto codice, mi sa tanto che sto esame non lo do se non riesco a consegnare entro martedì prossimo sto programma al proff.
Vedi che la parte piu difficile dell 'esame e proprio fare il programma invece la prova scritta consiste in delle domande teoriche sul C.
ma senza sto programma non posso dare l'esame

Fenomeno85
08-09-2005, 17:15
povero me !!!!!! sono davanti al pc da sta mattina per fare sto codice, mi sa tanto che sto esame non lo do se non riesco a consegnare entro martedì prossimo sto programma al proff.
Vedi che la parte piu difficile dell 'esame e proprio fare il programma invece la prova scritta consiste in delle domande teoriche sul C.
ma senza sto programma non posso dare l'esame

mi dispiace ... ma che roba di codice è quella :mbe: va be studia e vedrai che al prossimo appello saprai fare il tutto.

~§~ Sempre E Solo Lei ~§~

Toni85
08-09-2005, 18:54
Non mi do per vinto!!!!!!!
Mi metto giù a fare sto programm fino a domattina!!
SONO AMMESSI AIUTINI!!!!!! :cry: :cry: :help: :help: :help:

71104
08-09-2005, 19:08
scusa, a me pare che tu gli aiutini che ti si danno non li leggi neanche... :mbe:

Toni85
08-09-2005, 19:15
Il punto che non so quali funzioni devo mettere nel file.h
Una volta che so queste funzioni per implementarla ci riesco

cionci
08-09-2005, 19:23
Il punto che non so quali funzioni devo mettere nel file.h
Una volta che so queste funzioni per implementarla ci riesco
Te le ho scritte nella pagina precedente...quelle sono le funzioni che devi mettere nel .h (più quelle per somma e prodotto)...

Fenomeno85
08-09-2005, 19:27
Te le ho scritte nella pagina precedente...quelle sono le funzioni che devi mettere nel .h (più quelle per somma e prodotto)...

mi sa che vuole anche il corpo della funzione tra un pò :D ... cmq tony quel programma in massimo due ore lo scrivi (write + debug) sempre se sai quello che stai facendo.

~§~ Sempre E Solo Lei ~§~

Fenomeno85
08-09-2005, 19:51
cionci scusa ma secondo me sparsa è inutile o sbaglio? non basta farsi una bella lista di elem e buona notte?

~§~ Sempre E Solo Lei ~§~

cionci
08-09-2005, 20:41
cionci scusa ma secondo me sparsa è inutile o sbaglio? non basta farsi una bella lista di elem e buona notte?

Diciamo che sparsa serve per avere le dimensioni all'interno della stessa struttura che contiene il puntatore alla lista, in modo da apssare un solo parametro...

Ad esempio la somma o il prodotto in questo modo si fanno passando solo due parametri (i due puntatori a sparsa)...altrimenti per la somma avresti dovuto passare 4 parametri, mentre per il prodotto 6 parametri...

Comunque rientra nell'information hiding...una struttura di quel tipo nasconde all'utente che usa la libreria qualsiasi informazione interna...di conseguenza i controllli di consistenza dei parametri si possono fare all'interno della libreria ;)

Fenomeno85
09-09-2005, 08:51
Diciamo che sparsa serve per avere le dimensioni all'interno della stessa struttura che contiene il puntatore alla lista, in modo da apssare un solo parametro...

Ad esempio la somma o il prodotto in questo modo si fanno passando solo due parametri (i due puntatori a sparsa)...altrimenti per la somma avresti dovuto passare 4 parametri, mentre per il prodotto 6 parametri...

Comunque rientra nell'information hiding...una struttura di quel tipo nasconde all'utente che usa la libreria qualsiasi informazione interna...di conseguenza i controllli di consistenza dei parametri si possono fare all'interno della libreria ;)

capito anche se però abbiamo una ridondanza di dati è quella che non mi piace + di tanto :)

~§~ Sempre E Solo Lei ~§~

cionci
09-09-2005, 09:01
capito anche se però abbiamo una ridondanza di dati è quella che non mi piace + di tanto :)
Ridondanza ???? Assolutamente no... Ci sono solo due interi per ogni matrice che ne indicano le dimensioni...mentre nell'altro caso ne avresti dovuti tenere sempre sotto mano 2 nel programma principale che avresti dovuto passare poi alle funzioni che ne avrebbero usati altri due...

Toni85
09-09-2005, 09:46
Questo pomeriggio vado a casa di un mio amico per fare insieme il programma,
poi ve lo faccio vedere!!!
Speriamo che sia la volta buona!!!
Grazie infinitamente degli aiuti che mi avete date e che spero mi ridiate......
Il mio problema è che io sto facendo ingegneria informatica, devo fare il 2 anno ma ho lasciato dietro quest' esame del C visto che non lo digerisco bene poichè prima non sapevo neanche cos' era; facevo il liceo linguistico!!
Spero che siate ora comprensibili!!
poi il proffessore dell 'università ci faceva fare per esercitazioni programmi molto facili invece per l'esame ci ha dato sto programma che non è per niente facile!!

Fenomeno85
09-09-2005, 13:14
Ridondanza ???? Assolutamente no... Ci sono solo due interi per ogni matrice che ne indicano le dimensioni...mentre nell'altro caso ne avresti dovuti tenere sempre sotto mano 2 nel programma principale che avresti dovuto passare poi alle funzioni che ne avrebbero usati altri due...

sia nella struttura elem che sparsa hai la ripetizione di colonna e riga... potresti anche eliminarlo in uno dei due o no? alla fine potresti anche eliminarli nella lista di elem. Tanto per ogni elemento di sparsa se esiste ha il puntatore all'elemento.

~§~ Sempre E Solo Lei ~§~

cionci
09-09-2005, 13:19
sia nella struttura elem che sparsa hai la ripetizione di colonna e riga... potresti anche eliminarlo in uno dei due o no? alla fine potresti anche eliminarli nella lista di elem. Tanto per ogni elemento di sparsa se esiste ha il puntatore all'elemento.
Allora mi sa che non hai capito nemmeno te :D

Nella struttura elem ci vanno riga, colonna (la posizione all'interno della matrice) e valore dell'elemento...
In sparsa ci vanno il numero di righe e di colonne dell'intera matrice !!!

Fenomeno85
09-09-2005, 13:23
Allora mi sa che non hai capito nemmeno te :D

Nella struttura elem ci vanno riga, colonna (la posizione all'interno della matrice) e valore dell'elemento...
In sparsa ci vanno il numero di righe e di colonne dell'intera matrice !!!

e il puntatore a che ti serve scusa? http://www.fenomeno85.altervista.org/smile/fantozzi.gif

~§~ Sempre E Solo Lei ~§~

cionci
09-09-2005, 13:26
e il puntatore a che ti serve scusa? http://www.fenomeno85.altervista.org/smile/fantozzi.gif
La matrice andava implementata tramite una lista...quindi secondo te a cosa serve next ? :)

Fenomeno85
09-09-2005, 13:32
La matrice andava implementata tramite una lista...quindi secondo te a cosa serve next ? :)

sono un minchione :D lascia stare :D ho capito quello che vuoi fare :D

~§~ Sempre E Solo Lei ~§~

VegetaSSJ5
09-09-2005, 18:31
:yeah:

Fenomeno85
09-09-2005, 19:17
:yeah:

è riferito a me? http://www.fenomeno85.altervista.org/smile/zittobimbo.gif

~§~ Sempre E Solo Lei ~§~

VegetaSSJ5
09-09-2005, 19:48
è riferito a me? http://www.fenomeno85.altervista.org/smile/zittobimbo.gif

~§~ Sempre E Solo Lei ~§~
no è riferito a me!

71104
09-09-2005, 20:01
no è riferito a me! perché sei un minchione? :D
scherzo ^^

Toni85
10-09-2005, 12:56
Come si usano le liste???

71104
10-09-2005, 13:02
Come si usano le liste??? eeeeeeeeeehhhhhh??? ma che domanda sarebbe? :mbe:
"e come funziona un computer?" :D

scherzi a parte, che devi fare esattamente?

cionci
10-09-2005, 13:16
scherzi a parte, che devi fare esattamente?
Suppongo la matrice sparsa della pagina precedente :D

Non le hai fatte le liste durante il corso ? Io credo proprio di sì...sono basilari in qualsiasi corso di programmazione... Ti conviene guardare sui tuoi appunti...

http://programmazione.html.it/c/c_33.htm