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

لدي دالة لا تعمل 100٪

بدأه hamany-pirlo في 21 مارس 2010 · 9 رد · 507 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله و بركاته...

لقد كتبت برنامجا و إحدى دوال هذا البرنامج لا تعمل 100٪ ، حيث عندما أدخل أكثر من رقمين القيمة المرجعة من الدالة تكون خطأ :(

bool allSorted(int x[], int N)			//This function return true if 
										//all N integers in x are sorted 
										//in a descending order.
{
	int cnst=0;

	for(int i=0; i<N; i++)
	{
		if(x >= x[i+1]) 
		cnst++;
		}
	if(cnst==N)
	return 1;
	else
	return 0;
	}

و هذا البرنامج الكامل ...

#include <iostream>
using namespace std;

void ReadData(int x[], int N)			//This function will read from 
										//the user N integers. The N 
										//integers will ba saved in the 
										//parameter array x.
{
	cout<<"Data: ";
	for (int i=0; i<N; i++)
	{
		cin>>x;
		}

	cout<<endl;
	}

void printData(int x[], int N)			//This function prints the first 
										//N integers in array x.
{
	cout<<"Data is: ";
	int i;
	for (i=0; i<N-1; i++)
	{
		cout<<x<<',';
		}
	cout<<x<<'.'<<endl;
	}

bool allEven(int x[], int N)			//This function returns true if 
										//all N integers in x are even.
{
	int cnst=0;
	for (int i=0; i<N; i++)
	{
		if((x%2) == 0)
		cnst++;
		}
	if(cnst == N)
	return 1;
	else
	return 0;
	}

bool allSorted(int x[], int N)			//This function return true if 
										//all N integers in x are sorted 
										//in a descending order.
{
	int cnst=0;

	for(int i=0; i<N; i++)
	{
		if(x >= x[i+1]) 
		cnst++;
		}
	if(cnst==N)
	return 1;
	else
	return 0;
	}

void computeSum(int x[], int y[], int N)			//This function will 
													//set elements in 
													//array y such that 
													//the value of 
													//y(sub)k is equal 
													//to the sum of all 
													//positive integers 
													//<= x(sub)k
{	
	for(int i=0; i<N; i++)
	{
		int sum=0;

		if (x<=0)
		{
			sum=0;
			}
		else
		{
			for (int j=0; j<=x; j++)
			sum=sum+j;
			}
		y=sum;
		}
	}

int main()
{
	int N,i;

	cout<<"Size of data: ";
	cin>>N;
	int x[N],y[N];
	cout<<endl;

	ReadData(x, N);

	printData(x, N);

	if(allSorted(x, N) == 1)
		cout<<"The data IS sorted."<<endl;
	else
		cout<<"The data IS NOT sorted."<<endl;

	if(allEven(x, N) == 1)
		cout<<"The data IS all even."<<endl;
	else
		cout<<"The data IS NOT all even."<<endl;

	computeSum( x, y, N);

	{
		for (i=0; i<N-1; i++)
	{
		cout<<y<<',';
		}
	cout<<y<<'.'<<endl;
	}
	cout<<"Thank you.";

	return 0;
	}

الرجاء المساعدة بأسرع وقت ممكن لأني لم أكتشف هذا الخطأ إلا متأخرا ، و تسليم الـassignment اليوم.

Program every day for 20 years and you will become a good programmer. Program every day for 10 years and study algorithms on the side and you will become a great programmer !

على الأقل هذا اللي سمعته ...

#2

وعليكم السلام ورحمة الله وبركاته .. ,

int N,i;       
cout<<"Size of data: ";
cin>>N;
int x[N],y[N];

تريد تحديد طول المصفوفة بعد ما يشتغل البرنامج ؟

لا يمكنك فعل ذلك .. لآبد من إستخدام new ,

int N,i;
cout<<"Size of data: ";
cin>>N;
int *y,*x;
x=new int [N];
y=new int [N];
2

سبحآن الله وبحمده .. سبحآن الله العظيم .. ,

#3

سبقتني الأخت اشراقة فجر على احد النقاط

ولكن السبب في عدم عمل الدالة هو الآتي :

bool allSorted(int x[], int N)                  //This function return true if 
                                                                                //all N integers in x are sorted 
                                                                                //in a descending order.
{
        int cnst=0;

        for(int i=0; i<N; i++)
        {
                if(x >= x[i+1]) 
                cnst++;
                }
        if(cnst==N)
        return 1;
        else
        return 0;

بالتحديد هو هذا السطر

        for(int i=0; i<N; i++)

لأن الشرط يعمل وفق أن تكون أقل من N أي انه في كل الحالات لايمكن ان تتوافق N مع cnst والسبب أن عدد الدورات هو أقل بواحد عن N

لذا جرب هذه الدالة سوف تعمل بكفاءة .. وتتمثل بنفس آلية TRUE و FALSE في حالة إخفاق الشرط سوف تتغير الحالة الى صفر ونعود بقيمة cnst إما صفر أو واحد .

int allSorted(int x[], int N)                  //This function return true if 
                                                                                //all N integers in x are sorted 
                                                                                //in a descending order.
{
        int cnst=1;

        for(int i=1; i<N; i++)
        {
                if(x[i-1]< x) 
                cnst=0;
          }
        return cnst;
        }

تحياتي

تم تعديل هذه المشاركة بواسطة omani في 21 مارس 2010 في 16:10

1

OMANI FOR EVER

-------------------------------------------------

post-12787-12780191801974.jpg

-------------------------------------------------

#4
اقتباس
لأن الشرط يعمل وفق أن تكون أقل من N أي انه في كل الحالات لايمكن ان تتوافق N مع cnst والسبب أن عدد الدورات هو أقل بواحد عن N

صحيح ,

بالتالي أتوقع أن الخطأ في هالسطر ..

    if(cnst==(N))

جرب هذا :wink: ..

   if(cnst==(N-1))

سبحآن الله وبحمده .. سبحآن الله العظيم .. ,

#5
إشراقــه فجــر كتب:

صحيح ,

بالتالي أتوقع أن الخطأ في هالسطر ..

    if(cnst==(N))

جرب هذا :wink: ..

   if(cnst==(N-1))

ماذا لو كانت قيمة N = 1 ماذا سيحدث في الدالة ؟ هل ستعمل ؟؟

لن تعمل والسبب أن N +1 غير موجودة أصلا"

لذا يجب ان يبدأ قيمة i =1 لتكون المقارنه مع i-1 .

وعندما نأتي الى المقارنة سوف يقارن N-1 وهي -1 . سوف يعود بماذا؟

أنا أرى أن التعديل الذي قمت بكتابته في مشاركتي السابقة هو الأفضل . ( مجرد وجهة نظر شخصية )

شاكر لكم تفاعلكم

تحياتي

1

OMANI FOR EVER

-------------------------------------------------

post-12787-12780191801974.jpg

-------------------------------------------------

#6

أود أن أشكر الجميع على المشاركة و مساعدتي في الحل ، و لدي سؤال للأخ omani ...

إذا قمنا بإنشاء array طولها 3 ، فإن عناصرها سترتب بهذا الشكل 0,1,2 ، و في الشرط الذي كتبته أنا سابقاً ، ستتوافق N with cnst لأن الـ loop تبدأ من الصفر ، و إذا كتبت cout بعد الـ for loop للـ cnst ستجد أنه يساوي الـ N (طبعاً إذا كانت الأعداد زوجية).

ملاحظة : ليس قصدي التشكيك في الكود الذي قدمته (لأنه يعمل 100٪) ، و لكن قصدي التعلم من أخطائي.

Program every day for 20 years and you will become a good programmer. Program every day for 10 years and study algorithms on the side and you will become a great programmer !

على الأقل هذا اللي سمعته ...

#7
omani كتب:

ماذا لو كانت قيمة N = 1 ماذا سيحدث في الدالة ؟

هل ستعمل ؟؟ لن تعمل والسبب أن N +1 غير موجودة أصلا" لذا يجب ان يبدأ قيمة i =1 لتكون المقارنه مع i-1 . وعندما نأتي الى المقارنة سوف يقارن N-1 وهي -1 . سوف يعود بماذا؟ أنا أرى أن التعديل الذي قمت بكتابته في مشاركتي السابقة هو الأفضل . ( مجرد وجهة نظر شخصية ) شاكر لكم تفاعلكم تحياتي

صحيح ..

ما شاء الله عليك , بصراحه ما فكرت لو كانت الـ N = 1..

و كودك صحيح 100 % .. , وما شككت فيه أبداً

أتوقع فهمت قصدي خطأ من مشاركتي ..

أعتذر لك ,

سبحآن الله وبحمده .. سبحآن الله العظيم .. ,

#8
hamany-pirlo كتب:

أود أن أشكر الجميع على المشاركة و مساعدتي في الحل ، و لدي سؤال للأخ omani ...

إذا قمنا بإنشاء array طولها 3 ، فإن عناصرها سترتب بهذا الشكل 0,1,2 ، و في الشرط الذي كتبته أنا سابقاً ، ستتوافق N with cnst لأن الـ loop تبدأ من الصفر ، و إذا كتبت cout بعد الـ for loop للـ cnst ستجد أنه يساوي الـ N (طبعاً إذا كانت الأعداد زوجية).

ملاحظة : ليس قصدي التشكيك في الكود الذي قدمته (لأنه يعمل 100٪) ، و لكن قصدي التعلم من أخطائي.

bool allSorted(int x[], int N)                  //This function return true if 
                                                                                //all N integers in x are sorted 
                                                                                //in a descending order.
{
        int cnst=0;

        for(int i=0; i<N; i++)
        {
                if(x >= x[i+1]) 
                cnst++;
                }
        if(cnst==N)
        return 1;
        else
        return 0;
        }

أفترض أخي الكريم أن N=3

والمدخلات كالتالي ـ

i=0 و i<N إذا الشرط صحيح

المقارنه بين

x>=x[i+1]

أي أن

x[0]>=x[0+1]

أي أن

x[0]>=x[1]

إذا لامشكلة الكود ماشي تمام

الأن i=1 و i<N إذا الشرط صحيح

x[1]>=x[2]

إذا لامشكلة حتى الأن

الأن i=2 و i<N إذا الشرط صحيح

x[2]>=x[3]

هنا المشكلة لانه ببساطه لاتوجد لديك

x[3]

في الأصل . لأن حجم X هو3 فقط أي من صفر الى 2.

القليل من المترجمات قد تعيد لك الخطأ أما أغلبها فسوف يقوم بإنشاء قيمة عشوائية يقارن بها . وهنا اصل الخطأ في برنامجك .

أي ان تركيب for Loop يجب ان يكون بطريقة اخرى . أو بنفس طريقتك ولكن ان تجعل الشرط N-1

for(i=0;i<(n-1);i++)

وهنا سوف تحصل على نتائج دقيقة وصحيحه ولكن سوف يعمل اللوب ب N-1 اي قيمة cnst لن تتساوى مع N وهنا سنعود لنفس مشاركة الأخت اشراقة إذا كانت N=1 فسنعود بقيمة صفر وأيضا ستكون النتيجة خطأ .

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

اجعلها مباشرة . بهذه الطريقة لتحصل على نتائج فعلية وأسرع بمئات المرات .

int allSorted(int x[], int N)                  //This function return true if 
                                                                                //all N integers in x are sorted 
                                                                                //in a descending order.
{

        for(int i=1; i<N; i++)
        {
                if(x[i-1]< x) 
                return 0;
          }
        return 1;
        }

تحياتي

تم تعديل هذه المشاركة بواسطة omani في 21 مارس 2010 في 17:45

2

OMANI FOR EVER

-------------------------------------------------

post-12787-12780191801974.jpg

-------------------------------------------------

#9
إشراقــه فجــر كتب:

صحيح ..

ما شاء الله عليك , بصراحه ما فكرت لو كانت الـ N = 1..

و كودك صحيح 100 % .. , وما شككت فيه أبداً

أتوقع فهمت قصدي خطأ من مشاركتي ..

أعتذر لك ,

لا ابداً .. ولا داعي للاعتذار .. الهدف في النهاية ان نصل الى خلاصة صافية دون Error قصدي دون شوائب .

تحياتي

1

OMANI FOR EVER

-------------------------------------------------

post-12787-12780191801974.jpg

-------------------------------------------------

#10

شكراً جزيلاً لك أخي الكريم ، و الصراحة شرحك كافي و وافي ، و أشكرلك أيضاً سرعتك في الرد على أسئلتي. :)

Program every day for 20 years and you will become a good programmer. Program every day for 10 years and study algorithms on the side and you will become a great programmer !

على الأقل هذا اللي سمعته ...

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