http://www.cplusplus.com/reference/
1 - STRUTTURE ITERATIVE E VETTORI
versione 19/12/2012
 
ESERCIZIO
 
Costruire un programma che legge una sequenza di numeri interi (terminata con lo zero) e per ogni valore indichi se si tratta di un numero pari o dispari.

 
SOLUZIONE:
/**************************************************************************
 * Nome: lab1-pari_dispari.c                                              *
 * Autore: Alessandro Saetti                                              *
 * Data: 16/2/10                                                          *
 **************************************************************************/
#include <stdio.h>
#include <stdlib.h> // Richiesta da system("pause");
/* Nome: main
 * Scopo: Stampa numeri pari e dispari
 * Input: --
 * Output: 0 se il programma termina correttamente
 */
int main() 
{
    // DICHIARAZIONE VARIABILI/INIZIALIZZAZIONE
    int n;

    printf(" - DETERMINA SE PARI O DISPARI - \n");
    printf("Inserisci dei numeri interi positivi (0 per terminare):\n");
    do 
    {
        printf("==> ");       
        scanf("%d", &n);
        if (n > 0) 
           if(n % 2 == 0) 
              printf("%d e' pari!\n", n);        
           else
              printf("%d e' dispari!\n", n);
        
    } while(n > 0);

    system("pause");
    return(0);
}

ESERCIZIO
 
Costruire un programma che legge una sequenza di date (conclusa con la data fittizia 0/0/0) e restituisce la data più vecchia. Non sono richiesti controlli sulla correttezza delle date.

 
SOLUZIONE:
/**************************************************************************
 * Nome: lab2-date.c                                                      *
 * Autore: Alessandro Saetti                                              *
 * Data: 16/2/10                                                          *
 **************************************************************************/
#include <stdio.h>
#include <stdlib.h> // Richiesta da system("pause");
#include <limits.h> // Contiene la definizione di INT_MAX (2^31-1)
/* Nome: main
 * Scopo: Calcola e stampa la data minima
 * Input: --
 * Output: 0 se il programma termina correttamente
 */
int main() 
{
    // DICHIARAZIONE VARIABILI/INIZIALIZZAZIONE
    int gg, mm, aa, min_aa = INT_MAX, min_mm = 13, min_gg= 32;
    // INPUT
    printf("Immetti la data (g/m/aaaa) (0/0/0 per terminare):\n");
    do {
       printf("-> ");
       scanf("%d/%d/%d", &gg, &mm, &aa);
       if (aa > 0 && mm > 0 && gg > 0) 
       {
          if (aa < min_aa) //  Se l'anno appena letto e' minore del minimo
          {                //  fino a quel punto acquisito
             min_aa = aa;
             min_mm = mm;
             min_gg = gg;
          } 
          else if (aa == min_aa && mm < min_mm) 
          {
             min_mm = mm;
             min_gg = gg;
          }
          else if (aa == min_aa && mm == min_mm && gg < min_gg)
             min_gg = gg;
       }
    } while(gg != 0 || mm != 0 || aa != 0);
    // OUTPUT
    printf("La data minima e': %d/%d/%d\n", min_gg, min_mm, min_aa);
    
    system("pause");
    return(0);
}

ESERCIZIO
 
Costruire un programma che legge due numeri razionali e mostra a video la frazione somma ridotta ai minimi termini.

 
SOLUZIONE:
/**************************************************************************
 * Nome: lab4-frazioni.c                                                  *
 * Autore: Alessandro Saetti                                              *
 * Data: 16/2/10                                                          *
 **************************************************************************/
#include <stdio.h>
#include <stdlib.h> // Richiesta da system("pause");
/*
 * Nome: main
 * Scopo: Stampa la frazione somma ridotta ai minimi termini
 * Input: --
 * Output: 0 se il programma termina correttamente
 */
int main() 
{
    int num1, num2, den1, den2; 
    int num, den, min , MCD, i;
    // INPUT
    printf("Digita la prima frazione (A/B): ");
    scanf("%d/%d", &num1, &den1);
    printf("Digita la seconda frazione (C/D): ");
    scanf("%d/%d", &num2, &den2);
    
    // ALGORITMO:
    // 1) Determino la frazione somma non ridotta
    num = num1 * den2 + num2 * den1;
    den = den1 * den2;
    // 2) Calcolo il MASSIMO COMUNE DIVISORE
    //    - il MCD è minore o uguale di num o den
    if (num > den)
       min = den;
    else
       min = num;
    //    - divido num e den per i. Se il resto è zero allora
    //      i è il nuovo MCD. 
    for (i = 1; i <= min ; i++)
        if ( num % i == 0 && den %i == 0) 
           MCD = i;
    // Invece di partire da 1 parto da min. Se num e den non è multiplo di
    // i allora passo a considerare il numero i-1 altrimenti ho determinato
    // il MCD
    // for (MCD=min ; ((num%MCD)+(den%MCD))>0 ; MCD--);

    // OUTPUT
    printf("Frazione Somma (Non ridotta): (A*D+C*B)/B*D = (%d*%d+%d*%d)/(%d*%d) = %d/%d\n",num1, den2, num2, den1, den1, den2, num,den);
    printf("Frazione Somma (Ridotta)    : (A*D+C*B)/B*D = %d/%d = (%d*%d)/(%d*%d) = %d/%d\n",num, den, num/MCD, MCD, den/MCD, MCD, num/MCD, den/MCD);

    system("pause");
    return(0);
}

ESERCIZIO
 
Costruire un programma che genera N numeri interi compresi tra 1 e 100 e mostra la media di tali valori

 
SOLUZIONE:
NOTE:
int rand() => Restituisce un numero intero casuale tra 0 e RAND_MAX. Il valore RAND_MAX dipende dalla libreria. Vale almeno 32767. Richiede <stdlib.h>.

void srand ( unsigned int seed ); => Inizializza il generatore di numeri casuali. Richiede <stdlib.h>. Usando come argomento time(NULL) facciamo variare il seme (seed) in funzione del tempo e di conseguenza anche le sequenze generate.

time_t time ( time_t * timer ); => Restituisce l'orario corrente come oggetto time_t e lo registra anche nel parametro *timer (se questo non è posto a NULL!). Il tipo time_t restituito dalla funzione time() è un numero intero che contiene il numero di secondi trascorsi dalle 00:00 del 1 gennaio 1970 (corrisponde al timestamp di unix). In questo modo la rappresentazione del tempo consente di effettuare delle operazioni aritmentiche. Richiede <time.h>.
/**************************************************************************
 * Nome: lab4-media.c                                                     *
 * Autore: Alessandro Saetti                                              *
 * Data: 23/2/10                                                          *
 **************************************************************************/
#include <stdio.h>
#include <stdlib.h> // Richiesta da system("pause");
#include <time.h>   // Serve per la funzione time()
#define DIM 100
/*
 * Nome: main
 * Scopo: Stampa la media dei numeri in un vettore
 * Input: --
 * Output: 0 se il programma termina correttamente
 */
int main()
{
    float media;
    int i, vet[DIM], somma;
    // INIZIALIZZAZIONE:
    // - Inizializzo il generatore di numeri casuali
    srand(time(NULL));
    // - genero DIM numeri interi tra 1..100
    for (i=0; i < DIM; i++) 
        vet[i] = (rand() % 100 + 1);

    // ALGORITMO
    somma=0;
    for (i=0; i < DIM; i++) 
        somma += vet[i];
    // Si noti che il risultato che si ottiene scrivendo (float)(somma/n)
    // e' errato!
    media = (float)somma / DIM;

    // OUTPUT
    for (i=0; i < DIM; i++) 
       printf("%4d", vet[i]);
    printf("\n\nMedia: %.2f\n", media);

    system("pause");
    return 0;
}


ESERCIZIO
 
Costruire un programma che legge un intero positivo minore di 1024 e visualizza lasua rappresentazione in binario

 
SOLUZIONE:
/**************************************************************************
 * Nome: lab2-dectobin.c                                                  *
 * Autore: Alessandro Saetti                                              *
 * Data: 23/2/10                                                          *
 **************************************************************************/
#include <stdio.h>
#include <stdlib.h> // Richiesta da system("pause");
/*
 * Nome: main
 * Scopo: Stampa conversione base 2
 * Input: --
 * Output: 0 se il programma termina correttamente
 */
int main()
{
    int dec, t, bin[10], i, n = 0;

    // INPUT
    printf("Immetti un intero (positivo minore di 1024):\n");    
    do {
        printf("-> ");
        scanf("%d", &dec);
    } while(dec < 0 || dec > 1023);
    
    // ALGORITMO
    t=dec;
    do {
       bin[n++] = t % 2; // resto divisione per 2
       t = t /2;       // divisione intera
    } while (t != 0);

    printf("Conversione in base 2 di %d: ", dec);
    for (i = n-1; i >=0; i--) 
        printf("%d", bin[i]);
    printf("\n\n");

    system("pause");
    return 0;
}

ESERCIZIO
 
Costruire un programma che genera N numeri binari e li converte in decimale.

 
SOLUZIONE:


NOTE:
double pow(double b, double x)
float powf(float b, float x)
=> richiede l'include math.h
float V[NrRighe]={0.0}; => questa scrittura consente di inizializzare l'intero array a 0
/**************************************************************************
 * Nome: lab4-bintodec.c                                                  *
 * Autore: Alessandro Saetti                                              *
 * Data: 23/2/10                                                          *
 **************************************************************************/
#include <stdio.h>
#include <stdlib.h> // Richiesta da system("pause");
#include <math.h>   // Serve per la funzione powf()
#include <time.h>   // Serve per la funzione time()
#define NrDigit 8
#define NrRighe 5
/*
 * Nome: main
 * Scopo: Stampa conversioni in base 10 di numeri binari su righe di matrice
 * Input: --
 * Output: 0 se il programma termina correttamente
 */
 int main() 
 {
    int Valori[NrRighe][NrDigit], r, c;
    float V[NrRighe]={0.0}; // tutti i valori sono inizializzati a zero

    // INIZIALIZZAZIONE:
    // - Inizializzo il generatore di numeri casuali
    srand(time(NULL));
    // - Genero dei numeri 0 / 1 casuali
    for (r=0; r < NrRighe; r++) 
        for (c=0; c < NrDigit; c++) 
            Valori[r][c]=rand()%2;

    // ALGORITMO: Decodifica da binario a decimale
    for (r=0; r < NrRighe; r++) 
        for (c=0; c < NrDigit; c++) 
            V[r]+=Valori[r][c]*powf(2,NrDigit-1-c);

    // OUTPUT
    printf("CONVERSIONE NUMERI BINARIO/DECIMALE:\n\n");
    for (r=0; r < NrRighe; r++) 
    {
        printf("%d) Il numero binario ", r+1);
        for (c=0; c < NrDigit; c++) 
            printf("%1d",Valori[r][c]);
        printf(" convertito in decimale e': %.0f\n", V[r]);
    }

    system("pause");
    return(0);
}

ESERCIZIO
 
Costruire un programma che legge un numero positivo e visualizza i prossimi 5 anni bisestili.
Nel calendario Gregoriano un anno è bisestile se il suo numero è divisibile per 4, con l'eccezione degli anni secolari (quelli divisibili per 100) che sono bisestili solo se divisibili per 400. Si potrebbe ulteriormente migliorare il calendario gregoriano togliendo tre giorni ogni diecimila anni. A tale riguardo John Herschel (1792-1871) suggerì di non considerare bisestili (mentre, in base al calendario gregoriano, lo dovrebbero essere) gli anni 4000, 8000 e 12000.

 
SOLUZIONE:
/**************************************************************************
 * Nome: casa1-anno.c                                                     *
 * Autore: Alessandro Saetti                                              *
 * Data: 16/2/10                                                          *
 **************************************************************************/
#include <stdio.h>
#include <stdlib.h> // Richiesta da system("pause");
/*
 * Nome: main
 * Scopo: Stampa anni bisestili
 * Input: --
 * Output: 0 se il programma termina correttamente
 */
int main() {
    int n, i = 1;

    // INPUT
    printf(" - CALCOLO DEGLI ANNI BISESTILI - \n");
    printf("Inserisci un numero intero positivo:\n");
    do {
        printf("==> ");       
        scanf("%d", &n);
    } while(n <= 0);

    // ALGORITMO + OUTPUT
    do {
       n++;
       // Divisibile per 4 ma non per 100 ma non multiplo di 400
       if (n % 4 == 0 && n % 100 != 0 || n % 400 == 0) {
          printf("Il %d^anno bisestile e' %d\n", i, n);
          i++;
       }
    } while(i <= 5);

    system("pause");
    return(0);
}

ESERCIZIO
 
Richiedi la lunghezza dei 3 lati di un triangolo (quindi numeri reali positivi). Verifica quindi che sia soddisfatta la disuguaglianza triangolare {(Lato + lungo) <= (somma altri 2 lati) } e restituisci il perimetro.

 
SOLUZIONE:
/**************************************************************************
 * Nome: casa2-triangolo.c                                                *
 * Autore: Alessandro Saetti                                              *
 * Data: 16/2/10                                                          *
 **************************************************************************/
#include <stdio.h>
#include <stdlib.h> // Richiesta da system("pause");
/*
 * Nome: main
 * Scopo: Acquisisce la lunghezza dei lati di un triangolo e calcola perimetro 
 * Input: --
 * Output: 0 se il programma termina correttamente
 */
int main() {
    float l1, l2, l3, somma_altri, max_lato, perimetro;

    // INPUT + Controllo correttezza
    printf(" - CALCOLO DEL PERIMETRO - \n");
    printf("Inserisci la lunghezza dei 3 lati di un triangolo e calcolane il perimetro:\n");
    do 
    {
       // INPUT
       printf("Lato 1: ==> ");       
       scanf("%f",&l1);
       printf("Lato 2: ==> ");       
       scanf("%f",&l2);
       printf("Lato 3: ==> ");       
       scanf("%f",&l3);
       
       // ALGORITMO - Verifico che sia soddisfatta la disuguaglianza triangolare
       // Inizio con il considerare come lato + lungo l1
       max_lato = l1;
       somma_altri = l2+l3;
       if (l2 > max_lato) 
       {
          // se l2 > Lato + lungo ==> l2 è il nuovo lato + lungo
          max_lato = l2;
          somma_altri = l1 + l3;
       }
       if (l3 > max_lato)
       {
          // se l3 > Lato + lungo ==> l3 è il nuovo lato + lungo
          max_lato = l3;
          somma_altri = l1 + l2;
       }
       // Continuo a chiedere fino non ho dei reali positivi ed è soddisfatta
       // la disuguaglianza triangolare 
    } while(l1 <= 0 || l2 <= 0 || l3 <= 0 || somma_altri < max_lato);
    // ALGORITMO: determino il perimetro
    perimetro = l1 + l2 + l3;
    //OUTPUT
    printf("Il perimetro e': %.2f\n", perimetro);

    system("pause");
    return(0);
}

ESERCIZIO
 
Costruire il programma che chiede inizialmente il numero di valori da leggere. Successivamente legge la sequenza di numeri e al termine ne restituisce la media.

 
SOLUZIONE:
/**************************************************************************
 * Nome: casa3-media.c                                                    *
 * Autore: Alessandro Saetti                                              *
 * Data: 16/2/10                                                          *
 **************************************************************************/
#include <stdio.h>
#include <stdlib.h> // Richiesta da system("pause");
/*
 * Nome: main
 * Scopo: Stampa la media tra n numeri acquisiti da tastiera
 * Input: --
 * Output: 0 se il programma termina correttamente
 */
int main() 
{
    int i,n,x,somma=0;
    float media;

    // INPUT
    printf(" - CALCOLO DELLA MEDIA - \n");
    // Leggo quanti valori leggere
    printf("Inserisci il numero di valori da leggere:\n");
    do {
        printf("==> ");       
        scanf("%d",&n);
    } while(n < 0);
    // - Leggo gli n valori
    printf("Inserisci %d numeri interi:\n", n);
    for (i=1; i <= n; i++) 
    {
        printf("%d numero: ==> ", i);       
        scanf("%d",&x);
        somma+=x;
    }
    // ALGORITMO - si noti il risultato che si ottiene scrivendo: (float)(somma/n)
    media=(float)somma/n; 
    // OUTPUT
    printf("La media e': %.2f\n",media);

    system("pause");
    return(0);
}

ESERCIZIO
 
Costruire un programma che visualizza il calendario del mese basandosi su due dati (richiesti all'utente!):
- numero di giorni nel mese
- giorno della settimana del primo del mese

 
SOLUZIONE:
/**************************************************************************
 * Nome: casa4-calendario.c                                               *
 * Autore: Alessandro Saetti                                              *
 * Data: 16/2/10                                                          *
 **************************************************************************/
#include <stdio.h>
#include <stdlib.h> // Richiesta da system("pause");
/*
 * Nome: main
 * Scopo: Stampa calendario mensile
 * Input: --
 * Output: 0 se il programma termina correttamente
 */
int main()
{
    int i, n, gg_inizio, num_gg;
    
    // INPUT - Inizializzazione
    n=0;
    printf("Digita:\n- Il numero di giorni nel mese: ");
    scanf("%d", &num_gg);
	printf("- il giorno della settimana con cui inizia il mese\n");
    printf("  (1=>Dom., 2=>Lun., ..., 7=>Sab.): ");
    scanf("%d", &gg_inizio);                     

    // ALGORITMO = OUTPUT 
    printf("\n D\t L\t M\t M\t G\t V\t S\n");
    for (i=1; i < gg_inizio; i++, n++)
        printf("  \t");

    for (i=1; i <= num_gg; i++) 
    {
        printf("%2d\t", i);
        n++;
        if ( (n%7 == 0) && (n!=0))
           printf("\n");    
    }

    printf("\n\n");
    system("pause");
    return(0);
}

ESERCIZIO
 
Costruire un programma che determini, in una sequenza di valori casuali compresi tra -50 e 50, il più piccolo numero maggiore del minino.

 
SOLUZIONE:
NOTE:
int rand() => Restituisce un numero intero casuale tra 0 e RAND_MAX. Il valore RAND_MAX dipende dalla libreria. Vale almeno 32767. Richiede <stdlib.h>.

void srand ( unsigned int seed ); => Inizializza il generatore di numeri casuali. Richiede <stdlib.h>. Usando come argomento time(NULL) facciamo variare il seme (seed) in funzione del tempo e di conseguenza anche le sequenze generate.

time_t time ( time_t * timer ); => Restituisce l'orario corrente come oggetto time_t e lo registra anche nel parametro *timer (se questo non è posto a NULL!). Il tipo time_t restituito dalla funzione time() è un numero intero che contiene il numero di secondi trascorsi dalle 00:00 del 1 gennaio 1970 (corrisponde al timestamp di unix). In questo modo la rappresentazione del tempo consente di effettuare delle operazioni aritmentiche. Richiede <time.h>.
/**************************************************************************
 * Nome: casa1-secondoMin.c                                               *
 * Autore: Alessandro Saetti                                              *
 * Data: 23/2/10                                                          *
 **************************************************************************/
#include <stdio.h>
#include <stdlib.h>  // Richiesta da system("pause");
#include <time.h>    // Richiesta da time();
#define DIM 100
#define LB -50
#define UB 50
/*
 * Nome: main
 * Scopo: Trova il numero nel vettore per il quale esiste un numero piu' piccolo
 * Input: --
 * Output: 0 se il programma termina correttamente
 */
int main() 
{
    int vet[DIM], i, min, min2;
    // INPUT - INIZIALIZZAZIONE
    // - Inizializzo il generatore di numeri casuali
    srand(time(NULL));
    // - genero DIM numeri interi tra -50 e +50
    for (i=0; i < DIM; i++) 
        vet[i] = rand() % (UB-LB+1) +LB;

    // ALGORITMO
    // Pongo come minimi di default l'upper bound della sequenza ovvero 50
    // bound della sequenza
    min = UB;
    min2 = UB;
    for ( i=0; i < DIM ; i++ ) 
    {
        if (vet[i] < min) 
        {
           // Se il valore analizzato è + piccolo del minimo allora il minimo
           // diventa il 2^ minimo mentre il valore analizzato diviene il nuovo
           // minimo
           min2 = min;
           min = vet[i];
        }
        else if (vet[i] < min2) 
        {
           // Se il valore analizzato è + piccolo del 2° minimo allora 
           // il valore analizzato diviene il nuovo 2^ minimo
           min2 = vet[i];
        }
    }

    // OUTPUT
    for (i=0; i < DIM; i++) 
       printf("%5d", vet[i]);
    printf("\nIl Numero piu' piccolo superiore al minimo (%d) e': %d\n", min, min2);

    system("pause");
    return(0);
}

ESERCIZIO
 
Costruire un programma che trovi in un elenco di N numeri quello con il maggior numero di divisori.

 
SOLUZIONE:
NOTE:
int rand() => Restituisce un numero intero casuale tra 0 e RAND_MAX. Il valore RAND_MAX dipende dalla libreria. Vale almeno 32767. Richiede <stdlib.h>.

void srand ( unsigned int seed ); => Inizializza il generatore di numeri casuali. Richiede <stdlib.h>. Usando come argomento time(NULL) facciamo variare il seme (seed) in funzione del tempo e di conseguenza anche le sequenze generate.

time_t time ( time_t * timer ); => Restituisce l'orario corrente come oggetto time_t e lo registra anche nel parametro *timer (se questo non è posto a NULL!). Il tipo time_t restituito dalla funzione time() è un numero intero che contiene il numero di secondi trascorsi dalle 00:00 del 1 gennaio 1970 (corrisponde al timestamp di unix). In questo modo la rappresentazione del tempo consente di effettuare delle operazioni aritmentiche. Richiede <time.h>.
/**************************************************************************
 * Nome: casa2-maxdivisori.c                                              *
 * Autore: Alessandro Saetti                                              *
 * Data: 23/2/10                                                          *
 **************************************************************************/
#include <stdio.h>
#include <stdlib.h>  // Richiesta da system("pause");
#include <time.h> // Richiesta da time();
#define DIM 20
#define LB 10
#define UB 100
/*
 * Nome: main
 * Scopo: Trova il numero in un vettore con il massimo numero di divisori 
 * Input: --
 * Output: 0 se il programma termina correttamente
 */
int main() 
{
    int vet[DIM], i, j, n, numdiv, max_div = 0, best;

    // INPUT E INIZIALIZZAZIONE
    // - leggo il valore massimo
    printf("Immetti un intero (> 10 e < 100):\n");    
    do {
       printf(": --> ");
       scanf("%d", &n);
    } while (n <= LB || n>= 100);
    // - Inizializzo il generatore di numeri casuali
    srand(time(NULL));
    // - genero DIM numeri interi tra 10 e 100
    for (i=0; i < DIM; i++) 
        vet[i] = rand() % (n-LB+1) +LB;
    // ALGORITMO
    max_div = 0;
    for (i=0; i max_div) 
        {
           max_div = numdiv;
           best = vet[i];
        }
    }
    // OUTPUT
    for (i=0; i < DIM; i++) 
       printf("%5d", vet[i]);
    printf("\nIl numero con piu' divisori (%d) : %d\n",max_div, best);

    system("pause");
    return(0);
}

ESERCIZIO
 
Costruire un programma che generi una matrice 4x3 e visualizzi la somma degli elementi su ogni riga e colonna.

 
SOLUZIONE:
NOTE:
int rand() => Restituisce un numero intero casuale tra 0 e RAND_MAX. Il valore RAND_MAX dipende dalla libreria. Vale almeno 32767. Richiede <stdlib.h>.

void srand ( unsigned int seed ); => Inizializza il generatore di numeri casuali. Richiede <stdlib.h>. Usando come argomento time(NULL) facciamo variare il seme (seed) in funzione del tempo e di conseguenza anche le sequenze generate.

time_t time ( time_t * timer ); => Restituisce l'orario corrente come oggetto time_t e lo registra anche nel parametro *timer (se questo non è posto a NULL!). Il tipo time_t restituito dalla funzione time() è un numero intero che contiene il numero di secondi trascorsi dalle 00:00 del 1 gennaio 1970 (corrisponde al timestamp di unix). In questo modo la rappresentazione del tempo consente di effettuare delle operazioni aritmentiche. Richiede <time.h>.
/**************************************************************************
 * Nome: casa3-sommaRigheColonne.c                                        *
 * Autore: Alessandro Saetti                                              *
 * Data: 23/2/10                                                          *
 **************************************************************************/
#include <stdio.h>
#include <stdlib.h>  // Richiesta da system("pause");
#include <time.h> // Richiesta da time();
#define NR_RIGHE 4
#define NR_COLONNE 3
#define UB 9
/*
 * Nome: main
 * Scopo: Somma righe e colonne
 * Input: --
 * Output: 0 se il programma termina correttamente
 */
int main() 
{
    int mat[NR_RIGHE][NR_COLONNE], i, j, somma ;
    // INPUT-INIZIALIZZAZIONE
    // - Inizializzo il generatore di numeri casuali
    srand(time(NULL));
    // - genero i numeri interi della matrice 4x3
    for (i=0; i < NR_RIGHE; i++) 
    {
        for (j=0; j < NR_COLONNE; j++) 
        {
            mat[i][j] = rand() % UB + 1;
            printf("%3d", mat[i][j]);
        }
        printf("\n");
    }
    // ALGORITMO + OUTPUT
    for (i=0; i < NR_RIGHE; i++) 
    {
        somma = 0;
        for (j=0; j < NR_COLONNE; j++)
            somma += mat[i][j];
        printf("\nSomma riga %d: %d", i+1, somma);
    }
    for (i=0; i < NR_COLONNE; i++) 
    {
        // Scrittura in forma compatta
        for (j=0, somma = 0; j < NR_RIGHE; somma += mat[j++][i]);
        printf("\nSomma colonna %d: %d", i+1, somma);
    }
    printf("\n\n");

    system("pause");
    return(0);
}

ESERCIZIO
 
Costruire un programma che calcoli il prodotto tra una matrice NxM (generata automaticamente) e un vettore M-Dimensionale e mostri il risultato.

 
SOLUZIONE:
NOTE:
int rand() => Restituisce un numero intero casuale tra 0 e RAND_MAX. Il valore RAND_MAX dipende dalla libreria. Vale almeno 32767. Richiede <stdlib.h>.

void srand ( unsigned int seed ); => Inizializza il generatore di numeri casuali. Richiede <stdlib.h>. Usando come argomento time(NULL) facciamo variare il seme (seed) in funzione del tempo e di conseguenza anche le sequenze generate.

time_t time ( time_t * timer ); => Restituisce l'orario corrente come oggetto time_t e lo registra anche nel parametro *timer (se questo non è posto a NULL!). Il tipo time_t restituito dalla funzione time() è un numero intero che contiene il numero di secondi trascorsi dalle 00:00 del 1 gennaio 1970 (corrisponde al timestamp di unix). In questo modo la rappresentazione del tempo consente di effettuare delle operazioni aritmentiche. Richiede <time.h>.
/**************************************************************************
 * Nome: casa4-prodottomat.c                                              *
 * Autore: Alessandro Saetti                                              *
 * Data: 23/2/10                                                          *
 **************************************************************************/
#include <stdio.h>
#include <stdlib.h>  // Richiesta da system("pause");
#include <time.h> // Richiesta da time();
#define NR_RIGHE 4
#define NR_COLONNE 5
#define UB 9
/*
 * Nome: main
 * Scopo: Calcola il prodotto tra una matrice ed un vettore
 * Input: --
 * Output: 0 se il programma termina correttamente
 */
int main()
{
    int M[NR_RIGHE][NR_COLONNE], V[NR_COLONNE], i, j, somma ;
    // INPUT-INIZIALIZZAZIONE
    // - Inizializzo il generatore di numeri casuali
    srand(time(NULL));
    // - genero i numeri interi della matrice 4x5
    printf("Matrice %dx%d :\n\n",NR_RIGHE,NR_COLONNE);
    for (i=0; i < NR_RIGHE; i++) 
    {
        for (j=0; j < NR_COLONNE; j++) 
        {
            M[i][j] = rand() % UB + 1;
            printf("%3d", M[i][j]);
        }
        printf("\n");
    }
    // Chiedo il vettore  
    printf("\nInserisci i %d numeri interi relativi al vettore V:\n\n",NR_COLONNE);
    for (i=0 ; i < NR_COLONNE ; i++) 
    {
        do {
            printf("V[%d] --> ",i);
            scanf("%d",&V[i]);
        } while (V[i] <= 0 || V[i] > UB);
    }
    // ALGORITMO+OUTPUT
    printf("\nIl vettore prodotto e':\n\n");
    for(i=0 ; i < NR_RIGHE ;i++) 
    {
        somma = 0;
        for(j=0; j < NR_COLONNE ; j++)                    
           somma += M[i][j] * V[j];
        printf("%4d\n",somma);
    }
    printf("\n");

    system("pause");
    return(0);
}

ESERCIZIO
 
Testo esercizio
 
SOLUZIONE:
Soluzione C++
Soluzione JavaScript
Soluzione VBA
Soluzione ASP
Soluzione PHP