Array e Matrici.
Creazione di un file di testo, con:
numero righe, numero colonne
matrice.
Lettura delle tre righe dentro tre vettori a,b,c, calcolo di a+b,a-b,etc. Costruzione di una matrice M con righe a,b,c. Calcolo e stampa di $$M^tM$$ (prodotto tra matrici).
[cpp]
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define N 100
void vprint(double v[N], int s)
{
putchar(‘[‘);
for (int i=0; i<s ; i++) {
char final_char = (i==s-1) ? ‘]’ : ‘,’;
printf("%8.2f%c",v[i],final_char);
}
putchar(‘\n’);
}
int main(void)
{
// creo un file con i dati.
// matrice 3×5 con valori in [-20,20] casuali.
seed = time(NULL);
srand(seed);
printf("3 5\n");
for (int i=0; i<3; i++) {
for (int j=0; j<5; j++) {
printf("%.2f ", ((double)rand()/RAND_MAX)*20-10);
}
printf("\n");
}
/* adesso rileggo: assumo che la parte sopra venga
* eseguita per generare un file matrice.dat tramite redirezione dell’output
* il file verra poi letto tramite redirezione dell’input.
*/
int n = 0; s = 0;
scanf("%d %d",&n, &s);
double a[N], b[N], c[N];
for (int i=0; i<s; i++) scanf("%lf",&a[i]);
for (int i=0; i<s; i++) scanf("%lf",&b[i]);
for (int i=0; i<s; i++) scanf("%lf",&c[i]);
printf("a = "); vprint(a,s);
printf("a = "); vprint(b,s);
printf("a = "); vprint(c,s);
// ok, facciamo una somma:
double z[N] = { 0 };
for (int i=0; i<s; i++) z[i] = a[i] + b[i];
vprint(z,s);
double len = 0;
for (int i=0; i<s; i++) len += z[i]*z[i];
len = sqrt(len);
printf("||z|| = %.2f\n",len);
// normalize z
for (int i=0; i<s; i++) z /= len;
printf("z normalized: "); vprint(z,s);
// ok, ora le matrici:
double m[3][N];
for (int i=0; i<s; i++)
for(int j=0; j<s; j++)
switch(i) {
case 0: m[i][j] = a[j]; break;
case 1: m[i][j] = b[j]; break;
case 2: m[i][j] = c[j]; break;
}
mprint(m,3,s); // scrivete voi la funzione.
//scrivete il prodotto di m trasposto per m.
return 0;
}
[/cpp]
Esercizi:

  • dato un vettore, ed un valore x, trovare tutte le coppie del vettore che sommati fanno x. inserite un contatore dei controlli (if) svolti, e stampatelo alla fine, quanto può essere al massimo il valore di questo contatore? dipende dai dati? e nel caso peggiore?
  • dato un vettore di numeri interi, ordinarlo in modo crescente seguendo il seguente principio: il primo elemento del vettore ordinato è chiaramente il minimo di tutto il vettore, il resto del vettore rispetta lo stesso principio.
  • dato un vettore di interi ordinarlo in modo crescente seguendo questo principio: il vostro vettore è come un mazzo di carte da gioco, se è ordinato fino ad una certa carta (da sinistra a destra), la prima carta che non rispetta l’ordinamento viene inserita scorrendo dall’inizio della mano, cercando il punto in cui andrebbe inserita, e facendo poi scorrere le rimanenti carte per ‘farle posto’. Formalizzate questa procedura e scrivete il codice C.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *