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

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу

Комплексни бројеви

Написати програм у програмском језику C за рад са комплексним бројевима. Претпоставити да се комплексни бројеви у меморији рачунара чувају помоћу следеће структуре:

typedef struct complexNumber {

          double real, imaginary;

} ComplexNumber;

Ова декларација се налази у фајлу са називом тyпе.х. Приликом реализације програма неопходно је укључити овај фајл свугде где се користи дати тип. Програм реализовати према следећим ставкама:

  • 1. Написати потпрограм ЦомплеxНумбер сум ( ЦомплеxНумбер а, ЦомплеxНумбер б ); који сабира два комплексна броја а и б и резултат враћа као повратну вредност функције.
  • 2. Написати потпрограм воид цоњугате ( ЦомплеxНумбер *а ); који коњугује комплексни број на који показује показивач а.
  • 3. Написати потпрограм воид wрите ( ЦомплеxНумбер а ); који исписује комплексни број а.
  • 4. Написати потпрограм инт исНумбер ( цхар *стринг ); који проверава да ли низ карактера на који показује показивач стринг представља валидан реалан број.
  • 5. Коришћењем претходно реализованих потпрограма написати главни програм који добија четири аргумената преко командне линије. Главни програм треба да провери да ли су проследјени аргументи валидни реални бројеви и уколико јесу да од прва два формира једна комплексан број, а од друга два други комплексни број. Након тога потребно је наћи и исписати суму два комплексна броја, као и коњугиоване вредности оригиналних комплексних бројева. Уколико аргументи не представљају валидне реалне бројеве потребно је прекинути извршавање програм са повратном вредношћу 0.

Прва функција

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

Друга функција

#include "types.h"

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

Трећа функција

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

Четврта функција

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

Пета функција

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