OOD

yair24

Member
OOD

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

The_Mighty_Perr

New member
אל תפדח את עצמך!

בס"ד ידוע לכולם (מסתבר שלא לכולם) ש-Bjsarne Stourstrup המציא את CPP ב-1980 על בסיס C ב-Bell Labaratories. וקצת היסטוריה: ב-1967 מרטין ריצ´רדס פיתח שפה שנקראה BCPL. ב-1970 קן תומפסון פיתח את UNIX ע"י שימוש ב-BCPL ו-B(שאותה הוא פיתח) ב-1972 דניס ריצ´י פיתח את C, ב-1982 הוגדרו סטנדרטים ע"י ANSI. ב-1980 פיתח Bjarne Stroustrup את CPP על בסיס C... בברכה...
 

yair24

Member
אוקיי אני שמח שזה ידוע לכולם...

(לי זה לא היה ידוע...) אבל לא ענית לי על השאלה. אז אם יש לך רעיון אני אשמח לשמוע עליו... יאיר
 

The_Mighty_Perr

New member
רעיון

בס"ד אולי תעשה משהוא בסגנון ה-STREAMים שיש ב-CPP לכתיבת לקובץ, רק שהמחלקות שלך יכווצו יכתבו לדיסק! תשתמש בהעמסת אופרטורים, ותיצור את אותו ממשק של ה-STREAMים של CPP, כך שאפשר יהי להשתמש במחקלות שלך, או של CPP באותה צורה! בברכה...
 

yair24

Member
תוגה על הרעיון אבל...

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

The_Mighty_Perr

New member
אוקיי

בס"ד אתה יודע איך עובדים עם קבצים ב-CPP?
#include <fstream> ofstream outputfile("filename") ifstream inutfile("Filename")​
אתה רוצה לכווץ מידע, נכון? סביר להניח שאת המידע המכווץ יהי צורך לשמור על הדיסק... הצעתי שתכתוב מחלקות HoffmanIStream ו-HoffmanOStream, המספקות את אותו ממשק כמו המחלקות IFStream ו-OFStream, כך שיהי אפשרי לכתוב פונקציה:
void f(char[] filename, char[] data, BOOL compress) { I_OStream stream; if compress stream = new HoffmanOStream; else stream = new ofstream; stream << data; )​
בדוגמא השתמשתי גם בממשק(ב-CPP זו תיה מחלקה ווירטואלית "לגמרי"). אם אתה לא מבין את הדוגמא השאר תגובה! בברכה...
 

yair24

Member
אני אסתכל בMSDN על המחקלה

OFSTREAM ו- IFSTREAM. רק אם אתה יכול להסביר לי למה קראת לפונקיה F? ומה קורה שם בדיוק? מה זה הCASTING הזה ששמת שם? יאיר
 

yair24

Member
חוץ מזה...

אני בטח אצטרך שלמחלקה של HOFFMAN יהיה מצביע לעץ בינארי לא? ופונקציות שיודעות לבנות את העץ ולקרוא ממנו... אני לא כל כך מצליח להבין את התשובה שלך היא כללית מדי... אני התכוונתי לרעיון איך תראה המחלקה מה יהיה בתוכה וכולי. (יכול להיות שזה מה שענית לי אבל בגלל שאני לא מכיר כל כך את FSTREAM אז אני לא רואה את זה...) יאיר
 

The_Mighty_Perr

New member
הכל ביחד

בס"ד 1. אני לא מבין ב-HOFFMAN, חשבתי שרצית לדעת איך כדאי השהמחלקות יראו בגדול. 2. הפונקציה הייתה לדוגמא, סתם, אז קראתי לה F כקיצור ל-FUNCTION. אם הייתי נותן סתפ מחלקה לדוגמא הייתי קורא לה C, C2, C3 וכו´ 3. ה-NEW... אני מניח שיש מחלקת ווירטואלית טהורה I_OStream, שכעקרון מעמיסה אופרטורים ומאפשרת קריא הלפונקציות, וכו´ שיאפשר כתיבת לקובץ. יש בה את כל(בערך) מה שיש ב-OFStream של CPP. בקוד יש טעות הריני מתקן:
void f(char[] filename, char[] data, BOOL compress) { I_OStream * stream; if compress stream = new HoffmanOStream(); else stream = new ofstream(); *stream << data; }​
הסבר הפונקציה: הפונקציה מקבל 3 פרמטרים: *שם הקבוץ שלתוכו יש לכתבו מידע. *המידע שיש לכתוב. *האם לכווץ או לא? הפונקציה מתחילה בהכרזה של מצביע לאובייקט מסוג I_OStream. אח"כ היא בודקת האם יש להשתמש בכיווץ, או לא: *אם כן אז היא ניוצרת אובייקט HoffmanOStream חדש, ומשאירה את הצביע לאובייקט ב-stream. *אם אין צורך בכיוות - הםונקציה יוצרת אובייקט חדש מסוג OFStream, ומשאירה מצביע ב-stream. כעת הפונקציה כותבת את המידע לקובץ תוך שימוש באובייקט! המחלקות שעליך לכתוב הן: *מחלקה ווירטואלית טהורה I_OStream *מחלקה ווירטואלית טהורה I_IStream *מחלקה ממשית HoffmanOStream היורשת מ-I_OStream *מחלקה ממשית HoffmanIStream היורשת מ-I_IStream הממשק שהמחלקות יספקו יהי זהה לממשק שמספקות המחלקות OFStream ו-IFStream של CPP. כן. זו דוגמא שך רב-צורתיות. כן. "זה כל הקסם".
בברכה...
 

yair24

Member
לא הבנתי משהו...

בסוף אתה כותה לי איזה מחלקות אני צריך לכתוב ובין המחלקות האלה אתה מציין את IOSTREAM ו-IISTREAM המחלקות האלה לא קיימות כבר? יאיר
 

The_Mighty_Perr

New member
תגובה

בס"ד לא הן לא קיימות. אם אתה יודע JAVA, יהי לך יותר קל להבין על מה אני מדבר, אלב גם ב-CPP ישנה רב-צורתיות... קיימות המחלקות OFStream ו-IFStream אמרתי שצריך לכתוב את I_OStream ו -I_IStream I כמציין שזהו ממשק(interface). כעקרון אמורת להיות 6 מחלקות: 2 מחלקות אב/ממשקים שאותן אתה תכתוב 2 מחלקות כתיבת/קריאה מ/לקובץ של CPP 2 מחלקות קריאה/כתיבת מ/לקובץ בתוספת כיווץ שאותן את תכתוב 4 מחלקות הקריאה/כתיבה יממשו את הממשק(או יירשו את המחלקה) של 2 המחלקות הווירטואליות הטהורות. בברכה...
 
למעלה