Enrere Mòdul 7
Fonaments de programació. Llenguatge C/C++---
Pràctica    Resum teòric Exercicis
Pràctica d'ampliació

 
Suma i producte de nombres complexos

En aquesta pràctica veurem les dues formes de passar paràmetres d'estructura a una funció: per valor i per referència.

 

Desenvolupament de la pràctica

Els nombres complexos són una aplicació comú de les variables estructura. Els nombres complexos pertanyen als coneixements que molts de nosaltres hem adquirit a l'ensenyament secundari. En aquest conjunt, les operacions aritmètiques: suma, resta, producte i divisió es poden definir trivialment a partir de les operacions aritmètiques de nombres reals.

Un nombre complex és un parell ordenat de nombres reals (a,b) -habitualment s'escriu a+bi- . a rep el nom de part real, i b el nom de part imaginària

Si tenim dos nombres complexos: a+bi i c+di, la suma es defineix com un altre nombre complex, la part real del qual és la suma de les parts reals dels nombres complexos inicials i la seva part imaginària és la suma de les parts imaginàries dels nombres complexos inicials, és a dir:

a+bi + c+di = (a+c) + (b+d)i

El producte de nombres complexos és una mica més sofisticat. Es defineix de la següent forma:

(a+bi) *(c+di) = (a*c-b*d) + (a*d+b*c)i

En aquesta pràctica construirem dues funcions que ens permeti fer aquestes dues operacions amb nombres complexos.

Definiu un projecte nou anomenat m7p06 i afegiu-li un arxiu de font C/C++ anomenat m7p06.cpp. Escriviu el següent codi:

//m7p06.cpp: Suma de nombres complexos

#include <stdio.h>

struct complex {
    int re;
    int im;
};

void impr(complex );
void
suma(complex , complex , complex* );
void producte(complex, complex, complex*);



void main(){
    complex z1,z2,zr;
    printf("Introduïu els operadors. Per introduir un nombre 
         complex\n");
    printf("amb part imaginària negativa poseu a+-bi...\n");
    printf("introduïu z1 (format x+yi):...");
    scanf("%d+%di",&z1.re, &z1.im);

    printf("introduïu z2 (format x+yi):...");
    scanf("%d+%di",&z2.re, &z2.im);

 
    suma(z1,z2,&zr);
    impr(z1);printf("+ ");impr(z2);printf("= ");
    impr(zr);
printf("\n");

    producte(z1,z2,&zr);
    impr(z1);printf("* ");impr(z2);printf("= ");
    impr(zr);printf("\n");


}


void impr(complex a){
    printf("%d+%di ", a.re, a.im);
}


void suma(complex a, complex b, complex* c){
    c->re=a.re+b.re;
    c->im=a.im+b.im;
}

void producte(complex a, complex b, complex* c){
    c->re=a.re*b.re-a.im*b.im;
    c->im=a.im*b.re+a.re*b.im;
}

Explicació del programa

En aquest programa es defineix l'estructura complex amb dos camps enters anomenats re i im. Aquests dos camps correspondran a la part real i a la part imaginària del nombre complex.

L'usuari introduirà les parts real i imaginària de les dues variables complexes z1 i z2. El format per introduir les dades és:

nombre enter + nombre enter i

Aquest programa no permet la versió simplificada de no escriure la part imaginària quan aquesta val 1, a més, el signe + és obligatori, encara que la part imaginària sigui negativa. En aquest cas s'escriuran junts els signes + i -. Exemple 2+-3i.

En aquest programa es fan servir dues funcions: impr() i suma(). La primera d'aquestes funcions admet un únic argument que és una variable d'estructura complex. Aquest paràmetre es passa per valor. La funció fa una còpia de tots els camps de la variable i no pot modificar les inicials. 

Les funcions suma() i producte() tenen tres arguments, els dos primers es passen per valor i el tercer es passa per referència. Això últim és necessari ja que les funcions modifiquen aquest tercer argument. Fixeu-vos que la crida a aquestes funcions es fa: suma(z1,z2,&zr) i producte(z1,z2,&zr), és a dir, anteposant l'operador & davant el nom de la variable d'estructura complexa zr.