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/)

pablocoo 09.01.2005 14:23

Potrzebuje pomocy... z Pascalem
 
Na srode musze zrobic w Pascalu kalkulator jak prace zaliczeniowa na semest i wogole nie wiem jak sie za to zabrac...
Chetnie przeczytalbym jakies pomysly, moze ktos ma cos gotowego? :mruga:

Predi 09.01.2005 14:27

nie wiem jaki masz problem ???
jezeli znasz podstawy to najprostszy mozna zrobic
"Podaj dzialanie" tu 4 ify i else odnoszace do danych funccji, lub nawet na zywo po ifie intrukcje zeby podac dwie liczyby, cos z nimi robisz (dodajesz, odejmujesz itd)
a potem wypisujesz wynik....

ps. mase taki kalkulatorow na pewno jest w sieci to to czesty temat

andy 09.01.2005 14:39

Dokladnie znjac podstawy mozna zrobic bardzo przyzwoity kalkulator ;)
Jak kcesz jakies zrodla to wejdz tu: 4programmers.net :spoko:

luminat 09.01.2005 18:22

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...

MacGyver 09.01.2005 20: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.


luminat 09.01.2005 20: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: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

47 09.01.2005 21: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.


luminat 09.01.2005 22: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: .

MacGyver 09.01.2005 22: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)

pablocoo 11.01.2005 18: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?

Predi 11.01.2005 18: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

MacGyver 11.01.2005 18: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

pablocoo 11.01.2005 18: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?

Predi 11.01.2005 18: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

pawelblu 15.01.2005 18: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 :)

Posłany 15.01.2005 18: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:

MacGyver 17.01.2005 16: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:

Ziele 17.01.2005 21:25

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


Wszystkie czasy w strefie CET. Aktualna godzina: 20:32.

Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2025, vBulletin Solutions Inc.