נושאים פעיליםנושאים פעילים  הצגת רשימה של חברי הפורוםרשימת משתמשים  חיפוש בפורוםחיפוש  עזרהעזרה
  הרשמההרשמה  התחברותהתחברות RSS עדכונים
תיכנות
RSS UnderWarrior Forums : RSS תיכנות
נושא

נושא: שאלה בC

שליחת תגובהשליחת נושא חדש
כותב
הודעה << נושא קודם | נושא הבא >>
אסף
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 14 December 2007 בשעה 22:19 | IP רשוּם
ציטוט אסף

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

שאלה 5

 

רוצים להושיב k סטודנטים הנבחנים בבחינה בשורה אחת המכילה n כסאות. ידוע ש  1-n    2k. 
על מנת למנוע העתקות בבחינה הוחלט שבין כל שני נבחנים יהיה לפחות כסא ריק אחד. את סדר הישיבה יתאר מערך,
students, באורך n שאבריו הם 0 ו-1.

נסמן ב Students[i]=0 אם הכסא ה- i י ריק, ו- Students [i]=1 אם קיים נבחן היושב בכסא ה--i-י. (הכיסאות ממוספרים מ 0 עד n-1).

כתבו פונקציה המקבלת את המערך  students  ואת הפרמטריםn  ו- k ומדפיסה את כל האפשרויות למקם את הנבחנים.

לדוגמא, עבור n=5, k=2 על הפונקציה להדפיס את כל הישיבות האפשריות של הסטודנטים.

00101

01001

01010

10001

10010

10100

 

הפונקציה יכולה לקבל פרמטרים נוספים אם יש צורך.

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

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

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

הצטרף / הצטרפה: 16 July 2005
מדינה: Israel
משתמש: מנותק/ת
הודעות: 4637
נשלח בתאריך: 15 December 2007 בשעה 09:46 | IP רשוּם
ציטוט shoshan

כתבתי ב-CPP, נקווה שאתה יודע איך להמיר...
 
קוד:
void PrintPossibilitiesInner(bool* arr, int n, int k, int i)
{
     if(k == 0)
     {
          for (int i = 0 ; i < n ; ++i)
               cout << arr[i] << ' '; // replace with printf
          cout << endl; // replace with printf
          return;
     }
     if ((n+1-i)/2 < k) // this also includes i >= n
          return;
     PrintPossibilitiesInner(arr, n, k, i+1);
     arr[i] = true;
     PrintPossibilitiesInner(arr, n, k-1, i+2);
     arr[i] = false;
}


הקריאה הראשונה לפונקציה היא בערך כזאת:

קוד:
void PrintPossibilities(int n,int k)
{
     bool* arr = new bool[n];
     for (int i = 0 ; i < n ; ++i)
          arr[i] = false;
     PrintPossibilitiesInner(arr, n, k, 0);
}
חזרה לתחילת העמוד הצג את כרטיס החבר של shoshan חפש הודעות אחרות של shoshan בקר בדף הבית של shoshan
 
אסף
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 15 December 2007 בשעה 09:51 | IP רשוּם
ציטוט אסף

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

הצטרף / הצטרפה: 16 July 2005
מדינה: Israel
משתמש: מנותק/ת
הודעות: 4637
נשלח בתאריך: 15 December 2007 בשעה 13:30 | IP רשוּם
ציטוט shoshan

הלולאות פה זה רק בשביל ההדפסה והאתחול של המערך.

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

את האתחול אתה מוזמן לעשות ע"י ההקצאה של C שמאתחלת גם את הערכים בזכרון
שהוקצה (calloc).
חזרה לתחילת העמוד הצג את כרטיס החבר של shoshan חפש הודעות אחרות של shoshan בקר בדף הבית של shoshan
 
אסף
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 15 December 2007 בשעה 19:03 | IP רשוּם
ציטוט אסף

טוב, אז אחרי שהימרתי את זה לC והוספתי פונקציה שמדפיסה בצורה רקורסיבית, הגעתי לדבר הזה
קוד:

#include<stdio.h>

void PrintArray(int students[], int n);
void CheckSeats(int students[], int n, int k, int i);

#define MAX 100

void main(){
    int students[MAX] = {0}, k, n;
    printf("Please enter number of students: ");
    scanf("%d", &k);
    printf("Please enter number of seats: ");
    scanf("%d", &n);
    CheckSeats(students, n - 1, k, 0);
}

void CheckSeats(int students[], int n, int k, int i)
{
     if(k == 0)
     {
          PrintArray(students, n);
          printf("\n");
          return;
     }
     if ((n+1-i)/2 < k)
          return;
     CheckSeats(students, n, k, i+1);
     students = 1;
     CheckSeats(students, n, k-1, i+2);
     students = 0;
}


void PrintArray(int students[], int n){
    if (n > 0)
        PrintArray(students, n - 1);
    printf("%d", students[n]);
}


אולם זה עדיין לא עובד לי לגמרי, רק כמעט, למשל עבור קלט של 2 סטודנטים ו5 כיסאות, במקום
00101

01001

01010

10001

10010

10100

זה מדפיס לי רק את האפשרויות הבאות

01010

10010

10100

יש לך אולי מושג למה זה קורה?

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

הצטרף / הצטרפה: 16 July 2005
מדינה: Israel
משתמש: מנותק/ת
הודעות: 4637
נשלח בתאריך: 15 December 2007 בשעה 20:02 | IP רשוּם
ציטוט shoshan

כי לא היית צריך להעביר N-1 אלא פשוט N

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


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 15 December 2007 בשעה 20:41 | IP רשוּם
ציטוט זה עובד!!!

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

הצטרף / הצטרפה: 23 April 2006
משתמש: מנותק/ת
הודעות: 2621
נשלח בתאריך: 16 December 2007 בשעה 00:37 | IP רשוּם
ציטוט 11010010110

קוד:
# include <stdio.h>

# define N 11
# define K 5

int x (int ,int ,int) ;
void w (int) ;

int main ( )
{
    if (!x (4 ,N ,K)) printf ("no possible combinations") ;
    return 1 ;
}

int x (i ,n ,k)
{
    if (k > (n + ! (i % 2)) / 2) return 0 ;
    if (n < 1) { w (i) ; return 1 ; }
    return (x (2 * i ,n - 1 ,k) + (k && !(i % 2) && x (2 * i + 1 ,n - 1 ,k - 1))) ;
}

void w (i)
{
    if (i == 4) { printf ("\n\n") ; } else { w (i / 2) ; printf ("%d" ,i % 2) ; }
    return ;
}

חזרה לתחילת העמוד הצג את כרטיס החבר של 11010010110 חפש הודעות אחרות של 11010010110
 
אסף
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 16 December 2007 בשעה 09:31 | IP רשוּם
ציטוט אסף

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


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 20 December 2007 בשעה 12:19 | IP רשוּם
ציטוט אסף

shoshan, שמתי לב שבתוכנית שרשמת פה, זה מדפיס אפס אחד מיותר, כאילו במקום להדפיס למשל 00101, זה מדפיס 001010, האפס הימני מיותר, יש לך מושג למה זה עושה את זה ואיך אפשר להיפתר מזה?

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


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 20 December 2007 בשעה 12:23 | IP רשוּם
ציטוט אסף

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

אם ברצונך להגיב לנושא זה עליך קודם להתחבר
אם אינך רשום/ה כבר עליך להרשם

  שליחת תגובהשליחת נושא חדש
גרסת הדפסה גרסת הדפסה

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