שאלה בפונקציות בC++ - עמוד 2 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

שאלה בפונקציות בC++


BAR_PC
 Share

Recommended Posts

ציטוט של af db creid

רק רגע -

כלומר כל התאים במערך מתחלקים בו?

כאילו מצד שבכל התאים שלפניו קיימים ערכים המחלקים את הערך בתא, ובכל התאים אחריו קיים ערך המתחלק ע"י הערך בתא. למשל בדוגמה שלי כל הערכים לפני 60 אז 60 מחלק אותם וכל הערכים אחרי 60 מתחלקים ב60

נערך על-ידי BAR_PC
קישור לתוכן
שתף באתרים אחרים

טוב.

שתי בעיות -

אחת, לא מספיק לבדוק לפי הסדר אם השני מתחלק בראשון והשלישי בשני. זה לא ימצא את כל התבניות לדוג' במקרה שלך -

15 לא מחלק את 20, אז הלולאה של divide_left מפסיקה. למרבה הצער, זה ש15 לא מחלק את 20 לא אומר שהוא לא מחלק את 30.

למרבה הצער, אין דרך קיצור - תצטרך לבדוק עבור כל איבר במערך את כל האיברים משמאלו ומימינו.

שנית, בעיה שלא מופיעה בדוגמה שלך אבל בכל זאת קיימת -

התוכנית לא עובדת אם יש שני מספרים שעומדים בקריטריון (אמרת שהיא אמורה להדפיס את הראשון). נסה את הרצף 1 2 4 8 16 32 וזה אמור להדפיס -1. אשאיר לך את זה כתרגיל. אם תצטרך עדיין עזרה אני כאן.

קישור לתוכן
שתף באתרים אחרים

ציטוט של af db creid

טוב.

שתי בעיות -

אחת, לא מספיק לבדוק לפי הסדר אם השני מתחלק בראשון והשלישי בשני. זה לא ימצא את כל התבניות לדוג' במקרה שלך -

15 לא מחלק את 20, אז הלולאה של divide_left מפסיקה. למרבה הצער, זה ש15 לא מחלק את 20 לא אומר שהוא לא מחלק את 30.

למרבה הצער, אין דרך קיצור - תצטרך לבדוק עבור כל איבר במערך את כל האיברים משמאלו ומימינו.

שנית, בעיה שלא מופיעה בדוגמה שלך אבל בכל זאת קיימת -

התוכנית לא עובדת אם יש שני מספרים שעומדים בקריטריון (אמרת שהיא אמורה להדפיס את הראשון). נסה את הרצף 1 2 4 8 16 32 וזה אמור להדפיס -1. אשאיר לך את זה כתרגיל. אם תצטרך עדיין עזרה אני כאן.

זה אומר לעשות לולאת פור לכל תא פשוט? או משהו אחר?

לגבי השני לא הבנתי..

 

תודה :)

קישור לתוכן
שתף באתרים אחרים

הממ,

אני רואה ששינית את הקוד מאז הפעם האחרונה שהסתכלתי.

דבר ראשון, אסור, בתכלית האיסור, לא לעשות return לפונקציה שמחזירה ערך. זה undefined behavior.

דבר שני, אין שום שימוש במשתנים divide_l וdivide_r (לא אלו של happend).

קישור לתוכן
שתף באתרים אחרים

ציטוט של af db creid

הממ,

אני רואה ששינית את הקוד מאז הפעם האחרונה שהסתכלתי.

דבר ראשון, אסור, בתכלית האיסור, לא לעשות return לפונקציה שמחזירה ערך. זה undefined behavior.

דבר שני, אין שום שימוש במשתנים divide_l וdivide_r (לא אלו של happend).

אין בהם צורך פשוט? 

קישור לתוכן
שתף באתרים אחרים

ציטוט של BAR_PC

אין בהם צורך פשוט? 

תסתכל, אתה לא משתמש בהם.

 

ציטוט של BAR_PC

כל הבדיקה של כל תא יהיה בפונקצייה אחת?

אפשר, או לחלק את זה לפונקציה נפרדת.

נערך על-ידי af db creid
קישור לתוכן
שתף באתרים אחרים

ציטוט של af db creid

תסתכל, אתה לא משתמש בהם.

 

אפשר, או לחלק את זה לפונקציה נפרדת.

סליחה שאני משגע אותך אבל זה קוד יותר טוב או לעשות כבר את מה שאמרת? בעצם עדיין זה מדפיס -1.

פה השתמשתי בהם הבנת מה עשיתי? כאילו שמרתי כל פעם על התא שיבדוק את הבאים ואם לא אז שיעבור לתא הבא זה עדיין מדפיס לי -1...

//------include section-------
#include <iostream>
#include <cstdlib>

//------std section-------
using std:: cin;
using std:: cout;
using std:: endl;

//------const section
const int N = 6; // The size you want to set

//---prtotypes section----
void read_data (int arr[]);
int divide_left(int arr[], int &cell);
int divide_right (int arr[], int &cell);
int happend(int arr[], int &cell1, int &cell2);

/////-----Main-------
int main()
{
    int arr[N];

    read_data(arr);

    int cell1,cell2;

    int found = happend(arr,cell1,cell2);

    if(found != -1)
    	cout<< cell1;
    else
    	cout << "-1";

   return EXIT_SUCCESS ;
}

void read_data(int arr[])
{
	for(int i = 0; i < N; i++)
		cin >> arr[i];
}

int divide_left(int arr[], int &cell)
{
	int divide_l = arr[N];

	int j = N -1;

	for(int i = N -1 ; i >= 0; i--)
	{
		if((arr[j] % arr[i-1]) == 0)
		{
			divide_l = i;
			cell = divide_l;
		}
		j--;
	}

	return cell;

}

int divide_right (int arr[], int &cell)
{
	int divide_r = arr[0];

	int j = 0;

	for(int i = 1; i < N ; i++)
	{
		if ((arr [i + 1] % arr [j]) == 0)
		{
			divide_r = i;
			cell =  divide_r;
		}
		j++;
	}

	return cell;

}

int happend(int arr[], int &cell1, int &cell2)
{
	int no = -1;

	int divide_l = divide_left(arr,cell1);

	int divide_r = divide_right (arr,cell2);

	if(divide_l == divide_r)
	    return divide_l;
	else
		return no;
}


 

נערך על-ידי BAR_PC
קישור לתוכן
שתף באתרים אחרים

היי חבר'ה שיגעתי אותכם ממש אבל מרגיש בודד בנושא ואין לי למי לפנות...

אם אני משנה את התנאים כאן:

if(found != -1)
    	cout<< cell1;
    else
    	cout << "-1";

לככה:

if(found != -1)
    	 cout << "-1";
    else
    	cout<< cell1;

אז בדוגמה 180 120 60 30 20 15 הפלט 3 שזה תקין אבל שאין אז הוא לא מוציא -1 מישהו בבקשה יכול להסביר לי מדוע?

 

המון תודה ושוב סליחה :)

קישור לתוכן
שתף באתרים אחרים

ציטוט של BAR_PC

סליחה שאני משגע אותך אבל זה קוד יותר טוב או לעשות כבר את מה שאמרת? בעצם עדיין זה מדפיס -1.

פה השתמשתי בהם הבנת מה עשיתי? כאילו שמרתי כל פעם על התא שיבדוק את הבאים ואם לא אז שיעבור לתא הבא זה עדיין מדפיס לי -1...


//------include section-------
#include <iostream>
#include <cstdlib>

//------std section-------
using std:: cin;
using std:: cout;
using std:: endl;

//------const section
const int N = 6; // The size you want to set

//---prtotypes section----
void read_data (int arr[]);
int divide_left(int arr[], int &cell);
int divide_right (int arr[], int &cell);
int happend(int arr[], int &cell1, int &cell2);

/////-----Main-------
int main()
{
    int arr[N];

    read_data(arr);

    int cell1,cell2;

    int found = happend(arr,cell1,cell2);

    if(found != -1)
    	cout<< cell1;
    else
    	cout << "-1";

   return EXIT_SUCCESS ;
}

void read_data(int arr[])
{
	for(int i = 0; i < N; i++)
		cin >> arr[i];
}

int divide_left(int arr[], int &cell)
{
	int divide_l = arr[N];

	int j = N -1;

	for(int i = N -1 ; i >= 0; i--)
	{
		if((arr[j] % arr[i-1]) == 0)
		{
			divide_l = i;
			cell = divide_l;
		}
		j--;
	}

	return cell;

}

int divide_right (int arr[], int &cell)
{
	int divide_r = arr[0];

	int j = 0;

	for(int i = 1; i < N ; i++)
	{
		if ((arr [i + 1] % arr [j]) == 0)
		{
			divide_r = i;
			cell =  divide_r;
		}
		j++;
	}

	return cell;

}

int happend(int arr[], int &cell1, int &cell2)
{
	int no = -1;

	int divide_l = divide_left(arr,cell1);

	int divide_r = divide_right (arr,cell2);

	if(divide_l == divide_r)
	    return divide_l;
	else
		return no;
}


 

הקוד שלך לא מדפיס לי כלום

קישור לתוכן
שתף באתרים אחרים

ציטוט של Jabberwock

הקוד שלך לא מדפיס לי כלום

איזה קטע... אז איך לי זה הדפיס אני מבולבל כבר...כי אני שיניתי את התנאי בmain להיות הפוך כלומר found לא שווה -1 אז תדפיס -1 אחרת תדפיס את cell(הודעה למעלה) ושהכנסתי את הדוגמא 180 120 60 30 20 15 זה הדפיס לי 3 אבל מנגד שהכנסתי נגיד 6 5 4 3 2 1 הפלט היה 1 ושהכנסתי 9 0 0 0 0 0 אז הפלט היה ריק

 

 

תודה :)

קישור לתוכן
שתף באתרים אחרים

הצטרפ/י לדיון

בשלב זה תוכל/י להצטרף לדיון, ולאחר מכן להצטרף לקהילה שלנו. אם כבר יש לך חשבון אצלנו, אנא התחבר/י עכשיו על מנת להגיב תחת שם המשתמש שלך.
לתשומת לבך: התגובה תופיע לגולשים לאחר אישור של צוות הנהלת הפורומים.

אורח
הוסף תגובה

×   התוכן שהודבק הוא עם עיצוב.   הסר עיצוב

  Only 75 emoji are allowed.

×   הקישור שלך הוטמע אוטומטית.   הצג כקישור רגיל

×   התוכן הקודם שלך שוחזר אוטומטית.   נקה הכל

×   You cannot paste images directly. Upload or insert images from URL.

 Share


×
  • צור חדש...