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

سؤال بلغة سي مركّب نوعاً ما (دوال)

بدأه حامي الحمى في 8 يناير 2009 · 42 رد · 2,999 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

ثلاثية ارقام صحيحة تدعى ثلاثية حسابية اذا كان بالامكان اجراء عملية حسابية من الرقمين الأولان وتكون نتيجة ذلك هو الرقم الثالث (بمساعدة الأربع عمليات الحسابية + - * /) ، مثال: الثلاثية التالية: 5 3 2 هي ثلاثية حسابية لأنه يمكن اجراء تمرين جمع بين الـ 2 والـ 3 ويعطي متيجة 5 وهو الرقم الثالث.

يجب كتابة برنامج الذي يفحص اذا كان يوجد بمصفوفة ارقام صحيحة ثلاثيات حسابية.

البرنامج يقوم باستيعاب مصفوفة اعداد صحيحة باسم arrNum بحجم N ارقام موجبة ويقوم بعرض الثلاثيات الحسابية التي وجدت (عملية الفحص هي من اليسار الى اليمين) حسب مبني عملية قانونية.

كل رقم في المصفوفة يمكن ان يكون بداية ثلاثية موجبة بشرط ان تكون القراءة من اليسار الى اليمين (الثلاثيات التي يتم فحصها هي فقط ثلاثيات الموجودة على التوالي في المصفوفة).

عليكم استعمال وكتابة دوال لكتابة الحل، منها:

getNumbers : دالة التي تستوعب N ارقام صحيحة الى مصفوفة احادية الأبعاد من ملف تكست باسم inputNums.txt، ان فشلت عملية الإدخال يجب ارجاع القيمة 0، وان نجحت ترجع 1.

PrintExercise: دالة التي تستقبل ثلاثة ارقام (ليس بمصفوفة) ورمز الذي يمثل العملية الحسابية وتقوم بطباعة التمرين الملائم (العملية الحسابية تكون بين الرقمين الاولين ومن ثم اشارة = ومن ثم الرقم الثالث في الثلاثية).

FindAllTrioCalculation: دالة التي تستقبل مصفوفة احادية الأبعاد المكوّنة من أرقام صحيحة وموجبة فتقوم وحجم المصفوفة فتقوم بايجاد الثلثايات السابية وتطبع حسب مبنى اسئلة حسابية. هذه الدالة تتساعد بالدوال السابقة ودوال اخرى تحددونها انتم.

عليكم ايضا ان توفروا للمستخدم خيارات تمكّنه من تشغيل البرنامج عدة مرات لكل متواليات مختلفة. هذه الخيارات يجب ان تسمح للمستخدم ان يختار احد العمليات التالية:

1) ادخال متوالية ارقام جديدة من ملف تكست للمصفوفة.

2) طباعة مصفوفة الأرقام الحالية.

3) فحص اذا كانت المصفوفة قانونية (أي تحتوي على اعداد صحيحة موجبة فقط).

4) ايجاد وطباعة الثلاثيات الحسابية (هذه العملية تُنفّذ فقط اذا كانت المصفوفة قانونية، اذا لم تكن قانونية تظهر للمستحدم رسالة ملائمة تخبره بذلك).

5) انهاء البرنامج.

ملاحظات:

يمكن الفرض بأن ملف التكست يحتوي N ارقام كي تتم عملية الادخال، حتى وان كانت عملية الإدخال مكررة.

يمكن اضافة دوال اضافية ملائمة وايضا دوال للخيارات.

مثال لتشغيل البرنامج:

Choose your action from the menu:

1. Get numbers to array

2. Print current array

3. Check array validation

4. Find and print calculating trios

5. End program

Your action: 2

The numbers in the array: 2 3 5 12 60 6 10 16 2 1

1. Get numbers to array

2. Print current array

3. Check array validation

4. Find and print calculating trios

5. End program

Your action: 3

The array is valid

1. Get numbers to array

2. Print current array

3. Check array validation

4. Find and print calculating trios

5. End program

Your action: 4

2 + 3 = 5

5 * 12 = 60

60 / 6 = 10

6 + 10 = 16

There are 4 calculating trios

1. Get numbers to array

2. Print current array

3. Check array validation

4. Find and print calculating trios

5. End program

Your action: 5

Good bye!

وهناك دوال اخرى فكرت في اضافتها وهي كالتالي:

checkValid: دالة التي تستقبل مصفوفة احادية الأبعاد وحجمها وتفحص اذا كانت الأعداد في المصفوفة ملائمة أي اعداد صحيحة وموجبة فقط.

findCalculation: دالة التي تستقبل 3 اعداد صحيحة (ليس بمصفوفة) وترجع القيمة 1 اذا الثلاثية تعتبر ثلاثية حسابية او 0 اذا كانت لا تعتبر ثلاثية حسابية. وايضا ترجع رمز الذي يمثل العملية الحسابية الملائمة للثلاثية.

Menu: دالة التي تقوم بعرض الخيارات للمستخدم.

اللآن انا قمت بكتابة الدالة getNums ، لكني لم اعرف ما هي البرامترات التي اعطيها اياها، هل هو المؤشر على الملف !! ؟

وسؤال آخر وهو كيف يمكنني تحديد طول المصفوفة، حيث ان N ليس ثابت !!!

هذا ما كتبته لكن ظهر لي خطأ بسبب الـ N

  1.  
  2. #include <stdio.h>
  3.  
  4. #define INPUT "inputNums.txt"
  5.  
  6. int getNums (int);
  7.  
  8. void main()
  9.  
  10. {
  11.  
  12.  
  13.  
  14.  
  15. }
  16.  
  17.  
  18. int getNums ()
  19. {
  20.  
  21. int arrNum[N];
  22. FILE *file;
  23. file = fopen(INPUT, "r");
  24. if (file==NULL)
  25. {
  26. printf("File Not Found!n");
  27. return 0;
  28. }
  29. else
  30. {
  31. fgets(arrNum,N,file);
  32. return 1;
  33. }
  34.  
  35. }
  36.  

أرجو المساعدة

وبارك الله فيكم

السلام عليكم

تم تعديل هذه المشاركة بواسطة حامي الحمى في 8 يناير 2009 في 17:07

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#2

بالنسبة للمصفوفة عرف مصفوفة بطول 1000 مثلا.

عند حفظ الارقام من الملف اليها اقفل المصفوفة بالرقم -1 مثلا.

عند القراء سوف تقراء المصفوفة حتى تصل الرقم -1.

tvquran_6.gif

#3

السلام عليكم

بارك الله فيك اخي الكريم على المساعدة

لكني لم افهم كيف يمكن اقفال مصفوفة ؟!

هل تقصد ان يكون السطر في ملف التكست منتهي برمز معين مثلاً ؟

علما ان المصفوفة او ملف التكست غير ثابت ويمكن للمستخدم ام يقوم بتغييره كيفما يشاء

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#4

اذا كان الملف لا يحوي اعداد غير الموجبه عند تحويله الي مصفوفة نجعل آخر عنصر عدد فريد مثلا -1.

الملف ليس هناك حاجه للكتابه اليه فقط المصفوفة.

tvquran_6.gif

#5

هذا كود للقراءة من الملف على افتراض ان الارقام مكتوبة متتاليه وبين كل رقمين مسافة.

الفكرة ان انشئت مصفوفة طولها 1000 واخزن طول المصفوفة الحقيقي في آخر عنصر في المصفوفة.

  1. #include <stdio.h>
  2. #define INPUT "inputNums.txt"
  3. #define SIZE 1000
  4.  
  5.  
  6. int getNums(int number[]);
  7. main()
  8. {
  9. int number[SIZE];
  10. int len;
  11. int i;
  12. getNums(number);
  13. len=number[SIZE];
  14. for(i=0;i<len;i++)
  15. printf("%i n",number[i]);
  16.  
  17. getchar();
  18. }
  19.  
  20.  
  21.  
  22. int getNums(int number[])
  23. {
  24. FILE* file;
  25. int j=0;
  26. int k;
  27. file=fopen(INPUT,"r");
  28. if(file==NULL) return 0;
  29. while(!feof(file))
  30. {
  31. fscanf(file,"%i",&k);
  32. number[j]=k;
  33. j++;
  34. }
  35. number[SIZE]=j;
  36. fclose(file);
  37. return 1;
  38. }
  39.  

تم تعديل هذه المشاركة بواسطة فهدالشلوي في 8 يناير 2009 في 19:06

tvquran_6.gif

#6

السلام عليكم

بارك الله فيك اخي الكريم

وزادك الله بسطة في العلم

اريد سؤالك هل يمكن عمل أمر ما على أن لا يكون الـ N ثابت

بمعنى ان يتم تحديد الـ N تلقائياً حسب الطول

اي يكون في البداية قراءة للمصفوفة مع counter الذي يقوم بعدّ طول المصفوفة ومن ثم ادخال هذا العداد كحجم للمصفوفة ؟

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#7

لتحديد طول المصفوفة حسب رغبة المستخدم (يجب استخدام المؤشرات) :

#include <iostream>
using namespace std;


int main(void)
{
	int * a;
	int size;

	cout << "Enter size of array: ";
	cin >> size;

	a = new int[size];
	for (int i=0; i<size; i++)
	{
		a = 5*i;
	}
	for (int i=0; i<size; i++)
	{
		cout << a << endl;
	}
	delete[] a;
	system("pause");
	return 0;
}
#8

السلام عليكم

بارك الله فيك اخي عمر

لكن الكود ااذي قمت بكتابته مأجورا ان شاء الله ليس بلغة سي (أتوقع انه في لغة سي بلس بلس )

وايضا المطلوب هو ليس ان المستخدم عليه ان يدخل حجم المصفوفة، انما يكون حجمها كما هي في ملف التكست، اي على البرنامج ان يحفظ طول المصفوفة عند قراءة الملف.

جزيت خيرا اخي الفاضل :)

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#9

اولا الكود الذي وضعته في مشاركة 5 به خطأ اني خزنت الرقم في عنصر خارج المصفوفة .

المفروض يكون هكذا number[size-1]=j;

وكذلك عند القراءه يعدل الي len=number[size-1]

نعم يمكن عمل مصفوفة دناميكية لكن لا اعلم هل وصلتوا لها في المنهج ان بعد؟

باستخدام malloc

وتحرير باستخدام free

tvquran_6.gif

#10

السلام عليكم

بوركت اخي الكريم فهد

لكني جربت الكود اللي قمت بوضعه وقام بطباعة المصفوفة بشكل صحيح !!!

بخصوص عمل مصفوفة ديناميكة لم نصل اليها حتى الآن :(

لكن المفروض يكون هناك حل آخر

لان الحل انه يتم وضع رقم كبير مكان N غير مقبول، وهذا يدل انه يجب ان يكون هناك حل آخر !!!

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#11
اقتباس
لكني جربت الكود اللي قمت بوضعه وقام بطباعة المصفوفة بشكل صحيح !!!

نعم اذا كان غير محجوز لن يكون هناك مشكله لكن من الخطاء برمجيا التخزين فيه.

اقتباس
لكن المفروض يكون هناك حل آخر

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

لم تصل الي الدنميكية فليس هناك غير الثابته.

اقتباس
لان الحل انه يتم وضع رقم كبير مكان N غير مقبول

من اين عرفت انه غير مقبول ؟ هل هناك شروط تمنعه في السؤال؟

tvquran_6.gif

#12

كيف لم تدرسوا المصفوفات الديناميكية و المطلوب عمل مصفوفة طبقاً لعدد العناصر فى الملف :blink: :wacko: شئ غريب

-----------

بالنسبة للكود أخى حامى الحمى ، هو فعلاً ++C ، و بالنسبة أن المستخدم لا يدخل حجم المصفوفة ، أنا أضفته لتوضيح الفكرة فقط و أنت تقوم بتطبيقها كما تريد طبقاً لهدف برنامجك

---------

أنا عندى فكرة لا أعرف ان كانت صحيحة أم لا لانشاء مصفوفة حسب عدد العناصر فى الملف (تحتاج لمصفوفة ديناميكية)

الفكرة ببساطة هى كالتالى :

المرور على بيانات الملف و عد المسافات بين كل رقم واخر و انشاء مصفوفة حجمها يساوى عدد المسافات + 1

لا أعرف ان كانت صحيحة ، أعذرنى أخى لا استطيع تطبيقها لأنى لا أعرف كيفية التعامل مع الملفات (مكسل أدرسه :blush: )

أضافة : أنا لم أقرأ موضوعك بتمعن لذلك لا أعرف الشروط المطلوبة للكود ، أعتذر عن ذلك)

تم تعديل هذه المشاركة بواسطة Omar Eladel في 8 يناير 2009 في 20:27

#13

السلام عليكم

بارك الله فيكم اخواي فهد وعمر

اخي عمر درسنا المصفوفات لكن لم ندرس موضوع الديناميكية حتى الآن

لذلك أنفي ان يكون المقصود هو استعمال مصفوفات ديناميكية

اخي الفاضل فهد:

المذكور في السؤال هو ان حجم المصفوفة N، أي ممكن ان يتغير، صحيح انه غير منطقي ان تكون المصفوفة أكثر من 1000، لكن ماذا اذا كانت اكثر من ذلك ؟

هل هناك حل آخر برأيكم غير المصفوفة الديناميكية ؟

جزاكم الله خير الجزاء

السلام عليكم

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#14

من الممكن ان تسأل المحاضر برسالة بالايمل تتاكد منه ان كان لديكم بالجامعه تواصل للاستفسارات.

لكن لا اعتقد ان هناك غير هذه الطريقة

tvquran_6.gif

#15

السلام عليكم

نعم اخي، هذا ما قمت بفعله وهو سؤال الممرّن في الكورس

وان شاء الله تكون اجابته انا بنقدر نستعمل define

جزيت كل خير اخي الكريم :)

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#16

السلام عليكم

تم اجابتي بأن القصد هو متغير ثابت أي define

الآن اخواني الكرام لدي سؤال

وهو انني اريد كتابة دالة باسم fundCalculation وهي دالة تستقبل 3 اعداد صحيحة وترجع القيمة 1 اذا الثلاثية كانت حسابية او 0 اذا لم تكن حسابية، وفي حال كانت حسابية يجب ان ترجع رمز العملية الحسابية الملائم (+ - * / )

كيف يمكنني عمل دالة ترجع اكثر من قيمة ؟

السلام عليكم

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#17

السلام عليكم

اسف على رفع الموضوع مجددا

لكن نسيت اذكر اني عارف اني لازم استعمل المؤشرات

لكن بالضبط مش عارف

وهذا اللي كتبته للدالة

لكن الرمز نفسه ما بعرف كيف ممكن ارجعه بمعنى ارجاع قيمتين

خاصة كمان ان قيمة منهن int والثانية المفروض تكون char

  1.  
  2. int findCalculation(int *a, int *b, int *c)
  3. {
  4. char ch;
  5. if (*a - *b == *c)
  6. return 1;
  7. else return 0;
  8.  
  9. if (*a + *b == *c)
  10. return 1;
  11. else return 0;
  12.  
  13. if (*a * *b == *c)
  14. return 1;
  15. else return 0;
  16.  
  17. if (*a / *b == *c)
  18. return 1;
  19. else return 0;
  20.  
  21. }
  22.  

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#18

هذه فكرة الدالة باستخدام struct

  1. #include<stdio.h>
  2. struct mytype
  3. {
  4. int ok;
  5. char ch;
  6. };
  7.  
  8. struct mytype fundCalculation(int a,int b,int c)
  9. {
  10. struct mytype tmp;
  11. if(c==a+b) {tmp.ok=1;tmp.ch='+';}
  12. else if(c==a-b) {tmp.ok=1;tmp.ch='-';}
  13. else if(c==a*b) {tmp.ok=1;tmp.ch='*';}
  14. else if(c==a/b) {tmp.ok=1;tmp.ch='/';}
  15. else {tmp.ok=0;tmp.ch=' ';}
  16.  
  17. return tmp;
  18.  
  19. }
  20. main()
  21. {
  22.  
  23.  
  24. printf("%i %c ",fundCalculation(3,4,12).ok,fundCalculation(3,4,12).ch);
  25.  
  26. getchar();
  27. }
  28.  

tvquran_6.gif

#19

السلام عليكم

بارك الله فيك اخي الكريم فهد

عندي سؤال من بعد اذنك اخي

هل يمكن كتابتها بواسطة المؤشرات ؟

يعني بنمط اللي كتبته انا فوق ؟

السلام عليكم

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#20

هناك فكرة اسهل ان تعيد الدالة قيمة رمز العمليه ان كانت صحيحة او صفر لغير ذلك .

هل استخدام المؤشرات مشروط بنفس الصيغه الي كتبته أنت ؟

tvquran_6.gif

#21

هذه طريقه جيده ايضا:

  1. #include<stdio.h>
  2.  
  3. int fundCalculation(int a,int b,int c)
  4. {
  5. return (c==a+b)?(int)('+'):(c==a-b)?(int)('-'):(c==a*b)?(int)('*'):(c==a/b)?(int)('/'):0;
  6. }
  7.  
  8. main()
  9. {
  10. printf("%c n",fundCalculation(3,4,12));
  11. printf("%c n",fundCalculation(3,4,7));
  12.  
  13.  
  14. getchar();
  15. }
  16.  

tvquran_6.gif

#22

السلام عليكم

لا أخي ما في شرط

لكن هذا سؤال شخصي اذا في امكانية لعمل الدالة عن طريق المؤشرات

وقصدك في الطريقة الأسهل هو ان تعيد مثلا القيمة 43 اذا كانت الاشارة الملائمة هي + ؟

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#23

بالشكل الذي كتبته أنت سوف تتغير قيم البارمترات.

tvquran_6.gif

#24

بارك الله فيك اخي الكريم على التوضيح

لكن اذا ممكن اخي تشرحلي السطر اللي حضرتك كتبته

  1. return (c==a+b)?(int)('+'):(c==a-b)?(int)('-'):(c==a*b)?(int)('*'):(c==a/b)?(int)('/'):0;
  2.  

اول مرة بشوف هذي التركيبة

تعب الجسد

ونعيم الروح

جسد يمشي فوق الأرض

وروح ترفرف حول العرش

#25

هذا الشرط if

هذه الطريقه مشهوره جدا في لغه سي .

  1. #include <stdio.h>
  2. #include<string.h>
  3. int main(int argc, char *argv[])
  4. {
  5. int s;
  6. scanf("%i",&s);
  7. /*
  8.  
  9. if(s==1)
  10. printf("yesn");
  11. else
  12. printf("Non");
  13.  
  14. */
  15.  
  16. (s==1)?printf("yesn"):printf("Non");
  17. getchar(); getchar();
  18.  
  19. return 0;
  20. }
  21.  

tvquran_6.gif

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…