לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

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



  #1  
ישן 13-04-2005, 12:10
צלמית המשתמש של fat fish
  fat fish fat fish אינו מחובר  
 
חבר מתאריך: 20.06.03
הודעות: 5,616
מימוש מחלקה "מחרוזת" ב ++C

אני מעלה קוד של מחלקה שכתבתי בזמן שלמדתי ++C, המחלקה נועדה לטפל במחרוזות (sstring), לאור הדיון שהיה על נושא מחרוזות ב ++C.
אני אישית מוצא שעל מנת לעבוד עם מחרוזות ב +CC עדיף לעבוד עם מחלקה שנועדה לזה ולא עם מערך של char.

פונקציות של המחלקה (ציבוריות):
Length - מחזירה אורך מחרוזת
NumOfWords - מחזירה מספר מילים (מופרדות ברווח) במחרוזת
Word - מחזיר מילה מהמיקום ה-n שלה במחרוזת

אופרטורים:
= אופרטור הצבה
=+ אופרטור שירשור
+ אופרטור שירשור
==,>,<,=!,=<,=> אופרטורי השוואה
>>,<< אופרטורי זרימה
[] אופרטור אינדקס

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

להלן קובץ ה-header:





SString.hpp


קוד PHP:
 #ifndef _SSTRING_H_
#define _SSTRING_H_
#include <cstring>
#include <iostream>
using namespace std;
class 
SString
{
protected:
     
char *buf;
     
int Assignchar *);
     
char *GetBuffervoid ){ return buf; } // obsolete function
     
char GetChar( int );     // obsolete function
     
void Writevoid ){ cout<<buf; }    // obsolete function
     
void WriteLnvoid ){ Write(); cout<<endl; } // obsolete function
     
int Copychar *){ delete[] buf ; return Assign(p); }
     
int Copy( const SString ){ return Copy(s.buf); }
     
int Concatchar* );
     
int Concat( const SString ){ return Concat(s.buf); }
public:
     
SStringvoid ){ Assign(NULL);}
     
SStringchar *p){ Assign(p);}
     
SString( const SString ){ Assign(s.buf);}
     
int Lengthvoid ) const { return strlen(buf); }
     
int NumOfWordsvoid );
     
SString Word( int );
     ~
SStringvoid ){ delete[] buf ; }
// assignment operators
SString operator=( const SString &)
this->Copy); return *this; }
SString operator=( char *)
this->Copy); return *this; }
 
// concatenation operators ( += version )
SString operator+=( const SString &)
this->Concat); return *this; }
SString operator+=( char *)
this->Concat); return *this; }
// concatenation operators ( + version )
SString operator+( const SString ) const
{
    
SString res( *this );
    
res += s;
    return 
res;
}
SString operator+( char *) const
{
    
SString res( *this );
    
res += p;
    return 
res;
}
// compare operators
bool operator==( const SString &) const
{ return 
strcmpthis->bufs.buf ) == 0; }
bool operator==( char *) const
{ return 
strcmpthis->buf) == 0; }
friend bool operator==( char *p, const SString &)
{ return 
strcmpps.buf ) == 0; }
bool operator!=( const SString &) const
{ return 
strcmpthis->bufs.buf ) != 0; }
bool operator!=( char *) const
{ return 
strcmpthis->buf) != 0; }
friend bool operator!=( char *p, const SString &)
{ return 
strcmpps.buf ) != 0; }
bool operator>( const SString &) const
{ return 
strcmpthis->bufs.buf ) > 0; }
bool operator>( const char *) const
{ return 
strcmpthis->buf) > 0; }
friend bool operator>( const char *p, const SString &)
{ return 
strcmpps.buf ) > 0; }
bool operator<( const SString &) const
{ return 
strcmpthis->bufs.buf ) < 0; }
bool operator<( const char *) const
{ return 
strcmpthis->buf) < 0; }
friend bool operator<( const char *p, const SString &)
{ return 
strcmpps.buf ) < 0; }
bool operator>=( const SString &) const
{ return 
strcmpthis->bufs.buf ) >= 0; }
bool operator>=( const char *) const
{ return 
strcmpthis->buf) >= 0; }
friend bool operator>=( const char *p, const SString &)
{ return 
strcmpps.buf ) >= 0; }
bool operator<=( const SString &) const
{ return 
strcmpthis->bufs.buf ) <= 0; }
bool operator<=( const char *) const
{ return 
strcmpthis->buf) <= 0; }
friend bool operator<=( const char *p, const SString &)
{ return 
strcmpps.buf ) <= 0; }
// input/output operator
friend ostreamoperator<<( ostream &o, const SString &)
<< s.buf; return o; }
friend istreamoperator>>( istream &iSString &)

    
char b4096 ];
    
i.getlineb4095'\n' );
    
bi.gcount() ] = '\0';
    
s.Copy);
    return 
i;
}
// operator[]
char operator[] ( unsigned int i )
{
    return ( 
Length() ? buf] : bufLength() ] );
}
};
// global (char*)+(SString) operator. Implementation is in sstring.cpp
SString operator+( char *, const SString & );
#endif 




וקובץ המימוש:


SString.cpp

קוד PHP:
 #include "sstring.hpp"
int SString::Assignchar *)
{
if( 
)
{
     
buf = new char strlen) + ];
     
strcpybuf);
}
else
{
     
buf = new char];
     
buf[0] = '\0' ;
}
return 
strlenbuf );
}
 
int SString::Concatchar )
{
if( 
)
{
    
char *temp;
    
temp = new char strlenbuf ) + strlen) + ];
    
strcpytempbuf );
    
strcattemp);
    
delete[] buf;
    
buf temp;
}
return 
strlenbuf );
}
char SString::GetCharint i )
{
char res ='\0';
if( 
>= && < (int) strlenbuf ) )
    
res buf];
return 
res;
}
#define SEP " ,;."
int SString::NumOfWordsvoid )
{
int result 0;
charpword;
SString tmp( *this );
pword strtok tmp.bufSEP );
while ( 
pword 
{
++
result;
pword strtokNULLSEP );
}
return 
result;
}
SString SString::Wordint i )
{
charpword;
int j 0;
SString temp( *this ), result;
pword strtok temp.bufSEP );
while ( 
pword && 
{
pword strtok NULLSEP );
++
j;
    }
if( 
pword && == )
result.Copypword ); 
return 
result
}
SString operator+( char *p, const SString &)
{
SString res);
res += s;
return 
res;


_____________________________________
[ זיו ]
[ fat fish ]

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #4  
ישן 15-04-2005, 17:20
  cyberia_2ooo cyberia_2ooo אינו מחובר  
 
חבר מתאריך: 17.12.01
הודעות: 1,604
לא בהכרח מומלץ
בתגובה להודעה מספר 1 שנכתבה על ידי fat fish שמתחילה ב "מימוש מחלקה "מחרוזת" ב ++C"

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

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

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

להמליץ לכל מתכנת מתחיל ישר לרוץ לעבוד עם STL בלי שהוא מכיר את העבודה עצמה, היא לא נכונה.
כי מתכנת מתחיל, מגיע (או לפחות צריך להגיע) בגישה של ללמוד, ולא בגישה של לעשות כמה שפחות בשביל לראות תוצרים מהר.

ספריות למיניהן באות להקטין זמן פיתוח ע"י כך שהם מספקים קוד מוכן, ובדוק כך שאתה יכול (בתאוריה) לסמוך עליו, וע"י זה להקטין את זמן הפיתוח וזמן הבדיקות.
לא בשביל להקטין את זמן הלמידה, אם כבר להפך....
אחרי שבנאדם פתח את התחת וקרע עבודה עם זכרון דינמי וסטטי ומחרוזות בכל כיוון, אז שיתחיל להשתמש במחלקה שעושה לו את העבודה, ולא ההפך
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #7  
ישן 16-04-2005, 00:13
צלמית המשתמש של fat fish
  fat fish fat fish אינו מחובר  
 
חבר מתאריך: 20.06.03
הודעות: 5,616
....
בתגובה להודעה מספר 6 שנכתבה על ידי cyberia_2ooo שמתחילה ב "זה העניין"

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

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

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

לפי דעתי (ככה אני למדתי ומצאתי את השיטה טובה), למידת תמ"ע מתחיל מפיתוח מחלקות סטנדרטיות (שיש בכל שפה ולכל סביבת עבודה, אבל חשוב לתרגל בנייה שלהן, כמו מחלקה לתאריך, למחרוזת וכו).
ברור שב-MFC יכולתי לחסוך את העבודה ולהשתמש ב-CString, אך הפיתוח העצמאי של מחלקה, מדגים לך הרבה מן השימושים שלהן.
כשאני מדבר על תמ"ע אני מתכוון גם לשפות שלא מכילות "לכלוך" כמו ++C ואין בהן מצביעים (java, #C וכו)
_____________________________________
[ זיו ]
[ fat fish ]

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #8  
ישן 16-04-2005, 01:01
  cyberia_2ooo cyberia_2ooo אינו מחובר  
 
חבר מתאריך: 17.12.01
הודעות: 1,604
כאן אני מסכים (פחות או יותר)
בתגובה להודעה מספר 7 שנכתבה על ידי fat fish שמתחילה ב "...."

העניין הוא שאנשים רבים מתחילים ישר ללמוד ++C
שהויכוח האם זה נכון להתחיל משפה זו או לא הוא לא לכאן.

מה שכן הוא, שלמרות שזו שפה שהיא OO עדיין צריך להתעסק עם יכולות של השפה
ולהתלכלך עם כל מה שהיא מציעה לך ללא שום קשר לOO או תכנות פרוצדורלי (PP אם תרצה)

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

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

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

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

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

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 15:49

הדף נוצר ב 0.31 שניות עם 11 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר