Puzzle in c, progetto programmazione 1.

di il
3 risposte

Puzzle in c, progetto programmazione 1.

Ciao a tutti, ho appena terminato il primo dei due progetti di programmazione 1, il codice sembra funzionare anche se non nel migliore dei modi e mi piacerebbe avere pareri o consigli da qualcuno più esperto di me.
Condivido i relativi file header.h e main.c con tanto di traccia dell'esercizio tra i commenti.
#ifndef HEADER_H_INCLUDED
#define HEADER_H_INCLUDED
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define SIZE 8
void frequenza(char [][SIZE], int, int); /* Function per il calcolo della frequenza di presenze di un dato carattere tra quelli ammessi*/

void genera(char matrice[SIZE][SIZE]) /* Function che genera una matrice quadrata di misura size con i tre colori */
{
    char tessere[3] = {'r', 'g', 'b'};
    int lunghezza = 3;
    int i, j;
    for ( i = 0; i < SIZE; i++ )
        for ( j = 0; j < SIZE; j++)

        matrice[i][j] = tessere[rand()%lunghezza];

}

int trova_indice(char a[], int num_elementi, char valore ) /* Function che trova l'indice dell'elemento cercato nella matrice */
{
    int i;
    for ( i = 0; i < num_elementi; i++)
    {
        if (a[i] == valore)
        {
            return(valore); /* se è stato trovato*/
        }
    }
    return(-1); /* Se non è stato trovato*/
}

void frequenza (char a[][SIZE], int n, int n2) /* Function che trova la frequenza con cui un elemento si trova nella matrice*/
{
    int i, j, k, c = 0, num;
    int x, y, visited[n][n2];
    for ( i = 0; i < n; i++ ){
        for ( j = 0; j < n2; j++){
            c = 1;
            num = a[i][j];
            if (visited[i][j] !=1){
                for ( x = 0; x < n; x++){
                    for ( y = 0; y < n2; y++){
                        if ((i == x)&&(j == y)){
                            continue;
                        }
                        if(a[i][j] == a[x][y]){
                            visited[x][y] = 1;
                            c++;
                        }
                    }
                }
                printf("\nLa frequenza dell'elemento %c e' %d\n", num, c);
            }
        }
    }
}


#endif // HEADER_H_INCLUDED
/* Si vuole implementare un programma per la simulazione del gioco del puzzle. Si
suppone di avere n tessere (n è una potenza di 2 e almeno 32 ) che possono essere
disposte su una matrice quadrata.
Il gioco inizia chiedendo all’utente di inserire le n tessere scelte tra tre colori (o
simboli). Successivamente vengono generate 1000 matrici casuali usando gli stessi
colori. Vengono visualizzate le 10 matrici più simili a quella ottenuta con le tessere
scelte dall’utente.*/
#include "header.h"

void frequenza(char [][SIZE], int, int); /* Function per il calcolo della frequenza di presenze di un dato carattere tra quelli ammessi*/
void genera(char matrice[SIZE][SIZE]); /* Function che genera una matrice quadrata di misura size con i tre colori */
int trova_indice(char [], int, char); /* Function che trova l'indice dell'elemento cercato nella matrice */

int main()
{
    char MiaMatrice[SIZE][SIZE];
    char matrice[SIZE][SIZE];
    char MegaMatrice[100][100][100];
    int i, j, nm, indice, n, n2;
    char tessere[3]= {'r', 'g', 'b'};
    int MatriciScelte = 0;
    int similitudine = 0;
    int maxSize;

    printf("\n Inserire le tessere.\n");
    for (i = 0; i < SIZE; i++)
    {
        for ( j = 0; j < SIZE; j++)
        {
            printf("Inserire la tessera [%d,%d] : ", i + 1, j + 1);
            scanf(" %c ", &MiaMatrice[i][j]);

            indice = trova_indice(tessere, 3, MiaMatrice[i][j]);
            if ( indice == -1)
            {
                printf("L'elemento %c non e' stato trovato.\n", MiaMatrice[i][j]);

                    printf("I possibili elementi sono r, g, b : ", i + 1, j + 1);
                    scanf(" %c ", &MiaMatrice[i][j]);
            }
        }
    }

    printf("\n La matrice e' :\n");
    for ( i = 0; i < SIZE; i++)
    {
        for ( j = 0; j < SIZE; j++)
        {
            printf("%c\t", MiaMatrice[i][j]);



        }
    printf("\n"); /* Nuova riga dopo gli elementi di fila*/
    }
    frequenza(MiaMatrice, SIZE, SIZE);


    int topSimilitudine = 0; /* Calcola il grado di similitudine tra la matrice data e quelle casuali */
    printf(" MATRICI RANDOM\n");
        for (nm = 1; nm < 20; nm++)
        {
           genera(matrice);

            for ( i = 0; i < SIZE ; i++){
                for ( j = 0; j < SIZE; j++){
                        //printf("%c", Matrice[i][j];
                    MegaMatrice[nm][i][j] = matrice[i][j];


                    if (matrice[i][j] == MiaMatrice[i][j])
                    {
                        //printf("\n %c = %c\n", Matrice[i][j], MiaMatrice[i][j]
                        similitudine++;

                    }
                }

                printf("\n");


if ( similitudine > topSimilitudine ){
    topSimilitudine = similitudine;}
    else {
        topSimilitudine = topSimilitudine;
    }
    similitudine = 0;
}
            }

int x;

for ( x = 0; x < 11; x++){
        for ( i = 0; i < SIZE; i++){
            for ( j = 0; j < SIZE; j++){
            printf("%s", MegaMatrice[i][j]);





        }
        printf("\n");
    }

}




    return 0;
}

3 Risposte

  • Re: Puzzle in c, progetto programmazione 1.

    Innanzitutto al fine di rendere il codice più chiaro e leggibile ti consiglio di fare più attenzione alla spaziatura e all'indentazione, di racchiudere sempre il corpo delle istruzioni di controllo all'interno delle parentesi graffe e di utilizzare per le variabili nomi più significativi.

    Detto questo partiamo dalla traccia:
    - cosa rappresenta di preciso n? Detta D la dimensione della matrice quadrata, allora sarà n=D*D, giusto? In tal caso come potrà mai essere n=32?
    - inoltre anche la frase
    Il gioco inizia chiedendo all’utente di inserire le n tessere scelte tra tre colori.
    non è il massimo della chiarezza!
    - come dovrebbe essere misurata la similitudine tra 2 matrici? Semplicemente dal numero di caselle corrispettive uguali (cioè m1[ii][j]==m2[ii][j])?
  • Re: Puzzle in c, progetto programmazione 1.

    Nippolo ha scritto:


    Innanzitutto al fine di rendere il codice più chiaro e leggibile ti consiglio di fare più attenzione alla spaziatura e all'indentazione, di racchiudere sempre il corpo delle istruzioni di controllo all'interno delle parentesi graffe e di utilizzare per le variabili nomi più significativi.

    Detto questo partiamo dalla traccia:
    - cosa rappresenta di preciso n? Detta D la dimensione della matrice quadrata, allora sarà n=D*D, giusto? In tal caso come potrà mai essere n=32?
    - inoltre anche la frase
    Il gioco inizia chiedendo all’utente di inserire le n tessere scelte tra tre colori.
    non è il massimo della chiarezza!
    - come dovrebbe essere misurata la similitudine tra 2 matrici? Semplicemente dal numero di caselle corrispettive uguali (cioè m1[ii][j]==m2[ii][j])?
    Ciao, innanzitutto grazie per la risposta. Per quanto riguarda i nomi delle variabili, indentazione ecc ci sto lavorando volevo sapere se il ragionamento che c'è dietro al codice sia buono così come la matrice 3D. Per quanto riguarda la frase
    Il gioco inizia chiedendo all’utente di inserire le n tessere scelte tra tre colori.
    è la traccia che mi è stata consegnata dal professore
  • Re: Puzzle in c, progetto programmazione 1.

    Per poter valutare il tuo codice devo prima capire bene quello che l'esercizio richiede (o in alternativa qual è la tua interpretazione al riguardo)... quindi potresti rispondere alla prima e terza domanda del mio precedente post?
Devi accedere o registrarti per scrivere nel forum
3 risposte