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

נושא: תת מחרוזת ארוכה ביותר

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


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

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

http://www.cs.bgu.ac.il/~prog081/assignments/assignment4/ass4.doc

זאת שאלה 8, האחרונה.

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

באמת תודה מראש לכל התגובות.

שימי.


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

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

קוד:
# include <stdio.h>

# define S "abddrgty"
# define T "cdedrgrt"


unsigned long long int f (int x ,int y, int n) ;
unsigned long long int c (unsigned long long int i) ;
unsigned long long int d (unsigned long long int n ,unsigned long long int m) ;
void w (int x ,int y, unsigned long long int m) ;




int main ( )

{
    w (0, 0, c (f (0 ,0, 0))) ;
    return 1 ;
}




unsigned long long int f (int x ,int y, int n)
{
    if (T [x] == S [y])
    {
        if ((T [x + 1] == '\0') || (S [y + 1] == '\0')) return d (n + 1 ,1) ;
        return f (x + 1 ,y + 1 ,n + 1) ;
    }
    else
    {
        int t = 0 ;
        int s = 0 ;
        int v ;
        int u ;
        if (T [x + 1] != '\0') t = f (x + 1 ,y ,n) ;
        if (S [y + 1] != '\0') s = f (x ,y + 1 ,n) ;
        if ((T [x + 1] == '\0') && (S [y + 1] == '\0')) return d (n ,1) ;
        v = c (t / 2) ;
        u = c (s / 2) ;
        return d (v * !(v < u) + u * (v < u) ,2 * c (t) * !(v < u) + (2 * c (s) + 1) * (v < u)) ;
    }
}




void w (int x ,int y, unsigned long long int m)
{
    if (!m)
    {
        printf ("\n\n") ;
        return ;
    }
    if (T [x] == S [y])
    {
        printf ("%c" ,T [x]) ;
        w (x + 1, y + 1, m) ;
    }
    else
        w (x + !(m % 2) ,y + m % 2 ,m / 2) ;
    return ;
}




unsigned long long int d (unsigned long long int n ,unsigned long long int m)
{
    if (!n && !m) return 0 ;
    return (d (n / 2 ,m / 2) * 4 + n % 2 * 2 + m % 2) ;
}




unsigned long long int c (unsigned long long int i)
{
    if (!i) return 0 ;
    return (c (i / 4) * 2 + i % 2) ;
}


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


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

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

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

ניתן לפתור את זה גם על ידיי מערכים ואז אין צורך במשתנים
שהם לא int

ה unsigned long long int הוא המשתנה שיכול להחזיק את
המס' החיובי הגדול ביותר ב C (שאני יודע עליו)

במשתנה קטן יותר התוכנית תיתן תוצאות שגויות או תקרוס ב
strings ארוכים כי יהיו overflows




ועדיין היית יכול לעלות את התמונות ל hozt או משהוא ולא
להכריח אותי ללכת למחשב השני כולה כדיי לפתוח קובץ
חזרה לתחילת העמוד הצג את כרטיס החבר של 11010010110 חפש הודעות אחרות של 11010010110
 
שימי
אורח
אורח


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

מה זה hozt?

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

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

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

http://www.hozt.net

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


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

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





שוב תודה מראש.
שימי.

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


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

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


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

טוב, אז איכשהו, בניתי את הדבר הבא:

קוד:

# include <stdio.h>

void lcs(char st1[], char st2[], char temp[], int x, int y);

int main(){
    char st1[] = "bcdab", st2[] = "abcd", temp[20];
    lcs(st1, st2, temp, 0, 0);
}

void lcs(char st1[], char st2[], char temp[], int x, int y){
    static int i, y1;
    if (st1[x] == st2[y]){
        temp = st1[x];
        i++;
        y1 =y + 1;
        if ((st1[x + 1] != 0) && (st2[y + 1] != 0))
            lcs (st1, st2, temp, x + 1, y + 1);
    }
    else {
        if (st2[y + 1] != 0){
            lcs (st1, st2, temp, x, y + 1);
            return;
        }
        if (st1[x + 1] != 0){
            lcs (st1, st2, temp, x + 1, y1);
            return;
        }
    }


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

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


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

טוב, תשכחו מהקוד הקודם, הוא לא טוב.
איך זה נראה לכם (תשכחו מיעילות):

קוד:


# include <stdio.h>
# include <string.h>

#define MAX 20

void lcs(char st1[], char st2[], char temp[], char biggest[],
         int x, int y, int i, int y1, int j);
void compare(char biggest[], char temp[]);
void reset(char temp[], int i);

int main(){
    char st1[MAX] = {0}, st2[MAX] = {0}, temp[MAX] = {0},
        biggest1[MAX] = {0}, biggest2[MAX] = {0};
    printf("Enter First String:");
    gets(st1);
    printf("Enter Second String:");
    gets(st2);
    lcs(st1, st2, temp, biggest1, 0, 0, 0, 0, 1);
    lcs(st2, st1, temp, biggest2, 0, 0, 0, 0, 1);
    printf("The LCS is:");
    if ((strlen(biggest1)) > (strlen(biggest2)))
        puts(biggest1);
    else
        puts(biggest2);
}

void lcs(char st1[], char st2[], char temp[], char biggest[],
         int x, int y, int i, int y1, int j){
    if (st1[x] == st2[y]){
        temp = st1[x];
        i++;
        y1 =y + 1;
        if ((st1[x + 1] != 0) && (st2[y + 1] != 0)){
            lcs (st1, st2, temp, biggest, x + 1, y + 1, i, y1, j);
            return;
        }
    }
    else {
        if (st2[y + 1] != 0){
            lcs (st1, st2, temp, biggest, x, y + 1, i, y1, j);
            return;
        }
        if (st1[x] != 0){
            lcs (st1, st2, temp, biggest, x + 1, y1, i, y1, j);
            return;
        }
    }
    compare(biggest, temp);
    if (st1[j] != 0)
        lcs (st1, st2, temp, biggest, j, 0, 0, 0, j + 1);
       
}

void compare(char biggest[], char temp[]){
    if ((strlen(temp)) > (strlen(biggest)))
        strcpy(biggest, temp);
    reset(temp, 0);
}

void reset(char temp[], int i){
    if (i <= MAX){
        temp = 0;
        reset(temp, i + 1);
    }
}


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

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

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

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