עבור לתוכן

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

Featured Replies

פורסם

תעבור שוב על האלגוריתם שכתבת מהתחלה הוא פשוט לא עונה על השאלה שנשאלה, זו לא בעיה רק עם התנאי בסוף זה הרבה יותר מזה.

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

  • תגובות 42
  • צפיות 4.4k
  • נוצר
  • תגובה אחרונה
פורסם
  • מחבר
ציטוט של etal

תעבור שוב על האלגוריתם שכתבת מהתחלה הוא פשוט לא עונה על השאלה שנשאלה, זו לא בעיה רק עם התנאי בסוף זה הרבה יותר מזה.

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

 

אתה מתכוון לקוד האחרון שכתבתי? אני אנסה את זה תודה :)

אבל למה הוא לא עונה על השאלה? עובדה שבחלק מהדוגמאות זה עובד.

פורסם

 

ציטוט

עובדה שבחלק מהדוגמאות זה עובד

זה על תקן שגם שעון מקולקל מדייק פעמיים ביום.

 

אני רואה שכבר אתמול כתבו לך בדיוק למה זה לא עובד, לא ראיתי שעשית שום דבר לתקן את העניין גם לא בקוד האחרון

ציטוט של af db creid

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

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

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

 

נערך על-ידי etal

פורסם
  • מחבר
ציטוט של etal

 

זה על תקן שגם שעון מקולקל מדייק פעמיים ביום.

 

אני רואה שכבר אתמול כתבו לך בדיוק למה זה לא עובד, לא ראיתי שעשית שום דבר לתקן את העניין גם לא בקוד האחרון

 

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

נערך על-ידי BAR_PC

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

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

הבנתי, וכמו שכתבתי זה לא עובד, וגם הסברתי למה ונתתי דוגמה.

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

הבנתי, וכמו שכתבתי זה לא עובד, וגם הסברתי למה ונתתי דוגמה.

 

זה מה שצריך לעשות?

כי גם פה ניראלי שיש בעיה...

//------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 cell);

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

    read_data(arr);

    int cell;

    int found =  happend(arr,cell);

    cout << found;

   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 findleft = 1;

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

	return findleft;

}

int divide_right (int arr[], int cell)
{
	int findright = 1;

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

	return findright;

}

int happend(int arr[], int cell)
{
	int i = divide_right (arr, cell);

	int j = divide_right (arr,cell);

	if(i == 1 && j == 1)
	{
		for(int i = 0; i < N; i++)
		{
			 divide_right (arr,cell);
             return cell;
		}
	}

	return -1;

}

 

תודה :)

נערך על-ידי BAR_PC

פורסם

עכשיו הקוד שלך לא קורא ל-divide_left בכלל

 

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

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

 

פורסם
  • מחבר
ציטוט של etal

עכשיו הקוד שלך לא קורא ל-divide_left בכלל

 

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

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

 

טעות של העתקה חח תיקנתי את int i ל divide_left.

איפה היית ממקם את הלולאות? ככה זה עובר על כל התאים,לא?

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

 

תודה :)

פורסם

האם בהוראות הגדירו לך בדיוק את הקלט והפלט של כל הפונקציות?

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

נערך על-ידי etal

פורסם
  • מחבר
ציטוט של etal

האם בהוראות הגדירו לך בדיוק את הקלט והפלט של כל הפונקציות?

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

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

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

אני רוצה לשמור את הcell בשביל לבדוק בפונקציה ולהחזיר את מספר התא אם צריך

כמו שכבר אמרתי הקוד שלך כרגע לא משתמש ב-cell לשום דבר ואי אפשר להחזיר ערך דרך הקלט של הפונקציה (אלא אם משתמשים בפויינטרים וזה ממש לא דרוש פה).

 

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

פורסם

תיקנתי את הקוד. זה בסדר?

//------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[]);
bool divide_left(int arr[], int cell);
bool divide_right (int arr[], int cell);
int search_for_the_magic_cell(int arr[]);

/////-----Main-------
int main()
{
    int arr[N];// = { 180, 120, 60, 30, 20, 15 };

    read_data(arr);

    int result = search_for_the_magic_cell(arr);
    
    if (result != -1) cout << "we got a match !! cell number is " << result << " and its value is " << arr[result];
    else cout <<  "no I didn't find anything";

   return EXIT_SUCCESS ;
}

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

bool divide_left(int arr[], int cell)
{
	 for (int i = cell - 1; i >= 0; i--) if (arr[i] % arr[cell] != 0) return false;
	 return true;
}

bool divide_right(int arr[], int cell)
{
	 for (int i = cell + 1; i < N; i++) if (arr[cell] % arr[i] != 0) return false;
	 return true;
}

int search_for_the_magic_cell(int arr[]) {
    // so I we a loop to check if each element in the array is the magic cell
    
    for (int i = 0; i < N; i++) {
        bool l = divide_left(arr, i);
        bool r = divide_right(arr, i);
        
        if (l && r) return i;
    }

	return -1;
}
180
120
60
30
20
15
we got a match !! cell number is 2 and its value is 60 

 

פורסם
  • מחבר
ציטוט של Jabberwock

תיקנתי את הקוד. זה בסדר?


//------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[]);
bool divide_left(int arr[], int cell);
bool divide_right (int arr[], int cell);
int search_for_the_magic_cell(int arr[]);

/////-----Main-------
int main()
{
    int arr[N];// = { 180, 120, 60, 30, 20, 15 };

    read_data(arr);

    int result = search_for_the_magic_cell(arr);
    
    if (result != -1) cout << "we got a match !! cell number is " << result << " and its value is " << arr[result];
    else cout <<  "no I didn't find anything";

   return EXIT_SUCCESS ;
}

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

bool divide_left(int arr[], int cell)
{
	 for (int i = cell - 1; i >= 0; i--) if (arr[i] % arr[cell] != 0) return false;
	 return true;
}

bool divide_right(int arr[], int cell)
{
	 for (int i = cell + 1; i < N; i++) if (arr[cell] % arr[i] != 0) return false;
	 return true;
}

int search_for_the_magic_cell(int arr[]) {
    // so I we a loop to check if each element in the array is the magic cell
    
    for (int i = 0; i < N; i++) {
        bool l = divide_left(arr, i);
        bool r = divide_right(arr, i);
        
        if (l && r) return i;
    }

	return -1;
}

180
120
60
30
20
15
we got a match !! cell number is 2 and its value is 60 

 

כן תודה רבה ממש! מעריך :)

ארכיון

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

דיונים חדשים