עבור לתוכן

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

Featured Replies

פורסם
  • מחבר
ציטוט של af db creid

רק רגע -

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

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

נערך על-ידי BAR_PC

  • תגובות 42
  • צפיות 4.4k
  • נוצר
  • תגובה אחרונה
פורסם

טוב.

שתי בעיות -

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

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).

פורסם
ציטוט של BAR_PC

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

אכן.

 

ציטוט של BAR_PC

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

נסה את הרצף שאמרתי.

פורסם
  • מחבר
ציטוט של af db creid

אכן.

 

נסה את הרצף שאמרתי.

בפונקצייה אחת או לכל תא פונקצייה? בדוק אין קיצור דרך? חח :)

פורסם
ציטוט של BAR_PC

בפונקצייה אחת או לכל תא פונקצייה? בדוק אין קיצור דרך? חח :)

לא הבנתי.

פורסם
  • מחבר
ציטוט של af db creid

הממ,

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

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

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

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

פורסם
  • מחבר
ציטוט של af db creid

לא הבנתי.

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

פורסם
ציטוט של 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 אז הפלט היה ריק

 

 

תודה :)

פורסם
  • מחבר

היי עדיין אשמח לעזרה בתרגיל הזה אני לא מבין למה הוא לא מדפיס -1... תודה :)

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים