Programiranje 2/Blok 3

Izvor: SI Wiki
< Програмирање 2
Datum izmene: 28. jul 2020. u 20:28; autor: Ivan Pešić (razgovor | doprinosi) (ovako je bolje)
Pređi na navigaciju Pređi na pretragu

Kompleksni brojevi

Napisati program u programskom jeziku C za rad sa kompleksnim brojevima. Pretpostaviti da se kompleksni brojevi u memoriji računara čuvaju pomoću sledeće strukture:

typedef struct complexNumber {

          double real, imaginary;

} ComplexNumber;

Ova deklaracija se nalazi u fajlu sa nazivom type.h. Prilikom realizacije programa neophodno je uključiti ovaj fajl svugde gde se koristi dati tip. Program realizovati prema sledećim stavkama:

  • 1. Napisati potprogram ComplexNumber sum ( ComplexNumber a, ComplexNumber b ); koji sabira dva kompleksna broja a i b i rezultat vraća kao povratnu vrednost funkcije.
  • 2. Napisati potprogram void conjugate ( ComplexNumber *a ); koji konjuguje kompleksni broj na koji pokazuje pokazivač a.
  • 3. Napisati potprogram void write ( ComplexNumber a ); koji ispisuje kompleksni broj a.
  • 4. Napisati potprogram int isNumber ( char *string ); koji proverava da li niz karaktera na koji pokazuje pokazivač string predstavlja validan realan broj.
  • 5. Korišćenjem prethodno realizovanih potprograma napisati glavni program koji dobija četiri argumenata preko komandne linije. Glavni program treba da proveri da li su prosledjeni argumenti validni realni brojevi i ukoliko jesu da od prva dva formira jedna kompleksan broj, a od druga dva drugi kompleksni broj. Nakon toga potrebno je naći i ispisati sumu dva kompleksna broja, kao i konjugiovane vrednosti originalnih kompleksnih brojeva. Ukoliko argumenti ne predstavljaju validne realne brojeve potrebno je prekinuti izvršavanje program sa povratnom vrednošću 0.

Prva funkcija

#include <stdio.h>
#include "types.h"

ComplexNumber sum ( ComplexNumber a, ComplexNumber b) {
    ComplexNumber c;
    c.real = a.real + b.real;
    c.imaginary = a.imaginary + b.imaginary;
    
    return c;
}

Druga funkcija

#include "types.h"

void conjugate ( ComplexNumber *a ) {
    a->imaginary *= -1;
}

Treća funkcija

#include <stdio.h>
#include "types.h"

void write ( ComplexNumber a ) {
    char op = a.imaginary >= 0 ? '+' : '-';
    a.imaginary *= (a.imaginary >= 0 ? 1 : -1);
    
    printf("%.4f %c %.4fi", a.real, op, a.imaginary);
}

Četvrta funkcija

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

int isNumber ( char *string ) {
    if (string == NULL) {
    return 0;
    }
    int a;
    double b;
    return sscanf(string, "%*[+-]%lf%n", &b, &a) == 1 && a == strlen(string);
}

Peta funkcija

#include <stdio.h>
#include <stdlib.h>
#include "types.h"
#include <string.h>

int main(int argc, char** argv)
{
    for(int i = 1; i < 5; i++)
      if(!isNumber(argv[i]))
          return 0;

    ComplexNumber a, b, c;
    
    a.real = atof(argv[1]);
    a.imaginary = atof(argv[2]);
    
    b.real = atof(argv[3]);
    b.imaginary = atof(argv[4]);
    
    c.real = a.real + b.real;
    
    c.imaginary = a.imaginary + b.imaginary;
    
    write(c);
    putchar('\n');
    conjugate(&a);
    conjugate(&b);
    
    write(a);
    putchar('\n');
    write(b);
    return 0;
}