Sečtení sudých čísel ve sloupcích matice – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Sečtení sudých čísel ve sloupcích matice – Delphi – Fórum – Programujte.comSečtení sudých čísel ve sloupcích matice – Delphi – Fórum – Programujte.com

 

Rodney
~ Anonymní uživatel
18 příspěvků
10. 12. 2013   #1
-
0
-

Ahoj, potřeboval bych poradit.. Vytvořil jsem program, který mi připraví matici podle zadaných parametrů - počet řádků a počet sloupců. Potom do této matice pomocí generátoru náhodných čísel vygeneruji čísla z intervalu od 1 do 10. Potřeboval bych zajistit aby se mi ve sloupcích sečetly sudá čísla. Něco jsem zkusil, ale to samotné sečtení mi nějak nejde :-/. Přikládám zdrojová kód a prosím vás o radu :-).

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    bt_priprav: TButton;
    edtn: TEdit;
    edtm: TEdit;
    bt_nacti: TButton;
    sg: TStringGrid;
    lbl_pro_n: TLabel;
    lbl_pro_m: TLabel;
    bt_soucet: TButton;
    bt_konec: TButton;
    Label1: TLabel;
    procedure bt_pripravClick(Sender: TObject);
    procedure bt_nactiClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure bt_konecClick(Sender: TObject);
    procedure bt_soucetClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  Tmat=array[1..10,1..10] of integer; {určí hodnotu v jaké se má pohybovat
                                       generátor}
var
  Form1: TForm1;
  a:Tmat;
  n,m:integer; {určí proměnnou n a m, konrétně o jaký typ se jedná}
implementation

{$R *.dfm}

procedure TForm1.bt_pripravClick(Sender: TObject);
var sirka,vyska:integer;
begin
n:=StrToInt(Edtn.Text);       {načte z edtn hodnotu pro počet sloupců}
m:=StrToInt(Edtm.Text);       {načte z edtm hodnotu pro počet řádků}
sg.colcount:=n;         {nastavení počtu sloupců pomocí edtn}
sg.rowcount:=m;         {nastavení počtu řádků pomocí edtm}
sirka:=sg.DefaultColWidth;
vyska:=sg.DefaultRowHeight;
sg.Width:=n*sirka+n+4;        {nastavení šírky buňky}
sg.Height:=m*vyska+m+4;       {nastavení výšky buňky}
bt_nacti.Visible:=true;        {po nachystání stringridu se zobrazi
                                tlačítko pro naplnění stringridu}
end;

function soucet(j:integer; var a:Tmat):integer;
var i:integer;
begin
Result:=0;
for i:=1 to m do
  if a[i,j] mod 2=0 then
    Result:=Result+a[i,j];
end;

procedure TForm1.bt_nactiClick(Sender: TObject);
var i,j:integer;
begin
for i:=1 to m do
for j:=1 to n do
begin
sg.cells[j-1,i-1]:=IntToStr(a[i,j]);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i,j:integer;
begin
for i:=1 to 10 do
for j:=1 to 10 do
a[i,j]:=random(10)+1;

end;

procedure TForm1.bt_konecClick(Sender: TObject);
begin
close;
end;

procedure TForm1.bt_soucetClick(Sender: TObject);
var result:integer;
begin
label1.caption:=IntToStr(result);
end;

end.
Nahlásit jako SPAM
IP: 46.183.64.–
Zeel+1
Newbie
10. 12. 2013   #2
-
0
-

Nevím co ti tam přesně nefunguje, ale zkus udělat menší úpravu v tom výpisu, protože si myslím, že samotnou funkci máš dobře. Nechci se mýlit, ale zkus napsat tohle....

procedure TForm1.bt_soucetClick(Sender: TObject);
var result:integer;
begin
label1.caption:=IntToStr(soucet(j,a));  //Jak jsem pochopil, tak (j) je číslo
end;                                   //sloupce a (a) matice.. Tam dosad..

Ten result mi tam nějak neseděl... :D

Nahlásit jako SPAM
IP: 88.101.224.–
Honzc0
Stálý člen
11. 12. 2013   #3
-
0
-

#1 Rodney
2 otázky.

1.Proč nejdříve načítáš do a[i,j] matici 10x10 a pak pak teprve v obsluze bt_nactiClick to plníš na matici mxn

  To se dá udělat  najednou přímo v tom bt_nactiClick.

  Matici Tmat natypuj jako Tmat=array of array of integer;

 a pak matici a urči velikost takto: SetLength(a,m,n); a tu teprve naplň (tato matice začíná indexy 0)


for i:=0 to m-1 do

  for j:=0 to n-1 do

    a[i,j]:=random(10)+1;  a pak samozřejmě ji zobraz ve StringGridu.

To bude mít tu výhodu, že při každém zmáčknutí bt_nactiClick se ti matice naplní jinými čísly.

2. Což je horší to je použití funkce soucet. Ta je napsána dobře, ale její použití špatně.

   Pro výpis součtů si přidej do Stringridu ještě jeden řádek. a pak součty jednotlivých sloupců vypisuj

   třeba takto: (ve funkci součet je také potřeba změnit  cyklus na:)
   for i:=0 to m-1 do

      if a[i,j] mod 2=0 then

         Result := Result+a[i,j];
 

procedure TForm1.bt_soucetClick(Sender: TObject);
begin
for j := 0 to n-1 do
  sg.cells[j,n] := IntToStr(soucet(j,a);
end;  
Nahlásit jako SPAM
IP: 93.181.78.–
Rodney
~ Anonymní uživatel
18 příspěvků
11. 12. 2013   #4
-
0
-

#3 Honzc
Vyzkoušel jsem obě rady, bohužel si s tím lámu hlavu dál :(... Každopádně jsem velmi rád za vaši ochotu pomoct mi :-)...

dejme tomu že první radu pro zjednodušení nastavení matice udělám později, nejdříve bych rád docílil funkčnosti součtu těch čísel :-).

upravil jsem funkci následně

function soucet(j:integer; var a:Tmat):integer;
var i:integer;
begin
Result:=0;
for i:=1 to m-1 do
  if a[i,j] mod 2=0 then
    Result:=Result+a[i,j];

a samotnou proceduru pro výpočet následně 

procedure TForm1.bt_soucetClick(Sender: TObject);
var i,j:integer;
begin
for j:=0 to n-1 do
  sg.Cells[j,n]:=IntToStr(soucet(j,a));

end;

bohužel mi to ale opět nefunguje, program spustím dám připravit, naplnit ale jakmile dám součet nic se nestane :-/. Potom ale zadám do editů větší počet řádků a sloupců, dám připravit a vidím tam že se to sečetlo, ale je to sečetlé špatně. Prosím vás tedy znovu o radu :-).

Nahlásit jako SPAM
IP: 46.183.64.–
Zeel+1
Newbie
11. 12. 2013   #5
-
0
-

Zkus předělat tu funkci na tohle, přidal jsem jednu neznámou a pak result vyvolám jen jednou....

function soucet(j:integer; var a:Tmat):integer;
var i,vysledek:integer;
begin
vysledek:=0;
for i:=1 to m-1 do
  if a[i,j] mod 2=0 then
    vysledek:=vysledek+a[i,j];
result:=vysledek;
end;
Nahlásit jako SPAM
IP: 88.101.224.–
Rodney0
Newbie
11. 12. 2013   #6
-
0
-

Bohužel jsem to zkusil a nefunguje mi to :(, vážně si už nevím rady. Zkusím vám sem přiložit zdroják a pokud tam najdete něco špatně prosím o pomoc. Trávím nad tím už neskutečně moc hodin a zmocňuje se mě obrovská bezmoc :(.

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    bt_priprav: TButton;
    edtn: TEdit;
    edtm: TEdit;
    bt_nacti: TButton;
    sg: TStringGrid;
    lbl_pro_n: TLabel;
    lbl_pro_m: TLabel;
    bt_soucet: TButton;
    bt_konec: TButton;
    Label1: TLabel;
    procedure bt_pripravClick(Sender: TObject);
    procedure bt_nactiClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure bt_konecClick(Sender: TObject);
    procedure bt_soucetClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  Tmat=array[1..10,1..10] of integer; {určí hodnotu v jaké se má pohybovat
                                       generátor}
var
  Form1: TForm1;
  a:Tmat;
  n,m:integer; {určí proměnnou n a m, konrétně o jaký typ se jedná}
  result:integer;
  i,j:integer;
implementation

{$R *.dfm}

procedure TForm1.bt_pripravClick(Sender: TObject);
var sirka,vyska:integer;
begin
n:=StrToInt(Edtn.Text);       {načte z edtn hodnotu pro počet sloupců}
m:=StrToInt(Edtm.Text);       {načte z edtm hodnotu pro počet řádků}
sg.colcount:=n;         {nastavení počtu sloupců pomocí edtn}
sg.rowcount:=m;         {nastavení počtu řádků pomocí edtm}
sirka:=sg.DefaultColWidth;
vyska:=sg.DefaultRowHeight;
sg.Width:=n*sirka+n+4;        {nastavení šírky buňky}
sg.Height:=m*vyska+m+4;       {nastavení výšky buňky}
bt_nacti.Visible:=true;        {po nachystání stringridu se zobrazi
                                tlačítko pro naplnění stringridu}
end;

function soucet(j:integer; var a:Tmat):integer;
var i,vysledek:integer;
begin
Vysledek:=0;
for i:=1 to m-1 do
  if a[i,j] mod 2=0 then
    vysledek:=vysledek+a[i,j];
result:=vysledek;
end;

procedure TForm1.bt_nactiClick(Sender: TObject);
begin
for i:=1 to m do
for j:=1 to n do
begin
sg.cells[j-1,i-1]:=IntToStr(a[i,j]);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
for i:=1 to 10 do
for j:=1 to 10 do
a[i,j]:=random(10)+1;

end;

procedure TForm1.bt_konecClick(Sender: TObject);
begin
close;
end;

procedure TForm1.bt_soucetClick(Sender: TObject);
var i,j:integer;
begin
for j:=0 to n-1 do
  sg.Cells[j,n]:=IntToStr(result(j,a));
end;

end.
Nahlásit jako SPAM
IP: 46.183.64.–
Zeel+1
Newbie
11. 12. 2013   #7
-
0
-

Zkoušel si program odkrokovat ?? A zjistit kde ti to vázne. Hodilo by se to, zadej si break point na funkci soucet a pak to odkrokuj a do Watch Listu si zadej  

i, a[i,j], vysledek

Pak napiš kde ti to začne blbnout.

Nahlásit jako SPAM
IP: 88.101.224.–
Rodney0
Newbie
11. 12. 2013   #8
-
0
-

Blbne mi to v proceduře pro součet.

Nahlásit jako SPAM
IP: 46.183.64.–
Rodney0
Newbie
11. 12. 2013   #9
-
0
-

pokud chci spustit program napíše mi to 

[Warning] Unit1.pas(80): For loop control variable must be simple local variable.

Nahlásit jako SPAM
IP: 46.183.64.–
Zeel+1
Newbie
11. 12. 2013   #10
-
0
-

Tak jsem si udělal vlastní krátký program, abych to zkusil a všechno mi to funguje. Abych to měl jednodušší, tak jsem si udělal normálně texťák kam sem napsal 10 čísel, některý sudý, některý lichý. Pak jsem si udělal pole (a) o velikosti 10 a nahrál jsem tam čísla ze souboru. Následně jsem jen zkopíroval tvojí funkci, samozřejmě jsem jen předělal dvojrozměrný pole na jednorozměrný atd... A vše funguje....  Pošlu sem celý program, jen tím chci poukázat na to, že funkce musí být napsaná dobře.

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Button3: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    function soucet():integer;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  a:array[1..10] of integer;
  dll:textfile;

implementation

{$R *.dfm}

function TForm1.soucet():integer;
var i,vysledek:integer;
begin
vysledek:=0;
for i:=1 to 10 do
  if a[i] mod 2=0 then
    vysledek:=vysledek+a[i];
result:=vysledek;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i,b:integer;
begin
AssignFile(dll,'text.txt');
reset(dll);
for i:=1 to 10 do
  begin
  read(dll,b);
  a[i]:=b;
  end;
closefile(dll);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Label1.Caption:=IntToStr(soucet());
end;

end.

Podívej se k sobě, jestli tam nemáš nějakou chyba, já třeba hned vidím, že by sis měl odendat RESULT z VARU.

Nahlásit jako SPAM
IP: 88.101.224.–
Rodney0
Newbie
11. 12. 2013   #11
-
0
-

Nevěnuju se programování zrovna dlouho, ale rád bych se do toho dostal hlouběji. Nicméně nejsem schopný ještě si ty chyby ve svých programech pořádně najít a opravit. Myslíš že by jsi se mohl podívat na ten můj program přímo ? Je tady na tomto odkaze. Já totiž si vážně nevím rady, každopádně si strašně moc cením tvé pomoci :-).

http://www.edisk.cz/stahni/48501/Program_matice.rar_194.13KB.html

Nahlásit jako SPAM
IP: 46.183.64.–
Zeel+1
Newbie
11. 12. 2013   #12
-
0
-

Jdu se na to podívat :) 

Nahlásit jako SPAM
IP: 88.101.224.–
Zeel+1
Newbie
11. 12. 2013   #13
-
0
-

Tak jsem to rozjel :D:D:D 

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    bt_priprav: TButton;
    edtn: TEdit;
    edtm: TEdit;
    bt_nacti: TButton;
    sg: TStringGrid;
    lbl_pro_n: TLabel;
    lbl_pro_m: TLabel;
    bt_soucet: TButton;
    bt_konec: TButton;
    Label1: TLabel;
    procedure bt_pripravClick(Sender: TObject);
    procedure bt_nactiClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure bt_konecClick(Sender: TObject);
    procedure bt_soucetClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  Tmat=array[1..10,1..10] of integer; {určí hodnotu v jaké se má pohybovat
                                       generátor}
var
  Form1: TForm1;
  a:Tmat;
  n,m:integer; {určí proměnnou n a m, konrétně o jaký typ se jedná}
  i,j:integer;
implementation

{$R *.dfm}

procedure TForm1.bt_pripravClick(Sender: TObject);
var sirka,vyska:integer;
begin
n:=StrToInt(Edtn.Text);       {načte z edtn hodnotu pro počet sloupců}
m:=StrToInt(Edtm.Text);       {načte z edtm hodnotu pro počet řádků}
sg.colcount:=n;         {nastavení počtu sloupců pomocí edtn}
sg.rowcount:=m;         {nastavení počtu řádků pomocí edtm}
sirka:=sg.DefaultColWidth;
vyska:=sg.DefaultRowHeight;
sg.Width:=n*sirka+n+4;        {nastavení šírky buňky}
sg.Height:=m*vyska+m+4;       {nastavení výšky buňky}
bt_nacti.Visible:=true;        {po nachystání stringridu se zobrazi
                                tlačítko pro naplnění stringridu}
end;

function soucet(j:integer;a:Tmat):integer;
var i,vysledek:integer;
begin
vysledek:=0;
for i:=1 to m do
  if a[i,j] mod 2=0 then
    vysledek:=vysledek+a[i,j];
result:=vysledek;
end;

procedure TForm1.bt_nactiClick(Sender: TObject);
begin
for i:=1 to m do
for j:=1 to n do
begin
sg.cells[j-1,i-1]:=IntToStr(a[i,j]);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
for i:=1 to 10 do
for j:=1 to 10 do
a[i,j]:=random(10)+1;

end;

procedure TForm1.bt_konecClick(Sender: TObject);
begin
close;
end;

procedure TForm1.bt_soucetClick(Sender: TObject);
begin
 //for j:=0 to n do
  Label1.Caption:=IntToStr(soucet(2,a));
end;

end.

Ještě si změn ten výpis, upravil jsem si to na pracovní verzi :D,  Ta dvojka ukazuje číslo sloupce, kde to cheš zjistit. 

Nahlásit jako SPAM
IP: 88.101.224.–
Zeel+1
Newbie
11. 12. 2013   #14
-
0
-

Ještě jako dodatek, aby si plně pochopil funkci nebo princip RESULT. Určitě víš, že funkce ti vyhodí rovnou výsledek. Jsou dvě možnosti tedy, jak výsledek do funkce zadat. První je, že když se například ta funkce jmenuje soucet, tak jen napíšeš soucet:=a+b+c+d , ale mužeš to také nahradit result:=a+b+c+d , Result automaticky vyhodnotí, že je konec funkce a výsledek je konečný. Ale když pak danou funkci vyvoláváš, musíš ji normálně vyvolat přes název té funkce .. Nemůžeš napsat, jako ty, result(j,a) , ale musíš ji vyvolat soucet(j,a). Ve tvém programu byl počítač naprosto zmaten.... Doufám, že jsem to napsal nějak srozumitelně :D  

Ještě přidám názornou ukázku

function soucet():integer;
begin
soucet:=1+2+3+4+5+6
end;

// ÚPLNĚ STEJNÉ JAKO

function soucet():integer;
begin
result:=1+2+3+4+5+6
end;

// AVŠAK KDYŽ FUNKCI VYVOLÁVÁŠ, MŮŽEŠ POUŽÍT JEN

Label1.Caption:= IntToStr( soucet() );
Nahlásit jako SPAM
IP: 88.101.224.–
Rodney0
Newbie
11. 12. 2013   #15
-
0
-

Děkuji ti moc :-). Nevím jak bych ti to mohl oplatit, jsem strašně rád za tvoji pomoc :-), zítra ráno si s tím pohraju, dneska už mi hlava vůbec nebere, a pak napíšu jak mi to funguje :-). Ještě jednou díky moc :-).

Nahlásit jako SPAM
IP: 46.183.64.–
Rodney0
Newbie
12. 12. 2013   #16
-
0
-

Tak jsem to vyzkoušel a funguje mi to :-).

Jen bych se chtěl zeptat jak zajistím aby se mi v tom labelu pro výsledek zobrazil součet ze všech sloupců ?

Nahlásit jako SPAM
IP: 46.183.64.–
Zeel+1
Newbie
12. 12. 2013   #17
-
0
-

Uděláš si například nový StringGrid, ale pouze s jedním řádkem (sloupce upravíš podle matice) a tam pomocí for cyklu nahraješ součty sloupců..

procedure TForm1.bt_soucetClick(Sender: TObject);
begin
for j := 1 to n do       // n nebo m , nevim co jsou sloupce :D
  sg.cells[j-1,1] := IntToStr(soucet(j,a);
end;

A nebo jak už Honzc napsal, do tvého stringridu přidáš ještě jeden řádek a tam nahraješ součty. Ale kvůli přehlednosti bych normálně udělal ejště jeden StringGrid s jedním řádkem..... Vše bude přehlednější..

Nahlásit jako SPAM
IP: 88.101.224.–
Rodney0
Newbie
14. 12. 2013   #18
-
0
-

Udělal jsem to jak jsi napsal, vytvořil jsem nový stringrid a nastavil ho tak aby měl jeden řádek a počet sloupců podle matice, zkusil jsem tam vložit pomocí for cyklu součty sloupců ale nějak to nic nedělá :-/

procedure TForm1.bt_soucetClick(Sender: TObject);
var sirka2,vyska2:integer;
begin
n:=StrToInt(edtn.Text);
sg2.RowCount:=1;
sg2.ColCount:=n;
sg2.visible:=True;
sirka2:=sg2.DefaultColWidth;
vyska2:=sg2.DefaultRowHeight;
sg2.Width:=n*sirka2+n+4;
sg2.Height:=vyska2;
  for j:=1 to n do
  sg2.Cells[j-1,1]:=IntToStr(soucet(j,a));
Nahlásit jako SPAM
IP: 88.103.186.–
Zeel+1
Newbie
14. 12. 2013   #19
-
0
-

Takhle je to správně, ve SG řádky/sloupce začínají nulou...

sg2.Cells[j-1,0]:=IntToStr(soucet(j,a));
Nahlásit jako SPAM
IP: 88.101.224.–
Rodney0
Newbie
14. 12. 2013   #20
-
0
-

Jo už to funguje kompletně :-), strašně moc díky :-). 

Nahlásit jako SPAM
IP: 88.103.186.–
Rodney0
Newbie
14. 12. 2013   #21
-
0
-

Mám ještě k tomuto programu 2 úkoly, s kterými nevím moc rady. Jedná se o následující:

Matici vytiskněte po řádcích ve tvaru tabulky.

Výsledky zapište do textového souboru Vysledky.pas.

Moc tedy jako netuším jak na to, protože jsem toto nedělal nikdy a nedaří se mi najít moc dobře vysvětlení v knížce, kterou mám :-/.

Nahlásit jako SPAM
IP: 88.103.186.–
Zeel+1
Newbie
14. 12. 2013   #22
-
0
-

Nevím jakou máš knížku, že tam není výpis do souboru, ale určitě ji nahradí internet kde je naprosto vše. Výpis ze StringGridu do .txt není nic jiného než normální zápis do souboru. Na googlu si zadej něco jako: Delphi- StringGrid výpis nebo Delphi- StringGrid tisk nebo Delphi- zápis do souboru txt.

Je mnoho stránek, kde najdeš pomoc. Až budeš mít třeba nějaký kód a budeš si myslet, že ho máš dobře, ale stejně nebude fungovat, tak sem teprve napiš. :D:D:D Hodně štěstí :D

Nahlásit jako SPAM
IP: 88.101.224.–
Rodney0
Newbie
15. 12. 2013   #23
-
0
-

To s tím že to nemám v knížce jsem myslel spíš na to výsledek vytiskněte po řádcích ve tvaru tabulky.

Zkoušel jsem udělat ten výpis to Vysledky.pas, ale při kliknuti na tlačítko ulož mi to hodí chybu

procedure TForm1.bt_ulozClick(Sender: TObject);
var nazev:string;
Vystup:textfile;
i,j:integer;
vysledek:string;
begin
nazev:=Vysledek;
Assignfile(vystup, nazev);
rewrite(vystup);
writeln(vystup, n); writeln(vystup, 1);
for j:=1 to n do
  begin
  a[i,j]:=StrToInt(sg2.Cells[j-1,0]);
  writeln(vystup,a[i,j]);
Nahlásit jako SPAM
IP: 88.103.186.–
JoDiK
~ Anonymní uživatel
987 příspěvků
15. 12. 2013   #24
-
0
-

#23 Rodney
"mi to hodí chybu" a jakou chybu ti to hodí??? Nenapíše to náhodou nějaké číslo té chyby? Není v nápovědě seznam těchto čísel chyb i s podrobným vysvětlením příčin?

v programu máš napsáno:

nazev:=Vysledek;
Assignfile(vystup, nazev);

a co obsahuje proměnná Vysledek??? Asi náhodnou hodnotu že? Nemělo tam být třeba 'Vysledky.pas' ???

Nahlásit jako SPAM
IP: 88.100.43.–
Zeel+1
Newbie
15. 12. 2013   #25
-
0
-

Tady je celkem dobře vysvětlený tisk. Máš tam konkrétně i tisk SG, podívej se na to...

http://www.zive.cz/clanky/tipy-a-triky-v-delphi-dil-25/sc-3-a-104713/default.aspx

Nahlásit jako SPAM
IP: 88.101.224.–
Rodney0
Newbie
15. 12. 2013   #26
-
0
-

Upravil jsem to, soubor se mi uloží, ale se špatnými hodnotami, spíš je jich tam víc než by mělo, z toho jsou ale některé správně :-D.

Je chyba v tom, že nemám určený co je vlastně výsledek? 

procedure TForm1.bt_ulozClick(Sender: TObject);
var nazev,vysledek:string;
Vystup:textfile;
begin
nazev:='Vysledek.pas';
Assignfile(vystup, nazev);
rewrite(vystup);
writeln(vystup, n); writeln(vystup, 1);
for j:=1 to n do
  begin
  a[i,j]:=StrToInt(sg2.Cells[j-1,0]);
  writeln(vystup,a[i,j]);
  end;
  closefile(vystup);
  end;
Nahlásit jako SPAM
IP: 217.66.178.–
Zeel+1
Newbie
15. 12. 2013   #27
-
0
-

Tady to tady máš celkem zbytečně, doporučuji to udělat normálně takhle..

Assignfile(vystup,'Vysledek.pas');

A pak nechápu co znamená tohle:D  Jestli to znamená typ matice, nebo kolik má matice sloupcu? 

writeln(vystup, n); writeln(vystup, 1);

A celej tenhle řádek vymaž..

var nazev,vysledek:string;

Nech si tam jen :

var Vystup:textfile;

A poslední věc. Ty máš vypsat do souboru pouze ty výsledky, které máš v tom druhým SG, což znamené ten součet sudých čísel ve sloupcích. V tom for cyklu používáš dvojrozměrný pole, který k tomu vlastěn vůbec nepotřebuješ... JEstli chceš vypsat do souboru jen tu hodnotu, tak stačí...

var pomocnik:integer;  // Do varu si přidáš jakoukoliv proměnnou

for j:=1 to n do
  begin
  pomocnik:=StrToInt(sg2.Cells[j-1,0]);
  writeln(vystup,pomocnik);
  end;
Nahlásit jako SPAM
IP: 88.101.224.–
Rodney0
Newbie
15. 12. 2013   #28
-
0
-

jop, už mi to funguje správně :-).. Děkuju ti moc :-)

Nahlásit jako SPAM
IP: 46.183.64.–
Rodney0
Newbie
16. 12. 2013   #29
-
0
-

Mám poslední dotaz a prosbu, to tisknutí matice jsem se rozhodl udělat jinak, a to to tak že ji vepíšu do texťáku, který bude sloužit jako tisk. Udělal jsem to, ale vepíše se mi to tam pod sebe a ne jako tabulka. To znamená že mám všechny hodnoty pod sebou, a já potřebuji aby byly stejně jako ta matice vygenerovaná.

Chci se tedy prosím zeptat, co zde změnit ?

procedure TForm1.bt_tiskClick(Sender: TObject);
var soubor:TextFile;
pomocnik:integer;
begin
Assignfile(soubor, 'Matice.txt');
rewrite(soubor);
for j:=1 to n do
begin
radek:=Sg.Cells[0,i-1];

for i:=1 to m do
  begin
  pomocnik:=StrToInt(sg.Cells[j-1,i-1]);
  writeln(soubor, pomocnik);
  end;
  closefile(soubor);

end;
Nahlásit jako SPAM
IP: 78.128.148.–
Rodney0
Newbie
16. 12. 2013   #30
-
0
-

Dal jsem zde špatný zdroják, to je rozpracováno něco jiného..

Tady je ten konkrétní:

procedure TForm1.bt_tiskClick(Sender: TObject);
var soubor:TextFile;
pomocnik:integer;
begin
Assignfile(soubor, 'Matice.txt');
rewrite(soubor);
for j:=1 to n do
for i:=1 to m do
  begin
  pomocnik:=StrToInt(sg.Cells[j-1,i-1]);
  writeln(soubor, pomocnik);
  end;
  closefile(soubor);
Nahlásit jako SPAM
IP: 78.128.148.–
Zeel+1
Newbie
16. 12. 2013   #31
-
0
-

   

procedure TForm1.bt_tiskClick(Sender: TObject);
var soubor:TextFile;
pomocnik:integer;
begin
Assignfile(soubor, 'Matice.txt');
rewrite(soubor);
for i:=1 to m do begin
	for j:=1 to n do
  	begin
  	  pomocnik:=StrToInt(sg.Cells[j-1,i-1]);
  	  write(soubor, pomocnik);
  	end;
writeln;
end;
closefile(soubor);

Máš štěstí, že jsem zrovna byl na emailu, když mi přišlo sledování vlákna :D

Nahlásit jako SPAM
IP: 88.101.224.–
Rodney0
Newbie
16. 12. 2013   #32
-
0
-

Jen pro rozšíření, jak bych zajistil aby mezi jednotlivými čísly v řádku byly mezery ? Chtěl bych to trochu pochopit víc :-).

procedure TForm1.bt_tiskClick(Sender: TObject); {tlačítko pro tisk}
var soubor:TextFile;
matice:integer;
begin
Assignfile(soubor, 'Tisk.txt');   {vytvoří nový soubor, určen pro tisk}
rewrite(soubor);
writeln(soubor, 'Výsledná matice:');
for i:=1 to m do begin
for j:=1 to n do begin
  matice:=StrToInt(sg.Cells[j-1,i-1]);{definování co se do souboru vepíše}
  write(soubor, matice); {vepsání matice do souboru pro tisk}
  end;
      writeln(soubor, matice);
      end;
      closefile(soubor);
      end;
      end.

tohle mi funguje dobře jinak :-)

Nahlásit jako SPAM
IP: 46.183.64.–
Rodney0
Newbie
16. 12. 2013   #33
-
0
-

jojo já si to upravil hned jak jsem to jsem vložil :-), všiml jsem si toho.

Nahlásit jako SPAM
IP: 46.183.64.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 11 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý