Delphi obliczanie średniej dodatkowe dane

0

Mam taki sobie program zrobiony w Delphi tryb wizualny liczący średnią ocen i muszę do niego dorobić możliwość pokazania na końcu ile wpisanych zostało ocen. Np 2 x 3 4 x 2 i ile to procent wszystkich ocen.

user image

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    Label2: TLabel;
    Label3: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    Suma, Licznik : Integer;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Edit1.text := ''; {wyczyszczenie komonentu edit1}
  Suma := 0;
  Licznik := 0;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  Edit1.Color := clWindow; //ustawienie bialego koloru tla dla komonentu edit
  if (Trim(Edit1.Text) <> '') then begin
  if (StrToIntDef(Edit1.Text,-1) < 0) then Edit1.Color := clRed;
  {jezeli wartosc jest mniejsza od zera ustaw tlo na czerwony}
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var liczba :ShortInt; //zadeklarowanie zmiennej liczbowej calkowitej
begin
  liczba := 0; //wyzerowanie zmiennej
  if (Edit1.Color = clWindow) then begin
    //jezeli kolor komponentu edit1 bedzie bialy to wykonaj ponizsze instrukcje
    liczba := StrToInt(Edit1.text);
    if ((liczba>0) and (liczba <7 )) then begin
      Suma := Suma + liczba;
      Licznik := Licznik + 1;
      Label2.Caption := 'suma wynosi: ' + IntToStr(Suma);
      Label3.Caption := 'ilosc podanych ocen: ' + IntToStr(Licznik);
  end;
end;
end;
end.

Czyli muszę dodać nowy label?

Czy da się wykorzystać ten patent?

if o1>0 then writeln(o1,' x 1', o1*100/n:10:2,'%');
if o2>0 then writeln(o2,' x 2', o2*100/n:10:2,'%');
if o3>0 then writeln(o3,' x 3', o3*100/n:10:2,'%');
if o4>0 then writeln(o4,' x 4', o4*100/n:10:2,'%');
if o5>0 then writeln(o5,' x 5', o5*100/n:10:2,'%');
if o6>0 then writeln(o6,' x 6', o6*100/n:10:2,'%');
0
if o1>0 then writeln(o1,' x 1', o1*100/n:10:2,'%');
if o2>0 then writeln(o2,' x 2', o2*100/n:10:2,'%');
if o3>0 then writeln(o3,' x 3', o3*100/n:10:2,'%');
if o4>0 then writeln(o4,' x 4', o4*100/n:10:2,'%');
if o5>0 then writeln(o5,' x 5', o5*100/n:10:2,'%');
if o6>0 then writeln(o6,' x 6', o6*100/n:10:2,'%');

A co to są zmienne o1 .. o6 i gdzie chcesz ich użyć...?

No a gdzie Ty obliczasz średnią? Wiesz w ogóle jak się to robi?

0

A tak zamiast o1,o2,...,o6 zrobić tablicę:

IloscOcen:array[1..6] of Cardinal;

?
Wtedy po wczytaniu oceny:

Ocena:=StrToInt(PoleOceny.Text);

i oczywiście sprawdzeniu czy mieści się w 1..6 możesz zwiększyć odpowiedni licznik tak:

Inc(IloscOcen[Ocena]);

Na dodatek jeżeli Label'i z wynikami umieścisz w osobnym panelu czyli ma być w tym panelu tylko 6 Label'i i nic więcej to możesz wyświetlać wyniki:

Suma:=0;
for I:=1 to 6 do Inc(Suma,IloscOcen[Ocena]);
for I:=1 to 6 do TLabel(Panel.Controls[I-1]).Caption:=FormatFloat('%d: %.1f%%',[I,100*IloscOcen[I]/Suma]);
0

Tylko nie mogę używać tablic bo ich nie przerabialiśmy.

o1,o2,o3,o4,o5,o6: integer;

To są zmienne.

Program jeszcze nie oblicza średniej tylko sumuje i podaje ile zostało wpisanych liczb.

4
And333 napisał(a)

Tylko nie mogę używać tablic bo ich nie przerabialiśmy.

No to jak to, tablic nie przerabialiście a już zabieracie się za aplikacje okienkowe...? Pogratuluj nauczycielowi pomysłowości...


No to zaprogramuj wpisywanie kolejnych liczb do zmiennych (skoro nie chcesz korzystać z macierzy to teraz wymyśl jak to zrobić), podczas poprawności wpisanej liczby także dodaj ją do sumy; Jeśli chcesz obliczyć średnią musisz sumę liczb podzielić przez ich ilość (czyli 6, bo na sztywno masz ustawione sześć zmiennych) i wyświetl w jakimś komponencie (np. z klasy TLabel oczywiście po odpowiedniej konwersji np. funkcją FloatToStr);

Na macierzach byłoby o wiele łatwiej, bo mógłbyś podawać dowolną ilość ocen zwiększając odpowiednio rozmiar macierzy i dodając nową ocenę do końcowego elementu; Obliczenia byłyby bardzo proste, ale skoro chcesz się babrać ze zmiennymi...


Dodam jeszcze obsługę macierzy dynamicznych dla podawania dowolnej liczby ocen;

Zadeklaruj sobie prywatną macierz dynamiczną oraz zmienną przechowującą sumę ocen:

private
  aRatings: array of Byte;
  iSum: Word;

Teraz podczas tworzenia formularza w zdarzeniu OnCreate zainicjuj je:

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLength(aRatings, 0);
  iSum := 0;
end;

Po podaniu oceny sprawdzasz jej wartość i dodajesz do macierzy, po czym zwiększasz sumę:

procedure TForm1.Button1Click(Sender: Tobject);
var
  iRating: Word;
begin
  iRating := StrToInt(PoleOceny.Text);

  if iRating in [1 .. 6] then
    begin
      SetLength(aRatings, Length(aRatings) + 1);
      aRatings[High(aRatings)] := iRating;
      Inc(iSum, iRating);
    end;
end;

Teraz wystarczy ją obliczyć:

var
  rAverange: Single;
begin
  rAverange := iSum / Length(aRatings);

i wyświetlić, np. w komponencie z klasy TLabel uprzednio konwertując ją na łańcuch (np. funkcją FloatToStr);


A jeśli chodzi o wyświetlanie ilości poszczególnych podanych ocen - w pętli jedziesz po każdym elemencie macierzy i inkrementujesz zawartość odpowiedniego labelka (bo chyba o to Ci chodziło z tymi 6 kontrokami z klasy TLabel); Nic trudnego, rozwiązanie podał kolega wyżej; Ja dodam, że można posłużyć się także funkcją FindComponent; Choć wątpię, żeby ktokolwiek z Was potrafił się nią posłużyć biorąc pod uwagę to, że macie tak duże zaległości w materiale...

0
And333 napisał(a):

Tylko nie mogę używać tablic bo ich nie przerabialiśmy.
Czy ty myślisz że dacie rady przerobić chociażby 5% tego co jest w Delphi?
Czy to wg ciebie oznacza że pozostałych 95% nie możesz używać?

0
_13th_Dragon napisał(a):
And333 napisał(a):

Tylko nie mogę używać tablic bo ich nie przerabialiśmy.
Czy ty myślisz że dacie rady przerobić chociażby 5% tego co jest w Delphi?
Czy to wg ciebie oznacza że pozostałych 95% nie możesz używać?

Jak zrobiłem raz program z tablicami to musiałem go robić od nowa bo ich "nie przerabialiśmy"

Dzięki za informacje postaram się je wykorzystać.

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