Forum CDRinfo.pl

Forum CDRinfo.pl (https://forum.cdrinfo.pl/)
-   Off topic (https://forum.cdrinfo.pl/f5/)
-   -   Potrzebuje pomocy... z Pascalem (https://forum.cdrinfo.pl/f5/potrzebuje-pomocy-pascalem-46164/)

Ziele 17.01.2005 22:25

użyj komponentu timer :D albo uruchom sleepa w drugim wątku :D wydaje mi się ze tym drugim sposobem bardziej przybajerujesz :D

MacGyver 17.01.2005 17:15

Jest sobie takie zadanko w Delphi:
Cytat:

Napisać program do losowania liczb z MultiLotka. Należy zasosować petlę repeat..until lub while..do. Wylosowane liczby należy zapisywać w pomocniczej tablicy. Po wylosowaniu kolejnej liczby, na podstawie tablicy, należy sprawdzić czy liczba nie została wcześniej wylosowana, jeśli tak losowanie należy powtórzyć, jeśli nie - wylosowaną liczbę należy dopisać do tablicy. W ten sposób należy wylosować 6 liczb. Liczby maja sie pojawiać w polach (Edit) w odstępach 2 sec. Dodac animacje powodujaca odbijanie sie kulki od scianek
I mam problemik z "Liczby maja sie pojawiać w polach (Edit) w odstępach 2 sec". Jak dodaję sleep (2000) to zatrzymuje się również animacja (co jest normalnym zachowaniem w tym przypadku)...da sie to jakoś inaczej zrobić ???
thx4help :)

..::Update::..
OK, problem rozwiązany poprzez wstawienie przed każdym sleepem
Kod:

Application.ProcessMessages;
..::Update 2::..
Qrde nie do konca to dobrze działa...animacja kulki się "rwie" :ysz:

Posłany 15.01.2005 19:37

Trzeba jeszcze zrobic petle że dopoki readln nie zwroci 0 to ma pytac kolejno: liczba->dzialanie->liczba->działanie(...)->liczba->działanie...
I dobrze by było w międzyczasie podawać wynik, coś w tym stylu:
0
liczba: 2
działanie: *
liczba: 2
4
dzialanie: +
liczba: 2
6
dzialanie:

pawelblu 15.01.2005 19:22

Wydaje mi sie ze koncepcyjnie kalkulator powinien dzialac tak ze:
pyta sie o liczbe, pyta sie o dzialanie, pyta sie o liczbe (wykonuje dzialanie, zwraca liczbe), pyta sie o dzialanie, pyta sie o liczbe (wykonuje dzialanie na poprzedniej liczbie z parametrem w postaci nowej) itd.. W kazdym miejscu trzeba pamietac np. o dzieleniu przez 0 i innych rzeczach. Z typami bedzie troche zabawy, ale da sie to jakos sprytnie zrobic, jak np. sposob powyzej (nie wiem tylko co pascal odpowie 2 < 2.00 , mam nadzieje ze tak jak sie spodziewamy).

Poza tym jest taki troche drazliwy temat:
Jak 1 podzielimy przez 3, spytamy sie o wynik bedzie 0.(3) i teraz jak to pomnozymy przez 3 to obawiam sie ze bedzie 0.(9) a nie 1 (chociaz obie liczby zbiegaja do 1 to jednak druga reprezentacja jest znacznie przyjemniejsza).

Fakt faktem ten defekt wystepuje rowniez w wiekszosci kalkulatorow, wiec nasz bedzie z nimi kompatybilny :)

Predi 11.01.2005 19:26

napewno sie da :) np. masz

var a, b, d : integer;
var f : real;

begin
writeln ('podaj a');
readln(a);
writeln ('podaj b');
readln(b);

f:=a/b;

d:=a div b;

if d < f then writeln (f:2:2) else writeln (d);
end.

musisz to teraz tylko wstawic w ten fragment programu gdzie kalkulator dzieli, polega to na tym, ze f jest typu real i przechowuje rzeczywista wratosc dzielenia, natomiast d przechowuje wartosc calkowita, po odcieciu cyfr po kropce, jezeli f jest wieksze od d (a bedzie tak tylko wtedy jezeli bedzie cos mialo po kropce) to wypisywane jest np. 2.11 jezeli sa rowne, to wyswietla d jako normalna liczbe, bez kropki

pablocoo 11.01.2005 19:22

A da sie tak zrobic, zeby liczby calkowite wyswietlal normalnie bez miejsc po przecinku, a ulamki po 2 miejsca po przecinku, jak wynik przechowuje w tej samej zmiennej?

MacGyver 11.01.2005 19:19

Cytat:

Napisany przez pablocoo
Dzieki wszystkim za odpowiedz

Mam jeszcze pytanie: kiedy ustawiam typ zmiennej jako 'real' to wyniki wychodza np. 2.000000000E +0000
A kiedy ustawie typ jako 'integer' to wywala blad z dzieleniem.
Jakiego typu mam uzyc?

Daj zmienną w jako real a linijke odpowiedzialną za wyswietlanie wyniku zmodyfikuj np tak:
Kod:

writeln ('Wynik dzialania wynosi: ', w:0:2);
..::Update::..
@Predi był szybszy ;p

Predi 11.01.2005 19:16

zeby nie bylo "2.000000000E +0000" wypisuj zmienne np tak: writeln(zmienna:2:2); te dwojki znacza ze bedzie wyswietlana po dwoch polach z dwoma miejscami po przecinku

pablocoo 11.01.2005 19:09

Dzieki wszystkim za odpowiedz

Mam jeszcze pytanie: kiedy ustawiam typ zmiennej jako 'real' to wyniki wychodza np. 2.000000000E +0000
A kiedy ustawie typ jako 'integer' to wywala blad z dzieleniem.
Jakiego typu mam uzyc?

MacGyver 09.01.2005 23:11

Co do wspomnianej pętelki

Kod:

program kalkulatorek;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var a,b,w: integer;
    d, k: char;
begin
    repeat
    write ('Podaj pierwsza liczbe: ');
    readln (a);
    write ('Podaj druga liczbe: ');
    readln (b) ;
    write ('Podaj znak dzialania (+,-,*,/): ');
    readln (d);
    case d of
    '+'  : w:=a+b;
    '-'  : w:=a-b;
    '*'  : w:=a*b;
    '/'    :
      Begin
        if b=0 then
            Writeln('Dzielenie przez 0' )
              else
                  w:=a/b;
            end;
          end;
 writeln ('Wynik dzialania wynosi: ', w);
    writeln ('Wcisnij W aby wyjsc lub dowolny klawisz aby podac nowe liczby');
    read (k);
  until k='w';
end.

...lub podobnie (na to jest masa sposobów)

luminat 09.01.2005 23:05

Nie bede cytal calego, ale ja bym zastapił readln(d) na read(d); lub d:=readkey; - nie trzeba nacisnac klawisza enter w celu potwierdzenia wyboru. Dodałbym jeszcze modul crt (standard przy programach pascalowych) i komende crt na samym poczatku po begin oraz petle repeat ktora na samym koncu pytala by sie czy zakonczyc dzialanie programu. Ale cos nie wierze, ze taki prosty programik mialby by na zaliczenie semestru autorowi tematu pewnie chodzilo o cos bardziej skomplikowanego z bajerami i jaka szata graficzna :spoko: .

47 09.01.2005 22:14

Cytat:

Napisany przez MacGyver
...i napisanie zajmuje doslownie 5 minut...

..::Update::..
Wynik 2-minutowej pracy (nie mam Pascala wiec napisalem to w Delphi...ale w Pascalu chyba bedzie wygladać podobnie) :)
Programik robi podstawowe obliczenia (trzeba jeszcze dodac obsluge dzielenie przez zero)

Pozwoliłem sobie troszki przerobić.

Kod:

program kalkulatorek;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var a,b,w: integer;
    d: char;
begin
    write ('Podaj pierwsza liczbe: ');
    readln (a);
    write ('Podaj druga liczbe: ');
    readln (b) ;
    write ('Podaj znak dzialania (+,-,*,/): ');
    readln (d);
    case d of
    '+'  : w:=a+b;
    '-'  : w:=a-b;
    '*'  : w:=a*b;
    '/'    :
      Begin
        if b=0 then
            Writeln('Dzielenie przez 0' )
              else
                  w:=a/b;
            end;
          end;
 writeln ('Wynik dzialania wynosi: ', w);
    readln;
end.


MacGyver 09.01.2005 22:06

Cytat:

Napisany przez luminat
Oj nie, tym razem pomyliles sie MacGyver, w pascalu dzielenie okresla sie zwykly znakiem dzielenia '/'. A instrukcja mod o ktorej tu wspomniales zwraca reszte z dzielenia. Aby mi tu ktos nie wyskoczyl czasem z div'em to wspomne, ze to jest dzielenie calkowite a nie zwykle dzielenie.

No fakt wkradł się mały bład :) Pisałem to na szybko ;p

luminat 09.01.2005 21:54

Cytat:

Napisany przez MacGyver
program kalkulatorek;

....
if d='/' then w:=a mod b;
....

Oj nie, tym razem pomyliles sie MacGyver, w pascalu dzielenie okresla sie zwykly znakiem dzielenia '/'. A instrukcja mod o ktorej tu wspomniales zwraca reszte z dzielenia. Aby mi tu ktos nie wyskoczyl czasem z div'em to wspomne, ze to jest dzielenie calkowite a nie zwykle dzielenie.

MacGyver 09.01.2005 21:17

Cytat:

Napisany przez luminat
Polecam stronke www.komputery-internet.net - bardzo duzo o programowaniu m. in. pascal. PS kallkulator to jedna z najprostszych rzeczy jaka mozna zrobic w pascalu...

...i napisanie zajmuje doslownie 5 minut...

..::Update::..
Wynik 2-minutowej pracy (nie mam Pascala wiec napisalem to w Delphi...ale w Pascalu chyba bedzie wygladać podobnie) :)
Programik robi podstawowe obliczenia (trzeba jeszcze dodac obsluge dzielenie przez zero)

Kod:

program kalkulatorek;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var a,b,w: integer;
    d: char;
begin
    write ('Podaj pierwsza liczbe: ');
    readln (a);
    write ('Podaj druga liczbe: ');
    readln (b) ;
    write ('Podaj znak dzialania (+,-,*,/): ');
    readln (d);
    if d='+' then w:=a+b;
    if d='-' then w:=a-b;
    if d='*' then w:=a*b;
    if d='/' then w:=a mod b;
    writeln ('Wynik dzialania wynosi: ',w);
    readln;
end.



Wszystkie czasy w strefie CET. Aktualna godzina: 19:31.

Powered by vBulletin® Version 3.9.0 LTS
Copyright ©2000 - 2026, vBulletin Solutions Inc.