Numeri complessi in C
Buongiorno a tutti, il progetto che inserisco oggi, più che un progetto, è un file di programmazione che serve a gestire i numeri complessi nel linguaggio C. Il file completo che verrà inserito alla fine della pagina è composto da molte funzioni che servono per effettuare tutti i conti dei numeri complessi. L'obiettivo di questo post è presentare queste funzioni affinchè possano essere utilizzate in progetti di diverse nature, come magari una macchina con movimentazione su due assi e controllate da PC. Verrano spiegate tutte le funzioni una alla volta, ma prima di tutto, la definizione di numero complesso, che in C non è contemplata. Queste funzioni possono essere copiate ed utilizzate in qualsiasi vostro programma.
Il compilatore utilizzato è: dev-c++ 4.9.7.0
Definizione di un nuovo tipo di dato...
Come già accennato, il linguaggio di programmazione non contempla il tipo di dato "numero complesso", quindi dobbiamo crearlo e lo definiamo così:
typedef struct {float x; float y;} nC;
Adesso nC è un nuovo tipo di dato, come lo è int, float, char etc.
Per accedere a tale dato scriviamo :
nC numero; //DICHIARAZIONE DI UNA VARIABILE DI NOME NUMERO, DI TIPO nC (NUMERO COMPLESSO).
numero.x=4; //la parte reale di numero vale 4.
numero.y=5 //la parte immaginaria di numero vale 5.
Le dichiarazioni delle funzioni sono queste:
void printc(nC);
nC inserisci();
float absmio(float);
nC somma(nC, nC);
nC coniugato(nC);
float modulo(nC);
float fase (nC);
nC moltiplicazione(nC, nC);
nC divisione(nC, nC);
nC trigalg (float, float);
1-La funzione printc serve per stampare a schermo un numero complesso ed essa non ritorna niente.
2-La funzione inserisci serve per asegnare un valore complesso ad una variabile complessa, essa ritorna una struct di tipo nC. es.:
nC numero;
numero=inserisci();
(una interfaccia grafica interrogherà l'utente per inserire la parte reale ed immaginaria del numero).
3-La funzione abs ritorna il valore assoluto di un INT o FLOAT.
4-La funzione somma riceve in ingresso due numeri di tipo nC e ritorna una struct nC che è la somma delle 2 in ingresso.
5-La funzione coniugato riceve in ingresso un numero di tipo nC e ritorna una struct di tipo nC che è il complesso coniugato di quello in ingresso.
6-La funzione modulo ritorna un float che è il modulo del numero complesso ricevuto in ingresso.
7-La funzione fase ritorna un float che è la fase del numero complesso ricevuto in ingresso.
8-La funzione moltiplicazione riceve in ingresso due numeri complessi e ritorna un numero complesso che è il prodotto dei due in ingresso.
9-La funzione divisione ritorna il quoziente dei due numeri complessi ricevuti in ingresso.
10-La funzione trigalg riceve in ingresso il modulo e fase di un numero complesso e ritorna un numero complesso di tipo nC.
ok adesso credo di avervi annoiati abbastanza quindi scrivo un..........
Esempio di programma
Questo programma presenta un menù nel quale si può scegliere quale operazione fare utilizzando tutte quelle funzioni descritte di sopra.
typedef struct {float x; float y;} nC;
void printc(nC);
nC inserisci();
float absmio(float);
nC somma(nC, nC);
nC coniugato(nC);
float modulo(nC);
float fase (nC);
nC moltiplicazione(nC, nC);
nC divisione(nC, nC);
nC trigalg (float, float);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main () {
int i, o=1;
float z, x;
char c;
nC n, a, v[100];
while (1){
printf("Quale operazione vuoi fare (PREMI 0 per uscire):");
printf("n1-SOMMAn2-CONIUGATOn3-ALGEBRICA A TRIGONOMETRICAn4-MOLTIPLICAZIONEn5-DIVISIONEn6-TRIGONOMETRICA ad ALGEBRICAnn------------->");
do{
fflush(stdin);
scanf("%c", &c);
} while(c<'0'||c>'6');
o=(int)c-48;
switch(o){
case 1 : n=inserisci();a=inserisci(); printc(somma(n, a));getch();break;
case 2 : n=inserisci();printc(coniugato(n));getch();break;
case 3 : n=inserisci();printf("nIl modulo e': %.2f",modulo(n));printf("nIl modulo e': %.2f",fase(n));getch();break;
case 4 : n=inserisci();a=inserisci(); printc(moltiplicazione(n, a));getch();break;
case 5 : n=inserisci();a=inserisci(); printc(divisione(n, a));getch();break;
case 6 : printf("MODULO: ");scanf("%f", &z);printf("FASE: ");scanf("%f",&x);printc(trigalg(z,x));getch();break;
default : return 0; break;}
system("cls");
}
return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////DA QUI IN POI CI SONO GLI ALGORITMI DELLE FUNZIONI
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////STAMPA NUMERO COMPLESSO
void printc(nC n)
{
char segnox, segnoy;
if (n.x<0)
segnox='-';
else
segnox='+';
if (n.y<0)
segnoy='-';
else
segnoy='+';
if (n.x<0)
n.x=absmio(n.x);
if (n.y<0)
n.y=absmio(n.y);
printf("nIl numero complesso e': %c%.2f %cJ%.2f", segnox, n.x, segnoy, n.y);
}
//////////////////////INSERISCI
nC inserisci (){
nC n;
printf("nInserire parte reale: ");
scanf("%f", &n.x);
printf("Inserire parte immaginaria: ");
scanf("%f", &n.y);
return n;
}
//////////////////////ABSMIO
float absmio (float i){
if (i<0)
return (i=i*(-1));
else
return i;
}
//////////////////////SOMMA
nC somma (nC a, nC b){
nC n;
n.x=a.x+b.x;
n.y=a.y+b.y;
return n;
}
//////////////////////CONIUGATO
nC coniugato (nC a){
a.y=a.y*(-1);
return a;
}
//////////////////////MODULO
float modulo (nC a){
float modulo;
modulo=sqrt((a.x*a.x)+(a.y*a.y));
return modulo;
}
//////////////////////FASE
float fase (nC a){
float fase;
fase=atan(a.y/a.x);
fase=(fase/3.141516)*180;
if(a.x<0 && a.y>0 || a.x<0&&a.y<0)
fase=fase+180;
return fase;
}
//////////////////////TRIGALG
nC trigalg (float a, float i){
nC c;
c.x=a*(cos((i/180)*3.1415));
c.y=a*(sin((i/180)*3.1415));
return c;
}
//////////////////////MOLTIPLICAZIONE
nC moltiplicazione (nC a, nC b){
nC c;
c.x=a.x*b.x-a.y*b.y;
c.y=a.x*b.y+b.x*a.y;
return c;
}
//////////////////////DIVISIONE
nC divisione (nC a, nC b){
nC c;
c=moltiplicazione(a,coniugato(b));
c.x=c.x/(b.x*b.x+b.y*b.y);
c.y=c.y/(b.x*b.x+b.y*b.y);
return c;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Chiunque può utilizzare e modificare queste funzioni come meglio crede.
Attenzione!Non mi rendo responsabile per eventuali danni a persone e/o cose derivanti dall' uso di questi algoritmi!