Esercizio 1 - Soluzione (1)

Transcript

Esercizio 1 - Soluzione (1)
Esercizio 1: Quadrato magico
Realizzare una funzione che, presa in input
una matrice quadrata, determini se è un
quadrato magico
„ Un quadrato magico è una matrice NxN
„
• I cuii elementi
l
ti sono TUTTI i numerii iinteri
t id
da 1 a
N2
i cuii
in
• Le somme degli elementi per tutte le righe, tutte
l colonne
le
l
e lle di
diagonalili sono equivalenti
i l ti
– Tale somma è detta “magic constant”
1
Esercizio 1 - Soluzione (1)
#define N 3
typedef int matrice[N][N];
typedef enum{false, true} boolean;
t
typedef
d f boolean
b l
covered[N*N];
d[N*N]
boolean verifyMatrix(matrice m, int dim)
{
covered c;
Vettore che verifica la
int i, j;
presenza, nella matrice,
dei numeri da 1 a N2
for(i = 0; i < dim*dim; i++)
Se c[i] è true significa che il
c[i] = false;
presente
numero i+1 è p
…
nella matrice
2
Esercizio 1 - Soluzione (2)
…
Controllo
for(i = 0; i < dim; i++)
{
sull’intervallo dei
for(j = 0; j < dim; j++)
valori [1,N2]
{
if(m[i][j] < 1 || m[i][j] > dim*dim)
{
return false;
}
if( c[ m[i][j] -1] == false)
{
c[ m[i][j] -1] = true;
}
I numeri non
else
devono essere
{
p
ripetuti
return false;
}
}
}
return true;
}
3
Esercizio 1 - Soluzione (3)
„
Essendo il calcolo su righe e colonne molto simile
simile, realizziamo
un’unica funzione sufficientemente generica
• La somiglianza è dovuta al fatto che la matrice è quadrata
• Un ulteriore parametro di questa funzione indica se il conteggio va
effettuato sulle righe o sulle colonne
boolean verifyRows(matrice m, int dim, int* sum)
{
return verify(m, dim, true, sum);
}
boolean verifyColumns(matrice m, int dim, int* sum)
{
return verify(m, dim, false, sum);
}
4
Esercizio 1 - Soluzione (4)
boolean verify(matrice m, int dim, boolean verifyRows, int* sum)
{
int i, j, partial;
*sum = -1;
for(i = 0; i < dim; i++)
{
partial = 0;
for(j = 0; j < dim; j++)
{
if(verifyRows)
partial = partial + m[i][j];
else
partial = partial + m[j][i];
}
if(*sum < 0)
*sum = partial;
else if (*sum != partial)
I i i li
Inizializzazione
i
return false;
della somma
}
; }
return true;
5
Esercizio 1 - Soluzione (5)
boolean
b
l
verifyDiagonals(matrice
if Di
l ( t i
m, int
i t dim,
di
i t* sum)
int*
)
{
int i, j, sum2 = 0;
*sum = 0;
for(i = 0; i < dim; i++)
*sum = *sum + m[i][i];
for(i = 0; i < dim; i++)
sum2
2 = sum2
2 + m[i][dim-i-1];
[i][di i 1]
return (*sum == sum2);
}
6
Esercizio 1 - Soluzione (6)
Definizione dei codici di ritorno della funzione
#define RESULT int
#define
#define
#d fi
#define
#define
#define
#define
NOT
NOT_WELL_FORMED
WELL FORMED 0;
ROWS_CHECK_FAILED 1;
COLUMNS
COLUMNS_CHECK_FAILED
CHECK FAILED 2
2;
DIAGONALS_CHECK_FAILED 3;
DIFFERENT_SUM 4;
MAGIC 5;
7
Esercizio 1 - Soluzione (7)
RESULT magicSquared(
matrice m, int dim,
int*magic_constant)
{
boolean result;
int sum, sum2;
result = verifyMatrix(m, dim);
if(!result)
return NOT_WELL_FORMED;
result = verifyRows(m,
y
( , dim,
, &sum);
);
if(!result)
return ROWS_CHECK_FAILED;
result
lt = verifyColumns(m,
if C l
(
di
dim, &
&sum2);
2)
if(!result)
return COLUMNS_CHECK_FAILED;
_
_
…
8
Esercizio 1 - Soluzione (8)
…
if(sum != sum2)
return DIFFERENT_SUM;
result = verifyDiagonals(m, dim, &sum2);
if(!result)
return DIAGONALS_CHECK_FAILED;
DIAGONALS CHECK FAILED;
if(sum != sum2)
return DIFFERENT_SUM;
*magic_constant = sum;
return MAGIC;
}
9
E
Esercizio
i i 2
2: Al
Algoritmi
it i di ordinamento
di
t
“Astrazione”
Astrazione degli algoritmi di ordinamento
„
„
„
Implementare i diversi algoritmi di ordinamento
ordinamento, facendo in
modo di astrarre completamente dal tipo degli elementi
del vettore
de
etto e
Fare anche in modo che vengano stampate delle
statistiche sul numero di confronti e di scambi
effettuati
Testare la soluzione su un vettore di interi, un vettore di
caratteri, un vettore di stringhe
10
Esercizio 2 - elementdef.h
elementdef h
„
Nel caso di interi…
interi
#ifndef ELEMENTDEF
#define ELEMENTDEF
typedef int Element;
#endif
„
Nel caso di stringhe…
#ifndef ELEMENTDEF
#define ELEMENTDEF
typedef char* Element;
#endif
#
11
Esercizio 2 - element.h
element h
#ifndef ELEMENT
#define ELEMENT
int compare(Element e1, Element e2);
void swap(Element *e1, Element *e2);
void assign(Element *lvalue, Element rvalue);
void printElement(Element e);
void printStatistics();
#endif
12
Esercizio 2 - element.c
element c (1)
#include "elementdef.h"
#include <stdio.h>
#include <string.h> //se il tipo è stringa…
int compareCounter = 0;
int swapCounter = 0;
void incrementCompareCounter()
{
compareCounter++;
}
void incrementSwapCounter()
{
swapCounter++;
}
13
Esercizio 2 - element.c
element c (2)
void assign(Element
g (
*lvalue,
, Element rvalue)
)
{
*lvalue = rvalue;
}
void swap(Element *e1, Element *e2)
{
Element tmp;
assign(&tmp, *e1);
assign(e1,
i ( 1 *
*e2);
2)
assign(e2, tmp);
incrementSwapCounter();
}
14
Esercizio 2 - element.c
element c (3)
„
Nel caso di interi…
int compare(Element e1, Element e2)
{
incrementCompareCounter();
return e1 - e2;
}
printElement(Element
(
e)
)
void p
{
printf(“%d\n”, e);
}
„
Nel caso di stringhe…
int compare(Element e1, Element e2)
{
incrementCompareCounter();
return strcmp(e1, e2);
}
// e ovviamente printElement con %s
15
Esercizio 2 - altri header
„ commondef.h
commondef h
#ifndef COMMONDEF
#define COMMONDEF
#define DIM 20
typedef
yp
Element Array[DIM];
y[
];
#endif
„ sort.h
sort h
void printArray(Array a, int dim);
void naiveSort(Array a, int dim);
gli altri tipi
p di sort…
// e tutti g
16
E
Esercizio
i i 2 – ad
d esempio
i printArray
i tA
#include
#include
#include
#include
"elementdef.h"
"commondef.h"
"element.h"
<stdio.h>
void printArray(Array a, int dim)
{
i t i
int
i;
printf("---VETTORE---\n");
for(i = 0; i < dim; i++)
printElement(a[i]);
printf("-------------\n");
printf(
\n );
}
17
E
Esercizio
i i 2 – ad
d esempio
i naiveSort
i S t
void naiveSort(Array a, int dim)
{
int j, i, posmin;
Element min;
for (j = 0; j < dim; j++)
{
posmin = j;
for ( assign(&min,
assign(&min a[j]),
a[j]) i = j + 1; i < dim; i++)
{
if(compare(a[i], min) < 0)
{
posmin = i;
assign(&min, a[i]);
}
}
if (posmin != j)
swap(&a[j], &a[posmin]);
}
}
18