المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : [تمرين] استخراج ثوابت لكثير حدود اقل من الدرجة الثانية


hanipino
28-12-2008, 11:35 AM
السلام عليكم

استخراج ثوابت لكثير حدود اقل من الدرجة الثانية

اولا نعبر عن متغيرات الكثير حدود ب :

X = X
Xمربع = Y
اى يكون كثير الحدود من الشكل التالى ... مثلا : 10y+50x+12
المطلوب من التمرين استخراج الثوابت فى Edit 1 و Edit2 و Edit3 ليس شرط استخراج الثوابت بالاشارة .
-) يمكن ان تكتب هذا الكثير حدود على عدة اشكال :

z x y
(1 10y+50x+12 ==< المخرجات ==< 10 ,50 ,12
(2 5x+10y+12 ==< المخرجات ==< 10 ,5 ,12
(3 5x+10y ==< المخرجات ==< 10 ,5 ,0
(4 10y+5x ==< المخرجات ==< 10 ,5 ,0
(5 5x ==< المخرجات ==< 0 ,5 ,0
(6 5y ==< المخرجات ==< 5 ,0 ,0

يجب ان تتحقق هذه السة (6) شروط .
ملاحضة :
- لايشترط استخراج الثوابت بالاشارة .
- ان كان التمرين غير واضح حمل الفيديو لتتوضح الصورة عن التمرين .
- انا توصلت الى الحل لاكن ب 48 سطر . :confused: :)

الفيديو (http://www.4shared.com/file/77891422/1c5699e9/ConstExo.html)

Rover
28-12-2008, 11:10 PM
تفضل أخي Hanipino :

الحل مع السورس كود في المرفقات ...

و لكن يفضل أستخدام Mask في مثل هذه الحالات ..

شكراً لك ..

hanipino
29-12-2008, 12:38 AM
السلام عليكم
بارك الله فيك Rover طريقة ممتازة و كاملة . و الكمال لله .
طريقتى ناقصة بحيث ادا تم تغير مكان z تختلط الامور اى مكانه دائما فى الاخير . اضافتا الى دالك غلقت على نفسى بكثرة المتغيرات
-- لم استعمل Pos .
50 سطر و سطر :confused:

Type Array3Value = Array[0..2]of String;

Function ConstValue(Str:String):Array3Value;
var
i,intx,inty,x,y:integer;
inx,iny,inz:array[0..1]of integer;
Zero:string;
begin
Zero:='0';

intx :=0; inty :=0;
inx[0]:=0; inx[1]:=0;
iny[0]:=0; iny[1]:=0;
inz[0]:=0; inz[1]:=0;

for i:= 0 to length(str) do
begin
if Str[i]='x'
then intx:=i;

if Str[i]='y'
then inty:=i;
end;

x:=intx+2;
y:=inty+2;
//------------------------------------------//
if (intx < inty)and(intx <>0)then
begin
inx[0]:=(inx[0]+0); inx[1]:=(inx[1]-3+(x));
iny[0]:=(iny[0]+x); iny[1]:=(iny[1]+inty-(x));
inz[0]:=(inz[0]+y); inz[1]:=(inz[1]+length(str)+1-(y));
end
else
if (intx > inty)and(inty <>0)then
begin
inx[0]:=(inx[0]+y); inx[1]:=(inx[1]+intx-(y));
iny[0]:=(iny[0]+0); iny[1]:=(iny[1]-3+(y));
inz[0]:=(inz[0]+x); inz[1]:=(inz[1]+length(str)+1-(x));
end;
//------------------------------------------//
if (intx < inty)and(intx =0)then
begin
iny[0]:=(0); iny[1]:=(y-3);
inz[0]:=(inz[0]+y); inz[1]:=(inz[1]+length(str)+1-(y));
end;
if (intx > inty)and(inty =0)then
begin
inx[0]:=(0); inx[1]:=(x-3);
inz[0]:=(inz[0]+x); inz[1]:=(inz[1]+length(str)+1-(x));
end;
//------------------------------------------//
Result[0]:=Copy(str,inx[0],inx[1]);
Result[1]:=Copy(str,iny[0],iny[1]);
Result[2]:=Copy(str,inz[0],inz[1]);

if Result[0]='' then Result[0]:=Zero;
if Result[1]='' then Result[1]:=Zero;
if Result[2]='' then Result[2]:=Zero;
end;


اخى Rover قم بعرض طريقتك فى المنتدى (الكود) . طريقة جميلة . :)

B.M.AbdelAziZ
29-12-2008, 02:35 AM
وهذه طريقة اخرى مختلفة

Procedure GetYXZ(s:String;Var Y,X,Z: String);
var
i: integer;
L : TStringlist;
Begin
Y := '0'; X := Y; Z := X;

s:=UpperCase(StringReplace(s, ' ', '', [rfReplaceAll]));
s:=StringReplace(s, '+', ' ', [rfReplaceAll]);
s:=StringReplace(s, '-', ' ', [rfReplaceAll]);

L := TStringList.Create;
L.CommaText := s;

for i:=0 to L.Count-1 do begin
s:=StringReplace(L[i], 'X', '', [rfReplaceAll]);
if s<>L[i] then X := s else begin
s:=StringReplace(L[i], 'Y', '', [rfReplaceAll]);
if s<>L[i] then Y := s else
Z := L[i];
end;
end;

L.Free;

end;

ولتجربتها بزر Button نكتب

var
Y,X,Z : String;
begin

GetYXZ(Edit4.Text,Y,X,Z);

Edit1.Text := Z ;
Edit2.Text := X ;
Edit3.Text := Y ;

end;

والسلام عليكم

hanipino
29-12-2008, 11:58 AM
DeltaAziz حل ممتاز . اصغر و احسن طريقة الى حد الان . مشكور .

Rover
29-12-2008, 07:23 PM
deltaaziz حل ممتاز . اصغر و احسن طريقة الى حد الان . مشكور .

و تعالج ايضاً الفراغات بين المدخلات و هذا مانسيت معالجته ..

hanipino
02-02-2009, 01:05 AM
السلام عليكم

طريقة اخرى مقرصنة من طريقة الاخ (DeltaAziz و Rover):D


var
I:Byte;
S:TStringlist;
begin
Y.Text:='0'; X.Text:=Y.Text; Z.Text:=X.Text;
S:=TStringlist.Create;
ExtractStrings(['+','-'],[' '],PAnsiChar(LowerCase(Edt1.Text)),S);

for I:= 0 to S.Count-1 do
begin
if pos('x',S[i])<>0 Then X.Text:=Copy(S[I],0,length(S[I])-1);
if pos('y',S[i])<>0 Then Y.Text:=Copy(S[I],0,length(S[I])-1);
if(pos('x',S[i])= 0)And(pos('y',S[i])=0) then
Z.Text:=Copy(S[I],0,length(S[I]));
end;
S.Free;