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
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
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.
my_list : TList<integer>; my_object_list : TObjectList<MyClass>;
také to jde použít bez generiky:
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?
Offline
↑ 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
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
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.
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
↑ 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
↑ Honzc:
Dobrý den, celé jsem to přepracoval a použil pole. Ono je to přehlednější a mnohem jednodušší.
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.
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
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.
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
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