Програмирање 2/Блок 3

Извор: SI Wiki
< Програмирање 2
Датум измене: 28. јул 2020. у 20:27; аутор: Ivan Pešić (разговор | доприноси) (dodat primer)
(разл) ← Старија измена | Тренутна верзија (разл) | Новија измена → (разл)
Пређи на навигацију Пређи на претрагу

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;
}