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