Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Pytanie do programistów [TP]

14 May 2007 15:44 1274 10
  • Level 14  
    Witam mam następujący problem z pascalem mam następujący programik wyświetlający kontekstowe menu

    Code:
     USES CRT;
    
    Var
     c1,c2:char;
     y:byte;
     tablica:array[1..3]of string;

    Procedure info;                                {1}
    Begin
    End;

    Procedure glowny_program;                      {2}
    Begin
    End;

    Begin
      Tablica[1]:='   Info    ';                   {3}
      Tablica[2]:='  Program  ';                   {4}
      Tablica[3]:='  Wyjscie  ';                   {5}
      ClrScr;
      TextColor(15);
      For y:=1 to 3 do                             {6}
        Begin                                      {7}
          TextColor(15);                           {8}
          TextBackGround(0);                       {9}
          GotoXY(32,11+y);                         {10}
          Write(tablica[y]);                       {11}
        End;                                       {12}
      y:=1;                                        {13}
      Repeat                                       {14}
        TextColor(0);                              {15}
        TextBackGround(15);                        {16}
        GotoXY(32,11+y);                           {17}
        Write(tablica[y]);                         {18}
        c1:=ReadKey;                               {19}
        c2:=' ';                                   {20}
        If c1=Chr(0) Then c2:=ReadKey;             {21}
        TextColor(15);                             {22}
        TextBackGround(0);                         {23}
        GotoXY(32,11+y);                           {24}
        Write(tablica[y]);                         {25}
        If c2='H' Then Dec(y);                     {26}
        If c2='P' Then Inc(y);                     {27}
        If y=0 Then y:=3;                          {28}
        If y=4 Then y:=1;                          {29}
        If c1=Chr(27) Then y:=3;                   {30}
      Until (c1=chr(27)) or (c1=chr(13));         

    [b]Do tego 3 napisane programy
    pierwszy z nich[/b]

    program druk_prost;
    var k, r, i, s : integer;
    procedure rysowanie_lini ;
       begin
          for r := 1 to s do
             write('@');
          writeln
       end { druk_wiersza };
    begin
       readln(i,s);
       for k := 1 to i do
        rysowanie_lini;
        write;
       readln;
    end.

    [b]Drugi[/b]

    program pokaz_rekordow;

    uses crt;

    type licznik = record
    sasiad : string[20];
    ja : string[20];
    ile   : longint;
    end;

    var stats : licznik;

    procedure pobierz;
    begin
    writeln('Podaj sasiad, pole moze zawierac 20 liter: ');
    readln(stats.sasiad);
    writeln('Podaj ja, pole moze zawierac 20 liter: ');
    readln(stats.ja);
    writeln('Podaj ilosc wywolan, maks. longint: ');
    readln(stats.ile);
    end;

    procedure pokaz;
    begin
    write('sasiad: ');
    writeln(stats.sasiad);
    write('ja: ');
    writeln(stats.ja);
    write('Ilosc wywolan: ');
    writeln(stats.ile);
    end;

    begin
    clrscr;
    pobierz;
    pokaz;
    readln;

    [b] i Trzeci [/b]

    program rownanie_kwadratowe;
    uses crt;
    var a,b,c,delta,x,x1,x2: real;
    begin
    clrscr;
    write ('wpisz a '); read (a);
    write ('wpisz b '); read (b);
    write ('wpisz c '); read (c);
    delta:=(b*b)-4*a*c;
    if (delta<0) then
    begin
    write ('brak rozwiązań');
    end
    else
    begin
    if (delta=0) then
     begin
     x:=-b/2*a;
     write (x:2:2);
     end
    else
     begin
     x1:=-b-sqrt(delta)/2*a;
     x2:=-b+sqrt(delta)/2*a;
     write (x1:2:2,',', x2:2:2);
     end;
     end;
    end.


    moim zadaniem było połączenie ich jakby w jedno przez te menu tzn wybór poszczególnego z prgramów poprzez menu pod 1 pierwszy itd
    jeśli ktoś umiałby mi pomóc w tej dolegliwości to będe bardzo wdzięczny i przepraszam za taki długi post ;)

    z Poważaniem
    Snake[/code]
    [30.03.2021, darmowy webinar] Nowoczesna diagnostyka maszyn, monitorowanie i przewidywanie awarii. Zarejestruj się
  • Level 21  
    Chyba pomyliłeś dział. Powinieneś umieścić ten temat w "programowanie ogólne".
  • Level 14  
    proszę o przeniesienie w takim razie tematu :)
  • Helpful post
    Level 28  
    Po pierwsze primo, kod źródłowy umieszczamy w znacznikach code (przycisk powyżej okna edycji postu) - to znacznie ułatwia odczytanie kodu.
    Po drugie primo:

    Code:
    uses
    
     crt;

    var
     klawisz: char;
     wybor: byte;
     napisy: array[0..4] of string;
     y: byte;

    procedure info;
    begin
     ...
    end;

    procedure program_1;
    begin
     ...
    end;

    procedure program_2;
    begin
     ...
    end;
    procedure program_3;
    begin
     ...
    end;

    begin
     napisy[0] := 'Info';                 {wybor = 1}
     napisy[3] := 'Program 1';        {wybor = 2}
     napisy[4] := 'Program 2';         {wybor = 3}
     napisy[5] := 'Program 3';        {wybor = 4}
     napisy[2] := 'Wyjscie';            {wybor = 5}

     wybor := 1;

     repeat
      clrscr;

      for y:= 1 to 5 do
      begin
       if y = wybor then
       begin
        textcolor(black);
        textbackground(white);
       end
       else
       begin
        textcolor(white);
        textbackground(black);
       end
       gotoxy(32, 11 + wybor);
       write(napisy[y-1]);
      end; 

      klawisz := upcase(readkey);
      if (klawisz = 'H') and (wybor > 1) then dec(wybor) else wybor := 5;
      if (klawisz = 'P') and (wybor < 5) then inc(wybor) else wybor := 1;
      if klawisz = #27 then wybor := 5; {Esc}

      if klawisz = #13 then                   {Enter}
      case wybor of
       1: info;
       2: program_1;
       3: program_2;
       4: program_3;
       5: wybor := 0;
      end;

     until wybor = 0;

    end.


    Teraz wystarzczy jeszcze do kodu wstawić te 3 programy jako procedury (procedure_1, procedure_2, procedure_3) - zamieniasz program na procedure i end. na end;, wywalasz uses i juz. Musisz jeszcze zadbac o to, by kazdy z podprogramow wyswietlil wyniki - mozna dodac czekanie na dowolny klawisz przed powrotem do glownej petli. Uwaga - deklaracje type musisz umieścić w "dużym" programie.
    Dalsze problemy, pytania - pisz.
  • Level 14  
    witam ponownie jednak mam problem próbowałem już z tymi deklaracjami na okrągło błąd mi wyskakuje

    więc program wygląda tak

    Code:


    uses
     crt;

    var
     klawisz: char;
     wybor: byte;
     napisy: array[0..4] of string;
     y: byte;

    procedure info;
    begin
     ...
    end;

    procedure program_1;
    begin
    uses crt;                              [color=red]to rozumiem usuwam [/color]
    var a,b,c,delta,x,x1,x2: real;
    begin
    clrscr;
    write ('wpisz a '); read (a);
    write ('wpisz b '); read (b);
    write ('wpisz c '); read (c);
    delta:=(b*b)-4*a*c;
    if (delta<0) then
    begin
    write ('brak rozwiązań');
    end
    else
    begin
    if (delta=0) then
     begin
     x:=-b/2*a;
     write (x:2:2);
     end
    else
     begin
     x1:=-b-sqrt(delta)/2*a;
     x2:=-b+sqrt(delta)/2*a;
     write (x1:2:2,',', x2:2:2);
     
    end;

    procedure program_2;
    begin
    uses crt;        [color=red]tutaj tak samo [/color]

    type licznik = record
    sasiad : string[20];
    ja : string[20];
    ile   : longint;
    end;

    var stats : licznik;

    procedure pobierz;
    begin
    writeln('Podaj sasiad, pole moze zawierac 20 liter: ');
    readln(stats.sasiad);
    writeln('Podaj ja, pole moze zawierac 20 liter: ');
    readln(stats.ja);
    writeln('Podaj ilosc wywolan, maks. longint: ');
    readln(stats.ile);
    end;

    procedure pokaz;
    begin
    write('sasiad: ');
    writeln(stats.sasiad);
    write('ja: ');
    writeln(stats.ja);
    write('Ilosc wywolan: ');
    writeln(stats.ile);
    end;

    begin
    clrscr;
    pobierz;
    pokaz;
    readln;
    end;

    procedure program_3;
    begin
    var k, r, i, s : integer;
    procedure rysowanie_lini ;
       begin
          for r := 1 to s do
             write('@');
          writeln
       end { druk_wiersza };
    begin
       readln(i,s);
       for k := 1 to i do
        rysowanie_lini;
        write;
       readln;
    end;


    begin
     napisy[0] := 'Info';                 {wybor = 1}
     napisy[3] := 'Program 1';        {wybor = 2}
     napisy[4] := 'Program 2';         {wybor = 3}
     napisy[5] := 'Program 3';        {wybor = 4}
     napisy[2] := 'Wyjscie';            {wybor = 5}

     wybor := 1;

     repeat
      clrscr;

      for y:= 1 to 5 do
      begin
       if y = wybor then
       begin
        textcolor(black);
        textbackground(white);
       end
       else
       begin
        textcolor(white);
        textbackground(black);
       end
       gotoxy(32, 11 + wybor);
       write(napisy[y-1]);
      end;

      klawisz := upcase(readkey);
      if (klawisz = 'H') and (wybor > 1) then dec(wybor) else wybor := 5;
      if (klawisz = 'P') and (wybor < 5) then inc(wybor) else wybor := 1;
      if klawisz = #27 then wybor := 5; {Esc}

      if klawisz = #13 then                   {Enter}
      case wybor of
       1: info;
       2: program_1;
       3: program_2;
       4: program_3;
       5: wybor := 0;
      end;

     until wybor = 0;

    end.



    czy mógłbyś rzucić okiem co ja tu pomyliłem i ewentulanie wskazać takie miejsce nanieść poprawke oddam wszsytkie punkty chociaż a dużo ich nie mam ;) zależy mi na tym programie i z góry barrdzo dziękuje
  • Helpful post
    Level 28  
    Tak jak wspominałem wcześniej - deklaracji uses używasz tylko raz (na początku, najlepiej po program).
    Wziąłeś mnie trochę zbyt dosłownie:
    Code:
    procedure info;
    
    begin
     ...
    end;

    - w miejscu ... powinieneś wstawić kod, który np.: wyświetla jakiś tekst informacyjny o programie. Oczywiście, to żaden przymus, możesz nic nie wstawiać - wtedy procedura info jest pusta, można ją wywalić i nie wywoływać jej w ciele głównym programu.
    Deklarację typu (type) najlepiej daj globalnie - czyli przesuń ją na początek programu (np.: po uses).
    Nie deklaruj procedury w procedurze, to niezdrowy nawyk; przekształć kod:
    Code:
    procedure procedura_1;
    
    begin
      procedure procedura_2;
      begin
      end:
      procedura_2;
    end;

    na:
    Code:
    procedure procedura_2;
    
    begin
    end:

    procedure procedura_1;
    begin
      procedura_2;
    end;

    i tu uwaga - żeby w danym miejscu móc odwołać się do procedury, musi być ona zdefiniowana powyżej odwołania.
    Zmienne, których używasz w danej procedurze deklarujesz po procedure:
    Code:
    procedure procedura_1;
    
    var a, b, c: integer;
    begin
      a := 1;
      b := 2;
      c := 3;
    end;

    To tyle na pierwszy rzut oka. Poświęcę się, i zainstaluję sobie Pascala, żeby sklecić ten program, ale jak zauważyłeś, my tu na elektrodzie nie jesteśmy fanami dawania głodnemu ryby, wolimy raczej dać mu wędkę ;) - dlatego powyższe informacje to tylko wskazówki, a nie materiał do bezpośredniego wklejenia w Twój kod. Pomęcz się jeszcze trochę sam, bo widzę, że zmierzasz w dobrym kierunku.
    Acha, no i najważniejsze - po każdym end kończącym wyrażenie stawiamy średnik. Wyjątkiem jest końcowe end programu, gdzie stawiamy kropkę. Nie stawiamy średnika, gdy end jest w środku bardziej złożonego wyrażenia:
    Code:
    program moj_program;
    

    uses crt;

    var a, b: integer;

    procedure procedura_1;
    begin
    end;   { kończy definicję procedury - średnik }

    begin
      a := 1;
      b := 2;
      if a > b then
      begin
        a := b;
        b := 0;
      end     { kończy blok wewnątrz złożonego wyrażenia "if" - bez średnika }
      else
      begin
        b := a;
        a := 0;
      end;   { kończy złożone wyrażenie "if" - średnik }
    end.    { koniec programu - kropka }

    Pomyliłem też indeksy (swoją drogą, nietrudno zauważyć, że tablica jest zdeklarowana od 0 do 4, więc indeks 5 jest nieprawidłowy):
    Code:
      napisy[0] := 'Info';             {wybor = 1}
    
      napisy[3] := 'Program 1';        {wybor = 2}
      napisy[4] := 'Program 2';        {wybor = 3}
      napisy[5] := 'Program 3';        {wybor = 4}
      napisy[2] := 'Wyjscie';          {wybor = 5}

    - powinno być oczywiście
    Code:
      napisy[0] := 'Info';             {wybor = 1}
    
      napisy[1] := 'Program 1';        {wybor = 2}
      napisy[2] := 'Program 2';        {wybor = 3}
      napisy[3] := 'Program 3';        {wybor = 4}
      napisy[4] := 'Wyjscie';          {wybor = 5}

    Kod pisałem z głowy, bez sprawdzania, ale nawet raczkujący programista Pascala powinien zauważyć np.: brak średnika tam, gdzie być on powinien - tym bardziej, że przy próbie kompilacji kompilator Pascala podświetla linijkę z błędem i podaje prawdopodobną jego przyczynę.
  • Level 14  
    Code:
    uses 
    
     crt;

    var
     klawisz: char;
     wybor: byte;
     napisy: array[0..4] of string;
     y: byte;

    procedure info;
    begin
     ...
    end;

    procedure program_1;
    [b] uses crt;   
    begin                         
    var a,b,c,delta,x,x1,x2: real;
    end;[/b]

    begin
    clrscr;
    write ('wpisz a '); read (a);
    write ('wpisz b '); read (b);
    write ('wpisz c '); read (c);
    delta:=(b*b)-4*a*c;
    if (delta<0) then
    begin
    write ('brak rozwiązań');
    end
    else
    begin
    if (delta=0) then
     begin
     x:=-b/2*a;
     write (x:2:2);
     end
    else
     begin
     x1:=-b-sqrt(delta)/2*a;
     x2:=-b+sqrt(delta)/2*a;
     write (x1:2:2,',', x2:2:2);
     
    end;

    procedure program_2;
    [b]uses crt;
     begin                                     
    sasiad : string[20];
    ja : string[20];
    ile   : longint;
    end; [/b]

    var stats : licznik;

    procedure pobierz;
    begin
    writeln('Podaj sasiad, pole moze zawierac 20 liter: ');
    readln(stats.sasiad);
    writeln('Podaj ja, pole moze zawierac 20 liter: ');
    readln(stats.ja);
    writeln('Podaj ilosc wywolan, maks. longint: ');
    readln(stats.ile);
    end;

    procedure pokaz;
    begin
    write('sasiad: ');
    writeln(stats.sasiad);
    write('ja: ');
    writeln(stats.ja);
    write('Ilosc wywolan: ');
    writeln(stats.ile);
    end;

    begin
    clrscr;
    pobierz;
    pokaz;
    readln;
    end;

    procedure program_3;
    [b]begin
    var k, r, i, s : integer;
    end;[/b]
    procedure rysowanie_lini ;
       begin
          for r := 1 to s do
             write('@');
          writeln
       end { druk_wiersza };
    begin
       readln(i,s);
       for k := 1 to i do
        rysowanie_lini;
        write;
       readln;
    end;


    begin
    [b] napisy[0] := 'Info';                 {wybor = 1}
     napisy[1] := 'Program 1';        {wybor = 2}
     napisy[2] := 'Program 2';         {wybor = 3}
     napisy[3] := 'Program 3';        {wybor = 4}
     napisy[4] := 'Wyjscie';            {wybor = 5} [/b]

     wybor := 1;

     repeat
      clrscr;

      for y:= 1 to 5 do
      begin
       if y = wybor then
       begin
        textcolor(black);
        textbackground(white);
       end
       else
       begin
        textcolor(white);
        textbackground(black);
       end
       gotoxy(32, 11 + wybor);
       write(napisy[y-1]);
      end;

      klawisz := upcase(readkey);
      if (klawisz = 'H') and (wybor > 1) then dec(wybor) else wybor := 5;
      if (klawisz = 'P') and (wybor < 5) then inc(wybor) else wybor := 1;
      if klawisz = #27 then wybor := 5; {Esc}

      if klawisz = #13 then                   {Enter}
      case wybor of
       1: info;
       2: program_1;
       3: program_2;
       4: program_3;
       5: wybor := 0;
      end;

     until wybor = 0;

    end.



    uff juz powoli zaczynam się denerwować sam na siebie ;) dziki za Twoje poświęcenie :) pogrubiłem to co poprawiłem w tym moim nieszczęsnym programiku tylko niew eim czy wszystko dobrze zrozumiałem ...[/b]
  • Helpful post
    Level 28  
    Teraz to ja się zaczynam gubić. Daj kod wynikowy (już poprawiony), bo ten zamieszczony powyżej niewiele mówi (z punktu widzenia programu nieważne, co poprawiałeś, ważne, co otrzymałeś w wyniku).
  • Level 14  
    procedure program_1;
    uses crt; ---- w tej linijce podkreśla mi uses i error 36
    begin expected
    begin
    var a,b,c,delta,x,x1,x2: real;
    end;

    coś robie źle z tymi procedurami tylko nie wiem co :/
  • Level 23  
    a w jakim programie kompilujesz ?? Dopiero teraz zauwazylem :] W procedurze nie mozesz umieszczac uses tak jak powiedzial Ci poprzednik ma to byc tylko po nazwie programu glownego np:
    program jakis;
    uses crt;
    begin
    end;

    a procedury wygladaja tak samo tylko bez usesa.
  • Helpful post
    Level 28  
    Tak jak pisałem wcześniej, uses deklarujemy tylko raz, dla całego programu, i musi to nastąpić w bloku deklaracji globalnych. Wstawiłeś uses w deklarację procedury, stąd compiler error 36.
    Code:
    uses
    
      crt;

    type licznik = record
                    sasiad: string[20];
                        ja: string[20];
                       ile: longint;
                   end;

    var
     klawisz: char;
       wybor: byte;
      napisy: array[0..4] of string;
           y: byte;

       stats: licznik; { deklarujemy globalnie, zeby byla widoczna we wszystkich procedurach }

    procedure info;
    begin
    end;

    procedure program_1;
    var a, b, c, delta, x, x1, x2: real;
    begin
      clrscr;
      write('wpisz a '); read(a);
      write('wpisz b '); read(b);
      write('wpisz c '); read(c);
      delta := (b * b) - 4 * a * c;
      if delta < 0 then
      begin
        write('brak rozwiazan');
      end
      else if delta = 0 then
      begin
        x := -b / (2 * a);
        write(x :2 :2);
      end
      else
      begin
        x1 := -b - sqrt(delta) / (2*a);
        x2 := -b + sqrt(delta) / (2*a);
        write(x1 :2 :2, ',', x2 :2 :2);
      end;
      { czekamy na nacisniecie dowolnego klawisza }
      writeln;
      write('Wcisnij dowolny klawisz, aby powrocic do menu...');
      readkey;
    end;

    procedure pobierz;
    begin
      writeln('Podaj sasiad, pole moze zawierac 20 liter: ');
      readln(stats.sasiad);
      writeln('Podaj ja, pole moze zawierac 20 liter: ');
      readln(stats.ja);
      writeln('Podaj ilosc wywolan, maks. longint: ');
      readln(stats.ile);
    end;

    procedure pokaz;
    begin
      write('sasiad: ');
      writeln(stats.sasiad);
      write('ja: ');
      writeln(stats.ja);
      write('Ilosc wywolan: ');
      writeln(stats.ile);
    end;

    procedure program_2;
    begin
      clrscr;
      pobierz;
      pokaz;
      { czekamy na nacisniecie dowolnego klawisza }
      writeln;
      write('Wcisnij dowolny klawisz, aby powrocic do menu...');
      readkey;
    end;

    procedure rysowanie_lini(r, s: integer);
    begin
      for r := 1 to s do write('@');
      writeln;
    end;

    procedure program_3;
    var k, r, i, s: integer;
    begin
      clrscr;
      readln(i, s);
      for k := 1 to i do rysowanie_lini(r, s);
      { czekamy na nacisniecie dowolnego klawisza }
      writeln;
      write('Wcisnij dowolny klawisz, aby powrocic do menu...');
      readkey;
    end;

    begin
      napisy[0] := 'Info';             {wybor = 1}
      napisy[1] := 'Program 1';        {wybor = 2}
      napisy[2] := 'Program 2';        {wybor = 3}
      napisy[3] := 'Program 3';        {wybor = 4}
      napisy[4] := 'Wyjscie';          {wybor = 5}

      wybor := 2;

      repeat
        textbackground(black);
        clrscr;

        for y:= 1 to 5 do
        begin
          if y = wybor then
          begin
            textcolor(black);
            textbackground(white);
          end
          else
          begin
            textcolor(white);
            textbackground(black);
          end;
          gotoxy(32, 11 + y);
          write(napisy[y - 1]);
        end;

        klawisz := upcase(readkey);
        if klawisz = 'H' then if wybor > 1 then dec(wybor) else wybor := 5;
        if klawisz = 'P' then if wybor < 5 then inc(wybor) else wybor := 1;
        if klawisz = #27 then wybor := 5; { jezeli Esc}

        if klawisz = #13 then { jezeli Enter }
        case wybor of
          1: info;
          2: program_1;
          3: program_2;
          4: program_3;
          5: wybor := 0;
        end;

      until wybor = 0;

    end.

    Powyżej masz kod, poprawiony przeze mnie i na pewno działający (sprawdziłem). Przejrzyj dokładnie, porównaj ze swoim i wyciągnij wnioski.