Problem z programem do obliczeń pól figur

0

Hejj.. Pisze w pilnej sprawie, otóż mam na piatek przygotowac program do obliczania pol i objetosci figur. no i juz byloby git poza bledem ktory nie wiem gdzie jest. W obliczaniu pól i objętośći (do prostopadloscianu) wszystko było git. Przy obliczaniu już objętosci szescianu robi sie problem. We wczesniejszych obliczeniach w innych figurach po wcisnieciu entera po wyniku program sie wylaczal, a przy szescianie? po enterze przenosi do menu pól figur. CO z tym zrobic ? pomozcie bo nie mam zielonego pojecia.. przesledzilem wszystko.
W linkach zarzucam kod źródłowy z FPC i cały program już. prosiłbym o napisanie tego bledu.. :( i jakbyście mogli to tez prosilbym o to, zebyscie napisali co zrobic, zeby np po przycisnieciu entera nie wylaczalo, tylko np przenosiło do procedury "pola" albo coś? z góry dzięki i pozdro !

moje gg w razie czego: 44686572

LINKI:
kod: http://4programmers.net/Pastebin/2317
program: nowe.zip

0

wrzuć ten kod na http://ideone.com/

0

Skoro "FAST MUSZE MIEC NA PIATEK" to chyba należy się wynagrodzenie. Temat jest niepoprawny, wątek należy przenieść do kosza oraz napisać jeszcze raz z ludzkim tematem w stylu "Zlecę napisanie programu w Pascalu do obliczania pola figur" etc.

0

Jak wrzucić ? Jak kopiuję w FPC to nie moge wkleic gdzie indziej.

@up
dobra przepraszam pilne to jest po prostu..

Dobra mam.
http://ideone.com/1GJsPn prosze.

PS. Już właśnie skończyłem cały program i ten błąd jest tylko przy tym sześcianie...

0

Z racji tej, że VirusTotal zasugerował jedno zagrożenie w podanym pliku *.exe - program skompilowałem u siebie i dodałem załącznik do pierwszego posta; Plik ode mnie nie jest modyfikowany - oryginalny kod został skompilowany i ponownie przeskanowany - brak zagrożeń;

Kod programu wkleiłem do naszego Pastebin;


@statki97 - za tytuł ten wątek powinien wylądować w koszu, ale z racji tej, że jesteś na forum nowy - obowiązkowo przeczytaj ten wątek;

Nikogo z nas tak na prawdę nie obchodzi to, że masz zadanie i że musisz je oddać do piątku - to jest Twoje zadanie i Twój problem, więc na przyszłość zadawaj sensowniejsze pytania i oszczędź sobie tekstów typu:

Problem z programem w Pascalu ! FAST MUSZE MIEC NA PIATEK !!

otóż mam na piatek przygotowac program do obliczania pol i objetosci figur. no i juz byloby git poza bledem ktory nie wiem gdzie jest.

Pamiętaj - forum to nie GaduGadu czy podwórko, pisz z sensem i w języku takim, jak przystało - slang i inne durne zwroty zachowaj dla siebie; Polecam także nauczyć się obsługi prawego Altu, bo skoro piszesz do Polaków to pisz po polsku; Amen;


Teraz może w końcu coś odnośnie Twojego programu - niestety kod jest nieczytelny; Komentarze fajnie że są, jednak w połowie kodu brakuje wcięć, przez co źle się go analizuje; Dlatego też jeśli kodu nie doprowadzisz do stanu czytelności - najprawdopodobniej niktomu nie będzie się chciało go analizować, a tym bardziej poprawiać za Ciebie.

0

Nikomu nie każe poprawiać tylko mi trzeba jedną rzecz - błąd w sześcianie. Czytaj ze zrozumieniem .

0

U mnie działa Twój przykład z ideone bez żadnych modyfikacji... (patrz załącznik)

Napraw też menu bo dziurawe jest... Jak zaraz po starcie programu lecę w górę, to są błędy:

                               Runtime error 216 at $080609FB
  $080609FB                    read_rwlockattr_��
  $08049CC6                    ---------MENU---------
  $0806CEF3wlockattr_��    Informacje o programie
       p�                       Oblicz objętości   
                                     Oblicz pola     
                                       Wyjście       
------------------             ----------------------
(program exited with code: 216)
Press return to continue

A jak ominę ten błąd, to w czasie gdy idę do góry, "kursor" nie wraca na ostatni element menu, idzie na "Oblicz objętości" (zły y przypisujesz). I tak w sumie na każdej stronie menu.

4

Twój kod jest tak BEZNADZIEJNIE napisany, że potencjalna dziura może być praktycznie we wszystkim.
Zacznij od napisania go od nowa - porządnie!

2

Tsa napisz to porządnie a sprawdzimy i być może nawet pomożemy ;p

0

Program nie jest napisany brzydko, co najwyżej lamersko, ale nie jest źle.

Gdzie jest błąd? W skrócie "hermetyzacja". Dłuższa wersja:

  1. Zamień główne menu na procedurkę "menu_glowne" podobną do "pola"
  2. przenieś zmienne c1,c2,y,tablica do procedur "pola", "menu_glowne", "objetosci"

Wskazany problem powinien się sam rozwiązać.
Natomiast jak wspomniano wyżej mogą być inne, potestuj to z różnymi kombinacjami klawiszy.

4

Postanowiłem sprawdzić czy da się to napisać trzy razy krótsze z łatwą możliwością rozszerzenia, no i się udało:

uses Crt,Math;

type TParamKind=(pkSideA,pkSideB,pkSideC,pkHeight,pkRadius);
type TParamKindSet=set of TParamKind;
type TParams=array[TParamKind]of Double;
type TCalcFun=function(const arg:TParams):Double;
type TSubFun=procedure(Kind:Byte);
type TSubMenuItem=record Kind:Byte; Name,Info:String; Params:TParamKindSet; Fun:TCalcFun; end;

function Square(const arg:TParams):Double; begin Result:=Sqr(arg[pkSideA]); end;
function Mul2(const arg:TParams):Double; begin Result:=arg[pkSideA]*arg[pkSideB]; end;
function Trap(const arg:TParams):Double; begin Result:=(arg[pkSideA]+arg[pkSideB])*arg[pkHeight]/2; end;
function Kolo(const arg:TParams):Double; begin Result:=2*Pi*arg[pkRadius]; end;
function HalfMul(const arg:TParams):Double; begin Result:=arg[pkSideA]*arg[pkHeight]/2; end;
function Ball(const arg:TParams):Double; begin Result:=4*arg[pkRadius]*arg[pkRadius]*arg[pkRadius]/3; end;
function Mul3(const arg:TParams):Double; begin Result:=arg[pkSideA]*arg[pkSideB]*arg[pkSideC]; end;
function Cube(const arg:TParams):Double; begin Result:=arg[pkSideA]*arg[pkSideA]*arg[pkSideA]; end;
function Info(const arg:TParams):Double;
begin
  WriteLn('                  ***************************************************');
  WriteLn('                  *-==Program do obliczania pol i objętości figur==-*');
  WriteLn('                  ***************************************************');
end;

const Prog:array[0..10]of TSubMenuItem=
(
  (Kind:0;Name:'Informacje o programie';Info:'Informacja o programie';Params:[];Fun:@Info),
  (Kind:0;Name:'Oblicz objętości';Info:'';Params:[];Fun:@Info),
  (Kind:0;Name:'Oblicz pola';Info:'';Params:[];Fun:@Info),
  (Kind:1;Name:'Objętość kuli';Info:'Obliczenie objętości kuli';Params:[pkRadius];Fun:@Ball),
  (Kind:1;Name:'Objętość prostopadłościanu';Info:'Obliczenie objętości prostopadłościanu';Params:[pkSideA,pkSideB,pkSideC];Fun:@Mul3),
  (Kind:1;Name:'Objętość sześcianu';Info:'Obliczenie objętości sześcianu';Params:[pkSideA];Fun:@Cube),
  (Kind:2;Name:'Pole kwadratu';Info:'Obliczenie pola kwadratu';Params:[pkSideA];Fun:@Square),
  (Kind:2;Name:'Pole prostokąta';Info:'Obliczenie pola prostokąta';Params:[pkSideA,pkSideB];Fun:@Mul2),
  (Kind:2;Name:'Pole trapezu';Info:'Obliczenie pola trapezu';Params:[pkSideA,pkSideB,pkHeight];Fun:@Trap),
  (Kind:2;Name:'Pole koła';Info:'Obliczenie pola koła';Params:[pkRadius];Fun:@Kolo),
  (Kind:2;Name:'Pole trójkąta';Info:'Obliczenie pola trójkąta';Params:[pkSideA,pkHeight];Fun:@HalfMul)
);

procedure Calc(P:Integer);
var K:TParamKind;
const arg:TParams=(0,0,0,0,0);
const Params:array[TParamKind]of String=( 'bok a','bok b','bok c','wysokość h','promień r' );
begin
  TextBackGround(black);
  ClrScr;
  if P=0 then Prog[P].Fun(arg)
  else
  begin
    TextColor(green);
    WriteLn(Prog[P].Info);
    WriteLn;
    for K:=Low(TParamKind) to High(TParamKind) do
    begin
      if K in Prog[P].Params then
      begin
        TextColor(magenta);
        Write('Podaj '+Params[K]+': ');
        TextColor(yellow);
        Readln(arg[K]);
        WriteLn;
      end;
    end;
    WriteLn;
    TextColor(cyan);
    WriteLn(Prog[P].Name+' wynosi: ',Prog[P].Fun(arg):1:2);
  end;
  WriteLn;
  WriteLn;
  TextColor(white);
  Write('Naciśnij dowolny klawisz ');
  if ReadKey=#0 then ReadKey;
end;

procedure Menu(Kind,HalfWidth,Top:Byte);
var I,P,S,N:Integer;
var Key:Word;
var Name:String;
const FgClr:array[Boolean]of Word=(white,yellow);
const BgClr:array[Boolean]of Word=(black,blue);
begin
  TextBackGround(black);
  ClrScr;
  S:=0;
  while true do
  begin
    P:=0;
    N:=0;
    for I:=Low(Prog) to Length(Prog) do
    begin
      if I>High(Prog) then Name:='Powrót'
      else if Kind=Prog[I].Kind then Name:=Prog[I].Name
      else Continue;
      TextColor(FgClr[P=S]);
      TextBackGround(BgClr[P=S]);
      GotoXY(HalfWidth-(Length(Name)-1)shr(1),Top+P);
      Write(' '+Name+' ');
      if P=S then N:=I;
      Inc(P);
    end;
    GotoXY(HalfWidth,Top+P);
    Key:=Ord(ReadKey);
    if Key=0 then Key:=Ord(ReadKey)shl(8);
    case Key of
      $4800: S:=(S+P-1)mod(P);
      $5000: S:=(S+1)mod(P);
      27: Break;
      13:
      begin
        if S+1=P then Break;
        if (Prog[N].Params=[])and(N>0) then Menu(S,HalfWidth,Top) else Calc(N);
        TextBackGround(black);
        ClrScr;
      end;
    end;
  end;
end;

begin
  Menu(0,40,11);
end.

Druga wersja, jeszcze krótsza bo bez funkcji:

uses Crt,Math;
 
type TParamKind=(pkSideA,pkSideB,pkSideC,pkHeight,pkRadius);
type TParamKindSet=set of TParamKind;
type TSubMenuItem=record
  Kind:Byte;
  Name,Info:String;
  Params:TParamKindSet;
  Equal:array[0..1]of record Mul:Double; Tb:array[TParamKind]of Byte; end;
end;
 
const Prog:array[0..10]of TSubMenuItem=
(
  (Kind:0;Name:'Informacje o programie';Info:'';Params:[];Equal:((Mul:0;Tb:(0,0,0,0,0)),(Mul:0;Tb:(0,0,0,0,0)))),
  (Kind:0;Name:'Oblicz objętości';Info:'';Params:[];Equal:((Mul:0;Tb:(0,0,0,0,0)),(Mul:0;Tb:(0,0,0,0,0)))),
  (Kind:0;Name:'Oblicz pola';Info:'';Params:[];Equal:((Mul:0;Tb:(0,0,0,0,0)),(Mul:0;Tb:(0,0,0,0,0)))),
  (Kind:1;Name:'Objętość kuli';Info:'Obliczenie objętości kuli';Params:[pkRadius];Equal:((Mul:4*Pi/3;Tb:(0,0,0,0,3)),(Mul:0;Tb:(0,0,0,0,0)))),
  (Kind:1;Name:'Objętość prostopadłościanu';Info:'Obliczenie objętości prostopadłościanu';Params:[pkSideA,pkSideB,pkSideC];Equal:((Mul:1;Tb:(1,1,1,0,0)),(Mul:0;Tb:(0,0,0,0,0)))),
  (Kind:1;Name:'Objętość sześcianu';Info:'Obliczenie objętości sześcianu';Params:[pkSideA];Equal:((Mul:1;Tb:(3,0,0,0,0)),(Mul:0;Tb:(0,0,0,0,0)))),
  (Kind:2;Name:'Pole kwadratu';Info:'Obliczenie pola kwadratu';Params:[pkSideA];Equal:((Mul:1;Tb:(2,0,0,0,0)),(Mul:0;Tb:(0,0,0,0,0)))),
  (Kind:2;Name:'Pole prostokąta';Info:'Obliczenie pola prostokąta';Params:[pkSideA,pkSideB];Equal:((Mul:1;Tb:(1,1,0,0,0)),(Mul:0;Tb:(0,0,0,0,0)))),
  (Kind:2;Name:'Pole trapezu';Info:'Obliczenie pola trapezu';Params:[pkSideA,pkSideB,pkHeight];Equal:((Mul:0.5;Tb:(1,0,0,1,0)),(Mul:0.5;Tb:(0,1,0,1,0)))),
  (Kind:2;Name:'Pole koła';Info:'Obliczenie pola koła';Params:[pkRadius];Equal:((Mul:Pi;Tb:(0,0,0,0,2)),(Mul:0;Tb:(0,0,0,0,0)))),
  (Kind:2;Name:'Pole trójkąta';Info:'Obliczenie pola trójkąta';Params:[pkSideA,pkHeight];Equal:((Mul:0.5;Tb:(1,0,0,1,0)),(Mul:0;Tb:(0,0,0,0,0))))
);
 
procedure Info;
begin
  WriteLn('                  ***************************************************');
  WriteLn('                  *-==Program do obliczania pol i objętości figur==-*');
  WriteLn('                  ***************************************************');
end;

procedure Calc(P:Integer);
var K:TParamKind;
var Value,Add0,Add1:Double;
const Params:array[TParamKind]of String=( 'bok a','bok b','bok c','wysokość h','promień r' );
begin
  TextBackGround(black);
  ClrScr;
  TextColor(2);
  WriteLn(Prog[P].Info);
  WriteLn;
  Add0:=Prog[P].Equal[0].Mul;
  Add1:=Prog[P].Equal[1].Mul;
  for K:=Low(TParamKind) to High(TParamKind) do
  begin
    if K in Prog[P].Params then
    begin
      TextColor(magenta);
      Write('Podaj '+Params[K]+': ');
      TextColor(yellow);
      Readln(Value);
      Add0:=Add0*Power(Value,Prog[P].Equal[0].Tb[K]);
      Add1:=Add1*Power(Value,Prog[P].Equal[1].Tb[K]);
      WriteLn;
    end;
  end;
  WriteLn;
  TextColor(cyan);
  WriteLn(Prog[P].Name+' wynosi: ',Add0+Add1:1:2);
  WriteLn;
  WriteLn;
  TextColor(white);
  Write('Naciśnij dowolny klawisz ');
  if ReadKey=#0 then ReadKey;
end;
 
procedure Menu(Kind,HalfWidth,Top:Byte);
var I,P,S,N:Integer;
var Key:Word;
var Name:String;
const FgClr:array[Boolean]of Word=(white,yellow);
const BgClr:array[Boolean]of Word=(black,blue);
begin
  TextBackGround(black);
  ClrScr;
  S:=0;
  while true do
  begin
    P:=0;
    N:=0;
    for I:=Low(Prog) to High(Prog)+1 do
    begin
      if I>High(Prog) then Name:='Powrót'
      else if Kind=Prog[I].Kind then Name:=Prog[I].Name
      else Continue;
      TextColor(FgClr[P=S]);
      TextBackGround(BgClr[P=S]);
      GotoXY(HalfWidth-(Length(Name)-1)shr(1),Top+P);
      Write(' '+Name+' ');
      if P=S then N:=I;
      Inc(P);
    end;
    GotoXY(HalfWidth,Top+P);
    Key:=Ord(ReadKey);
    if Key=0 then Key:=Ord(ReadKey)shl(8);
    case Key of
      $4800: S:=(S+P-1)mod(P);
      $5000: S:=(S+1)mod(P);
      27: Break;
      13:
      begin
        if S+1=P then Break;
        if N=0 then Info else if Prog[N].Params=[] then Menu(S,HalfWidth,Top) else  Calc(N);
        TextBackGround(black);
        ClrScr;
      end;
    end;
  end;
end;
 
begin
  Menu(0,40,11);
end.
0

Dzięki. Ja w tym zielony jestem trochę. Robię to tylko, żebym miał 6 na koniec. Nie skończyłem się uczyć całego Pascala.
Popróbuję to co pisaliście wyżej.

0

Ja też z racji chwili wolnego czasu napisałem taki programik, nieco mniej haxiorski, niż ten Dragona, lecz imho bardziej czytelny:
http://4programmers.net/Pastebin/2320
(pisany pod FPC)

2
statki97 napisał(a):

Dzięki. Ja w tym zielony jestem trochę. Robię to tylko, żebym miał 6 na koniec. Nie skończyłem się uczyć całego Pascala.
Popróbuję to co pisaliście wyżej.

Na 6? Takie byle co, byle jak wykonane?

Ty nie zasługujesz nawet na 5.... Trochę pokory dziecko.

0

@Spine - takie programy robi się w TI na 6, ale to nie ważne; Pytacz nie ma wiedzy na ocenę 4, a robi program na 6 (w sumie to forum robi); Poza tym ktoś, kto ubiega się o najwyższą ocenę powinien znać takie pojęcie jak formatowanie kodu (czego tutaj wszędzie brakuje) oraz DRY & KISS; Pamiętam jak sam robiłem projekt na 6 i musiałem się do tego stosować, dzięki czemu poszło gładko.

0

Technikum Informatyczne... Ja w 3 klasie Gimnazjum na 6 robiłem w Delphi program do chodzenia po szkole używając narzędzi, które posiadałem. To nie tylko komputer i IDE, ale także kamera analogowa odkupiona od kuzyna w 1991 roku + karta telewizyjna żeby powycinać "cyfrowe foty" z filmu. Jeśli 97 w jego nicku to rok urodzenia, to ma gdzieś tyle lat co ja wtedy.

0

Ja mam na informatyce dopiero Komeniusza.. bawimy sie. jestem ponad dlatego 6. chyba nie wiecie za co sie 6 daje - za wiedze ponad program. problem rozwiazany. do zamkniecia.

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