Kalkulator liczb zespolonych w postaci kanonicznej.

0

witam

mam napisać kalkulator(+ - / *) liczb zespolonych w postaci kanonicznej
ma on zawierać 2 procedury: wczytywania 2 liczb zespolonych i wypisująca liczbę zespoloną.
Podstawowe działania(+ - / *) mają zostać zaimplementowane za pomoca funkcji.

stworzyłem record składający się z części rzeczywistej i urojonej.
i mam problem z funkcja dodawania 2 liczb zespolonych

mam cos takiego:

uses crt;
type zespolona=record
        re:real;
        im:real;
     end;
var
A,B,D:zespolona;
{************Procedura WCZYTYWANIA LICZB ZESPOLONYCH****************}

procedure wczytaj(var c:zespolona);
begin
with c do
 begin
   writeln('Podaj czesc rzeczywist liczby zespolonej:');
    readln(c.re);
   writeln('Podaj czesc urojona liczby zespolonej:');
    readln(c.im);
 end;
end;

{*************PROCEDURA WYPISYWANIA LICZB ZESPOLONYCH***************}

procedure wypisz;
begin
writeln('1 liczba zespolona: ',A.re:2:1,'+',A.im:2:1,'i');
writeln('2 liczba zespolona: ',B.re:2:1,'+',B.im:2:1,'i');
end;

{***********************FUNKCJA DODAWANIA***************************}
function dodawanie(var A,B:zespolona):zespolona;
begin
dodawanie.re:=A.re+B.re;
dodawanie.im:=A.im+B.im;
end;


BEGIN
clrscr;
wczytaj(A);
wczytaj(B);
wypisz; 
writeln(dodawanie(A,B));


readln;
End.

chodzi o to ze funkcja musi zwrócić jakaś wartość
i nie wiem jak funkcja dodać 2 liczby zespolone
jak robię tak jak mam w kodzie to nie działa wyskakuje błąd z typami

0

W funkcji dodawanie utwórz zmienną typu "zespolona". Do niej wstawiaj wynik dodawania, a funkcja dodawanie niech zwróci tylko tą zmienną. To jak Ty robisz:

dodawanie.re:=A.re+B.re;
dodawanie.im:=A.im+B.im;

moim zdaniem nie powinno działać.

Poza tym z prototypu funkcji możesz wywalić var, bo nie zmieniasz liczb składowych (zwracasz tylko wynik dodawania, nową zmienną).

Poza tym w Pascalu masz typ Complex, więc nie musisz definiować własnego typu liczb zespolonych i operacji na nim :D - http://www.gnu-pascal.de/gpc/Complex-Number-Operations.html
Chyba, że w celach naukowych...

0

poprawiłem tak jak napisałeś
ale teraz jak to wyświetlić? bo ten wartość funkcji dodawanie jest równa rekordowi składającego się z 2 pol rm i im
jak daje cos takiego to nie działa:
writeln(dodawanie(A,B));

0

writeln domyślnie nie wypisuje typów złożonych. Musisz wypisać tylko typy proste, które wyłuskasz z rekordu.

D:=dodawanie(A,B);
writeln(D.re);
writeln(D.im);
0

dzięki działa :)
cały dzień tego na necie szukałem

0

Poza tym w Pascalu masz typ Complex, więc nie musisz definiować własnego typu liczb zespolonych i operacji na nim

Nie wydaje mi się żeby to było na wyposażeniu standardowym. W FPC jest w każdym razie od tego moduł UComplex (nigdy nie używałem, wygląda na starodawny).

jak daje cos takiego to nie działa:
writeln(dodawanie(A,B));

Dział newbie?!

dodawanie.re:=A.re+B.re;
dodawanie.im:=A.im+B.im;
moim zdaniem nie powinno działać.

Ta instrukcja jest poprawna. (przy czym lepiej używać result).

Poza tym z prototypu funkcji możesz wywalić var, bo nie zmieniasz liczb składowych (zwracasz tylko wynik dodawania, nową zmienną).

Najlepiej dać const.

0

wiem ze istnieją gotowe moduły od liczb zespolonych
ale takie mam zadanie ze muszę to zrobić na funkcjach

ale z tym result to i tak nie będzie działać bo są dwa pola

0
googz napisał(a):

ale z tym result to i tak nie będzie działać bo są dwa pola

Totalna bzdura. Po czym wnioskujesz, że z tym Result to i tak nie ędzie działać? Chyba, że masz jakieś inne Result albo nie zrozumiałem o co Tobie chodzi, ale jeżeli zrozumiałem to poniższy kod kompiluje się bez żądnych problemów. Jak widzisz poniżej użyłem Result i nawet FPC nie ma powodów do "narzekań". Sprawdź sam.

program ucz_sie_podstaw;

{$MODE DELPHI}
 
type
  TPodstawyChlopie = record
    Knowledge, Rulez : Word;
  end;

function Foo : TPodstawyChlopie;
begin
  with Result do
  begin
    Knowledge := 31;
    Rulez := 337;
  end;
end;

var
  Boom : TPodstawyChlopie;
begin
  Boom := Foo;
  With Boom do
  begin
    Writeln(Knowledge);
    Writeln(Rulez);
  end;
  Readln;
end.
0
googz napisał(a):

ale z tym result to i tak nie będzie działać bo są dwa pola

Będzie działać.

// Np tak
with result do
begin
  re:=A.re+B.re;
  im:=A.im+B.im;
end;
//albo tak jak przedtem
result.re:=A.re+B.re;
result.im:=A.im+B.im;
0

identifier not found "result"

result.re:=A.re+B.re;
result.im:=A.im+B.im;

z tym result coś nie chce chodzić
mam fpc

0

Podstawowe pytanie, czy dyrektywa {$MODE DELPHI} została dodana, tak jak pokazałem to w swoim kodzie powyżej?

0

nie bo z nią nie chciał zlinkowac w bloodshed dev-pascal

0

O ile wiem pod Dev-Pascalem jak go stosowałem, ta dyrektywa pozwalała spokojnie skompilować kod. Nawet taki WinAPI, który wcześniej przez rzutowanie na PChar(ZmiennaTypuString) na przykład w MessageBoxach nie chciał się skompilowac. Jednak piszesz, że używasz FPC, no to kod jaki podałem na pewno się z taką dyrektywą skompiluje bez żadnych błędów.

0

tak po przepisaniu go do FPC działa dobrze :)

rzucił by ktoś okiem czy dobrze robię?
zostało mi tylko dzielenie
tylko zastanawiam się czy nie da rady zrobić coś z tą zmienna D aby nie była w głównym programie tylko w procedurze czy coś

uses crt;
type zespolona=record
        re:real;
        im:real;
     end;
var
A,B,D:zespolona;
{************Procedura WCZYTYWANIA LICZB ZESPOLONYCH****************}

procedure wczytaj(var c,e:zespolona);
begin
with c do
 begin
   writeln('Podaj czesc rzeczywista pierwszej liczby zespolonej:');
    readln(c.re);
   writeln('Podaj czesc urojona pierwszej liczby zespolonej:');
    readln(c.im);
 end;
with e do
 begin
   writeln('Podaj czesc rzeczywist drugiej liczby zespolonej:');
    readln(e.re);
   writeln('Podaj czesc urojona drugiej liczby zespolonej:');
    readln(e.im);
 end;
end;

{*************PROCEDURA WYPISYWANIA LICZB ZESPOLONYCH***************}

procedure wypisz;
begin
writeln('1 liczba zespolona: ',A.re:2:1,'+',A.im:2:1,'i');
writeln('2 liczba zespolona: ',B.re:2:1,'+',B.im:2:1,'i');
end;
{*******************************************************************}

procedure wyp(i:zespolona);
var
znak:string;
begin
if i.im<0 then znak:='' else znak:='+';
writeln(i.re:2:1,znak,i.im:2:1,'i');
writeln;
end;

{***********************FUNKCJA DODAWANIA***************************}
function dodawanie(const A,B:zespolona):zespolona;
var
k:zespolona;
begin
k.re:=A.re+B.re;
k.im:=A.im+B.im;
dodawanie:=k;
end;

{*********************FUNKCJA ODEJMOWANIE***************************}
function odejmowanie(const A,B:zespolona):zespolona;
var
k:zespolona;
begin
k.re:=A.re-B.re;
k.im:=A.im-B.im;
odejmowanie:=k;
end;
{***********************FUNKCJA MNOZENIE****************************}
function mnozenie(const A,B:zespolona):zespolona;
var
k:zespolona;
begin
k.re:=(A.re*B.re)-(A.im*B.im);
k.im:=(A.re*B.im)+(B.re*A.im);
mnozenie:=k;
end;
{*******************************************************************}
{***********************GLOWNY PROGRAM******************************}
{*******************************************************************}
BEGIN
clrscr;
wczytaj(A,B);
wypisz; writeln;
D:=dodawanie(A,B);
wyp(D);
D:=odejmowanie(A,B);
wyp(D);
D:=mnozenie(A,B);
wyp(D);



readln;
End.

0

Sformatuj kod po ludzku (nie umiesz sam to użyj JEDI Code Formatter) i wstaw go w odpowiednie znaczniki kolorujące składnie jak choćby delphi, to ktoś spojrzy. Ja wymiękam i zaraz idę spać.

0
googz napisał(a):

tylko zastanawiam się czy nie da rady zrobić coś z tą zmienna D aby nie była w głównym programie tylko w procedurze czy coś

Możesz pominąć D. Piszesz np.
wyp(dodawanie(A,B));

0

ja mam sformatowany kod
tylko otwieram z FPC kod poprzez notatnik
i formatowanie znika

0

rzeczywiście działa
wcześniej coś nie chciało :)
dzięki
ten program do formatowania tez zobaczę

0

z tym result coś nie chce chodzić
mam fpc

A czy umieć pan skonfigurować swój kompilator? Nie umieć pan.

Podstawowe pytanie, czy dyrektywa {$MODE DELPHI} została dodana, tak jak pokazałem to w swoim kodzie powyżej?

Podstawowe pytanie, czemu dyrektywa {$MODE DELPHI}? Możesz jakoś to uzasadnić względami innymi niż to że to jedyna dyrektywa którą znasz? Czas może poznać {$MODE OBJFPC}... albo jeszcze lepiej tutaj użyć {$MODESWITCH RESULT}. @olesio , super że 'znasz się' na FPC, tylko zlituj się i nie przełączaj FPC w tryb zgodności tylko dlatego bo 'coś nie działa'. Od aktywacji pojedyńczych featurów jest MODESWITCH, a tryb który jest podobny do Delphi ale bardziej FPC style to OBJFPC. Przełączanie FPC w tryb zgodności komplikuje parę spraw, a to chyba nie jest celem pytacza. Osobiście jeżeli chcemy mieć coś aka Delphi tylko w wydaniu FPC to polecę to co Lazarus generuje tj. {$MODE OBJFPC}{$H+}.

ja mam sformatowany kod
tylko otwieram z FPC kod poprzez notatnik
i formatowanie znika

Krasnoludki formatowanie zarąbały... Używaj Lazarusa, dużo lepsze środowisko do FPC.

rzeczywiście działa
wcześniej coś nie chciało

Znów krasnoludki? Pewnie kurs też krasnoludki podrąbały....

0

@-321oho: niegdy nie twierdziłem, że znam się na FPC. Używam go bardzo rzadko, tak jak Lazarusa. Dopóki ConEmu nie będzie mógł go wyświetlać na pełnym ekranie jak potrafi FAR'a czy HIEW to kompilowanie pozostaje poza IDE, bo jak ktoś ma słabszy wzrok to imo niewiele zobaczy co tam FPC namarudził jeśli są błedy w kodzie. I fajnie, że podałeś inne dyrektywy. Można z nich skorzystać. Ja podałem taką, jaką znam i stosowałem z powodzniem, nawet jak mi Dev-Pas psioczył kiedyś na te rzutowania w prostym kodzie dla WinAPI. Chociaż pod tym kompilatorem akurat żadna dyrektywa dla Result nie jest raczej potrzebna. Przynajmniej u mnie się kompiluje. Powodem do ataków nie powinno być to, że próbuje pomóc jeśli nikt nie odpisuje przede mną, a to że autor wątku po prostu chyba nie zna podstaw. Tylko, że Ty nie byłbyś soba jakbyś komuś czegoś nie zarzucił. Jeżeli możesz to poświęć też trochę energii na szybkość odpisywania przed innymi kompleksowo to będziemy mogli oceniać tylko Twój kod. Ok, idę spać, bo rano do roboty trzeba wstać.

0

Powodem do ataków nie powinno być to, że próbuje pomóc jeśli nikt nie odpisuje przede mną, a to że autor wątku po prostu chyba nie zna podstaw.

Staraj się tu być miły, powiedzą ci że atakujesz. Wychodzi na to że zbyt miły jestem.

Tylko, że Ty nie byłbyś soba jakbyś komuś czegoś nie zarzucił.

Gdyby to nie miało wpływu na działanie kompilatora to bym się nie czepiał. Problem leży w tym że początkujących użyszkodników uczysz złych konstrukcji co skończy się wielkimi zdziwieniami gdy potem coś będzie nie tak. Ale jak się domyślam wtedy już nie ty będziesz mieć problem, więc masz racje, miej sobie wyrąbane na użyszkodników. W końcu wprowadzając ich w błąd nie szkodzisz sobie a im. Widzę że myliłem się co do twojego dokładnego odpisywania jak to kiedyś było. W kółko powtarzasz niepoprawne odpowiedzi, nie potrafisz korzystać z wskazówek innych.
Zawsze traktujesz moje zarzucanie jako coś złego natomiast ja dążę do pomocy tobie, a ty moją pomoc odrzucasz. Doprawdy aż tak trudno zapamiętać jeden parametr przełącznika który jest natywny dla FPC? W twoim przypadku to już nie jest tylko 'niedokładna odpowiedź' a 'permanentne wprowadzanie w błąd' zazwyczaj początkujących użyszkodników. I jeszcze mi masz za złe to że wielce czepiam się że któryś raz powtarzasz ten sam błąd.

Jeżeli możesz to poświęć też trochę energii na szybkość odpisywania przed innymi kompleksowo to będziemy mogli oceniać tylko Twój kod.

Czas jest zazwyczaj odwrotnością jakości. Stawiam na jakość. Wydawało mi się że ty też.

0

przy dzieleniu mam takie cos:
(A/B; należy sprawdzić, czy dzielenie jest możliwe, w przeciwnym razie wypisać wynik 0.0 + 0.0i).
jak dziele np. (2+3i)/(1-3i) to muszę sprawdzić czy 1-3i jest różne od zera.
jak to sprawdzić?

0

Sprawdzić Re oraz Im

0

Musisz porównać dwie liczby zespolone - mianownik i zero. Jeśli są równe to dzielenie jest niemożliwe. Liczby zespolone porównuje się bardzo prosto. Wystarczy porównać z osobna część rzeczywistą i część urojoną. Dwie liczby zespolone są identyczne wtedy i tylko wtedy jeśli ich części rzeczywiste są identyczne oraz części urojone też są identyczne. Zero zespolone to liczba zespolona której zarówno cześć rzeczywista jak i urojona wynoszą 0.

0

Krótko się postaram do @-321oho: staram się pomagać jak umiem i na ile mam wiedzę, ale o tym już chyba pisałem. Fajnie, wytknąłeś mi bład to napisałem, że masz rację. A stawiam na jakość na pewno, bo dałem przykładowy kod i często pomagam kompleksowo, ale ludziom albo się tym i tak szkodzi. A nawet jeśli nie to ktoś będzie miał zastrzeżenia. Zamiast sam najpierw pomóc najlepiej jak potrafi i bez błędów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1