| 
    
     | 
       
        | כותב |  |  
        | שימי אורח
 
  
 
 הצטרף / הצטרפה: 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 רשוּם | 
 |   |  
           | 
 |  
| קוד: 
 
    
    | 
      
       | # 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) ;
 }
 |  |  |  
 אל תשלח אותי בפעם הבאה לקובץ שלא בהכרח יש לי אם מה לפתוח אותו. אפשר להעתיק את השאלה לפורום
 
 |  
        | חזרה לתחילת העמוד |     |  
        |  |  
        | באמת תודה אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          בקשר לקובץ, ניסיתי להעתיק את השאלה אבל היא באה עם תמונות שרלוונטיות לשאלה כמו שאתה יכול לראות בקובץ DOC.
           | | נשלח בתאריך: 17 December 2007 בשעה 20:47 | | IP רשוּם | 
 |   |  
           | 
 |  עוד משהו, מה זה הunsigned long הזה, יש מצב להחליף אותו במשתנה מסוג אחר, כי עוד לא למדנו מה זה unsigned ואני לא בטוח אם יאשרו את זה.
 באמת באמת באמת תודה.
 זה ללא ספק הפורם השולט באינטרנט לתכנות.
 
 |  
        | חזרה לתחילת העמוד |       |  
        |  |  
        | 11010010110 פורומיסט על
 
  
  
 הצטרף / הצטרפה: 23 April 2006
 משתמש: מנותק/ת
 הודעות: 2621
 | 
          ניתן לפתור את זה גם על ידיי מערכים ואז אין צורך במשתנים
           | | נשלח בתאריך: 17 December 2007 בשעה 21:15 | | IP רשוּם | 
 |   |  
           | 
 |  שהם לא int
 
 ה unsigned long long int הוא המשתנה שיכול להחזיק את
 המס' החיובי הגדול ביותר ב C (שאני יודע עליו)
 
 במשתנה קטן יותר התוכנית תיתן תוצאות שגויות או תקרוס ב
 strings ארוכים כי יהיו overflows
 
 
 
 
 ועדיין היית יכול לעלות את התמונות ל hozt או משהוא ולא
 להכריח אותי ללכת למחשב השני כולה כדיי לפתוח קובץ
 
 |  
        | חזרה לתחילת העמוד |     |  
        |  |  
        | שימי אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          מה זה hozt?
           | | נשלח בתאריך: 17 December 2007 בשעה 22:01 | | IP רשוּם | 
 |   |  
           | 
 |  
 שימוש במערכים די מסבך את זה, לא?
 מה הפונקציות אמורות להחזיר?
 מצביעים?
 
 שוב תודה.
 
 |  
        | חזרה לתחילת העמוד |       |  
        |  |  
        | 11010010110 פורומיסט על
 
  
  
 הצטרף / הצטרפה: 23 April 2006
 משתמש: מנותק/ת
 הודעות: 2621
 | 
          http://www.hozt.net
           | | נשלח בתאריך: 17 December 2007 בשעה 22:11 | | IP רשוּם | 
 |   |  
           | 
 |  
 תסתכל ותנסה להבין איך התוכנית ללא מערכים עובדת ותחשוב
 איך מממשים את זה אם מערכים
 |  
        | חזרה לתחילת העמוד |     |  
        |  |  
        | שימי אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          יאלה הרקורסיה הזאת!!
           | | נשלח בתאריך: 18 December 2007 בשעה 14:43 | | IP רשוּם | 
 |   |  
           | 
 |   ישבתי איזה שעה על התוכנית הזאת ועדיין זה לא ברור לי, יש דרך לעקוב אחרי מה שהולך פה ואחרי רקורסיה בכללי?
 זה ממש מסובך לי ואני באמת לא מבין איך אני יכול לשלב פה עוד מערכים...?
 אפשר עוד קצת עזרה בבקשה?
 כמו כן, העלתי את השאלה לhozt ככה שכולם יוכלו לראות.
 
 
  
  
 
 שוב תודה מראש.
 שימי.
 
 
 |  
        | חזרה לתחילת העמוד |       |  
        |  |  
        | שימי אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          11010010110, אתה יכול לעזור לי בבקשה?
           | | נשלח בתאריך: 19 December 2007 בשעה 07:41 | | IP רשוּם | 
 |   |  
           | 
 |  |  
        | חזרה לתחילת העמוד |       |  
        |  |  
        | שימי אורח
 
  
 
 הצטרף / הצטרפה: 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);
 }
 }
 
 
 |  |  |  
 |  
        | חזרה לתחילת העמוד |       |  
        |  |  |  |