Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 22. 04. 2013 20:59

Jan Jícha
Veterán
Místo: Plzeň/Mnichov
Příspěvky: 1801
Škola: ZČU - FST - KMM
Pozice: Safety Engineer
Reputace:   74 
Web
 

Delphi - Pascal

Zdravím vás, mám zapsaný předmět programování - je povinný, ale od příštího roku volím specializaci, a v tom programování nebude.

Dostal jsem udělat program.

Naplňte vektor pracovišť hodnotami. Každé pracoviště má číslo (pole 6 numerických znaků – kontrola), název pracoviště (20 alfanumerických znaků bez diakritiky), hodinovou sazbu (reálné číslo). Seřaďte tento vektor sestupně podle hodinových sazeb a vytiskněte všechna pracoviště, jejichž hodinová sazba je větší než průměrná.
Pole záznamů zobrazujte do memo pole a nakonec vytiskněte do souboru.

vstup: n – počet pracovišť, jejich data

Výstup: Pracoviště a jejich vlastnosti s hodinovou sazbou větší než průměrná, průměrná sazba.

Vzhledem k tomu, že mě tlačí čas a mám spoustu jiné práce, ptám se Vás, jak bych měl začít, co a jak použít, případně nějaké rady.

Programování je pro mě španělská vesnice a když vím, že se s tím do budoucna zabývat nebudu, nějak to hrotit nechci a žádám o pomoc.

Za jakoukoliv pomoc děkuji:-))

Offline

  • (téma jako vyřešené označil(a) Jan Jícha)

#2 26. 04. 2013 14:49

Jan Jícha
Veterán
Místo: Plzeň/Mnichov
Příspěvky: 1801
Škola: ZČU - FST - KMM
Pozice: Safety Engineer
Reputace:   74 
Web
 

Re: Delphi - Pascal

Poradí někdo, prosím?

Offline

 

#3 28. 04. 2013 00:01

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: Delphi - Pascal

Zdravím,
záleží, jak si chceš ten vektor naimplementovat. Ono v Pascalu to není vůbec. Najdi si na netu, co to ten vektor vůbec je...

V Delphi 2009 a 2010 máme unitku Generics.Collections pro generiku (něco jako šablony v C++). Máme tu datové typy (kontejnery) jako TList, nebo TObjectList.

Code:

my_list : TList<integer>;
my_object_list : TObjectList<MyClass>;

také to jde použít bez generiky:

Code:

my_list : TList;
my_object_list : TObjectList;

List v Delphi je úplně stejně naimplementován jako STL vektory, tedy jsou založeny (based) na poli. Tam je problém spíše v rychlosti generování (Delphi vs. C++).

Co používáš pro vývoj? Já doporučuji pro toto Embarcadero.
Jak jsi na tom časově, stíháš? Do kdy to máš mít?


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#4 28. 04. 2013 02:09

Jan Jícha
Veterán
Místo: Plzeň/Mnichov
Příspěvky: 1801
Škola: ZČU - FST - KMM
Pozice: Safety Engineer
Reputace:   74 
Web
 

Re: Delphi - Pascal

↑ RePRO: Také zdravím, jsem v 1. ročníku. Probrali jsme to, co na střední - podmínky, cykly, pole.

Mám to mít asi za dva týdny, nejsme z toho nějak moudrý. Dělám v Delphi 2009. Pročtu ještě skripta no, jestli tam něco nenajdu.

Offline

 

#5 11. 05. 2013 13:15

Jan Jícha
Veterán
Místo: Plzeň/Mnichov
Příspěvky: 1801
Škola: ZČU - FST - KMM
Pozice: Safety Engineer
Reputace:   74 
Web
 

Re: Delphi - Pascal

Tak jsem k tomu dostal další instrukce.

Dobry den,budu pry potrebovat datovy typ zaznam (record). Tento zaznam "rozmnozite" pomoci jednorozmnerneho pole

nejak vyuzit memopole

Pro razeni vyuzijete proceduru BubbleSort

Moudrý z toho nejsem, poradí někdo.

Offline

 

#6 13. 05. 2013 15:45

Jan Jícha
Veterán
Místo: Plzeň/Mnichov
Příspěvky: 1801
Škola: ZČU - FST - KMM
Pozice: Safety Engineer
Reputace:   74 
Web
 

Re: Delphi - Pascal

Tak jsem nějak pokročil, ale dál nevím.


Naplňte vektor pracovišť hodnotami. Každé pracoviště má číslo (pole 6 numerických znaků – kontrola), název pracoviště (20 alfanumerických znaků bez diakritiky), hodinovou sazbu (reálné číslo). Seřaďte tento vektor sestupně podle hodinových sazeb a vytiskněte všechna pracoviště, jejichž hodinová sazba je větší než průměrná.
Pole záznamů zobrazujte do memo pole a nakonec vytiskněte do souboru.

vstup: n – počet pracovišť, jejich data

Výstup: Pracoviště a jejich vlastnosti s hodinovou sazbou větší než průměrná, průměrná sazba.

Code:

unit pracoviste_f;

interface

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

type
  TfrmPracoviste = class(TForm)
    btnDalsi: TButton;
    btnNovy: TButton;
    btnOpravit: TButton;
    btnPotvrdit: TButton;
    btnOdstranit: TButton;
    btnKonec: TButton;
    btnVypocet: TButton;
    btnPrvni: TButton;
    edtCislo: TEdit;
    edtNazev: TEdit;
    edtSazba: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    lblPrumer: TLabel;
    lblVypis: TLabel;
    memoVysledek: TMemo;
    btnPokracovat: TButton;
    btnUlozit: TButton;
    sdiaUlozit: TSaveDialog;
    procedure btnKonecClick(Sender: TObject);
    procedure btnDalsiClick(Sender: TObject);
    procedure btnNovyClick(Sender: TObject);
    procedure btnPotvrditClick(Sender: TObject);
    procedure btnPrvniClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure btnOpravitClick(Sender: TObject);
    procedure btnOdstranitClick(Sender: TObject);
    procedure btnVypocetClick(Sender: TObject);
    procedure edtCisloClick(Sender: TObject);
    procedure edtNazevClick(Sender: TObject);
    procedure edtSazbaClick(Sender: TObject);
    procedure btnPokracovatClick(Sender: TObject);
    procedure btnUlozitClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmPracoviste: TfrmPracoviste;

implementation

{$R *.dfm}
Const
  JmenoSoub = 'Prac.dat';
Type
  TZaznam = record

    cislo: integer;
    nazev: string[20];
    sazba: real;
  end;
  TSoubor = file of TZaznam;
var
  zaznam: TZaznam;
  soubor: TSoubor;
  procteni: boolean; // Indikace, že je soubor otevřen pro čtení

//vlastni podprogramy
procedure zobrazit;
begin

  frmPracoviste.edtCislo.text := IntToStr(zaznam.cislo);
  frmPracoviste.edtNazev.text := zaznam.nazev;
  frmPracoviste.edtSazba.text := FloatToStr(zaznam.sazba);

end;

procedure TfrmPracoviste.btnNovyClick(Sender: TObject);
begin
  frmPracoviste.edtCislo.text := 'Zadejte 6 numerických znaků';
  frmPracoviste.edtNazev.text := 'Zadejte 20 alfanumerických znaku';
  frmPracoviste.edtSazba.text := 'Zadejte reálné číslo';
  edtCislo.Enabled := true;
  edtNazev.Enabled := true;
  edtSazba.Enabled := true;

end;
procedure ZapsatDoSouboru(var t:textfile;n:integer;var zaznam:Tzaznam);
var

    i:integer;

begin

    writeln('uložená data z programu pracoviště');

    for i := 1 to n do writeln('Číslo pracoviště: '+IntToStr(zaznam.cislo)+'     Název pracoviště: ' + zaznam.nazev +'     Sazba pracoviště: ' + FloatToStr(zaznam.sazba));

end;
procedure TfrmPracoviste.btnOdstranitClick(Sender: TObject);
var

    odkud,kam: integer;

    z:TZaznam;

begin

    odkud := filepos(soubor);

    kam   := odkud - 1;

    seek(soubor,odkud);

    while not Eof(soubor) do begin

       seek(soubor,odkud);

       read(soubor,z);

       seek(soubor,kam);

       write(soubor,z);

       inc(odkud);

       inc(kam);

       seek(soubor,odkud);

    end;

    seek(soubor,kam);

    truncate(soubor);

    seek(soubor,1);

    read(soubor,zaznam);

    zobrazit;

    procteni := true;

    btnDalsi.enabled := true;

end;

procedure TfrmPracoviste.btnOpravitClick(Sender: TObject);
var

    n:integer;

begin

    n := filepos(soubor);

    seek(soubor,n-1);

    zaznam.cislo := StrToInt(edtCislo.Text);
    zaznam.nazev := edtNazev.Text;
    zaznam.sazba   := StrToFloat(edtSazba.Text);

    write(soubor,zaznam);

end;

procedure TfrmPracoviste.btnPokracovatClick(Sender: TObject);
begin
    memoVysledek.Visible:=false;
    btnPokracovat.Visible:=false;
    btnUlozit.Visible:=false;
end;

procedure TfrmPracoviste.btnPotvrditClick(Sender: TObject);
begin
  if procteni then
    CloseFile(soubor);
{$i-}// vypnout st. chyby
   Reset(soubor);
{$i+}// zapnout st. chyby
  if ioresult = 0 then //Soubor existuje
    seek(soubor,filesize(soubor)) //nastavit za konec
  else
    rewrite(soubor); //otevřít nový soubor pro čtení a zápis
  zaznam.cislo   := StrToInt(edtCislo.text);
  zaznam.nazev   := edtNazev.Text;
  zaznam.sazba   := StrToFloat(edtSazba.text);
  write(soubor,zaznam);
  memoVysledek.lines.add('Číslo pracoviště: '+IntToStr(zaznam.cislo)+'     Název pracoviště: ' + zaznam.nazev +'     Sazba pracoviště: ' + FloatToStr(zaznam.sazba));
  CloseFile(soubor);
  frmPracoviste.edtCislo.text := 'Zadejte 6 numerických znaků';
  frmPracoviste.edtNazev.text := 'Zadejte 20 alfanumerických znaků';
  frmPracoviste.edtSazba.text := 'Zadejte reálné číslo';

end;

procedure TfrmPracoviste.btnPrvniClick(Sender: TObject);
begin
if procteni then
   CloseFile(soubor);
{$i-}// vypnout st. chyby
   Reset(soubor);
{$i+}// zapnout st. chyby
  if ioresult <> 0 then showmessage ('Soubor neexistuje')
  else begin
    read(soubor,zaznam);
    zobrazit;
    procteni:=true;
    btnDalsi.Enabled := true;
  end;
end;

procedure TfrmPracoviste.btnUlozitClick(Sender: TObject);
var

    t:textfile;

begin

    if sdiaUlozit.Execute then begin

      AssignFile(t,sdiaUlozit.FileName);

      Rewrite(t);



      CloseFile(t);

    end else

      showmessage('Chyba otevírání souboru pro zápis');

end;

procedure TfrmPracoviste.btnVypocetClick(Sender: TObject);
var

    n:integer;

    psazba:real;


begin


    if procteni then

      CloseFile(soubor);

    procteni := false;

    reset(soubor);

    psazba := 0;

    n := 0;

    while not eof(soubor) do begin

       read(soubor,zaznam);

       psazba := psazba + zaznam.sazba;

       inc(n);



       lblPrumer.caption   := 'Průměrná sazba je ' + FloatToStr(psazba/n);

       lblVypis.Caption   := 'Pracoviště č. mají hodinovou sazbu vyšší než průměr' ;

    end;
    memoVysledek.Visible:=true;
    btnPokracovat.Visible:=true;
    btnUlozit.Visible:=true;
    closefile(soubor);

end;

procedure TfrmPracoviste.edtCisloClick(Sender: TObject);
begin
edtCislo.text := '';
end;


procedure TfrmPracoviste.edtNazevClick(Sender: TObject);
begin
 edtNazev.text := '';
end;


procedure TfrmPracoviste.edtSazbaClick(Sender: TObject);
begin
edtSazba.text := '';
end;

procedure TfrmPracoviste.FormActivate(Sender: TObject);
begin
  showmessage ('Vítejte v programu Pracoviště. Začněte kliknutím na tlačítko "Nový" ');
  AssignFile(soubor,JmenoSoub);
  procteni := false;
  btnDalsi.Enabled := false;
end;

//obsluha udalosti
procedure TfrmPracoviste.btnDalsiClick(Sender: TObject);
begin
  if not procteni then begin
    reset(soubor);
    procteni := true;
  end;
  if not eof(soubor) then begin
    read(soubor,zaznam);
    zobrazit;
  end else
    showmessage('Konec souboru');
end;

procedure TfrmPracoviste.btnKonecClick(Sender: TObject);
begin
close;
end;
end.

Chybí mi - seřadit pracovníky podle sazby, na to bych použil bublinkovou metodu, ale tady nevím jak na to.

Dál při kliknutí na "uložit jako" mi program do txt. souboru nic nenapíše, prý mám použít něco jako memopoleVysledek.Lines.FileToSave , ale taky nevím kam s tím.

Pomůže někdo?

Offline

 

#7 14. 05. 2013 12:37

Honzc
Příspěvky: 4551
Reputace:   241 
 

Re: Delphi - Pascal

↑ Jan Jícha:
TZaznam máš dobře (pokud tedy cislo bude číslo skládající se ze 6-ti číslic, ovšem lepší by bylo ho implementovat jako string[6], protože tam asi budou moci být i na začátku nuly,
pak by frmPracoviste.edtCislo.text := IntToStr(zaznam.cislo); bylo frmPracoviste.edtCislo.text := zaznam.cislo;)
Pak TSoubor nadefinuj do sekce type jako:
TSoubor=array of TZaznam;
dál už jsem to neprojížděl.

Offline

 

#8 16. 05. 2013 12:39

Jan Jícha
Veterán
Místo: Plzeň/Mnichov
Příspěvky: 1801
Škola: ZČU - FST - KMM
Pozice: Safety Engineer
Reputace:   74 
Web
 

Re: Delphi - Pascal

↑ Honzc:

Dobrý den, celé jsem to přepracoval a použil pole. Ono je to přehlednější a mnohem jednodušší.

Code:

unit Zaznamy_f;

interface

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

const
  MAX = 100;

type
  Clovek = record
             Jmeno : String;
             Cislo   : Integer;
             Mzda  : Real;
           end;
  PoleClovek = array [1..MAX] of Clovek;
  TfrmZaznam = class(TForm)
    Label1: TLabel;
    edtJmeno: TEdit;
    Label2: TLabel;
    edtCislo: TEdit;
    Label3: TLabel;
    edtMzda: TEdit;
    btnPridat: TButton;
    Label4: TLabel;
    lblPocet: TLabel;
    memZaz: TMemo;
    btnRefresh: TButton;
    btnZavrit: TButton;
    btnPrumVek: TButton;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    procedure btnPridatClick(Sender: TObject);
    procedure btnRefreshClick(Sender: TObject);
    procedure btnPrumVekClick(Sender: TObject);
    procedure btnZavritClick(Sender: TObject);
    procedure edtCisloKeyPress(Sender: TObject; var Key: Char);
    procedure edtMzdaKeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmZaznam: TfrmZaznam;
  Lide     : PoleClovek;
  n        : Integer = 0; // pocet zaznamu

implementation

{$R *.dfm}

procedure VypisZaznamuDoMemoPole (var P: PoleClovek; kam: TMemo; index: Integer);
var
  ToString : String;
begin
  ToString := 'Pracoviště číslo [' + IntToStr (index) +
              '] ... Jméno: ' + P[index].Jmeno +
              ', Číslo: ' + IntToStr (P[index].Cislo) +
              ', Mzda: ' + FloatToStr (P[index].Mzda);
  kam.Lines.Add(ToString);
end;


procedure TfrmZaznam.btnPridatClick(Sender: TObject);
begin
  n := n + 1;
   Lide [n].Jmeno := edtJmeno.Text;
   Lide [n].Cislo := StrToInt (edtCislo.Text);
   Lide [n].Mzda := StrToFloat (edtMzda.Text);
  lblPocet.Caption := IntToStr (n);

  VypisZaznamuDoMemoPole (Lide, memZaz, n);

  edtJmeno.Text:=('');    //Vynulovani hodnot at se to uzivateli neplete a
  edtCislo.Text:=('');    //je to prehlednejsi
  edtMzda.Text:=('');
end;

function PrumernaMzda (var P : PoleClovek; n : Integer): Real;
var
  Suma : Real;
  i : Integer;
begin
  Suma := 0;
    for i := 1 to n do
      Suma := Suma + (P[i].Mzda);
  PrumernaMzda := Suma/n;
end;

procedure TfrmZaznam.btnPrumVekClick(Sender: TObject);
begin
 //prumerny Mzda
 if n>0 then memZaz.Lines.Add('Průměrná mzda: ' + FloatToStr (PrumernaMzda (Lide, n)));
end;

procedure TfrmZaznam.btnRefreshClick(Sender: TObject);
var
  i: Integer;
begin
 memZaz.Lines.Clear;
  for i := 1 to n do
    VypisZaznamuDoMemoPole (Lide, memZaz, i);
end;

procedure TfrmZaznam.btnZavritClick(Sender: TObject);
begin
Close;
end;

procedure TfrmZaznam.edtCisloKeyPress(Sender: TObject; var Key: Char);
begin
if (not (Key in ['0'..'9', #8])) then   //uzivatel zadava pouze nnumericke znaky
Key := #0;
end;

procedure TfrmZaznam.edtMzdaKeyPress(Sender: TObject; var Key: Char);
begin
if (not (Key in ['0'..'9', #8,'.'])) then   //Uzivatel smi zadat jen numericke
Key := #0;                     //znaky a desetinou tecku
end;

end.

http://forum.matweb.cz/upload3/img/2013-05/00585_Obr1.png
http://forum.matweb.cz/upload3/img/2013-05/00573_Obr2.png

Co bych potřeboval - seřadit teď jednotlivé pracoviště podle mzdy. Použiji na to bublinkovou metodu . ale nevím jak ji tam zakomponovat.

A pak potřebuji vypsat pracoviště, jejichž mzdy jsou vyšší než je průměrná.

Předem děkuji.

Offline

 

#9 17. 05. 2013 16:17

Jan Jícha
Veterán
Místo: Plzeň/Mnichov
Příspěvky: 1801
Škola: ZČU - FST - KMM
Pozice: Safety Engineer
Reputace:   74 
Web
 

Re: Delphi - Pascal

Neví někdo?

Offline

 

#10 19. 05. 2013 10:50 — Editoval Dibex (19. 05. 2013 14:53)

Dibex
Zelenáč
Příspěvky: 1
Škola: ZCU FST
Pozice: student
Reputace:   
 

Re: Delphi - Pascal

Když jsem se díval na tuto problematiku napadlo mě toto řešení. Myslím že takhle by to mohlo fungovat. Možná bude potřeba nějaká korekce.

Code:

procedure BubbleSort (var Lide : PoleClovek; kolik: Integer);
var
    i   : Integer;
    pom : clovek;
    serazeno : Boolean;
begin

    Repeat
        serazeno := true;
        for i := 1 to kolik - 1 do
            if Lide[i].Mzda>Lide[i+1].Mzda then
                begin
                    pom := Lide[i];
                    Lide[i] := Lide[i+1];
                    Lide[i+1] := pom;
                    serazeno := false;
                end;
    Until serazeno;
end;

Offline

 

#11 20. 05. 2013 12:11

Jan Jícha
Veterán
Místo: Plzeň/Mnichov
Příspěvky: 1801
Škola: ZČU - FST - KMM
Pozice: Safety Engineer
Reputace:   74 
Web
 

Re: Delphi - Pascal

Díky, fungovalo mi to. Teď už jen nějak potřebuji vypsat ty pracoviště, které mají větší než průměrnou mzdu.

Jak na to?

Offline

 

#12 20. 05. 2013 16:50

Jan Jícha
Veterán
Místo: Plzeň/Mnichov
Příspěvky: 1801
Škola: ZČU - FST - KMM
Pozice: Safety Engineer
Reputace:   74 
Web
 

Re: Delphi - Pascal

Tak už mám i to vypsání těch pracovišť se mzdou, která je větší než průměrná.

Teď bych potřeboval to uložit do nějakého souboru.

To zatím neumím - poradíte?

Offline

 

#13 20. 05. 2013 22:05

Jan Jícha
Veterán
Místo: Plzeň/Mnichov
Příspěvky: 1801
Škola: ZČU - FST - KMM
Pozice: Safety Engineer
Reputace:   74 
Web
 

Re: Delphi - Pascal

Tak již mám všechno, díky všem. Uzavírám.

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson