[C] Matrice variabile con puntatore

« Older   Newer »
  Share  
CAT_IMG Posted on 27/8/2012, 01:40     +1   -1

So implementare gli object

Group:
Admin
Posts:
1,215
Reputazione:
+150

Status:


Ieri th1sk mi ha chiesto degli esercizi sui puntatori, e ho trovato questo su internet:

CITAZIONE
Creare una matrice NxM di interi (con N e M definiti dall’utente). Impostare la matrice con tutti
gli elementi a ‘0’. Definire un puntatore ad interi che punti all’elemento (0, 0) d ella matrice.
Scrivere un algoritmo che sposti il puntatore di i caselle in basso e di j caselle a destra (dove i e j
sono numeri casuali compresi rispettivamente tra 0 e N e tra 0 e M). Ripetere l’operazione di
spostamento del puntatore un numero di voltedefinito dall’utente e incrementare di 1 ogni el e-mento della matrice che viene puntato dal puntatore. Stampare le coordinate di tutti i movimenti
del puntatore e la matrice ottenuta alla fine degli spostamenti del puntatore.

Fonte, con altri 2 esercizi e un'immagine che spiega quello scritto qui sopra: <x>

Il contest consiste nell'eseguire l'esercizio (se volete anche gli altri due, ma sono davvero banali).

Il programma può avere, oltre alle funzioni richieste dall'esercizio, opzioni aggiuntive, come ad esempio disattivare l'output o mostrare la matrice dopo ogni iterazione.

Per generare i numeri casuali, usate questa funzione:
CODICE
int random_number (int max)
{
       return (int) (((float) max) * rand() / RAND_MAX);
}


Linguaggio: C (libreria standard)
Scadenza: sabato 1 settembre 2012

Consigli:
* Se state pensando ad un array bidimensionale, cercate subito un'altra idea.
 
Top
th1sk
CAT_IMG Posted on 27/8/2012, 01:43     +1   -1




Ovviamente parteciperò, devo ancora migliorare il codice!
 
Top
CAT_IMG Posted on 27/8/2012, 21:20     +1   -1

So implementare gli object

Group:
Admin
Posts:
1,215
Reputazione:
+150

Status:


Uffa è così difficile? Dopo un giorno mi sarei aspettato almeno una soluzione :'(
 
Top
th1sk
CAT_IMG Posted on 27/8/2012, 23:01     +1   -1




Ecco:
CODICE
// Grazie #(dd) <3
#define MEMZERO(address, size) int i__ = 0; for (i__ = 0; i__ < size; i__++) *(address + i__) = 0;

// Larghezza e lunghezza massima della matrice
#define MAXX 100
#define MAXY 100

#include <stdio.h>
#include <stdlib.h>

// matrice_t è il tipo di tutti gli elementi della matrice (ed il puntatore)
typedef short matrice_t;
// matrice_st invece è per indicare la dimensione massima della matrice e le coordinate
typedef short matrice_st;

// Prototipi delle funzioni
matrice_t randomNumber(matrice_st);
void risolviMatrice(matrice_t*, matrice_st, matrice_st);
void mostraMatrice(matrice_t*, matrice_st, matrice_st);

int main(int argc, char *argv[])
{
       // Il puntatore al primo elemento della matrice
       matrice_t *matrice;

       // Larghezza e lunghezza
       matrice_st lx, ly;

       srand(time(NULL));

       // Chiedo larghezza e lunghezza della matrice

       printf("Larghezza matrice: ");
       scanf("%­i", &lx);
       printf("Lunghezza matrice: ");
       scanf("%­i", &ly);

       // Controllo se sono numeri validi

       if ((lx < 2 || lx > MAXX) || (ly < 2 || ly > MAXY))
       {
               printf("Min. 2x2, Max. %­ix%­i\n",MAXX,MAXY);
               return 1;
       }

       // Alloco la memoria per la matrice

       matrice = (matrice_t*) malloc((lx*ly) * sizeof(int));

       if (matrice == NULL)
       {
               printf("Errore nell'allocare la memoria!");
               return 1;
       }

       // Come memset, però più 'manuale'
       MEMZERO(matrice, (lx*ly));

       printf("\nAppena il limite massimo della matrice sarà superato\nil programma si chiuderà mostrandoti ogni singolo valore.\n\n");

       risolviMatrice(matrice, lx, ly);

       printf("\nEcco i valori:\n");

       mostraMatrice(matrice, lx, ly);

       // Libero la memoria
       free(matrice);

       return 0;
}

void risolviMatrice(matrice_t *matrice, matrice_st lx, matrice_st ly)
{
       matrice_st x, y, i, j;
       matrice_t *p;

       x = 0;
       y = 0;

       // P punta al primo elemento della matrice
       p = matrice;

       while ((x < lx) && (y < ly))
       {
               printf("Coordinate attuali: (%­i;%­i)\n", x, y);

               // Sposto il puntatore di i in basso
               // ed j a destra
               i = randomNumber(ly);
               j = randomNumber(lx);

               y += i;
               x += j;


               // Se hanno superato i bordi della tabella
               // Esci dal loop
               if(x > lx) continue;
               if(y > ly) continue;

               // Altrimenti aumenta il valore dell'elemento di 1
               p = matrice;
               p += (y*lx) + x;
               (*p)++;
       }
}

void mostraMatrice(matrice_t *matrice, matrice_st lx, matrice_st ly)
{
       matrice_st y, x;
       matrice_t *p;

       p = matrice;

       // Mostro tutti gli elementi della matrice
       for (y = 0; y < ly; y++)
       {
               for(x = 0; x < lx; x++)
               {
                       // Do il valore e faccio puntare
                       // Al numero dopo
                       printf("%­i", *(p++));
               }
               printf("\n");
       }
}

matrice_st randomNumber(matrice_st max)
{
       return (matrice_st) (((float) max) * rand() / RAND_MAX);
}


Pastebin: http://pastebin.com/ZwnbEVYV
 
Top
CAT_IMG Posted on 28/8/2012, 22:48     +1   -1

So implementare gli object

Group:
Admin
Posts:
1,215
Reputazione:
+150

Status:


Altri? :asd:
 
Top
4 replies since 27/8/2012, 01:40   185 views
  Share