[PASCAL] tab 2 wym, srednia z wskazanej kolumny

program wskazana_kolumna;


uses crt;


type

tab2=array[1..10,1..10] of byte;




procedure info(var wybor:byte);

begin

     clrscr;

     writeln('Program generuje i wyswietla tabilce dwuwymiarowa.');

     write('Ktorej kolumny chcesz obliczyc srednia: '); readln(wybor);


     writeln;

end;


procedure generuj(var tab2x2:tab2);


var

   i,j:byte;


begin


     randomize;

     for j:=1 to 10 do

     begin


          for i:=1 to 10 do

          begin

               tab2x2[i,j]:=random(10);

          end;

     end;

end;


procedure drukuj(tab2x2:tab2);


var

   i,j:byte;


begin

     for j:=1 to 10 do

     begin

         for i:=1 to 10 do

         begin

              write(tab2x2[i,j],' ');

         end;

         writeln;

     end;

end;



procedure srednia_kolumny(tab2x2:tab2; wybor:byte ; var srednia:integer);

var

j:byte;


begin


j:=wybor;



end;









var

   tab2x2:tab2;

   wybor:byte;


begin

     info(wybor);

     generuj(tab2x2);

     drukuj(tab2x2);

     readln;

end.

wiem, że na początku trzeba wybrać której kolumny średnią chcę obliczyć, chciałem to zrobić w ten sposób, że na samym początku wybrać kolumnę przechować w zmiennej wybor i przez przypisane jej do kolumny później liczyć średnią, tylko nie wiem jak dalej to zrobić. plox help

PS. jaka była zależność aby liczyć średnią nad przekątną w tab 2 wymiarowych?

  1. Policz średnią z liczb 1, 1, 2 - i zastanów się jak zamierzasz wpisać ten wynik do: var srednia:integer

  2. Zerujesz wynik, w pętle takiej jak przy wydruku dodajesz do wyniku wartość komórki, po pętli wynik dzielisz przez ilość wierszy.

program wskazana_kolumna;


uses crt;


type

tab2=array[1..10,1..10] of byte;




procedure info(var wybor:byte);

begin

     clrscr;

     writeln('Program generuje i wyswietla tabilce dwuwymiarowa.');

     write('Ktorej kolumny chcesz obliczyc srednia: '); readln(wybor);


     writeln;

end;


procedure generuj(var tab2x2:tab2);


var

   i,j:byte;


begin


     randomize;

     for j:=1 to 10 do

     begin


          for i:=1 to 10 do

          begin

               tab2x2[i,j]:=random(10);

          end;

     end;

end;


procedure drukuj(tab2x2:tab2);


var

   i,j:byte;


begin

     for j:=1 to 10 do

     begin

         for i:=1 to 10 do

         begin

              write(tab2x2[i,j],' ');

         end;

         writeln;

     end;

end;



procedure srednia_kolumny(tab2x2:tab2; wybor:byte ; var srednia:real);

var

j,i:byte;

suma:integer;


begin


suma:=0;

srednia:=0;

for j:=wybor to 10 do

     begin

         for i:=1 to 10 do

         begin

              suma:=suma+tab2x2[i,wybor];

              srednia:=suma/10;

         end;

         writeln;

     end;

writeln('Srednia ',wybor,' kolumny wynosi ',srednia);


end;









var

   tab2x2:tab2;

   wybor:byte;

   srednia:real;


begin

     info(wybor);

     generuj(tab2x2);

     drukuj(tab2x2);

     srednia_kolumny(tab2x2,wybor,srednia);

     readln;

end.

sklepałem coś takiego tyle, że źle oblicza(chyba bo jak suma liczb ktora liczylem w pamieci wyszla 39 to powinna srednia wyjsc 3.9 a wyszla 3.87) ;/ gdzie zrobiłem błąd? (pewnie liczę średnią wiersza, ta?)

  1. Na początku nie musisz zerować średnia, ponieważ najpierw zliczasz sumę.

  2. Jak pisałem już wcześniej “po pętli wynik dzielisz przez ilość wierszy”, nie wiem czemu przeczytałeś to jako “wewnątrz pętli”.

  3. Chyba miałeś obliczać średnią z kolumny a nie z wiersza.

  4. Sumujesz wybrany wiersz kilkukrotnie (11-nr_wiersza razy) nie wiedzieć po kiego.

  5. Po to zmienna srednia przekazuje się do funkcji jako referencja (przez var) aby nie wypisywać jej wartości w funkcji.

program wskazana_kolumna;


uses crt;


type

tab2=array[1..10,1..10] of byte;




procedure info(var wybor:byte);

begin

     clrscr;

     writeln('Program generuje i wyswietla tabilce dwuwymiarowa.');

     write('Ktorej kolumny chcesz obliczyc srednia: '); readln(wybor);


     writeln;

end;


procedure generuj(var tab2x2:tab2);


var

   i,j:byte;


begin


     randomize;

     for j:=1 to 10 do

     begin


          for i:=1 to 10 do

          begin

               tab2x2[i,j]:=random(10);

          end;

     end;

end;


procedure drukuj(tab2x2:tab2);


var

   i,j:byte;


begin

     for j:=1 to 10 do

     begin

         for i:=1 to 10 do

         begin

              write(tab2x2[i,j],' ');

         end;

         writeln;

     end;

end;



procedure srednia_kolumny(tab2x2:tab2; wybor:byte ; var srednia:real);

var

j,i:byte;

suma:integer;


begin


suma:=0;

for j:=1 to 10 do

     begin

         for i:=1 to 10 do

         begin

              suma:=suma+tab2x2[i,wybor];

         end;

         writeln;

     end;

srednia:=0;

srednia:=suma/10;

writeln('Srednia ',wybor,' kolumny wynosi ',srednia);


end;





var

   tab2x2:tab2;

   wybor:byte;

   srednia:real;


begin

     info(wybor);

     generuj(tab2x2);

     drukuj(tab2x2);

     srednia_kolumny(tab2x2,wybor,srednia);

     readln;

end.

po kolei ;o

i tu mam problem wlasnie bo kurde gdzie bym nie wstawił tego wyboru to mi liczy średnią wiersza a nie kolumny :confused:

ale ja tu przecież żadnej funkcji nie uzywam

Błąd tkwi w procedurze srednia_kolumny. W tej procedurze kilkadziesiąt razy wewnątrz pętli zapisujesz pewną wartość do zmiennej srednia (a powinieneś tylko raz na końcu procedury)

Dla przykładu procedura obliczająca średnią wybranego wiersza:

procedure SredniaWiersza(tab2x2: tab2; wybor:byte; var srednia: real);

    var i: byte;

        suma: integer;

    begin

      suma:=0;

      for i:=1 to 10 do suma:= suma+tab2x2[i, wybor];

      srednia:= suma/10;

    end;

A co wpisać, aby wyświetlała się średnia kolumny?

procedure SredniaKolumny(tab2x2: tab2; wybor:byte; var srednia: real);

    var i: byte;

        suma: integer;

    begin

      suma:=0;

      for i:=1 to 10 do suma:= suma+tab2x2[?, ?]; (* Co wstawisz zamiast znaków "?" *)

      srednia:= suma/10;

    end;

Na pewno sobie poradzisz, tylko chwilę pomyśl :slight_smile:

[wybor, i]

(liczy dobrze ale chcę się upewnić)

A nie mówiłem, że sobie poradzisz :smiley:

uff… dzięki serdeczne za pomoc :wink: