הרשם שאלות ותשובות רשימת חברים לוח שנה הודעות מהיום

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

   
|!|

השב
 
כלים לאשכול תצורת הצגה
ישן 06-11-07, 21:47   # 1
phpyo
חבר בקהילה
 
מיני פרופיל
תאריך הצטרפות: Jan 2007
הודעות: 180

phpyo לא מחובר  

שפת C - פיתרון אלטרנטיבי לבעיה?

שלום!

קיבלתי לש.ב בשפת C את השאלה הבאה:

ציטוט:
שרשרת סימטרית של '$' היא סדרה של תווים המתחילה ומסתיימת ב-'$ד ובדיוק באמצעיתה נמצא התו '$'. כתוב פונקציה המקבלת מערך תווים שאורכו max ואורך של שרשת len ומחיזרה 1 אם יש במערך שרשרת סימטרית של $, או 0 אם אין.
דוגמאות לשרשראות סימטריות

ds4$$$444

abc$xxx$yyy$zzz

אני פתרתי את זה כך:

PHP קוד:
#include <iostream.h>
#include <conio.h>
#define len 7

char str(char string[len])
{
    
int i,mik1=-1,mik2,mid;


    for(
i=0;i<len;i++)
    {
        if(
string[i] == '$')
        {
            if(
mik1 == -1)
            {
                
mik1 i;
            }
            else
                
mik2 i;
        }

        }


    
mid mik1+mik2;

    if(
mid/!= mid/2.0)
        return 
0;
    else
        if(
string[mid/2] == '$')
            return 
1;

                else
                                    return 
0;
  

}

void main()
{

    
int i;
        
char string[len];

    for(
i=0;i<len;i++)
        
string[i] = getche();

                
cout<<endl<<(int)str(string);

לשם ניסיון נתתי ל-Len אורך 7.

אשמח לדעת אם יש למישהו פיתרון טוב יותר או פשוט יותר.

תודה!
  Reply With Quote
ישן 06-11-07, 22:00   # 2
mayden
Авторитет
 
מיני פרופיל
תאריך הצטרפות: Apr 2006
הודעות: 2,556

mayden לא מחובר  

למדתם פונקציות רקורסיביות?
__________________

ציטוט:
" זוכרים בשביל ללמוד, יודעים בשביל ללמד, מבינים בשביל לתכנת.."
  Reply With Quote
ישן 06-11-07, 22:22   # 3
phpyo
חבר בקהילה
 
מיני פרופיל
תאריך הצטרפות: Jan 2007
הודעות: 180

phpyo לא מחובר  

לא למדנו.
  Reply With Quote
ישן 07-11-07, 20:29   # 4
SDF
חבר בקהילה
 
מיני פרופיל
תאריך הצטרפות: Sep 2006
מיקום: Negev
הודעות: 270

SDF לא מחובר  

תודה על האתגר לשעת ערב זו ;)

למיטב הבנתי את השאלה, אתה צריך לטפל גם במקרה כזה:
ab$abe$ab$ab$adsg

כלומר יש מחרוזת סימטרית... פשוט לא עם ה$ ה-1.
כמוכן אין סיבה ממשית לרוץ על כל המחרזות של 100 תווים (למשל) אם מצאנו
את השרשרת ב10 הראשונים...

הנה מימוש שלי:

PHP קוד:
#include <stdio.h>
#include <stdlib.h>


int sim(char **stint len) {
    
int ok 00fst 0next 0;

    while (!
ok && len) {
        
//printf("%c\n", (*st)[i]);
        
if ((*st)[i] == '$'
            if (!
fstfst i;
                else {
                    
next = (fst)+i;
                    if (
next len) {
                        if ((*
st)[next] == '$'ok 1;
                        }
                    else 
fst i;
                }
        
i++;
    }
    return 
ok;
}

int main() {
    
charst;
    
int st_size 0;
    
printf("Enter ST size: ");
    
scanf("%d", &st_size);
    
st = (char *) malloc(sizeof(char) * st_size);
    
printf("Enter ST(%d): "st_size);
    
scanf("%s"st);

    
printf("Result of SIM: %d\n"sim(&stst_size));
    return 
0;


הקוד רץ על GCC, כמובן טל"ח.

פלט:
קוד:
yury@moon ~ $ gcc sim.c -o sim
yury@moon ~ $ ./sim
Enter ST size: 20
Enter ST(20): abcd$dg$asdg$adgd$dsgsg
Result of SIM: 1
yury@moon ~ $
__________________
FreeBSD, a *nix operating system

Last edited by SDF; 07-11-07 at 20:35..
  Reply With Quote
ישן 07-11-07, 22:33   # 5
phpyo
חבר בקהילה
 
מיני פרופיל
תאריך הצטרפות: Jan 2007
הודעות: 180

phpyo לא מחובר  

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


אשמח לפיתרון שאוכל להבין

תודה!

Last edited by phpyo; 07-11-07 at 23:04..
  Reply With Quote
ישן 08-11-07, 08:33   # 6
O-B
חבר וותיק
 
מיני פרופיל
תאריך הצטרפות: Oct 2005
מיקום: בבית
גיל: 35
הודעות: 1,423
שלח הודעה באמצעות ICO אל O-B

O-B לא מחובר  

תגיד איזה נושאים למדתה עד עכשיו כי אפשר לפתור את זה בהרבה דרכים...
__________________
בברכה עובד, מפתח אתרים.
  Reply With Quote
ישן 09-11-07, 06:53   # 7
SDF
חבר בקהילה
 
מיני פרופיל
תאריך הצטרפות: Sep 2006
מיקום: Negev
הודעות: 270

SDF לא מחובר  

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


אשמח לפיתרון שאוכל להבין

תודה!
פשוט תתעלם מהמצביעים... ותסתכל על הלולואה, זה מה שחשוב כאן.

בלי מצביעים:
PHP קוד:
     while (!ok && len) {
        if ((
st)[i] == '$'
            if (!
fstfst i;
                else {
                    
next = (fst)+i;
                    if (
next len) {
                        if ((
st)[next] == '$'ok 1;
                        }
                    else 
fst i;
                }
        
i++;
    }
    return 
ok
ובמילים:
כל עוד ok הוא שקר ולא הגעת לסוף המחרזות בצע:
בדוק תו-תו:
אם התו הנוכחי הוא התו $:
אם זה התו הראשון מהסוג $ שמור את מיקומו למשתנה fst
אחרת
(כניראה זה התו השני שאנחנו מוצאים... המיקום הנוכחי הוא אמצע המחרוזת הסימטרית)
תו ה-$ הבא צריך להיות ב: מיקום נוכחי פחות המיקום של התו הראשון (ההפרש בין
הראשון לאמצע) ועוד המיקום הנוכחי.
אם המיקום הבא לא חורג מאורך המחרוזת, בדוק האם התו אכן שם.
אם כן שנה את ok ל1.
אם לא, הכנס את המיקום הנוכחי למשתנה fst. (ז"א מבחינתנו זה עכשי והתו
הראשון)
__________________
FreeBSD, a *nix operating system
  Reply With Quote
השב

חברים פעילים הצופים באשכול זה: 1 (0 חברים ו- 1 אורחים)
 


חוקי פירסום
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is מופעל
סמיילים הם מופעל
[IMG] קוד מופעל
קוד HTML מכובה

קפיצה לפורום


כל הזמנים הם GMT +2. הזמן כעת הוא 21:04.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ