Problem z największą, najmniejszą liczbą w procedurach

0

Tak jak w temacie mam problem z obliczeniem najmniejszej liczby w procedurze. Program jakby bierze pod uwagę tylko ostatnią tablicve i znią porównuje. W czym zrobiłem błą byłbym wdzięczny za szybką pomoc.

program menu;
var
a:integer;

     procedure najmniejsza;
     var
     tab:array[1..3,1..3]of integer;
     a,b,min:integer;
     begin
     for a:=1 to 3 do
     for b:=1 to 3 do
     tab[a,b]:=random(10);
     for a:=1 to 3 do
     for b:=1 to 3 do
     writeln('tab[',a,',',b,']',tab[a,b]);
     min:=tab[a,b];
     if tab[a,b]<min then
     min:=tab[a,b];
     writeln('najmniejsza ',min);
     end;

     procedure najwieksza;
     var
     tab:array[1..3,1..3]of integer;
     a,b,max:integer;
     begin
     for a:=1 to 3 do
     for b:=1 to 3 do
     tab[a,b]:=random(10);
     for a:=1 to 3 do
     for b:=1 to 3 do
     writeln('tab[',a,',',b,']',tab[a,b]);
     max:=tab[a,b];
     if tab[a,b]>max then
     max:=tab[a,b];
     writeln('najwieksza ',max);
     end;




begin
writeln('wybierz co teraz zrobic?');
readln(a);
if a=1 then najmniejsza;
if a=2 then najwieksza;
readln;
readln;
end. 
0

byłbym wdzięczny za szybką pomoc.

A my bylibyśmy wdzięczni, gdybyś wrzucił wersję tego kodu przed obfuskacją.

#Edit - ale z tego co widzę, masz w ogóle źle poustawiane (czy raczej "brak") bloki "begin...end" w pętlach.

0

min musisz wyszukać w pętli a nie tak, jak teraz to robisz.

0
program menu;

var
  a : integer;

  procedure najmniejsza;
  var
    tab : array[1..3, 1..3] of integer;
    a, b, min : integer;
  begin
    for a := 1 to 3 do
    begin
      for b := 1 to 3 do
      begin
        tab[a, b] := random(10);
        writeln('tab[', a, ',', b, ']', tab[a, b]);
        min := tab[a, b];
        if tab[a, b] < min then
          min := tab[a, b];
        writeln('najmniejsza ', min);
      end;
    end;
  end;

  procedure najwieksza;
  var
    tab : array[1..3, 1..3] of integer;
    a, b, max : integer;
  begin
    for a := 1 to 3 do
    begin
      for b := 1 to 3 do
      begin
        tab[a, b] := random(10);
        writeln('tab[', a, ',', b, ']', tab[a, b]);
        max := tab[a, b];
        if tab[a, b] > max then
          max := tab[a, b];
        writeln('najwieksza ', max);
      end;
    end;
  end;




begin
  writeln('wybierz co teraz zrobic?');
  readln(a);
  if a = 1 then
    najmniejsza;
  if a = 2 then
    najwieksza;
  readln;
  readln;
end.
 

teraz lepiej?

tak dodałem beginy i endy to kod wcześniejszy:

program menu;

var
  a : integer;

  procedure najmniejsza;
  var
    tab : array[1..3, 1..3] of integer;
    a, b, min : integer;
  begin
    for a := 1 to 3 do
      for b := 1 to 3 do
        tab[a, b] := random(10);
    for a := 1 to 3 do
      for b := 1 to 3 do
        writeln('tab[', a, ',', b, ']', tab[a, b]);
    min := tab[a, b];
    if tab[a, b] < min then
      min := tab[a, b];
    writeln('najmniejsza ', min);
  end;

  procedure najwieksza;
  var
    tab : array[1..3, 1..3] of integer;
    a, b, max : integer;
  begin
    for a := 1 to 3 do
      for b := 1 to 3 do
        tab[a, b] := random(10);
    for a := 1 to 3 do
      for b := 1 to 3 do
        writeln('tab[', a, ',', b, ']', tab[a, b]);
    max := tab[a, b];
    if tab[a, b] > max then
      max := tab[a, b];
    writeln('najwieksza ', max);
  end;




begin
  writeln('wybierz co teraz zrobic?');
  readln(a);
  if a = 1 then
    najmniejsza;
  if a = 2 then
    najwieksza;
  readln;
  readln;
end.
  
0
cemax11 napisał(a):

teraz lepiej?

Odpowiem najpierw pytaniem. No i co, można? Można! Jak widać. Teraz będzie innym łatwiej spojrzeć na ten kod. Sam chyba zresztą też widzisz, że kod stał się o wiele bardziej czytelny.

A właśnie co do kodu. To jeśli dobrze odczytuje, jest tutaj coś totalnie bez sensu. Nadajesz wartości tym zmiennym do ustalenia największej oraz najmniejszej, a zaraz po tym je porównujesz z tym co przed chwilą przypisałeś. Mogę się mylić, ale chyba to nie ma sensu. Poza tym to te wypisanie najmniejszej i największej, powinno się na logikę odbyć po skończeniu tych pętli.

Powinno się to odbyć tak, że Max zerujesz przed pętlą. Natomiast Min ustawiasz na High(Integer), bo taki jest Twój typ tablicy. Natomiast w samych pętlach porównujesz Min i Max z elementem tablicy i dopiero wtedy kiedy jest on mniejszy (dla Min) lub większy (dla Max) to ustawiasz te zmianne. To tak na moją (a może nie tylko moją) logikę. Jednak bez formatowania kodu nawet do tak prostych wniosków ciężko dojśc, bo kod jest nieczytelny.

0

I przy okazji tablice zrób globalną. Bo toco masz teraz to wyszukiwanie najmniejszej i największej wartości dla dwóch różnych tablic.

0
program menu;

var
  tab : array[1..3, 1..3] of integer;
  a, b, min, i, max : integer;

  procedure najmniejsza;
  begin
    min := High(integer);
    for a := 1 to 3 do
      for b := 1 to 3 do
        tab[a, b] := random(10);
    for a := 1 to 3 do
      for b := 1 to 3 do
        writeln('tab[', a, ',', b, ']', tab[a, b]);
    if tab[a, b] < min then
      min := tab[a, b];
    writeln('najmniejsza ', min);
  end;

  procedure najwieksza;
  begin
    max := 0;
    for a := 1 to 3 do
      for b := 1 to 3 do
        tab[a, b] := random(10);
    for a := 1 to 3 do
      for b := 1 to 3 do
        writeln('tab[', a, ',', b, ']', tab[a, b]);
    if tab[a, b] > max then
      max := tab[a, b];
    writeln('najwieksza ', max);
  end;

begin
  writeln('wybierz co teraz zrobic?');
  readln(i);
  if i = 1 then
    najmniejsza;
  if i = 2 then
    najwieksza;
  readln;
  readln;
end.
  

zrobiłem globalną tablice+ zmieniłem początkową wartość mix, max ale dalej to samo

1

Dalsze odpowiadanie Tobie według mnie - nie ma żadnego sensu. Jeżeli nie znasz podstaw języka i tylko zgadujesz. Nie na tym polega programowanie. Przeczytaj najpierw kompendium (może być to na 4p) albo jakiś kurs, to się dowiesz co robisz źle. Oraz po co stosujemy begin i end poza rozpoczynaniem i kończeniem danej procedury czy funkcji. Takie rzeczy powinieneś dawno wiedzieć, a po przefomatowiu kodu na czytelny też samodzielnie wyłapywać i poprawiać, nie czekając na nas i ze wszystkim od razu "smarując" na forum. Ja rozumiem, że dział Newbie. Ale jakieś podstawy trzeba mieć. I oczywiście znać też zasadę zastosowania zmiennych w pętlach.

0

No i teraz załóż pętlę na wyszukiwanie min
Obecnie robisz tylko jedno sprawdzenie

if tab[a, b] < min then
      min := tab[a, b];

przy czym a i b są prawdopodobnie nieokreślone (Nie pamiętam jakie wartości przyjmują zmienne pętli po jej zakończeniu. To chyba zależy od kompilatora).

0
pelsta napisał(a):

No i teraz załóż pętlę na wyszukiwanie min
Obecnie robisz tylko jedno sprawdzenie

if tab[a, b] < min then
      min := tab[a, b];

przy czym a i b są prawdopodobnie nieokreślone (Nie pamiętam jakie wartości przyjmują zmienne pętli po jej zakończeniu. To chyba zależy od kompilatora).

wielkie dzięki :) po dodaniu pętli program działa ;)

0
Furious Programming napisał(a)

Low(Integer) <> -High(Integer)

Oczywiście!
Zakładając, że mamy liczby 32-bitowe w kodzie U2
Low(Integer) = 10000000000000000000000000000000 = -2147483648
High(Integer) = 01111111111111111111111111111111 = 2147483647
-High(Integer) = -2147483647

Zaproponowałem -High(Integer), żeby pytający miał symetryczny zakres min..max :)

@Furious Programming
He, he
Zmieniłeś się nie do poznania. Nie wiem czy odważę się z Tobą dyskutować patrząc na Twoją nową twarz :)

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