עזרה נואשת.

pilot23

New member
עזרה נואשת.

שלום,
יש לי מספר בעיות שאני לא מצליחה לפתור.
1. אם יש לי למשל תפריט ראשי , נאמר ומכיל 5 קטגוריות. ובנוסף יש לי תפריט משני עם 3 קטגוריות , שאני רוצה שיפתח בכל פעם שבוחרים אופציה מהתפריט הראשי. איך עושים את זה ? אגב, למדנו פונקציות.
2. יש לי משפט מסוים באנגלית, ואני רוצה להזיז כל רווח במשפט מקום אחד ימינה.. איך למען השם אני עושה את זה ? אני מסתבכת קצת עם הכתיבה. חשבתי לעלות לולאת for שרצה על המערך, ואז מתחת תנאי if או גם while יכול להיות אופציה, ואז בתוך התנאי לכתוב שבכל פעם שנתקלים ברווח אז להזיז את האינדקס במערך.. אבל אני לא ממש יודעת איך.
וכדי לשחזר את התהליך צריך להזיז שמאלה, וגם אני לא יודעת איך לעשות את זה.
3 איך מורידה מתחילת משפט ומסוף משפט את כל הרווחים ? וכמו כן, באמצע משפט איך אני מצטמצמת את מספר הרווחים לאחד ?

תודה רבה!
 

אiהד

New member
שפת תכנות? סביבה גרפית (לתפריטים)?

1)אני מניח שאת מתכוונת לתפריט טקסטואלי - פשוט תגידי שאם אופציה X נבחרה להציג תפריט חדש, במשפט switch או בפונקציה של החלק הרלוונטי בתפריט תבני תפריט חדש
2)נתחיל בלכתוב פונקציה שמחליפה בין שתי מקומות במערך, מכאן הדרך די פשוטה
3)ברוב השפות יש פונקציה trim שמוחקת רווחים בתחילת/סוף המחרוזת, באמצע - עם ביטויים רגולריים וreplace
 

pilot23

New member
תשובה

תודה.
צודק, הכוונה הייתה ששפת התכנות היא C וסביבת העבודה היא ויז'ואל סטודיו 2010 אקספרס.
ואנחנו לא למדנו פונקציה trim ואסור לנו להשתמש במשהו כזה.
 

BravoMan

Active member
כשאת מתקשה להבין מה בדיוק התוכנית צריכה

לעשות, הדבר הנכון לעשות הוא להתחיל מכתיבת "פסודו קוד".

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

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

אני אתן לך דוגמה של פסודו קוד לסעיף 2, בתקווה שזה יעזור להמחיש את ההסבר שלי:

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

0. תתחילי מהאות הראשונה במשפט
1. האם האות שבודקים היא רווח?
אם כן, בצעי צעדים 2 עד 4: (אחרת דלגי עליהם)
--> 2. קחי את האות הבאה, ושמרי אותה בצד.
--> 3. שימי את הרווח במקום האות הבאה (צעד אחד ימינה).
--> 4. קחי את האות ששמרת בצד, ושימי במקום האות הנוכחית (שהיא בעצם רווח)
5. כל עוד לא הגעת לאות אחת לפני אחרונה תעברי לאות הבאה ותתחילי מ-1.

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

מקווה שזה נתן לך כיוון איך לגשת לבעיות מהסוג הזה.
בהצלחה!
 

pilot23

New member
תגובה

שמתי לב עכשיו שאני חייבת לך תשובה לגבי השאלת מחשב... אני מניחה שלא בודקים את האות האחרונה כי זה בעצם לא אות .. זה סימן סוגר מחרוזת '0\'. זה נכון ?
ולגבי השלבים שרשמת.. לקחת את האות הבאה אני יודעת איך i+1 בתוך המערך.. זה סבבה.. אבל מה זאות לשמור אותה בצד? איך אני עושה את זה ? ב- temp ?
ולשים את הרווח במקום האות ההבאה זה בעצם לעשות השמה של i+1 במערך שווה לרווח ?
אגב, רוב אנשים שפתרו את התרגיל דוווקא התחילו מהסוף של המשפט.. ולא כמו כאן.... מדוע ? מה ההבדל ?
 

BravoMan

Active member
תשובה:

ראשית, לגבי האות האחרונה:
האות האחרונה היא לא '0\' אלא האות האמתית האחרונה במשפט שבאה לפני ה-'0\' הסוגר. (המיקום שלה במערך הוא "עורך מחרוזת פחות אחד)
והסיבה שלא בודקים אותה, בשיטה שלי היא שגם אם היא רווח, אין לאן להזיז אותה - נגמר המקום.

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

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

"לשמור בצד" פירושו להגדיר עוד משתנה, temp זה שם טוב בשבילו, ולשמור שם את האות.

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

אפשר ישר לדרוס את הרווח עם האות הבאה, ולדרוס אות הבאה עם תו רווח.

אבל תזכרי את השיטה של "לשים בצד" למקרה שתקבלי תרגיל להחליף בין 2 אותיות שונות.

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

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

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

זה שיש שתי תשובות לתרגיל מסוים לא אומר שאחת שגויה או שאחת יותר טובה.

בהצלחה!
 

nocgod

New member
עזרה נואשת?

1. אם למדתם פונקציות תכתבי פונקציה שתדפיס תפריט ראשי, תקלוט מהמשתמש את הבחירה שלו ותחזיר אותה
int mainMenu() {//...}

תכתבי פונקציה נוספת שתדפיס תפריט משני ותחזיר את הבחירה ממנו, בדיוק כמו הפונקציה הקודמת
int secondatyMenu(){//...}

2. מאחר והביאו לך pseudo-code השלב הבא יהיה לתת לך את הקוד אז...תעזרי בפסדוקוד
3. עושים מערך חדש באותו האורך של המערך הישן (אני מאמין שאתם משתמשים במערכים סטאטיים של תווים) באמצעות לולאת for שעוברת על המערך המקורי מדלגים על כל התווים שהם רווחים עד התו הראשון שהוא לא רווח
אפשר למצוא את התו האחרון שמערך המקורי על ידי מעבר מסוף המערך אחורנית עד התו הראשון...אז לולאת הfor שלך תרוץ עד ה index של התו האחרון במשפט
 

pilot23

New member
תגובה

קודם על המון תודה.
לא מבינה מה העניין הזה להגיב מגעיל על דברים שאני אומרת... אז כתבתי עזרה נואשת.. ו ?

אבל זה בדיוק מה שאני שואלת... אני לא יודעת איך לכתוב מעבר מהערך האחרון עד התו הראשון... התו האחרון שלי המשפט זה' 0\' , נכון?
 

nocgod

New member
אני לא מגיב מגעיל

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

את יכולה להשתמש בstrlen כדי לקבל את אורך המשפט שלך, ואז ללכת אחורנית באמצעות לולאת for עד התו הראשון אשר שונה מרווח
for (i = strlen(yourString); i >=0; i--) { //... }

וכן כל מחרוזת מסתיימת בתו 0\...
 

pilot23

New member
תגובה

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

pilot23

New member
שכחתי לשאול אותך

למה דווקא ללכת מהסוף להתחלה ולא להפך?
 

nocgod

New member
כי...

כדי להעתיק את המחרוזת ככה שלא יהיו בהתחלה רווחים ובסוף רווחים את צריכה לדעת את הindex של התו הראשון השונה מרווח ואת הindex של התו האחרון אשר שונה מרווח (כלומר כל התווים אחריו רווחים בלבד)
הכנתי לך פסדו קוד, עם הערות...בבקשה תקראי ותעברי שוב על הפרקים של מחרוזות בספר
// find the first non ' ' character
for i = 0 to end
if arr is not ' ' break

start = i // save the location of the first non ' ' character

// find the index of the last non ' ' character
for i = length of string to 0
if arr is not ' ' then break

end = i // save the location of the last non ' ' character
j = 0 // initiate the index of the newArr at the beginning
// copy the sub-string from arr to newArr
for i = start to end
newArr[j++] = arr
 

BravoMan

Active member
נקודה קטנה לגבי סעיף 3:

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

ייתכן, שבתרגיל הגבילו אותך לא להשתמש במערך כזה, ואז הפתרון יהיה דומה לסעיף 2, רק שבמקום להזיז רק רווחים מזיזים את כל האותיות, ובסוף מזיזים גם את תו '0\' כדי לחתוך רווחים מסוף המחרוזת.
 

MLCollege

New member
בבקשה

1. תפריט ראשי עם אפשרות לצאת מהתכנית ותפריט משני עם אפשרות לחזור לתפריט הראשי

int selection1;
int selection2;

while(selection1!=5)
{
printf("\nEnter main menu selection: ");
scanf("%d", &selection1);
if(selection1==5)
continue;

printf("\nEnter sub-menu selection: ");
scanf("%d", &selection2);
if(selection2==3)
continue;

switch(selection1)
{
case 1:
function1(selection2, more_parameters...);
break;
case ...
}
}


2. קוד שמזיז כל רווח במשפט מקום אחד ימינה

int c=0;
char res_string[200];
while(str[c]!=NULL)
{
if(str[c]=' ')
{
res_string[c]=str[c+1];
res_string[c+1]=' ';
c=c+2
}
else
c++;
}


3. קוד שמוריד רווחים מתחילת המשפט ומסוף המשפט

res_str = char[200];
int index_orig=0, index_result=0;
//skip over spaces in the begining
while(str[index_orig]==' ')
index_orig++;
while(str[index_orig]!=NULL)
res_str[index_result++] = str[index_orig++];
res_str[index_result] = NULL;
//chop spaces in the end
index_result--;
while(res_str[index_result]==' ')
index_result--;
res_str[++index_result]=NULL;


4.קוד שמזהה רווחים רצופים במשפט ומחליף אותם ברווח בודד

res_str = char[200];
int index_orig=0, index_result=0;
while(str[index_orig]!=NULL)
{
if(str[index_orig]==' ' && str[index_orig-1]==' ')
index_orig++;
else
str[index_result++] = str[index_orig++];
}


בברכה,
מתן,
[URL='http://www.mlcollege.co.il']www.mlcollege.co.il[/URL]
 

nocgod

New member
אני חושב ש...

לשלוח פיתרון מלא לתרגיל של סטודנט זה קצת לא אתי לא?
הוא יקבל 100 בעבודה ו 40 במבחן...במצטבר אם המרצה נחמד ייצא סופי 52 אם לא יהיה 40 סופי...
אני מבין את חשיבות הפרסומת אבל צריך לשמור על רמת אתיקה מינימלית...
 

ihovav

New member


 

mistero

New member
אני דווקא ממש לא מסכים אתך

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

אני מסכים שיש כאן מין האקט הפרסומי, מצד שני יש כאן עזרה אמיתית ובצורה מושקעת מאד.

להגיד את האמת אני הייתי שוקל לפנות למישהו שמסוגל לתת פתרון בצורה כזו...אבל לצערי אני לא גר בב"ש
 

nocgod

New member
אז כנראה היית נכשל בקורס מה אני אגיד לך...

בתור מי שכבר שנה שניה מלמד סטודנטים חלשים בקורסים של C ו ++C אני יכול להגיד לך בפה מלא: מי שלא קורע את התחת ולומד לבד לא יצליח בקורס ואם נרחיק לכת אפשר להגיד שהבן אדם אינו רואה מטרה מול העיניים וכנראה יהיה לו קשה להצליח מאוחר יותר.
יש הבדל עצום בין לעזור לבין להביא תשובה מוכנה. אנשים שמביאים תשובה מכונה מעודדים התנהגות של וותרנות חוסר יכולת.
לא חושב שזו הייתה הכוונה שלו אני יכול להגיד לך ב 100 אחוז שזה התוצאה.
התרגיל שהיא קיבלה לא קשה, לא מסובך ולא מצריך יותר מלקורא וללמוד את ה 100 עמודים הראשונים של K&R ואני לא רואה סיבה שמי שלומד באוניבריסטה לא יעשה את זה אם רצונו להצליח בלימודים ובחייו בהמשך

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

אגב אם אתה מעוניין בפתרונות כאלה אין לי בעיה להביא לך אותם, בוא נעשה וועידות בסקייפ 40 שקל לשעה, פגישה מינימלית של שעתיים ואני מביא לך תשובות כאלה
אם תרצה אני גם אכין בשבילך עבודות הגשה בJava C ++C וC# תמורת תשלום, אפילו אכתוב בשבילך הערות ירוקות שהמתרגלים כל כך אוהבים לקרוא...כמובן תמורת תשלום סימלי...
מה תלמד מזה?
 
למעלה