Skocz do zawartości

Przeniesienie wartości nieparzystych z stringgrida1 do stringgrida2


tasker3

Polecane posty

Opracować aplikację w Delphi, która dla danego N-elementowego (N<=20) ciągu liczb całkowitych wyznacza:

1. liczbę elementów ciągu

2. mniejszy spośród elementów skrajnych, tzn. pierwszy i ostatni

3. liczbę elementów ciągu większych od obliczonej wartości

4. Nowy ciąg, składający się z nieparzystych elementów ciągu danego

 

Pierwsze (działa):

 

var pom:string;

i: integer;

begin

i:=0;

repeat

pom:=StringGrid1.Cells[0, i];

if pom <> '' then begin i:=i+1; x:=StrToFloat(pom); end;

until ( pom = '' ) or ( I = StringGrid1.RowCount );

N:=i;

label9.Caption:=IntToStr(N);

end;

 

Drugie(działa):

var m:real;

i:integer;

begin

m:=0;

for i:=1 to N do

if (x<x[1]) then

m:=x

else if (x>x[1]) then

m:=x[1];

label10.caption:=floattostr(m);

end;

 

Trzeci(nie wiem jak zrobić):

 

Czwarty (czarna magia).... ;|

Link do komentarza
Udostępnij na innych stronach

Odnośnie punktu 3:

 

liczbę elementów ciągu większych od obliczonej wartości
Ale od jakiej obliczonej wartości? Na podst. czego ta wartość jest obliczana?

 

Natomiast punkt 4:

Możesz użyć albo listy albo zwykłej tablicy dynamicznej (bo i tak w takim programie nie ma co bawić się zupełnie w wydajność i cokolwiek). Tak więc:

 

var
Nieparzyste : Array of Integer;
i : Integer;
for i := 0 to Length(Twoj_Zadany_Ciag) - 1 do
begin
if (Twoj_Zadany_Ciag[i] mod 2 <> 0) then
 begin
  SetLength(Nieparzyste, Length(Nieparzyste) + 1);
  Nieparzyste[Length(Nieparzyste) - 2] = Twoj_Zadany_Ciag[i];
 end;
end;

 

Pisane z pamięci i prawdopodobnie są błędy bo nie mam żadnego środowiska na dysku zainstalowanego do kodzenia a druga sprawa dawno już w delphi nie kodziłem więc pewnie coś schrzaniłem z zakresem tablicy.

 

Ale generalnie chodzi o to, że:

 

1. Iterując cały ciąg sprawdzasz czy X mod 2 0 (znaczy, że liczba nieparzysta)

2. Zwiększasz tablicę nowego ciągu o 1element

3. Wpisujesz w ostatni element tablicy tą nieparzystą liczbę.

 

 

Edit: Aa teraz czytam jeszcze raz i to mają być wsadzone w nowy ciąg nieparzyste liczby z tego ciągu czy chcesz z tego ciągu skopiować tylko 1,3,5,7,9 element itd. ?

Ot taka mini-strona moja po godzinach :)http://www.wnetrzekuchni.pl

Link do komentarza
Udostępnij na innych stronach

Odnośnie punktu 3:

 

Ale od jakiej obliczonej wartości? Na podst. czego ta wartość jest obliczana?

 

Natomiast punkt 4:

Możesz użyć albo listy albo zwykłej tablicy dynamicznej (bo i tak w takim programie nie ma co bawić się zupełnie w wydajność i cokolwiek). Tak więc:

 

var
Nieparzyste : Array of Integer;
i : Integer;
for i := 0 to Length(Twoj_Zadany_Ciag) - 1 do
begin
if (Twoj_Zadany_Ciag[i] mod 2 <> 0) then
 begin
  SetLength(Nieparzyste, Length(Nieparzyste) + 1);
  Nieparzyste[Length(Nieparzyste) - 2] = Twoj_Zadany_Ciag[i];
 end;
end;

 

Pisane z pamięci i prawdopodobnie są błędy bo nie mam żadnego środowiska na dysku zainstalowanego do kodzenia a druga sprawa dawno już w delphi nie kodziłem więc pewnie coś schrzaniłem z zakresem tablicy.

 

Ale generalnie chodzi o to, że:

 

1. Iterując cały ciąg sprawdzasz czy X mod 2 <> 0 (znaczy, że liczba nieparzysta)

2. Zwiększasz tablicę nowego ciągu o 1element

3. Wpisujesz w ostatni element tablicy tą nieparzystą liczbę.

 

 

Edit: Aa teraz czytam jeszcze raz i to mają być wsadzone w nowy ciąg nieparzyste liczby z tego ciągu czy chcesz z tego ciągu skopiować tylko 1,3,5,7,9 element itd. ?

 

 

Na podstawie wartości obliczonej z drugiego pkt, czyli jeżeli ostatni wyraz ciągu jest mniejszy to na podstawie tego wyniku należy policzyć ilość elementów większych od tego elementu

Link do komentarza
Udostępnij na innych stronach

No to przecież sprawa prosta jak drut. Zapamiętaj sobie najprościej w jakiejś zmiennej globalnej wartość z punktu 2, który już obliczyłeś a resztę kodu robisz sobie poprzez:

 

ilosc_wiekszych_w_ciagu : Integer = 0;
for i := 0 to Length(Twoj_Zadany_Ciag) - 1 do
if (Twoj_Zadany_Ciag[i] > zapamietana_wartosc_z_pkt2)
Inc(ilosc_wiekszych_w_ciagu);

Ot taka mini-strona moja po godzinach :)http://www.wnetrzekuchni.pl

Link do komentarza
Udostępnij na innych stronach

No to przecież sprawa prosta jak drut. Zapamiętaj sobie najprościej w jakiejś zmiennej globalnej wartość z punktu 2, który już obliczyłeś a resztę kodu robisz sobie poprzez:

 

ilosc_wiekszych_w_ciagu : Integer = 0;
for i := 0 to Length(Twoj_Zadany_Ciag) - 1 do
if (Twoj_Zadany_Ciag[i] > zapamietana_wartosc_z_pkt2)
Inc(ilosc_wiekszych_w_ciagu);

 

Wartość obliczona z pkt 2 wyświetla się w label lub edit. Jak to teraz zapisać od początku do końca żeby 3 pkt zadziałał poprawnie?

Link do komentarza
Udostępnij na innych stronach

Coś czuje, że te pierwsze 2pkt. samemu nie zrobiłeś ;) Skoro masz tą wartość w edit to robisz zwykłą konwersje ze string->int

 

zapamietana_wartosc_z_pkt2 := StrToInt(Edit1.Text);

 

ok już zrobiłem. Dzięki.

A jak przenieść te wartości do nowego stringgrida czyli pkt 4? :(

Link do komentarza
Udostępnij na innych stronach

Dobra wystarczy. Pierwszy podpunkt zadania ponoć sam napisałeś. Masz w nim odczytywanie wartości ze stringgrida to analogicznie się zapisuje do komórki w nim dane korzystając z operatora przypisania. Sam coś zrób.

 

Siedziałem nad tym cały weekend. Wiem jak znaleźć nieparzyste i parzyste, ale mi wyskakuje błąd...

Zadeklarowałem w zmiennej globalnej z:

 

z:integer;

 

potem procedura dla przycisku, aby znajdował ilość liczb parzystych/nieparzystych.

 

 

procedure TForm1.Button4Click(Sender: TObject);

var i,ile:integer;

 

begin

z:=strtoint ( StringGrid1.Cells[0, i] );

ile:=0;

for i:=1 to n do

if (z mod 2 <>0) then //dla nieparzystych

ile:=ile+1;

label14.Caption:=floattostr(ile);

end;

 

 

procedure TForm1.Button4Click(Sender: TObject);

var i,ile:integer;

 

begin

z:=strtoint ( StringGrid1.Cells[0, i] );

ile:=0;

for i:=1 to n do

if (z mod 2 =0) then //dla przystych

ile:=ile+1;

label14.Caption:=floattostr(ile);

end;

 

błąd jest taki:

 

" '' is not a valid integer value."

 

nie wiem co zrobić... :blink:

Link do komentarza
Udostępnij na innych stronach

" '' is not a valid integer value."

znaczy:

" " nie jest poprwaną liczbą całkowitą

 

Masz całego stringgrida niewypełnionego. wpisz do StringGrid1.Cells[0, i] jakieś liczby całkowite i błąd znikinie. to raz a dwa możesz przestać z każdą pierdołą na forum biegać?

Link do komentarza
Udostępnij na innych stronach

" '' is not a valid integer value."

znaczy:

" " nie jest poprwaną liczbą całkowitą

 

Masz całego stringgrida niewypełnionego. wpisz do StringGrid1.Cells[0, i] jakieś liczby całkowite i błąd znikinie. to raz a dwa możesz przestać z każdą pierdołą na forum biegać?

 

 

Niestety nie masz racji... Uzupełniam całego stringgirda i nic

Link do komentarza
Udostępnij na innych stronach

Jak już napisałeś na forum to może aktualny kod pokażesz. I przeczytaj jakiś kurs...

 

Proszę.

 

 

 

 

unit Unit1;

 

interface

 

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls, Menus, ComCtrls, Grids;

 

type

TForm1 = class(TForm)

StringGrid1: TStringGrid;

StatusBar1: TStatusBar;

MainMenu1: TMainMenu;

N11: TMenuItem;

N21: TMenuItem;

N31: TMenuItem;

N41: TMenuItem;

Panel1: TPanel;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

Label6: TLabel;

Label7: TLabel;

Label8: TLabel;

Button1: TButton;

Button2: TButton;

Button3: TButton;

Button4: TButton;

Panel2: TPanel;

Label9: TLabel;

Label10: TLabel;

Label11: TLabel;

StringGrid2: TStringGrid;

Label12: TLabel;

Label13: TLabel;

procedure StringGrid1GetEditMask(Sender: TObject; ACol, ARow: Integer;

var Value: String);

procedure StringGrid2GetEditMask(Sender: TObject; ACol, ARow: Integer;

var Value: String);

procedure Button1Click(Sender: TObject);

procedure N11Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure N21Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

 

var

Form1: TForm1;

x,y:array[1..20]of real;

n:integer;

c:real;

z:integer;

 

implementation

 

{$R *.dfm}

 

procedure TForm1.StringGrid1GetEditMask(Sender: TObject; ACol,

ARow: Integer; var Value: String);

begin

Value:='99';

end;

 

procedure TForm1.StringGrid2GetEditMask(Sender: TObject; ACol,

ARow: Integer; var Value: String);

begin

Value:='99';

end;

 

procedure TForm1.Button1Click(Sender: TObject);

var pom:string;

i: integer;

begin

i:=0;

repeat

pom:=StringGrid1.Cells[0, i];

if pom <> '' then begin i:=i+1; x:=StrToFloat(pom); end;

until ( pom = '' ) or ( I = StringGrid1.RowCount );

N:=i;

label9.Caption:=IntToStr(N);

label10.Caption:='0';

label11.Caption:='0';

Button2.Enabled:=N<>0;

Button3.Enabled:=N<>0;

Button4.Enabled:=N<>0;

end;

 

procedure TForm1.N11Click(Sender: TObject);

var pom:string;

i: integer;

begin

i:=0;

repeat

pom:=StringGrid1.Cells[0, i];

if pom <> '' then begin i:=i+1; x:=StrToFloat(pom); end;

until ( pom = '' ) or ( I = StringGrid1.RowCount );

N:=i;

label9.Caption:=IntToStr(N);

label10.Caption:='0';

label11.Caption:='0';

Button2.Enabled:=N<>0;

Button3.Enabled:=N<>0;

Button4.Enabled:=N<>0;

end;

 

procedure TForm1.Button2Click(Sender: TObject);

var m:real;

i:integer;

begin

m:=0;

for i:=1 to N do

if (x<x[1]) then

m:=x

else if (x>x[1]) then

m:=x[1];

label10.caption:=floattostr(m);

 

end;

 

 

procedure TForm1.N21Click(Sender: TObject);

var m:real;

i:integer;

begin

m:=0;

for i:=1 to N do

if (x<x[1]) then

m:=x

else if (x>x[1]) then

m:=x[1];

label10.caption:=floattostr(m);

 

end;

 

procedure TForm1.Button3Click(Sender: TObject);

var i, ile:integer;

begin

c:=strtofloat(label10.caption);

ile:=0;

for i:=1 to N do

if x<c then

ile:=ile+1;

label11.caption:=floattostr(ile);

end;

 

procedure TForm1.Button4Click(Sender: TObject);

var i,ile:integer;

 

begin

z:=strtoint ( StringGrid1.Cells[0, i] );

ile:=0;

for i:=1 to n do

if (z mod 2 <>0) then

ile:=ile+1;

label14.Caption:=floattostr(ile);

end;

 

end.

Link do komentarza
Udostępnij na innych stronach

 

Siedziałem nad tym cały weekend. Wiem jak znaleźć nieparzyste i parzyste, ale mi wyskakuje błąd...

Zadeklarowałem w zmiennej globalnej z:

 

z:integer;

 

potem procedura dla przycisku, aby znajdował ilość liczb parzystych/nieparzystych.

 

 

procedure TForm1.Button4Click(Sender: TObject);

var i,ile:integer;

 

begin

z:=strtoint ( StringGrid1.Cells[0, i] );

ile:=0;

for i:=1 to n do

if (z mod 2 0) then //dla nieparzystych

ile:=ile+1;

label14.Caption:=floattostr(ile);

end;

 

 

procedure TForm1.Button4Click(Sender: TObject);

var i,ile:integer;

 

begin

z:=strtoint ( StringGrid1.Cells[0, i] );

ile:=0;

for i:=1 to n do

if (z mod 2 =0) then //dla przystych

ile:=ile+1;

label14.Caption:=floattostr(ile);

end;

 

błąd jest taki:

 

" '' is not a valid integer value."

 

nie wiem co zrobić... :blink:

 

Przecież tu nawet juz na początku jest błąd w każdej tej procedurze. Żeby rozwiązać problem warto zastanowić się co się dzieje w pierwszej linijce?

z:=strtoint ( StringGrid1.Cells[0, i] );

 

Czytałeś o zmiennych globalnych/lokalnych? Jak wygląda ich zasięg/wartości etc. i wszystko z nimi związane? Wyjaśnię w takim razie te podstawy. Deklarujesz zmienną lokalną: i oraz ile. A potem od razu w początku procedury odwołujesz się do StringGrida w którym parametrem jest zmienna i.

 

Jako, że jest to zmienna lokalna są w niej śmieci(przypadkowe całkowicie wartości) wykorzystujesz zmienną bez wcześniejszego przypisania wartości. Jakbyś sprawdził sobie debuggerem albo chodźby zrobił print-a na ekran/konsole wartość tej zmiennej przed użyciem to byś zobaczył, że są tam jakieś wartości jak np.: 32141 czy jakieś inne kosmiczne dziwadła.

 

Koniec.

 

Edit: chociaż widzę, że w innych prockach masz zerowanie zmiennych na początku więc zakładam, że to było przeoczeniem. (mam nadzieję)

Ot taka mini-strona moja po godzinach :)http://www.wnetrzekuchni.pl

Link do komentarza
Udostępnij na innych stronach

  • 2 weeks later...

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...