תיכנות פונקציונאלי - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

תיכנות פונקציונאלי


satlan1

Recommended Posts

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

בהגרלה מוחזרים לי לפעמים אותם מספרים. יעני אני צריך לעשות אחרי כל מספר שזה מגריל שיוציא אותו מהרשימה ולא מצליח:\

עשיתי את כל הפונקציות שמערבבות, ושבונה רשימה של מספרים וכל השאר

זה הראשית:

(define (main n )

(cond

[(= n 0) '()]

[else(cons(random1(mix(numbers1)))(main (sub1 n)))]))

הפרמטר N זה בעצם כמה מספרים היא צריכה להגריל. נמברס1 יוצרת רשימה של 45 מספרים והמיקס מערבבת אותה ורנדום1 מוציאה מספר רנדמולי.

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

בבקשה מישהו יכול לעזור לי?

קישור לתוכן
שתף באתרים אחרים

אני לא מבין בC (או שכל שפה אחרת שהיא לא VB), אבל בVB הייתי פותר את זה ע"י הכנסת כל המס' שקיבלת למערך (אולי קוראים לזה Type או Class בC), והרצת לולאה על כל המס' אשר במערך, ובדיקה האם זה תואם למס' שיצא.

אם לא, תפדאל, אם כן, מגרילים מחדש.

קישור לתוכן
שתף באתרים אחרים

זה לא C.

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

בימינו, במהירות שהמחשב פעולות, פחות משניה הוא יכול להגריל כמה מליוני מס' ככה.

לא נראה לי שתשים לב אם התוכנה תעצור לכמה זמן (כמה מליוניות השניה).

קישור לתוכן
שתף באתרים אחרים

זה לא C.

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

== will run forever

קישור לתוכן
שתף באתרים אחרים

לא אמור לרוץ לנצח, זה כמובן תלוי מימוש הרנדום, ונכנסים פה לאלגוריתם הסתברותי (לפחות בנוגע לכריעות שלו) אבל בהנחה והרנדום עובד (אתה משתמש ברנדום של scheme אני מקווה, כי לכתוב פונקציה שמייצרת מספר "דמוי" רנדומי, זה לא עסק פשוט) :

אם ה-mix מערבב את הנתונים, למה שלא תוציא את השישה הראשונים וזהו ?

אם לא, אז דחוף הכל לרשימה/טבלה וכו... (זו הבעיה ?, לא הבנתי איפה נתקעת...)

חוץ מזה, באיזה גירסה של scheme אתה כותב, כי הסינטקס נראה לי ממש מוזר (שונה מאד מה"סוגריים בלבד !") שאני מכיר.

מטי.

קישור לתוכן
שתף באתרים אחרים

אני משתמש בגירסא 2(נראה לי..:))

וכן ברנדום של סקים(הוא לא פועל על רשימות אז אני עושה רנדום על הlength ועל זה אני עושה ליסט-רפ).

ואני לא יכול להוציא 6 מספרים ראשונים כי זה אמור להיות ממש כמו בהגרלה :screwy:

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

ומזתומרת דחוף הכל לרשימה?

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

(2 2 8 15 35 9)

וזה לא אמור לקרות...

קישור לתוכן
שתף באתרים אחרים

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

(ע"י !set) אם לא אז אתה יכול לעשות לולאה שתגריל מספר רדומי כל עוד אינו שונה מכל הקודמים לו ורק לאחר שהוגרל מספר כזה (שונה מקודמיו) אז אותו תוסיף לרשימה.

מטי.

קישור לתוכן
שתף באתרים אחרים

מה הבעיה?

אמרת שיש לך רשימה של המספרים ופונ' שמערבבת את הרשימה לא?

אז תגריל מספר נוסף בין 0 לאורך הרשימה פחות 1 (להריץ ראדום על אורך פחות 1) ותן אותו לפונ' אחרת שתחזיר את המספר מהרשימת מספרים במיקום שהוגרל ואת הרשימת מספרים בלי המספר באותו מיקום. כלומר הפונ' תפעיל את List-ref כדי להוציא את המספר שדרוש ותפעיל פונ' נוספת (שאותה אתה צריך לכתוב) שתקרא Remove למשל ותקבל את רשימת המספרים ואותו מיקום שהוגרל (אתה תעביר אותו כפרמטר) ותוציא מהרשימה את האיבר במיקום הזה.

למקרה שאתה מתקשה לכתוב Remove, הנה כתבתי לך אותה:

(Define (Remove Item List)

(Cond [(Empty? List) '()]

[(Equal? (First List) Item) (Remove Item (Rest List))]

[Else (Cons (First List) (Remove Item (Rest List)))]))

קישור לתוכן
שתף באתרים אחרים

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

.1אתה יוצר מערך בעל N איברים ושכל איבר מכיל את מקומו במערך.

2.1עכשיו אתה מגריל מספר עד N-1 מוציא אותו מהמערך ועכשיו אתה מאתחל את האיבר שהוצאת ממנו את המספר באיבר N-1 (האחרון)

2.2ברגע זה אתה מחסיר את N ב1 ומעכשיו חוזר ל2.1

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...