Delphi kłopot z mnożeniem//średnia ważona

0
program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, SysUtils, CustApp
  { you can add units after this };

type

  { TMyApplication }

  TMyApplication = class(TCustomApplication)
  protected
    procedure DoRun; override;
  public
  end;

{ TMyApplication }

procedure TMyApplication.DoRun;
var
  ErrorMsg: String;
  s,k,r,i,waga_spr,waga_kart,waga_reszta:Integer;
  a,b,c,wynikspr,wynikkart,wynikreszta:String;
  srednia_wazona:Real;
  Spr:array of String;
  Kart:array of String;
  Reszta:array of String;
begin
  writeln('Program Sredna Wazona by Gromo'); writeln();readln();
  writeln('Podaj liczbe ocen o wadze 5');
  readln(s);
  SetLength(Spr, s);
  for i:=1 to s do
  begin
       writeln('- ');
       readln(a);
       Spr[i]:=a;
  end;
  readln();
  writeln('Podaj liczbe ocen o wadze 3');
  readln(k);
  SetLength(Kart, k);
  for i:=1 to k do
  begin
       writeln('- ');
       readln(b);
       Kart[i]:=b;
  end;
  writeln('Podaj liczbe ocen o wadze 1');
  readln(r);
  SetLength(Reszta, r);
  for i:=1 to r do
  begin
       writeln('- ');
       readln(c);
       Reszta[i]:=c;
  end;
  for i:=1 to s do
  begin
       wynikspr:=wynikspr+Spr[i];
  end;
  for i:=1 to k do
  begin
       wynikkart:=wynikkart+Kart[i];
  end;
  for i:=1 to r do
  begin
       wynikreszta:=wynikreszta+Reszta[i];
  end;
  waga_spr:=5*s;
  waga_kart:=3*k;
  waga_reszta:=1*r;
  srednia_wazona:=(wynikspr*5+wynikkart*3+wynikreszta+1)/(waga_spr+waga_kart+waga_reszta);
  writeln('Twoja srednia wazona to:');
  writeln(srednia_wazona);
  end;


  readln();
  Terminate;
end;

var
  Application: TMyApplication;
begin
  Application:=TMyApplication.Create(nil);
  Application.Title:='My Application';
  Application.Run;
  Application.Free;
end.
 

Otóż postanowiłem zacząć moją przygodę z programowaniem. Mam już za sobą pierwszy kontakt, jednak mam tak kiepskiego nauczyciela w szkole, że nie jest w stanie mnie prawie niczego nauczyć. Postanowiłem napisać swój pierwszy program liczący średnią ważoną. W Pogrubionym miejscu podczas odpalania programu Lazarus wyświetla mi błąd pod tytułem "Operation "*" is not supported for types "AnsiString" and "ShortInt". Próbowałem konwertować tym za pomocą StrtoInt ale to nic nie daje. Z góry dziękuję za pomoc. Pozdrawiam.

1

a,b,c,wynikspr,wynikkart,wynikreszta:Integer;
Spr:array of Integer;
Kart:array of Integer;
Reszta:array of Integer;

0

No a teraz kolejne pytanie. Jak pozamieniać typy zmiennych, albo co dopisać, by program zczytywał także takie liczby jak 4,5(odpowiednik 4+)? Nie popełniłem też przypadkiem błędu we wzorze na średnią ważoną? Gdy wpisuję dość niskie wyniki to program oblicza kosmiczne wyniki w okolicach 12 tysięcy.

0

Zapraszamy do google. Tylko zamiast wpisywać tam swoje pytania wpisz tam: "Pascal kurs od podstaw" ewentualnie "Pascal Tutorial". I od razu uprzedzę Twoje jęczenie jacy to my źli, że nie odpowiadamy Ci na pytanie. W KURSACH ZNAJDZIESZ ODPOWIEDZI.

1
Gromo napisał(a):

No a teraz kolejne pytanie. Jak pozamieniać typy zmiennych, albo co dopisać, by program zczytywał także takie liczby jak 4,5(odpowiednik 4+)?

Single, Double, Extended...

Nie popełniłem też przypadkiem błędu we wzorze na średnią ważoną?

Masz w ogóle błąd we wczytywaniu tych danych.
SetLength(Tablica, n); tworzy Ci tablicę o indeksach 0..n-1, a nie 1..n

Btw, możesz napisać po prostu Readln(Tablica[I]);, bez tych pomocniczych zmiennych.

0

Dzięki za pomoc. A co do tych złośliwych komentarzy. Nauczyciel jest naprawdę kiepski. Programowania uczy u mnie w szkole trzech ludzi. Dwóch jest dobrych. Mój zawsze kazał nam kopiować kod z notatnika, który po poprawnym skopiowaniu(!) nie był w stanie działać. ZERO nauki pisania aplikacji. W sumie to jedyne co sami napisaliśmy to kalkulator na dodawanie, oczywiście nam pomagał, ale to było raczkowanie w Pascalu. A wyobraźcie sobie, że na klasę 16 osobową jestem w trójce najlepszych uczniów z programowania, o ile nie najlepszym i w 90% dostaję piątki. Mój nauczyciel jedyne czego mnie nauczył to odróżniać kod delphi od c++ oraz pisać wszystko z wcięciami i w miarę estetycznie i czysto. Nie wiecie jaki on jest, więc proszę abyście się nie wypowiadali. Ten sam człowiek uczy mnie i programowania i specjalizacji(AutoCAD). Na specjalizacji mam wrażenie, że wiem więcej niż on. Nie jest w stanie nam nawet pomóc, gdy czegoś nie umiemy(w końcu od tego jest). Każe nam tylko robić jakieś tuby/wałki w 3D, które wcześniej pobrał z internetu. Oczywiście cały wałek w 2D należy przerysować, po już narysowanych liniach, ponieważ nie da się utworzyć z tych już istniejących regionów. Generalnie lekcje z tym człowiekiem to kombinowanie i kombinowanie, bo sam nic nie umie nauczyć. Ale koniec tego offtopu o tym człowieku. Wystarczy mi z nim 6 godzin tygodniowo męki.

Co do programu to może faktycznie jak na nauczyciela i mój poziom zaawansowania to wybrałem trochę zbyt ambitne zadanie. Rozumiem, że popełniłem wiele błędów, ale ja jedynie proszę o drobną pomoc. Czytałem już 5 artykułów o tym, jak zacząć i wiem, że należy czytać kursy/książki. Akurat pisząc ten program wykorzystywałem wiedzę o delphi/pascalu zawartą na tej stronie. Wiem, że potrzeba do programowania cierpliwości, szczególnie na początku. Gdy wyskoczył mi błąd o mnożeniu to tak, szukałem tego w internecie. Jedynie nie skojarzyłem, że to o tablice chodzi. Każdy ma prawo do takiego błędu. Ja RACZKUJĘ i potrzebuję wsparcia. Takie jest moje zdanie. Z pomocy forum skorzystałem w ostateczności.

Dziwię się, że spotkałem się z trochę przykrymi komentarzami.

1

Nauczyciel jest naprawdę kiepski. Programowania uczy u mnie w szkole trzech ludzi. Dwóch jest dobrych. Mój zawsze kazał nam kopiować kod z notatnika, który po poprawnym skopiowaniu(!) nie był w stanie działać.

Pamiętam, że jak ja chodziłem jeszcze do TI to także miałem nie najlepszego nauczyciela, jednak dzięki nauce na własną rękę i samodzielności nauczyłem się wszystkiego sam; I także kopiowaliśmy kod ze stacji nauczyciela na swoje stanowisko, jednak kody nie działały celowo - należało nanieść odpowiednie poprawki, jednak można to było zrobić jedynie jeśli miało się odpowiednią wiedzę; Może ten Twój nauczyciel nie powiedział Wam tego, ale może coś w ten deseń wykombinował; Natomiast jeśli takie rzeczy dzieją się na co dzień i bez przerwy, to jest to kłopot, który należy rozwiązać z danym nauczycielem, a nie z forumowiczami z całej Polski;

W sumie to jedyne co sami napisaliśmy to kalkulator na dodawanie, oczywiście nam pomagał, ale to było raczkowanie w Pascalu.

No dobrze, ale jestem ciekaw, czy jeśli uczylibyście się jak należy i posiadali odpowiednią na daną chwilę wiedzę to czy napisalibyście taki program sami - możliwe, że po prostu brakowało Wam wiedzy i nauczyciel musiał Was prowadzić za rękę;

Mój nauczyciel jedyne czego mnie nauczył to odróżniać kod delphi od c++ oraz pisać wszystko z wcięciami i w miarę estetycznie i czysto.

A to ciekawe, bo u nas na zajęciach uczyliśmy się korzystania ze zmiennych/stałych, różnych instrukcji itd., ale nigdy nie była poruszana sprawa formatowania kodu; Na jedno to dobrze, ale uczyć także trzeba się samemu, a jeśli się czegoś nie zrozumie na zajęciach i z braku czasu czy możliwości nauczyciel nie wyjaśni dokładniej, to tym bardziej trzeba przysiąść w domu; Do tego jednak trzeba chęci;

Na specjalizacji mam wrażenie, że wiem więcej niż on.

A to całkiem możliwe; Ja miałem takie nieszczęście, że pewnego przedmiotu z informatyką związanego uczył mnie nauczyciel po szkole rolniczej z kursem zrobionym pewnie w czasach świetności Comodore czy Atari; Większość klasy wiedziała więcej niż on;

Co do programu to może faktycznie jak na nauczyciela i mój poziom zaawansowania to wybrałem trochę zbyt ambitne zadanie.

To zadanie wcale nie jest trudne - brakuje Ci jednak wiedzy żeby sprawnie je rozwiązać; Poucz się, a spokojnie napiszesz wszystko sam - bez naszej pomocy;

Gdy wyskoczył mi błąd o mnożeniu to tak, szukałem tego w internecie.

To bardzo dobrze, jednak ilość wyników w wyszukiwarce uzależniona jest on treści zapytania; Zrozumiałbyś problem od razu, jeśli umiałbyś choć trochę język angielski, a ten w programowaniu i ogólnie informatyce jest nieodzowny; Zawsze do dyspozycji masz translatory w internecie, które chętnie pomogą;

Dziwię się, że spotkałem się z trochę przykrymi komentarzami.

A to Cię akurat nie powinno dziwić - tutaj z reguły jak ktoś ma problem z zadaniem ze szkoły czy uczelni to zawsze winny jest nauczyciel czy wykładowca, nigdy pytacz;

0

Z angielskiego jestem dobry, ale akurat nie potrafiłem zrozumieć istoty problemu. Jak już w pierwszym poście napisałem, próbowałem konwersji typów, ale to nic nie dawało. W ogóle tego z tablicami nie skojarzyłem.

Co do celowego nie działania kodu, to u mnie wątpię w to, żeby nam tak nauczyciel robił. Sam jest zdziwiony, że program nie działa i nie potrafi go samodzielnie naprawić. Nie raz już przerabialiśmy jakąś funkcję/program na suchym kodzie, bo programu nie dało się odpalić.

No dobrze, ale jestem ciekaw, czy jeśli uczylibyście się jak należy i posiadali odpowiednią na daną chwilę wiedzę to czy napisalibyście taki program sami - możliwe, że po prostu brakowało Wam wiedzy i nauczyciel musiał Was prowadzić za rękę;

Nie mogliśmy wtedy posiadać jakiejkolwiek wiedzy, bo pisaliśmy to w pierwszej klasie. Akurat wtedy był "dobrym" nauczycielem, bo uczył banalnych rzeczy.

A to Cię akurat nie powinno dziwić - tutaj z regóły jak ktoś ma problem z zadaniem ze szkoły czy uczelni to zawsze winny jest nauczyciel czy wykładowca, nigdy pytacz;

Akurat to nie jest moje zadanie do szkoły ani na uczelnię. Nigdy nam nawet takich zadań nie zadawano. Postanowiłem w końcu rozszerzyć swoją wiedzę i zacząć uczyć się na własną rękę programowania, więc wpadłem na pomysł napisania programu dla użytku własnego.

Apropos samego programu, naniosłem poprawki, które polecaliście zrobić, ale dalej program nie liczy średniej tak, jak powinien. Liczby zczytuje chyba prawidłowo, karzę mu spytać o dwie, to bierze dwie. Nigdy więcej mniej. Jednak gdy wpiszę pojedyncze oceny w danych wagach to program się wysypuje przy zamykaniu konsolki dosowej.

Poprawiony kod:

program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, SysUtils, CustApp
  { you can add units after this };

type

  { TMyApplication }

  TMyApplication = class(TCustomApplication)
  protected
    procedure DoRun; override;
  public
  end;

{ TMyApplication }

procedure TMyApplication.DoRun;
var
  ErrorMsg: String;
  s,k,r,i,waga_spr,waga_kart,waga_reszta:Integer;
  wynikspr,wynikkart,wynikreszta:Integer;
  srednia_wazona:Real;
  Spr:array of Integer;
  Kart:array of Integer;
  Reszta:array of Integer;
begin
  writeln('Program Sredna Wazona by Gromo'); writeln();readln();
  writeln('Podaj liczbe ocen o wadze 5');
  readln(s);
  SetLength(Spr, s);
  for i:=1 to s do
  begin
       writeln('- ');
       readln(Spr[i]);
  end;
  readln();
  writeln('Podaj liczbe ocen o wadze 3');
  readln(k);
  SetLength(Kart, k);
  for i:=1 to k do
  begin
       writeln('- ');
       readln(Kart[i]);
  end;
  readln();
  writeln('Podaj liczbe ocen o wadze 1');
  readln(r);
  SetLength(Reszta, r);
  for i:=1 to r do
  begin
       writeln('- ');
       readln(Reszta[i]);
  end;
  for i:=1 to s do
  begin
       inc(wynikspr,Spr[i]);
  end;
  for i:=1 to k do
  begin
       inc(wynikkart,Kart[i]);
  end;
  for i:=1 to r do
  begin
       inc(wynikreszta,Reszta[i]);
  end;
  waga_spr:=5*s;
  waga_kart:=3*k;
  waga_reszta:=1*r;
  srednia_wazona:=(wynikspr*5+wynikkart*3+wynikreszta+1)/(waga_spr+waga_kart+waga_reszta);
  writeln('Twoja srednia wazona to:');
  writeln(srednia_wazona:2:2);



  readln();
  Terminate;
end;

var
  Application: TMyApplication;
begin
  Application:=TMyApplication.Create(nil);
  Application.Title:='My Application';
  Application.Run;
  Application.Free;
end.
0

To, co tutaj wpisałem to kod poprawiony o porady kolegów powyżej. Jeszcze w pętlach for liczacych wynikspr,wynikkart i wynikreszta zamiast

for i=1 to s do

dałem for i=0 to s-1 do

. Myślałem, że to rozwiąże problem z obliczaniem średniej ważone, ale się pomyliłem. Z głowy mi już paruje ale nie umiem się doszukać błędu powodującego wyniki rzędu 12 tysięcy i wyżej w ostatecznym wyniku.
2
procedure TMyApplication.DoRun;
var I,W,N,V,Nom,Den:Integer;
begin
  Nom:=0;
  Den:=0;
  W:=5;
  while W>0 do
  begin
    writeln('Podaj liczbe ocen o wadze ',W);
    readln(N);
    for i:=1 to N do
    begin
      readln(V);
      Inc(Nom,V*W);
      Inc(Den,W);
    end;
    Dec(W,2);
  end;
  writeln('Twoja srednia wazona to: ',(Nom/Den)2:2);
  readln();
  Terminate;
end;

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