5 - MODULARIZZAZIONE
versione 16/01/2013
|
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++]));
}
|
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++]));
}
SOLUZIONE:
Soluzione C++
Soluzione JavaScript
Soluzione VBA
Soluzione ASP
Soluzione PHP