الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

طرح arrays

مغلق
بدأه maro009 في 28 أكتوبر 2005 · 6 رد · 876 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

[السلام عليكم يا اخوانى

فى جزء من مسأله محيرنى انا وزملائى فى الجامعة

المسألة باختصار كالأتى

1- يوجد مصفوفتان بحجم 20 int الحجم ثابت

2-نقوم بوضع اعداد فى كل مصفوفة بحيث ان كل element يحتوى على عدد واحد بمعنى

اذا ادخلنا فى المصفوفه العدد 5198 يوضع كل عدد منهم فى element لواحده ويملا باقى المصفوفة

بأصفار من الشمال اى سندخل الرقم من اخر المصفوفة , وسيكون الناتج كالأتى:

{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,1,9,8}

ما فكرت به هو ان املا المصفوفة ب أصفار قبل ان ابدأ كالأتى:

	int firstNum [20];
	int secondNum[20];
	for (int i =0; i<20; i++)
	{
  firstNum=0;
  secondNum=0;
	}

بعد ذلك اقوم بادخال الأرقام وأقوم بتجزئتها بستعمال %10 ووضعها فى أخى المصفوفة

الأن فى كل element رقم واحد

مشكلتى كالأتى وأتمنى من الله ان أجد الحل عندكم

يجب ان أطرح secondNum من firstNum بالشروط التالية

عملية الطرح يجب ان تكون من ال array

انشاء مصفوفة جديده لوضع الناتج بحيث يكون كل element فى المصفوفة يحتوى على عدد واحد

اذا كان الرقم الثانى اكبر من الاول يجب ان نطبع رسالة ان الناتج اقل من الصفر

لقد كتبت الكود ولكنه لا يعمل فى حالة اذا كان الرقم الثانى اكبر من الاول

سوف اشرح الموضوع ثانيا باستخدام كود لكى اوضح الموضوع اكثر

1- الرقم الأول أكبر من الثانى 
int num1 = 56458;
int num2 = 35729;
int result[20];
char sign ='+';
لقد قمت بوضع الأصفار كما فى السابق لذلك لن اكتبها ثانيا.
int firstNum[]  ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,6,4,5,8};
int secondNum[] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,7,2,9};
___________________________________________________
result              ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,7,2,9};

2-الرقم الثانى أكبر من الأول 
int num1 = 130;
int num2 = 15000;
int result[20];
char sign ='+';

int firstNum[]  ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,0};
int secondNum[] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,5,0,0,0};
_____________________________________________________
result              ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,8,7,0};
sign ='-';

وهذا ما توصلت اليه حتى الأن
public int[] subtractIntArrays(int array1[] , int array2[])
{
	int total=0;
	int remainder =0;
	int arraySubtract[20];
	for(int i=19; i>=0; i--)
	{
  if ((array1- remainder) - array2<0 )
  {
 	 total =(10+array1- remainder) - array2;
 	 arraySubtract=total;
 	 remainder=1;
  }
  else
  {
 	 total =(array1- remainder) - array2;
 	 arraySubtract=total;
 	 remainder = 0;
  }
	}
	return arraySubtract;
}
#2

أعـجبتني فكرة المشكلة لذلك قمت بحلها كلها

العيب الأول في الكـود الذي قمت بكتابته هـو أنه يقوم بتغيير قيـم العـدد الأول ، وليس الأمر في صعوبة أنني لا يمكنني تلافي هذا العيب ولكن لأن الكـود سيصبح طويلاً للغاية بدون هذا العيب

العيب الثاني في الكود هـو أنه يقارن لا يقوم بمقارنة العـددين بعـد أن يتم تحويلهما إلى مصفوفة ، كتبت كـود يقوم بهذه المهـمـة وظهرت مشاكل جـديدة أخرى لذلك اكتفيت بالمقارنـة وهـما بعـد في وضع الـ int وليس المصفوفة ... بإمكاني المقارنـة داخل المصفوفة ولكن هذه العـملية ستزيد الكـود عشر أسطر

الكـود شغال 100% وليس به عيب سوى التي في الأعلى ....

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

int main()
{
	int arr1[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	int arr2[20]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	int val [20]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	char StopTheProgram; // For Prevent The Program From Exit

	int Num1=0,Num2=0; // The Numbers
	int temp1=0,temp2=0; // Temp Number
	int count1=0,count2=0; // Counter Number For Loop
	cout << "Enter The First Number \n";
	cin >> Num1;
	cout << "Enter The Second Number \n";
	cin >> Num2;
	/**************/
	temp1=Num1;
	temp2=Num2;
	/*************/
	for(count1=0,count2=19;temp1>9;count1++,--count2)
	{
  arr1[count2]=temp1%10; // For Seprate 
  arr2[count2]=temp2%10; // Numbers
  temp1=temp1/10; 
  temp2=temp2/10;
	}
	arr1[count2]= temp1;
	arr2[count2]=temp2;
	/* Print The Arrays*/
	for( count1=0;count1 <20;count1++)
  cout << arr1[count1] << "\t";
	cout << endl << "the secont Number:\n";
	for( count1=0;count1 <20;count1++)
  cout << arr2[count1] << "\t";
	cout << endl;

	/* Compare The arrays */
	int i=0;
	if (Num1<Num2)
  i=1;

	if (i==1) // if the Second Number bigger than First Number
	{ 
  cout << "We cannot do it\n";
  cout << "Press any Key to Exit";
  cin >> StopTheProgram;
  return 0;}

	if (i==0){
  cout << "We can do it\n";
  // Do the Operation (Subtractor)
  for(count1=19;count1>-1;count1--){
 	 if (arr1[count1] < arr2[count1]){
    arr1[count1-1]-=1;
    arr1[count1]+=10;
    val[count1]=arr1[count1] - arr2 [count1];
 	 }
 	 else if (arr1[count1]>arr2[count1]){
    val[count1]=arr1[count1]-arr2[count1];
 	 }
 	 else val[count1]= 0; // this case if Num1=Num2
  }
	}
  /* print the arrays After Subtractor*/
	cout << "*******************\n";
	cout << " The Two Array After Operation\n";
  cout << endl << "The first Number:\n";
	for( count1=0;count1 <20;count1++)
  cout << arr1[count1] << "\t";
	cout << endl << "the secont Number:\n";
	for( count1=0;count1 <20;count1++)
  cout << arr2[count1] << "\t";
	cout << endl << "the val Number:\n";
	for( count1=0;count1 <20;count1++)
  cout << val[count1] << "\t";
	cout << endl;

	cout << "Press any key to Exit";
	cin >> StopTheProgram;

	return 0;
}

وشكراًُ

#3

أخى Sultan_Althibity

والا اشكرك على اهتمامك

اخى ممكن تشرح لى اين العيب فى الكود

لأن الكود يفعل مايفعله الكود بتاعك

فى ملحوظة اخرى اذا كان الرقم الثانى اكبر من الرقم الأول يجب ان نتم عملية الطرح أيضا

ليس فقط اظهار رسالة خطأ

ما قصده هو اظهار رسالة ان الناتج اصغر من الصفر واظهار الرقم السالب

اقتباس
2-الرقم الثانى أكبر من الأول 
int num1 = 130;
int num2 = 15000;
int result[20];
char sign ='+';

int firstNum[]  ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,0};
int secondNum[] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,5,0,0,0};
_____________________________________________________
result              ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,8,7,0};
sign ='-';

فمثلا 6-8=-2

130 - 700 = - 570

شكرا

#4

اخىSultan_Althibity

شئ اخر غير مسموح المقارنة او الحسابات خارج array

اقتباس
* Compare The arrays */
int i=0;
if (Num1<Num2)
 i=1;

#5

لدي فكرة, و لكن لا ادري اذا كانت مسموحة ضمن شروط السؤال:

نحن عندنا مجموعة ارقام مرتبة في array, و نريد طرح هذه الأرقام من بعضها.

علينا أولا التأكد من أن حجم المصفوفتين متساوي, و هذه المشكلة محلولة لان الحجم ثابت و هو 20.

اريد فقط ان انوه الى ملاحظة بسيطة, قد نغفل عنها لانها من الأساسيات اللتي لا تحتاج الى تفكير, لكنها ستسهل علينا المهمة كثيرا هنا!

نحن البشر نستخدم النظام العشري decimal في العد, يعني الرقم:

2345

هو رقم مكون من اربع خانات, اول خانة هي خانة الاحاد (او عشرة مرفوعة الى الاس 0), و الخانة الثانية هي العشرات (عشرة مرفوعة الى الاس 1) و الثالثة هي خانة عشرة مرفوعة الى الأس 2, يعني خانة المئات, الخ.

للحصول على قيمة هذا الرقم, نقوم بضرب كل رقم بقيمة "الخانة", ثم نضيف الارقام:

5 * 1

+

4 * 10

+

3 * 100

+

2 * 1000

طبعا كلنا يعرف هذا الشي, و لكن لماذا اقوم بطرحه هنا؟

بسيطة, عناصر المصفوفة تمثل الخانات, و هناك حيلة يمكننا القيام بها عند الطرح, لتبسيط العملية.

فعند طرح

112

105 -

نرى ان 2 اقل من خمسة, لذلك نستعير 1 من الرقم التالي و نضيف عشرة الى 2 ..

و لكن عند القيام بهذه العملية في البرنامج, لا نحتاج الى وجع الراس هذا, فنستطيع الاكتفاء بطرح الرقمين,

{ 2, 1, 1 }

-

{ 5, 0, 1 }

=

{ 3-, 1, 0 }

و هنا لدينا الخانة الأولى من الرقم هي -3, و لكن لا داعي للقلق, فنستطيع تحويل هذا الرقم الى رقم مقبول, فهذا الرقم هو:

-3 * 1

+

1 * 10

+

0 * 100

اي:

-3 + 10 + 0

=

7

و هو ناتج الطرح!

طبعا لازم بعدين نحول هذا الناتج الى array مرة أخرى, و هو امر ذكرت انك تمكنت من القيام به :)

قممكن نحول هذه المصفوفة الى رقم مرة اخرى ثم نحولها الى رقم, و لكن لست متأكدا فيما اذا كان هذا مقبول في شروط السؤال.

#6

أخى hasan_aljudy

كلامك منطقى جدا

فقد قمت بشئ مشابه فى الكود وهو اذا كان ناتج الطرح اقل من صفر سوف استلف 10 واجمعها على

الرقم الأول

اقتباس
if ((array1- remainder) - array2<0 )
 {
  total =(10+array1- remainder) - array2;
  arraySubtract=total;
  remainder=1;
 }

ولكن هناك شئ مهم هو ان حجم المصفوفة ثابت ولكن عدد الرقام التى بها ليس ثابت

مثلا

int num1 = {0,0,0,0,0,0,0,0,5,9}
int num2 = {0,0,0,0,6,3,4,8,5,7}

شئ اخر اذا كانت الأرقام تبدأ من يمين المصفوفة فكيف اعرف اذا كان هناك احاد فقط او احاد وعشرات او ,,,, الخ لأن على شمال اخر رقم

يمكن ان يكون هناك صفر او اكثر

#7

إذا أردت للبرنامج أن يقوم بالطرح حتى وإن كان العـدد الثاني أكبر من الأول فقم بوضع تعـديلات بسيطـة على الكود الذي وضعتـه واجعله يقوم بطرح العـدد الثاني من الأول (أي العكس) وأضف إليه إشارة السالب فقط..

بالنسبة لطريقة الاستلاف من الرقم الآخر التي ذكرها الأخ حسن فهي موضوعـة في الكود..

بالنسبة للمقارنـة بين العـددين داخل المصفوفة فهي بسيطة للغاية ولا داعي لأن أحلها لك

هذا الموضوع مغلق.

مواضيع مشابهة