delphi4arab منتديات دلفي للعرب
خطا في كود برمجي ؟ - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : خطا في كود برمجي ؟ (/showthread.php?tid=5784)



خطا في كود برمجي ؟ - bassem_43 - 12-12-2013

لدي برنامج بسيط يحتوي على editText و زر ، والكود الموجود عند الضغط على الزر هو :

PHP كود :
procedure TForm1.BitBtn1Click(Sender: TObject);
 const 
tablelettre:Array[1..26] of string = ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','K','R','S','T','U','V','w','X','Y','Z');
 const 
tabint:Array[1..26] of integer = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26);
 var
 
i,j,sum: integer ;
 
begin
Label1
.visible := true ;
sum := 0;
for 
i := 1 to length(edit1.text) do
for 
j := 1 to length (tablelettre) do
   if 
edit1.Text[i]=tablelettre[j] then
      sum
:= sum + tabint[j];
       
j:=j+1;
       
i:=i+1;


label1.caption:= inttostr(sum) ;

end;

end. 
عمل البرنامج انه يقوم بمقارنة حروف الكلمة المدخلة الى Edittext مع جدول الارقام tabint و كل حرف من tablelettre يقابله رقم معين وادا وجد حرف من الكلمة المدخلة في editText يقوم بجمع الرقم الموافق لها مع متغير sum وتظهر النتيجة على 1label .
1-المشكلة انه دائما نتيجة Sum تساوي صفر وهده مشكلة ؟؟
اظن انه يوجد خطا في الكود ما هو لاصححه .
2- كيف يمكن نزع الفراغات المدخلة الى Edit يعني مثلا لو ادخلنا : Delphi for Arabe النتيجة بعد نزع الفراغ هي DelphiforArabe ؟؟


خطا في كود برمجي ؟ - الياس الدويرة - 12-12-2013

دالة بسيطة لي حذف الفراغ + تصحيح السورس الذي وضعته
function notvid(strConfusedtring)Confusedtring;
var i:integer;
cConfusedtring;
begin
for i:=1 to length(str) do begin
if str[i]<>' ' then c:=c+str[i]; end;
result:=c;
end;
//////////////////////
procedure TForm1.Button1Click(Sender: TObject);
const tablelettre:Array[1..26] of string = ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','K','R','S','T','U','V','w','X','Y','Z');
const tabint:Array[1..26] of integer = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26);
var
i,j,sum: integer ;
cConfusedtring;
begin
Label1.visible := true ;
sum := 0;
c:=UpperCase(edit1.text) ;
for i := 1 to length(edit1.text) do
for j := 1 to length (tablelettre) do
if c[i]=tablelettre[j] then
sum:= sum + tabint[j];
label1.caption:= inttostr(sum) ;
end;


خطا في كود برمجي ؟ - igidher - 12-12-2013

تنقصك Begin و end لكل من for الأولى و الثانية


خطا في كود برمجي ؟ - Najy Ibraheem - 12-12-2013

السلام عليكم...

أحد الأسباب هو أن مقارنة النصوص في دلفي هي مقارنة ثنائية، أي حساسة لحالة الأحرف (case-sensitive) يعني مثلاً أن B لا يساوي b. و قد استخدم الأخ "الياس الدويرة" الدالة UpperCase للمطابقة مع محتويات المصفوفة tablelettre على اعتبار أن الحروف التي بها حروف كبيرة (CAPITAL) - لكن - ربما سهواً الحرف w صغير!

*** لإزالة الفراغات أضف الوحدة StrUtils إلى جملة uses (في الـ interface أو الـ implementation):
كود :
uses StrUtils;
ثم استعمل الدالة ReplaceText كما في الكود التالي:

* إذا كانت القيم المقابلة للحروف هي 1، 2، 3، ... ، 26 بالترتيب فلا نحتاج إلى المصفوفة الثانية (tabint) و يكون الكود هكذا:

كود :
procedure TForm1.Button1Click(Sender: TObject); const tablelettre: Array[1..26] of string = ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','K','R','S','T','U','V','W','X','Y','Z'); var i, j, sum: Integer; MyStr: string; begin MyStr := ReplaceText(Edit1.Text, ' ', ''); sum := 0; for i := 1 to Length(MyStr) do begin for j := 1 to Length(tablelettre) do begin if UpperCase(MyStr[i]) = UpperCase(tablelettre[j]) then begin sum := sum + j; Break; // إذا وجدت الحرف فاخرج من الحلقة الداخلية end; end; end; Label1.Caption := IntToStr(sum); end;


* أما إذا كانت القيم غير ذلك فالكود يكون هكذا:

كود :
procedure TForm1.Button1Click(Sender: TObject); const tablelettre: Array[1..26] of string = ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','K','R','S','T','U','V','W','X','Y','Z'); tabint: Array[1..26] of Integer = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26); var i, j, sum: Integer; MyStr: string; begin MyStr := ReplaceText(Edit1.Text, ' ', ''); sum := 0; for i := 1 to Length(MyStr) do begin for j := 1 to Length(tablelettre) do begin if UpperCase(MyStr[i]) = UpperCase(tablelettre[j]) then begin sum := sum + tabint[j]; Break; end; end; end; Label1.Caption := IntToStr(sum); end;


* نرجو الاستفادة و السلام.


خطا في كود برمجي ؟ - S.FATEH - 12-12-2013

السلام عليكم

الأخطاء في الكود

1) يجب حذف
PHP كود :
j:=j+1;
       
i:=i+1; 

لا داعي لرفع قيم العدادات الا في حالة استخدمت جملة while
2) مقارنة الاحرف الكبيرة و الصغيرة تختلف كما اشار الاخ Najy Ibraheem
3) هناك تكرار للحرف K الا في حالة تعمدت ذلك اعتقد يجب ان يكون Q
PHP كود :
tablelettre: Array[1..26] of string = ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','K','R','S','T','U','V','W','X','Y','Z'); 
لحذف الفراغات استخم الدالة trim

PHP كود :
Edit1.Text := Trim(Edit1.Text); 

بطريقة اخرى

PHP كود :
procedure TForm1.Button1Click(Sender: TObject);
var
  
I, Sum: Integer;
begin
  Sum 
:= 0;
  
Edit1.Text := Trim(Edit1.Text);
  
Edit1.Text := UpperCase(Edit1.Text);
  for 
I := 1 to Length(Edit1.Text) do
    case 
Edit1.Text[i] of
      
'A': Sum := Sum + 1;
      
'B': Sum := Sum + 2;
      
'C': Sum := Sum + 3;
      
'D': Sum := Sum + 4;
      
'E': Sum := Sum + 5;
      
'F': Sum := Sum + 6;
      
'G': Sum := Sum + 7;
      
'H': Sum := Sum + 8;
      
'I': Sum := Sum + 9;
      
'J': Sum := Sum + 10;
      
'K': Sum := Sum + 11;
      
'L': Sum := Sum + 12;
      
'M': Sum := Sum + 13;
      
'N': Sum := Sum + 14;
      
'O': Sum := Sum + 15;
      
'P': Sum := Sum + 16;
      
'Q': Sum := Sum + 17;
      
'R': Sum := Sum + 18;
      
'S': Sum := Sum + 19;
      
'T': Sum := Sum + 20;
      
'U': Sum := Sum + 21;
      
'V': Sum := Sum + 22;
      
'W': Sum := Sum + 23;
      
'X': Sum := Sum + 24;
      
'Y': Sum := Sum + 25;
      
'Z': Sum := Sum + 26;
    
end;
    
Label1.Caption := IntToStr(Sum);
end; 



خطا في كود برمجي ؟ - bassem_43 - 12-12-2013

الياس الدويرة كتب :دالة بسيطة لي حذف الفراغ + تصحيح السورس الذي وضعته
function notvid(strConfusedtring)Confusedtring;
var i:integer;
cConfusedtring;
begin
for i:=1 to length(str) do begin
if str[i]<>' ' then c:=c+str[i]; end;
result:=c;
end;
//////////////////////
procedure TForm1.Button1Click(Sender: TObject);
const tablelettre:Array[1..26] of string = ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','K','R','S','T','U','V','w','X','Y','Z');
const tabint:Array[1..26] of integer = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26);
var
i,j,sum: integer ;
cConfusedtring;
begin
Label1.visible := true ;
sum := 0;
c:=UpperCase(edit1.text) ;
for i := 1 to length(edit1.text) do
for j := 1 to length (tablelettre) do
if c[i]=tablelettre[j] then
sum:= sum + tabint[j];
label1.caption:= inttostr(sum) ;
end;

بارك الله فيك يا اخي الكريم على ال****** لكن في كود دالة حدف الفراغ اظن انه يجب اسناد قيمة ابتدائية للمتغير c ولتكن عبارة عن فراغ ' ' ؟؟؟


خطا في كود برمجي ؟ - bassem_43 - 12-12-2013

نعم اخي S.FATEH قدا كررت الحرف K سهوا قصدت Q وكدلك الحرف W قصدته كبيرا كما نبهني الاخ Najy Ibraheem
بارك الله فيكم جميعا اتحفتموني بحلول رائعة
تم التعديل على الكود و الاستفاد ان شاء الله


خطا في كود برمجي ؟ - Mr.DOS - 12-12-2013

غيرت CharCase الخاصة بـ EDIT الى ecUpperCase


خطا في كود برمجي ؟ - Amer12 - 13-12-2013

S.FATEH كتب :السلام عليكم

الأخطاء في الكود

1) يجب حذف
PHP كود :
j:=j+1;
       
i:=i+1; 

لا داعي لرفع قيم العدادات الا في حالة استخدمت جملة while

عداد جملة التكرار for لا يزاد إلا بمقدار واحد والتلاعب بمقدار زيادته يؤدي إلى خطأ
كذلك يجب ان يكون متغير محلي والسبب أنه يحفظ في مسجلات المعالج لضمان سرعة في التنفيذ.