[تمرين] استخراج ثوابت لكثير حدود اقل من الدرجة الثانية
#1
السلام عليكم

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

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

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: Smile

الفيديو
#2
تفضل أخي Hanipino :

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

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

شكراً لك ..


الملفات المرفقة
.rar   ZXY.rar (الحجم : 1.82 ك ب / التحميلات : 109)
#3
السلام عليكم
بارك الله فيك 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  :=0inty  :=0;
inx[0]:=0inx[1]:=0;
iny[0]:=0iny[1]:=0;
inz[0]:=0inz[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 قم بعرض طريقتك فى المنتدى (الكود) . طريقة جميلة . Smile
#4

وهذه طريقة اخرى مختلفة
PHP كود :
Procedure GetYXZ(s:String;Var Y,X,ZString);
var
  
iinteger;
  
TStringlist;
Begin
  Y 
:= '0';  := Y;  := X;

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

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

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

  
L.Free;

end
ولتجربتها بزر Button نكتب
PHP كود :
var
 
Y,X,String;
begin

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

 
Edit1.Text := ;
 
Edit2.Text := ;
 
Edit3.Text := ;

end
والسلام عليكم
#5
DeltaAziz حل ممتاز . اصغر و احسن طريقة الى حد الان . مشكور .
#6
hanipino كتب :deltaaziz حل ممتاز . اصغر و احسن طريقة الى حد الان . مشكور .

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

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

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

for 
I:= 0 to S.Count-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])=0then
   Z
.Text:=Copy(S[I],0,length(S[I]));
 
end;
 
S.Free


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم