السلام عليكم
استخراج ثوابت لكثير حدود اقل من الدرجة الثانية
اولا نعبر عن متغيرات الكثير حدود ب :
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:
الفيديو
تفضل أخي Hanipino :
الحل مع السورس كود في المرفقات ...
و لكن يفضل أستخدام Mask في مثل هذه الحالات ..
شكراً لك ..
السلام عليكم
بارك الله فيك Rover طريقة ممتازة و كاملة . و الكمال لله .
طريقتى ناقصة بحيث ادا تم تغير مكان z تختلط الامور اى مكانه دائما فى الاخير . اضافتا الى دالك غلقت على نفسى بكثرة المتغيرات
-- لم استعمل
Pos .
50 سطر
و سطر :confused:
PHP كود :
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 قم بعرض طريقتك فى المنتدى (الكود) . طريقة جميلة .

DeltaAziz حل ممتاز . اصغر و احسن طريقة الى حد الان . مشكور .
hanipino كتب :deltaaziz حل ممتاز . اصغر و احسن طريقة الى حد الان . مشكور .
و تعالج ايضاً الفراغات بين المدخلات و هذا مانسيت معالجته ..
السلام عليكم
طريقة اخرى
مقرصنة من طريقة الاخ (DeltaAziz و Rover)
PHP كود :
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;