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;
}