Lab 1 Komplexa tal med funktioner.

 lab1.pdf

Labtillfälle 1 och 2

Teckentömning av inmatningsbufferten
Alla tecken Du skriver på tangentbordet hamnar i datorns inmatningsbuffert. Även de tecken Du inte tänker på, som tex. "return"-tecknet. Om man gör  scanf("%c", &tecken);  är risken stor att variabeln  tecken  inte kommer att innehålla det tecken Du matat in, utan i stället något "icke svärtande tecken" som blivit kvar i teckenbufferten.
Man undviker sådana svårupptäckta fel genom att "tömma" teckenbufferten innan man använder  scanf("%c", &tecken); .

while(getchar() != '\n') /* nothing */ ;


Laborationsuppgift

( Laborationsuppgift av kenneth Börgesson )

Programspråket C har först helt nyligen fått in komplexa tal i standarden. Uppgiften på denna laboration, och de kommande laborationerna är att från grunden bygga program för kompelexa tal. I laborationen utgår vi därför ifrån att kompilatorn inte har några funktioner för komplexa tal ( oavsett om detta är sant eller ej ).

Komplexa tal består av talpar och med dessa går det att göra liknande operationer som med vanliga tal, dvs + - * och /.
Har Du aldrig hört talas om komplexa tal, är det lika bra att bara ta detta som den rena programmeringsuppgift det är, och bara följa de givna formlerna. Vill Du passa på att repetera komplexa tal så läser Du först detta repetitionshäfte.

Inmatning av två komplexa tal

Alla rutor som som är inramade med dubbla streck i JSP-diagrammet ska programmeras som funktioner!
Inmatning av två komplexa tal innebär inmatning av fyra tal, a1 b1 a2 b2. Dessa fyra tal ska sedan "överföras" till huvudprogrammet. Hur? En C-funktion har bara ett returvärde. Lösningen är att använda referensöverföring med pekare. Repetera därför Övning funktioner uppgift 1.3.

inmatning1()
Provkör. Fungerar inte! Vid anropet av inmatning1() skickar man med pekare till a och b. scanf() lägger de två flyttalen i pekarna som därigenom "pekar fel"!
Det som skrivs ut blir a=1 och b=2 oavsett vad man matat in.

#include <stdio.h>
#include <stdlib.h>

void inmatning1(double *, double *);

int main(int argc, char *argv[])
{
  double a = 1, b = 2;
  inmatning1(&a,&b);
  printf("%f %f\n",a,b);
  system("PAUSE");	
  return 0;
}

void inmatning1(double *a, double *b) {
  printf("Mata in två stycken flyttal: ");   
  scanf("%lf %lf",&a,&b);  
}

inmatning2()
Provkör. Nu fungerar programmet (men som det kommer att visa sig på ett onödigt komplicerat sätt).
Vid anropet av inmatning1() skickar man med pekare till a och b. scanf() lägger de två inmatade flyttalen i lokala variabler c och d. Därefter läggs c och d där *a och *b pekar, dvs i variablerna a och b. Det som skrivs ut blir de tal som matats in.

#include <stdio.h>
#include <stdlib.h>

void inmatning2(double *, double *);

int main(int argc, char *argv[])
{
  double a = 1, b = 2;
  inmatning2(&a,&b);
  printf("%f %f\n",a,b);

  system("PAUSE");	
  return 0;
}

void inmatning2(double *a, double *b) {
  double c, d;
  printf("Mata in två stycken flyttal: ");   
  scanf("%lf %lf",&c,&d);  
  *a = c;
  *b = d;
}

inmatning3()
Provkör. Detta är det riktiga sättet.
Vid anropet av inmatning3() skickar man med pekare till a och b. Eftersom scanf() använder pekare för att placera ut de inmatade talen så räcker det med att man anger a och b - de är ju redan pekare!

#include <stdio.h>
#include <stdlib.h>

void inmatning3(double *, double *);

int main(int argc, char *argv[])
{
  double a = 1, b = 2;
  inmatning3(&a,&b);
  printf("%f %f\n",a,b);

  system("PAUSE");	
  return 0;
}

void inmatning3(double *a, double *b) {
  printf("Mata in två stycken flyttal: ");   
  scanf("%lf %lf",a,b);  
}

Produktberäkning och Kvotberäkning

Komplexa tal

Produkt och kvot mellan komplexa tal kan beräknas på olika sätt. I princip räcker det med att använda de fyra räknesätten mellan de inmatade talen, det är egentligen inte nödvändigt med några avancerade matematikfunktioner.
Detta kan utnyttjas för att med komplexa operationer vrida och skala grafik i spelprogram och CAD-program.

Produkt

Kvot

Produkt och kvot med |z| och arg(z)

Den som vill pröva på C:s matematikfunktioner kan beräkna produkten och kvoten med hjälp av de komplexa talens belopp |z| och argument arg(z).
För att få tillgång till C:s matematikfunktioner skriver man #include <math.h>.

Produkt

Kvot

Från |z| och arg(z) till z gäller följande formel:

Den som väljer denna omvandlingsmetod får sig således en ordentlig genomkörare med C:s matematikfunktioner!

TIPS! Tag en titt på C:s funktion atan2(). Eftersom den tar två argument a och b så svarar den alltid med vinkeln i rätt kvadrant!

Testa ditt program!

Ta sifferexempel från repetitionshäftet att pröva programmet med.

Fråga 9
Vad blir z = z1×z2 om z1 = j och z2 = 1 - j .
Svar: 1 + j

Fråga 11
Beräkna z = z1/z2 om z1 = 2 + 3j och z2 = 1 + j .
Svar: 2,5 + 0,5j

Länk till  Kalkylator för komplexa tal 

Lycka till!

 © William Sandqvist     william@kth.se