PDA

Visualizza la versione completa : [C] esercizio con matrice


straider91
31-01-2013, 15:43
Salve a tutti.Come da titolo avrei un problema con un programma.In pratica devo considerare una matrice 32x32 inizializzata con tutti caratteri 'X'.Dopo aver suddiviso questa matrice in 4 blocchi 16x16 devo poter mettere su ogni diagonale dei 4 blocchi il carattere 'D' e in alto a destra di ogni blocco il carattere 'A'.Dopo di che devo suddividere i 4 blocchi in altri 4 blocchi 8x8,ripetendo lo stesso procedimento cioè mettendo su ogni diagonale dei blocchi il carattere 'D' e il carattere 'A' in alto a destra.Ovviamente poi dovro dividerli in 4 blocchi ancora più piccoli ripetendo sempre le stesse cose.L'algoritmo esamina 6 volte la matrice e deve essere un semplice algoritmo iterativo.Qualcuno ha qualche idea su come fare????Grazie in anticipo!!!!

glukosio
31-01-2013, 16:13
per scrivere in diagonale potresti usare un ciclo for e le posizioni posX e posY, e aumentarle di 1 tutte e due contemporaneamente, se devi partire da più a destra metti posX=16 ad esempio e poi usa lo stesso metodo di prima, potresti usare una funzione che viene richiamata più volte e che invece dei numeri messi da te usi la lunghezza prestabilita e la dividi per 2...
appena ho un po' di tempo provo a scriverla e la posterò qui,

straider91
31-01-2013, 16:42
Originariamente inviato da glukosio
per scrivere in diagonale potresti usare un ciclo for e le posizioni posX e posY, e aumentarle di 1 tutte e due contemporaneamente, se devi partire da più a destra metti posX=16 ad esempio e poi usa lo stesso metodo di prima, potresti usare una funzione che viene richiamata più volte e che invece dei numeri messi da te usi la lunghezza prestabilita e la dividi per 2...
appena ho un po' di tempo provo a scriverla e la posterò qui,

E' infatti è quello che ho fatto.Però c'è un problema.Dato che i blocchi sono 4 come devo richiamare la funzione nel main per le diagonali del blocco in alto a destra e del blocco in basso a sinistra???...Non so se questo problema provenga da un errore della mia funzione.Se casomai ci fosse un errore se per piacere me lo potreste correggere o dire come aggiustare.Grazie.

Questa è la mia funzione(la matrice è globale ed è inclusa nel file header.h):




#include"header.h"

void funz(int x,int y){
int i,j;

for(i=x;i<y;i++){
mat[i][i]='D';}
mat[x][y]='A';

for(i=x;i<y;i++){
for(j=x;j<y;j++){
printf("%c|",mat[i][j]);
}printf("\n");
} printf("\n");
}

glukosio
31-01-2013, 16:53
ci proverò in serata, magari mi verrà qualcosa di meglio in mente, ma potresti provare a farlo partire da zero, poi da x=16, poi da y=16, e iterarlo 16 volte (fino alla fine della riga); poi dividere per due e fare x=8 e iteri 8 volte, stesso per x=24, y=8,y=24 e così via... ma non so quanto questa idea sia trasportabile poi ad altre grandezze, potresti usare un valore Z per 32, e dividerlo per 2,4,8 fino ad arrivare all'1

straider91
31-01-2013, 17:07
cerco di fare come hai detto....in serata poi ti dirò se ci sono riuscito....tu comunque appena pensi di aver risolto se per piacere mi faresti vedere un esempio pratico te ne sarei grato.

straider91
31-01-2013, 20:15
Originariamente inviato da glukosio
ci proverò in serata, magari mi verrà qualcosa di meglio in mente, ma potresti provare a farlo partire da zero, poi da x=16, poi da y=16, e iterarlo 16 volte (fino alla fine della riga); poi dividere per due e fare x=8 e iteri 8 volte, stesso per x=24, y=8,y=24 e così via... ma non so quanto questa idea sia trasportabile poi ad altre grandezze, potresti usare un valore Z per 32, e dividerlo per 2,4,8 fino ad arrivare all'1

Purtroppo io non sono riuscito a raggiungere nessuna soluzione migliore di quella scritta da me oggi....sapresti aiutarmi???? :bhò:

glukosio
31-01-2013, 20:41
ci sto provando, se ci riesco posto il codice qui

glukosio
31-01-2013, 22:11
questo qua fa il primo partizionamento, però è meglio se riscrivo la funzione divideM per renderla più portabile e di conseguenza anche la parte del main, in modo da non doversi massacrare ad ogni frazionamento!


#include<stdio.h>
#define SIZE 32
void printM(const char matrix[] );
void cleanM(char matrix[] );
void divideM(char matrix[] );
int X=0,Y=0;
int LIM;
int main(void)
{
int count=0,temp;
char matrix[SIZE][SIZE];
cleanM(matrix);
//prima divisione
LIM=(SIZE/2-1);
temp=0;
while(count<4){
divideM(matrix);
if(X==SIZE/2){
Y=temp;
}
else{
X=temp;
temp=Y;
}
count++;
}
printM(matrix);
return 0;
}
void cleanM(char matrix[][SIZE])
{
int i,j;
for(i=0;i<SIZE;i++){
for(j=0;j<SIZE;j++){
matrix[i][j]='x';
}
}
}
void printM(const char matrix[][SIZE])
{
int i,j;
for(i=0;i<SIZE;i++){
for(j=0;j<SIZE;j++){
printf("%c|",matrix[i][j]);
}
printf("\n");
}
}
void divideM(char matrix[][SIZE])
{
int i=0;
matrix[X][Y+LIM]='A';
for(;i <=(SIZE/2-1);X++,Y++,i++){
matrix[Y][X]='D';
}


}

straider91
31-01-2013, 23:57
è esattamente questo che dicevo...solo che vorre un breve chiarimento se puoi sul codice da te scritto perchè non l'ho capito ancora tanto bene cosa fa...un ultima cosa....mi sapresti dire come fare se vorrei stampare ogni volta i blocchi presi in considerazione e alla fine di ogni ciclo,stampare la matrice e vedere pian piano il suo mutamento?...lo vorrei fare per un numero di 6 volte....avevo pensato a un ciclo do while,ma non so bene come impostarlo e soprattutto dove metterlo...cioè dentro al ciclo do while cosa ci deve andare e la condizione come potrebbe essere????

glukosio
01-02-2013, 07:30
in pratica nella funzione while la prima volta si parte con X=0 e Y=0, poi viene eseguita la funzione e ci si ritrova con X=16 e Y=16, viene azzerata la Y da temp=0 e viene eseguito di nuovo il ciclo; poi ci si ritrova con X=32 e Y=16, viene azzerato X da temp e il valore 16 viene salvato in temp, si fa il terzo pezzo, e poi tutti e due i valori saranno 16, ed eseguendo un'ultima volta il ciclo disegna l'ultimo quarto di matrice.
scusa per la disordinatezza del codice, ma sono praticamente ancora alle prime armi, e per scrivere qualcosa di ordinato mi ci vuole tempo...


per controllare il processo potresti inserire nel while due printf che ti scrivano i valori di X,Y e temp, richiamare la funzione per disegnare la matrice, bloccare il tutto con system("PAUSE") per darti il tempo di guardare, e poi mettere un system("cls") per cancellare, così avrai sempre una sola matrice su schermo e non 7 una dopo l'altra...

Loading