PDA

View Full Version : [C]Programma esame con le matrici in C


scarface7
08-06-2006, 14:46
Salve a tutti,siccome tra pochi giorni dovrei fare l'esame di fondamenti d'informatica vorrei sapere se qualcuno di voi saprebbe aiutarmi con questo programma da fare:

In particolar modo potreste aiutarmi nei punti dove dice di riordinare la matrice e dove dice di calcolare la somma di tutti gli elementi delle righe di indice dispari e delle righe di indice pari.

Per togliervi ogni dubbio vi posto la traccia completa...ringrazio tutti anticipatamente

Si scriva un programma che soddisfi le seguenti specifiche:
* - carica da un file di testo una matrice A di numeri reali;
* - visualizza a video la matrice caricata A;
* - riordina gli elementi della matrice A in ordine crescente rispetto
* alla scansione per righe; in pratica dopo l'ordinamento i valori della
* matrice dovranno soddisfare la seguente condizione:
* A[0][0]<A[0][1]<...<A[0][N-1]<A[1][0]<...<A[1][N-1]<...<A[M-1][N-1]
* - visualizza nuovamente a video la matrice A;
* - calcola la somma di tutti gli elementi delle righe di indice dispari
* (RD) e la somma di tutti gli elementi delle righe di indice pari (RP)
* - crea una nuova matrice B con le stesse dimensioni della matrice A;
* gli elementi della matrice B sono ottenuti a partire dagli elementi
* della matrice A:
* -sommando RD agli elementi i cui indici di riga e colonna sono pari
* -sommando RP agli elementi i cui indici di riga e colonna sono dispari
* -sommando RP-RD agli elementi il cui indice di riga è dispari e
* l'indice di colonna è pari
* -sommando RD-RP agli elementi il cui indice di riga è pari e l'indice
* di colonna è dispari
* - visualizza a video la matrice B;
*
*
* Ulteriori specifiche:
* - il caricamento della matrice deve essere effettuato chiedendo
* all'utente di indicare le dimensioni della matrice (numero di righe M
* e il numero di colonne N), quindi leggendo da un file, il cui nome è
* anch'esso fornito dall'utente, M*N valori nel seguente ordine:
* A[0][0] A[0][1] ... A[0][N-1] A[1][0] ... A[1][N-1] ... A[M-1][N-1]
* nel caso in cui il numero di valori presenti nel file sia minore di
* M*N il programma termina dando una segnalazione di errore all'utente
* - la dimensione massima delle matrici gestite è pari a 100
* - oltre al main si scrivano una funzione per ognuna delle seguenti
* operazioni da effettuare:
* -> caricamento di una matrice da file
* -> ordinamento crescente della matrice rispetto alla scansione per
* righe
* -> calcolo di RD e RP
* -> creazione della matrice B a partire dalla matrice A
* -> visualizzazione a video di una matrice

trallallero
08-06-2006, 15:23
puoi farlo in qualsiasi linguaggio ? pare strano :confuso:

scarface7
08-06-2006, 15:25
devo farlo in linguaggio C

trallallero
08-06-2006, 16:00
devo farlo in linguaggio C

io ti potro' aiutare domani, ora vo via ...
se non t'aiuta qualcuno prima magari spiega meglio quali sono i tuoi dubbi. Cosa sai e non sai fare in C ;)

ciao

scarface7
08-06-2006, 16:16
io ti potro' aiutare domani, ora vo via ...
se non t'aiuta qualcuno prima magari spiega meglio quali sono i tuoi dubbi. Cosa sai e non sai fare in C ;)

ciao



In particolar modo potreste aiutarmi nei punti dove dice di riordinare la matrice e dove dice di calcolare la somma di tutti gli elementi delle righe di indice dispari e delle righe di indice pari.

shinya
08-06-2006, 16:30
In particolar modo potreste aiutarmi nei punti dove dice di riordinare la matrice e dove dice di calcolare la somma di tutti gli elementi delle righe di indice dispari e delle righe di indice pari.

Giusto perchè mi sto rompendo le palle con pl/sql al lavoro:

int dis = 0, par = 0;
for (i = 0; i < n; ++i)
if (i&1)
for (j = 0; j < m; ++j) dis += mat[i][j]
else
for (j = 0; j < m; ++j) par += mat[i][j]


Ovviamente non è testato e non funziona. E' solo una traccia.

trallallero
09-06-2006, 07:56
In particolar modo potreste aiutarmi nei punti dove dice di riordinare la matrice e dove dice di calcolare la somma di tutti gli elementi delle righe di indice dispari e delle righe di indice pari.

si vabbe', questo lo avevi gia' scritto, io intendevo qualcosa di piu' preciso ...
sai ordinare un array ? hai capito quello che t'ha scritto shinya ?

io l'ordinamento di una matrice lo farei creando una array lungo righe*colonne, ordinando l'array con un semplice bubble sort e rimettendo i valori ordinati nella matrice.

provi a farlo da solo ? :Prrr:

Fraggerman
09-06-2006, 13:01
secondo me lo fai con un bubble sort, immaginando che la tua matrice sia tutta su una unica riga... cioè scorri la matrice dalla prima posizione all'ultima... e poi riscrivi in un'altra matrice il risultato! forse nn è la sol migliore ma credo sia un buon modo...

trallallero
09-06-2006, 13:08
secondo me lo fai con un bubble sort, immaginando che la tua matrice sia tutta su una unica riga... cioè scorri la matrice dalla prima posizione all'ultima... e poi riscrivi in un'altra matrice il risultato! forse nn è la sol migliore ma credo sia un buon modo...

ehm ... assomiglia solo vagamente a quello consigliato da me :D

peppedx
09-06-2006, 21:13
non è che vorrei rendermi antipatico...ma provare a studiare per fare gli esami non sarebbe una idea????? :mc:

scarface7
11-06-2006, 13:58
si vabbe', questo lo avevi gia' scritto, io intendevo qualcosa di piu' preciso ...
sai ordinare un array ? hai capito quello che t'ha scritto shinya ?

io l'ordinamento di una matrice lo farei creando una array lungo righe*colonne, ordinando l'array con un semplice bubble sort e rimettendo i valori ordinati nella matrice.

provi a farlo da solo ? :Prrr:


potreste dirmi come fare..per piacere

Janky
11-06-2006, 14:42
crei un array di dimensione righe*colonne

con 2 cicli for scorri la matrice e carichi i valori delle celle nell'array

prendi l'array e lo ordini con un bubble sort

reinserisci i dati nella matrice

scarface7
11-06-2006, 16:19
allora ragazzi ho iniziato a scrivere una bozza della funzione ordina..correggetemi dove ho sbagliato:


void ordina(int m[][MAXCOL],int r1,int c1,int ord[][MAXCOL],int *r2,int *c2)

{
int i,j,temp;

for(i=0;i<r1;i++)
for(j=0;j<c1;j++){
if(m[i][j]>m[i+1][j+1]){
temp=m[i][j];
m[i][j]=m[i+1][j+1];
m[i+1][j+1]=temp;
}

}
ord[i][j]=m[i][j];

*r2=r1;
*c2=c1;


}

trallallero
12-06-2006, 17:19
allora ragazzi ho iniziato a scrivere una bozza della funzione ordina..correggetemi dove ho sbagliato:


void ordina(int m[][MAXCOL],int r1,int c1,int ord[][MAXCOL],int *r2,int *c2)

{
int i,j,temp;

for(i=0;i<r1;i++)
for(j=0;j<c1;j++){
if(m[i][j]>m[i+1][j+1]){
temp=m[i][j];
m[i][j]=m[i+1][j+1];
m[i+1][j+1]=temp;
}

}
ord[i][j]=m[i][j];

*r2=r1;
*c2=c1;


}

penso che tu non abbia tutti questi aiuti perchè, giustamente, secondo me ed almeno secondo peppedx, per fare gli esami è necessario studiare ;)
non stai lavorando o sperimentando o cazzeggiando ...
ci hai chiesto, fino a qualche giorno fa, la soluzione di un problema per un esame, senza nessun tentativo, nessun inizio .. troppo facile così :D

però adesso vedo che hai comiciato a provarci, bravo.
Oggi non ero al lavoro (non ho le malattie pagate :muro: )
ma domani (se tutto va bene) un occhio ce lo diamo :)

trallallero
13-06-2006, 08:21
allora ragazzi ho iniziato a scrivere una bozza della funzione ordina..correggetemi dove ho sbagliato:


void ordina(int m[][MAXCOL],int r1,int c1,int ord[][MAXCOL],int *r2,int *c2)

{
int i,j,temp;

for(i=0;i<r1;i++)
for(j=0;j<c1;j++){
if(m[i][j]>m[i+1][j+1]){
temp=m[i][j];
m[i][j]=m[i+1][j+1];
m[i+1][j+1]=temp;
}

}
ord[i][j]=m[i][j];

*r2=r1;
*c2=c1;


}

allora ... il codice e' meglio postarlo con (CODE) ... (/CODE) almeno non perde l'indentazione ;)
(ovviamente le () = [] )

ma c'e' qualcosa di poco chiaro nella funzione :mbe:
immagino tu voglia ordinare i dati della matrice "m" e scriverli dentro "ord" ...
ma i 2 puntatori finali r2 e c2 a che servono ?
il codice dell'ordinamento e' giusto, il classico swap, ma


ord[i][j] = m[i][j];

sono fuori dal ciclo ;)


*r2 = r1;
*c2 = c1;

a cosa dovrebbe servire ?

ti consiglio di postare il codice con il commento affianco che spiega quello che stai facendo
es:

for( i = 0; i < r1; i++ ) // LOOP SULLE RIGHE
for( j = 0; j < c1; j++ ) // LOOP SULLE COLONNE
...


ti serve tenere la matrice originale invariata ?
perche' senno' puoi ordinare direttamente "m" senza dover copiare tutto su "ord"

dai che sei sulla buona strada ;)
scusa ma niente pappa pronta, se ci arrivi da solo la prossima volta questo argomento sara' un gioco da ragazzi per te :)

scarface7
16-06-2006, 12:28
putroppo ancora non ci riesco se per piacere mi dite come fare..perchè sto perdendo solo tempo e lunedi ho l'esame..grazie

scarface7
17-06-2006, 15:51
void ordina(int m[][MAXCOL],int r,int c)

{
int i,j,k,t,dim,temp;
int v[MAXRIG];
for(i=0;i<r;i++)
for(j=0;j<c;j++)
v[i*j]=m[i][j];

for(k=1;k<(i*j);k++)
for(t=0;t<((i*j)-i);t++)
if(v[t]>v[t+1]){
temp=v[t];
v[t]=v[t+1];
v[t+1]=temp;
m[i][j]=v[t];

m[i][j]=v[t];
}
}


peccato ke ancora nn funzioni..dov'è l'orrore???