5 - MODULARIZZAZIONE
versione 16/01/2013
 
ESERCIZIO
 
Costruire un programma che legge da un file testuale una sequenza di numeri complessi, li coniuga e li mostra a video.

 
SOLUZIONE:
OSSERVAZIONI:

1) Per approfondimenti relativi alla modularizzazione di un progetto clicca qui

2) Per approfondimenti relativi alla gestione dei files testuali clicca qui

main.c
/**************************************************************************
 * Nome: main.c                                                           *
 * Autore: Alessandro Saetti                                              *
 * Data: 6/4/10                                                           *
 **************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include "complessi.h"
#define DIM 100
/*
 * Nome: main
 * Scopo: Gestione di numeri complessi
 * Input: -
 * Output: 0, se il programma termina correttamente
 */
int main() 
{
    /* Per visualizzare la directory corrente
    char *Path=NULL;
    size_t size;
    Path=(char *)getcwd(Path,size);
    printf("Directory corrente: \n%s\n",Path); */
    
    int n;
    tComplex v[DIM];
   	FILE *fp = fopen("dati.txt", "r");
	if (fp != NULL) 
    {
        n = fscanf_C(fp, v);
        printAll(v, n);     
        printf("Coniugati:\n");
        // coniugo tutti i numeri complessi
        ConjAll(v, n);     
        printAll(v, n);     
    }
    else
    {
        printf("\nErrore apertura file!\n");
        system("pause");
        exit(1);
    }

    system("pause");
    return 0;
}
complessi.h
#ifndef COMPLESSI_H
#define COMPLESSI_H

typedef struct 
{
   float r;  /*real part*/
   float i;  /*imag part*/
} tComplex;

int fscanf_C(FILE *fp, tComplex v[]);
void ConjAll (tComplex v[], int n);
void printAll (tComplex v[], int n);

#endif
complessi.c
#include <stdio.h>
#include "complessi.h"
/*
 * Nome: fscanf_C
 * Scopo: Legge una sequenza di numeri complessi da file
 * Input: FILE *fp : puntatore al file contenente i dati
 *        tComplex v[]: vettore che conterrā l'elenco dei numeri letti
 * Output: numero di valori complessi letti
 */
int fscanf_C(FILE *fp, tComplex v[]) 
{
    int i = 0;
    while(feof(fp) == 0) 
      if (fscanf(fp, "%f%fi", &v[i].r, &v[i].i) > 0)
         i++; // se ho letto qualcosa incremento i
    return i;
}
/*
    Si definisce complesso coniugato di un numero complesso quello ottenuto 
    dal primo cambiando il segno della parte immaginaria. Pensando il numero
    complesso come punto del piano complesso, il suo complesso coniugato č 
    il punto riflesso all'asse reale.
*/
/*
 * Nome: C_conj
 * Scopo: Coniuga un numero complesso
 * Input: tComplex a: il numero complesso da coniugare
  * Output: il numero complesso coniugato
 */
tComplex C_conj (tComplex a)
{
   tComplex result;
   result.r = a.r;
   result.i = -a.i;
   return(result);
}
/*
 * Nome: ConjAll
 * Scopo: Coniuga una sequenza di numeri complessi
 * Input: tComplex v[]: vettore contenente la sequenza di numeri
 *        complessi da coniugare
 * Output: --
 */
void ConjAll (tComplex v[], int n)
{
    int i;
    for (i = 0; i < n; i++) 
        v[i] = C_conj(v[i]);
}
/*
 * Nome: print
 * Scopo: Stampa a video un numero complesso
 * Input: tComplex a: numero complesso da stampare
 * Output: --
 */
void print(tComplex a)
{
    printf("%.2f", a.r);
    if (a.i > 0) 
       printf("+%.2fi\n", a.i);
    else if (a.i < 0)
        printf("%.2fi\n", a.i);      
}
/*
 * Nome: printAll
 * Scopo: Stampa a video una sequenza di numeri complessi
 * Input: tComplex v[]: sequenza di numeri complessi da stampare
 * Output: --
 */
void printAll (tComplex v[], int n)
{
    int i;
    for (i = 0; i < n; print(v[i++]));
}

ESERCIZIO
 
Costruire un programma che legge da un file testuale una sequenza di numeri complessi, li coniuga e li mostra a video. La struttura dati deve essere occultata.

 
SOLUZIONE:
OSSERVAZIONI:

1) Per approfondimenti relativi alla modularizzazione di un progetto clicca qui

Nell'esempio sottostante non ho alcun riferimento alla struttura dati utilizzata per memorizzare le informazioni main.c
/**************************************************************************
 * Nome: main.c                                                           *
 * Autore: Alessandro Saetti                                              *
 * Data: 6/4/10                                                           *
 **************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include "complessi.h"
/*
 * Nome: main
 * Scopo: Gestione di numeri complessi
 * Input: -
 * Output: 0, se il programma termina correttamente
 */
int main() 
{
   	FILE *fp = fopen("complessi.txt", "r");
	if (fp == NULL) 
	{
        printf("\nErrore apertura file!\n");
        exit(1);
    }

    fscanf_C(fp);
    printAll();     
    printf("Coniugati:\n");
    ConjAll();     
    printAll();     
	// Pausa per non chiudere la finestra DOS
    system("pause");
    return 0;
}
complessi.h
#ifndef COMPLESSI_H
	#define COMPLESSI_H
	void ConjAll ();
	void printAll ();
	void fscanf_C(FILE *fp); 
#endif
complessi.c
#include <stdio.h>
#include <math.h>
#include "complessi.h"

#define DIM 100

typedef struct 
{
   float r;  /*real part*/
   float i;  /*imag part*/
} Complex;

Complex v[DIM];
int n = 0;

void fscanf_C(FILE *fp) 
{
    while(feof(fp) == 0) 
      if (fscanf(fp, "%f%fi", &v[n].r, &v[n].i) > 0) 
		n++;
}
/* ------------------------------------------------------------------------------
    Si definisce complesso coniugato di un numero complesso quello ottenuto 
    dal primo cambiando il segno della parte immaginaria. Pensando il numero
    complesso come punto del piano complesso, il suo complesso coniugato č 
    il punto riflesso all'asse reale.
--------------------------------------------------------------------------------- */
/*
 * Nome: C_conj
 * Scopo: Coniuga un numero complesso
 * Input: tComplex a: il numero complesso da coniugare
 * Output: il numero complesso coniugato
 */
tComplex C_conj (tComplex a)
{
   tComplex result;
   result.r = a.r;
   result.i = -a.i;
   return(result);
}
/*
 * Nome: ConjAll
 * Scopo: Coniuga una sequenza di numeri complessi
 * Input: --
 * Output: --
 */
void ConjAll ()
{
    int i;
    for (i = 0; i < n; i++) 
		v[i] = C_conj(v[i]);
}

/*
 * Nome: print
 * Scopo: Stampa a video un numero complesso
 * Input: tComplex a: numero complesso da stampare
 * Output: --
 */
void print(tComplex a)
{
    printf("%.2f", a.r);
    if (a.i > 0) 
       printf("+%.2fi\n", a.i);
    else if (a.i < 0)
        printf("%.2fi\n", a.i);      
}
/*
 * Nome: printAll
 * Scopo: Stampa a video una sequenza di numeri complessi
 * Input: --
 * Output: --
 */
void printAll ()
{
    int i;
    for (i = 0; i < n; print(v[i++]));
}

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