Reklama
Pokazuje wyniki od 1 do 10 z 10

Temat: [Delphi 7] pomoc z podstawami

  1. #1

    Data rejestracji
    2011
    Posty
    385
    Siła reputacji
    13

    Domyślny [Delphi 7] pomoc z podstawami

    Witajcie, w tym semestrze dali nam przedmiot zwany programowanie, więc przydałoby się nieco to ogarnąć.
    Wg pani doktor mamy język Pascal w środowisku Delphi 7.
    Chciałbym sam napisać "program" do liczenia azymutów, jednakże problemy pojawiają mi się już na początku


    I początki mojego kodu:
    Kod PHP:
    program obliczanie_azymutow;
    
    {$APPTYPE CONSOLE}
    
    uses
      SysUtils;
      var x1,x2,y1,y2,czwartak,deltay,deltax : Real;
    begin
      Write ('podaj wspolrzedna x1 = ');  Readln(x1);
      Write ('podaj wspolrzedna x2 = ');  Readln(x2);
      Write ('podaj wspolrzedna y1 = ');  Readln(y1);
      Write ('podaj wspolrzedna y2 = ');  Readln(y2);
      deltay:= (y2-y1);
      deltax:= (x2-x1);
      czwartak:= ArcTan (deltay / deltax); Readln;
    end.
    Czy program liczy mi deltay, deltax oraz czwartak i po prostu tego nie pokazuje?
    I kolejne pytanie, czy do tego momentu jest wszystko ok? :)
    Raczej nie jest to coś wielkiego, ale to dopiero początki, a materiały, które dostaliśmy nie do końca do mnie docierają ;/

    @edit
    + po ponownym włączeniu w konsoli wyskakują mi takie rzeczy:
    Załącznik 299439
    Ostatnio zmieniony przez Perkun : 15-10-2013, 11:08

  2. #2
    Avatar Kusterek
    Data rejestracji
    2013
    Położenie
    Warszawa
    Wiek
    31
    Posty
    1,710
    Siła reputacji
    13

    Domyślny

    nie znam kompletnie tego jezyka, ale biorąc pod uwagę inne języki to ewidentnie brakuje Ci wypisania na ekran wartosci zmiennnych. W sensie, ze sa wyliczone dobrze ale nie napisales programowi zeby Ci to na ekran wyrzucił.

    http://4programmers.net/Delphi/Write

    tutaj jest co i jak z tym wydrukiem na ekran bo domyslam sie ze
    Kod:
    Write(czwartek);
    może nie działać
    Ostatnio zmieniony przez Kusterek : 14-10-2013, 21:08

  3. Reklama
  4. #3

    Data rejestracji
    2011
    Posty
    385
    Siła reputacji
    13

    Domyślny

    Dzięki, wyświetla, ale nie do końca to co powinien.
    Zakładam, że chcę obliczyć czwartak punktów 1 i 2
    x1= 5404843,37
    x2= 5404991,81
    y1= 4554089,58
    y2= 4555015,89

    czwartak dla tego powinien wynieść 80,8958 stopni
    a otrzymany wynik to:
    Załącznik 299440

    Kod mam teraz taki:
    Kod PHP:
    program obliczanie_azymutow;
    
    {$APPTYPE CONSOLE}
    
    uses
      SysUtils;
      var x1,x2,y1,y2,czwartak,deltay,deltax : Real;
    begin
      Write ('podaj wspolrzedna x1 = ');  Readln(x1);
      Write ('podaj wspolrzedna x2 = ');  Readln(x2);
      Write ('podaj wspolrzedna y1 = ');  Readln(y1);
      Write ('podaj wspolrzedna y2 = ');  Readln(y2);
      deltay:= (y2-y1);
      deltax:= (x2-x1);
      czwartak:= ArcTan (deltay / deltax); Read;
      Write (czwartak); Readln;
    end.
    @edit
    W sumie ten wynik jest w radianach, więc raczej nie będzie problemu abym to sobie zamienił na stponie/grady.
    Narazie to tyle, leci reput, a jutro się jeszcze raczej odezwę :)

    + czy da się jakoś ustawić, aby w cyfrach można było używać przecinka ",", który znajduje się na klawiaturze numerycznej?
    Jak na razie to po użyciu go i wciśnięciu "entera" wyskakuje mi błąd i cały program się buguje.
    Ostatnio zmieniony przez Perkun : 14-10-2013, 21:31

  5. #4
    Avatar Absherr
    Data rejestracji
    2008
    Położenie
    Kraków
    Posty
    578
    Siła reputacji
    16

    Domyślny

    Jeżeli chcesz podawać wejście do programu z przecinkami to przyjmuj to jako String, ale później musisz i tak przerzutować to na Real, żeby wykonać obliczenia. Najłatwiej to zrobić StringReplace i zamienić przecinki na kropki, a później StrToFloat. Generalnie za dużo zabawy moim zdaniem, trzeba przywyknąć, że korzysta się z notacji kropkowej.
    Ostatnio zmieniony przez Absherr : 14-10-2013, 23:19

  6. #5

    Data rejestracji
    2011
    Posty
    385
    Siła reputacji
    13

    Domyślny

    Kod PHP:
    if ((czwartak > 0) or (czwartak < 90)) then
      begin
        azymut:= czwartak;
        Writeln (azymut); Readln;
    end.
    Czy ktoś orientuje się, co powinienem zrobić, aby w 1 wierszu nie wyskakiwał mi błąd?

    @edit
    Zaczynam zauważać, że tutaj jak w excelu nawiasy mają dużą rolę, jednak teraz wyskakuje mi błąd w wierszu z end.
    Ostatnio zmieniony przez Perkun : 15-10-2013, 10:49

  7. #6
    Avatar Kusterek
    Data rejestracji
    2013
    Położenie
    Warszawa
    Wiek
    31
    Posty
    1,710
    Siła reputacji
    13

    Domyślny

    z tego co widze chyba powinno byc tak:
    Kod:
    if (czwartak > 0) or (czwartak < 90) then
      begin
        azymut:= czwartak;
        Writeln (azymut); Readln;  
      end;
    Ostatnio zmieniony przez Kusterek : 15-10-2013, 10:55

  8. #7

    Data rejestracji
    2011
    Posty
    385
    Siła reputacji
    13

    Domyślny

    Dzięki :)
    Już do tego doszedłem, teraz jedyne co mnie nurtuje to otrzymywane wyniki, a dokładniej:
    Załącznik 299448

    Kod na chwile obecną:
    Kod PHP:
      if ((deltax > 0) and (deltay > 0)) then                                        // 1 cwiartka
      begin
        azymut:= czwartak;
        Writeln (azymut); Readln;
      end;
      if ((deltax < 0) and (deltay > 0)) then                                        // 2 cwiartka
      begin
        azymut:= 180 + czwartak;
        Writeln (azymut); Readln;
      end;
      if ((deltax < 0) and (deltay < 0)) then                                        // 3 cwiartka
      begin
        azymut:= 180 + czwartak;
        Writeln (azymut); Readln;
      end;
      if ((deltax > 0) and (deltay < 0)) then                                        // 4 cwiartka
      begin
        azymut:= 360 + czwartak;
        Writeln (azymut); Readln;
      end;
    end.
    Wynik 1 zgadza się (jeśli dodamy do niego pełny okrąg - 360 stopni, to wyjdzie dobry azymut dla dobrej ćwiartki), ale kod tego nie dodaje :(
    Czemu on pokazuje to w taki dziwny sposób? chciałbym, aby zapisywał to w formie xx.xxxx
    + czemu wyświetla inne opcje (tak mi się wydaje, że to jest to poniżej) skoro pasuje tylko do 1 wersji?
    Ostatnio zmieniony przez Perkun : 15-10-2013, 11:24

  9. #8
    Avatar Bazan
    Data rejestracji
    2008
    Wiek
    31
    Posty
    1,909
    Siła reputacji
    18

    Domyślny

    O ile dobrze pamietam, wystarczy wyswietlic zmienna w formie zmienna:0:2 albo zmienna:4:0, pierwsza liczba - ilosc cyfr przed kropka, 2 liczba - ilosc cyfr po kropce.
    Dreaming by drumming. ˆˆ™

  10. #9

    Data rejestracji
    2011
    Posty
    385
    Siła reputacji
    13

    Domyślny

    @up dzięki, rep :)


    Teraz staram się włożyć w to wyjątki:
    Kod PHP:
      if ((deltax > 0) and (deltay = 0)) then                                        // wyjątek 0 grad
      begin
        azymut:= 0;
        Writeln ('azymut = ',azymut:1:4); Readln;
      end;
      if ((deltax = 0) and (deltay > 0)) then                                        // wyjątek 100 grad
      begin
        azymut:= 100;
        Writeln ('azymut = ',azymut:1:4); Readln;
      end;
      if ((deltax < 0) and (deltay = 0)) then                                        // wyjątek 200 grad
      begin
        azymut:= 200;
        Writeln ('azymut = ',azymut:1:4); Readln;
      end;
      if ((deltax = 0) and (deltay < 0)) then                                        // wyjątek 300 grad
      begin
        azymut:= 300;
        Writeln ('azymut = ',azymut:1:4); Readln;
      end;
    end.
    Problem w tym, że jak wpiszę współrzędne dla których azymut będzie wynosił 0/100/200/300 grad, to aplikacja mi się od razu zamyka, nie wyświetla żadnej wartości :(
    Ktoś wie, czym to może być spowodowane?


    @edit
    Już myślałem, że sobie z tym problemem poradziłem:
    Kod PHP:
      if ((deltax > 0) and (y1 = y2)) then                                           // wyjątek 0 grad
      begin
        azymut:= 0;
        Writeln ('azymut = ',azymut:1:4); Readln;
      end;
      if ((x1 = x2) and (deltay > 0)) then                                           // wyjątek 100 grad
      begin
        azymut:= 100;
        Writeln ('azymut = ',azymut:1:4); Readln;
      end;
      if ((deltax < 0) and (y1 = y2)) then                                           // wyjątek 200 grad
      begin
        azymut:= 200;
        Writeln ('azymut = ',azymut:1:4); Readln;
      end;
      if ((x1 = x2) and (deltay < 0)) then                                           // wyjątek 300 grad
      begin
        azymut:= 300;
        Writeln ('azymut = ',azymut:1:4); Readln;
      end;
    end.
    Jednak dla 100 i 300 grad dalej mi nagle zamyka okno ;/
    Czy aplikacja uwzględnia tutaj dzielenie przez 0 i dlatego się zamyka? Jak to rozwiązać?
    Ostatnio zmieniony przez Perkun : 15-10-2013, 13:42

  11. #10
    Avatar Bazan
    Data rejestracji
    2008
    Wiek
    31
    Posty
    1,909
    Siła reputacji
    18

    Domyślny

    readln oraz writeln daj poza ify.

    Nie potrzebnie wpisujesz to samo 4x.

    Zrob

    Kod:
    if ((deltax > 0) and (y1 = y2)) then                                           // wyjątek 0 grad
      begin
        azymut:= 0;
      end;
      if ((x1 = x2) and (deltay > 0)) then                                           // wyjątek 100 grad
      begin
        azymut:= 100;
      end;
      if ((deltax < 0) and (y1 = y2)) then                                           // wyjątek 200 grad
      begin
        azymut:= 200;
      end;
      if ((x1 = x2) and (deltay < 0)) then                                           // wyjątek 300 grad
      begin
        azymut:= 300;
      end;
        Writeln ('azymut = ',azymut:1:4); 
        Readln;
    end.
    druga sprawa jest taka, ze teraz jest tylko 1 polecenie po if. Wiec mozna usunac begin i end i calosc wyjdzie:

    Kod:
      if ((deltax > 0) and (y1 = y2)) then    azymut:= 0;
      if ((x1 = x2) and (deltay > 0)) then    azymut:= 100;
      if ((deltax < 0) and (y1 = y2)) then    azymut:= 200;
      if ((x1 = x2) and (deltay < 0)) then    azymut:= 300;
    
        Writeln ('azymut = ',azymut:1:4); 
        Readln; // jesli readln nie dziala to zorb readln(), a jesli to nie dziala to readkey()
     
    end.
    @edit

    Dodatkowo zmien ify na else if.

    If ...
    else if...
    else if...
    else ...

    Tak jesli 1 if bedzie spelniony to nie sprawdza juz kolejnych, a w twoim przypadku sprawdza wszystko.
    Ostatnio zmieniony przez Bazan : 15-10-2013, 16:36
    Dreaming by drumming. ˆˆ™

Reklama

Informacje o temacie

Użytkownicy przeglądający temat

Aktualnie 1 użytkowników przegląda ten temat. (0 użytkowników i 1 gości)

Podobne tematy

  1. Odpowiedzi: 3
    Ostatni post: 22-05-2014, 22:48
  2. Delphi - listbox, wybieranie elementu
    Przez niemoralny w dziale Programowanie
    Odpowiedzi: 1
    Ostatni post: 07-11-2013, 22:00
  3. [Delphi 7] Potrzebna pomoc w pobieraniu wartości..
    Przez Zaster w dziale Sprzęt i oprogramowanie
    Odpowiedzi: 2
    Ostatni post: 29-05-2013, 16:05
  4. C++ Delphi Java PHP
    Przez dima0909x w dziale Programowanie
    Odpowiedzi: 44
    Ostatni post: 18-01-2013, 11:41
  5. Program Baza danych Delphi - pomoc
    Przez Bazan w dziale Programowanie
    Odpowiedzi: 0
    Ostatni post: 08-01-2013, 17:16

Zakładki

Zakładki

Zasady postowania

  • Nie możesz pisać nowych tematów
  • Nie możesz pisać postów
  • Nie możesz używać załączników
  • Nie możesz edytować swoich postów
  •