שאלה בסיסית בשפת c

ronib25

New member
שאלה בסיסית בשפת c

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

השאלה:

יש לכתוב תכנית, המדפיסה את רשימת האותיות abc מ- z ועד a כפירמידה: דוגמת הרצה של התוכנית:

יש לכתוב אותה תכנית בשלושה אופנים שונים:
א.יש להשתמש בלולאה “for”.
ב.יש להשתמש בלולאה “while”.
ג.יש להשתמש בלולאה “do-while”.
כמו כן אני מוסיף תמונה של איך שזה אמור להיראות (זה לא באמת פירמידה...)

 

BravoMan

Active member
בפורום הזה לא פותרים שיעורי בית!

חלק המשתתפים פה (כולל אותי) לא מאמינים שאפשר ללמוד מתשובה מוכנה, מה גם, שמי שלא מראה השקעה וניסיון ומבקש ישר תשובה במקום הכוונה נשמע כמו אחד שרוצה לרמות ולא ללמוד.
&nbsp
אבל בשאלה שהצגת, אם פתרת את סעיף א', הפתרון של ב' ו-ג' הוא טריוויאלי.
אתה רק מזיז כמה חלקים קטנים בהתחלה וסוף של לולאה.
&nbsp
הרי בסופו של יום כל הלולאות עובדות אותו הדבר, רק הסינטקס טיפה שונה.
&nbsp
בהצלחה!
&nbsp
ואויב ואבוי שיש עדיין מוסד שמלמד בורלנד...
נו, לפחות זה עדיף מללמד NET.
 

ronib25

New member
צריך עזרה

תאמין לי שאני משקיע, בסה״כ לא מצליח לי.אני עובד ב visual studio ואתה יכול להבין שאפשר לעשות שם אינסוף מניפולציות עד שזה ייצא כמו שאני רוצה, ובכל זאת אני לא מצליח. לכן פניתי לפורום, כי ל א הצלחתי, אני אלמד מהפיתרונות הללו !
כמו כן הנה סעיף א׳ שלי. אם זה פשוט כל כך אשמח לתשובה ו/או הדרכה..
&nbsp

 

BravoMan

Active member
בוא ננסה להבין במה בדיוק אתה מתקשה:

האם אתה יודע איך עובדת לולאת while?
האם אתה יודע מה ההבדל המינורי בין while ל-do while?
&nbsp
האם אתה מבין מה עושה כל חלק בתוך הסוגריים (העגולים!) של for?
האם אתה יודע שאתה יכול להשתמש בחלקים האלה מחוץ לסוגריים של for?
 

ronib25

New member
במה אני מתקשה

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

BravoMan

Active member
זה תכנות, לא נהיגה

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

ronib25

New member
זה נחמד

אבל גם עם הרמזים הללו אני לא מצליח...
אוליי הייתה אפשרות יותר נוחה לרשום את סעיף א׳ עבור for ואז זה היה יותר ברור ?
אני באמת לא יודע מה לעשות. אני עושה בדיוק כמו שרשמו את הדוגמא של השינוי בין ה for ל while וכשאני עושה debuging פתאום יש 24 שגיאות, זה כנראה שאני בכל זאת לא מבין, ובכל מקרה אני אשמח לראות פיתרון, אני חושב שאני מכניס את עצמי כבר לבור מספיק עמוק בזה שזה לא מצליח לי...
 

BravoMan

Active member
בסדר.

הנה פתרון לכל הסעיפים של השאלה:
#include <stdio.h>
const char* const pattern = "z\ny x\nw v u\nt s r q\np o n m l\nk j i h g f\ne d c b a\n";
int main(int argc, char **argv) { const char *iter; /* clause a) */ for (iter = pattern; *iter; iter++) putchar(*iter); /* clause b) */ iter = pattern; while (*iter) { putchar(*iter); iter++; } /* clause c) */ iter = pattern; do { putchar(*iter); iter++; } while (*iter); return 0;}
הוא כתוב ב-ANSI C תקני, מתקמפל ללא אף אזהרה, נותן את הפלט הנכון, והקוד יעיל וקומפקטי.

עכשיו, בכנות: מה למדת ממנו?

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

ronib25

New member
מה זה c ansi ?

אני מכיר עבודה עם c רגיל...כמו כן מה זה iter ? pattern ?
כמו כן כשאני מריץ את זה, זה נפתח לשנייה וgetch() לא עוזר... מה צריך לעשות ?
 

BravoMan

Active member
נו, רואה, פתרון לא עזר לך ללמוד!

אמרתי לך שלא תוכל ללמוד מהפתרון, ואכן לא למדת.

ANSI הוא תקן של C, הוא מה שמלמדים בד"כ במוסדות להשכלה גבוהה (יש עוד כמה תקנים יותר חדשים), הוא אמור להיות מה שאתה מכנה C רגיל.
בכל מקרה, הקוד יעבוד גם על סוגי C "חדשים יותר".

כדי לראות את התוכנית רצה, כל שעליך לעשות הוא לפתוח סייר קבצים בתיקייה שם נבנה לך ה-exe, לכתוב בשורת הכתובת של החלון (היכן שמופיע כל הנתיב לתיקייה) cmd וללחוץ Enter. ייפתח לך חלון שחור כזה כבר בספרייה ההיא.

תכתוב בו את שם ה-exe ותלחץ enter. הוא ירוץ, והחלון לא ייסגר.

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

ולשאלה שלך:
מה הכוונה "מה זה pattern ו-iter"?
אלה בסה"כ שמות משתנים. אם אתה לא מצליח לזהות הגדרה של משתנה, אתה עוד לא מוכן בכלל לעבודה עם לולאות, ופספסת חתיכה מאוד בסיסית ומאוד התחלתית בחומר, מה שגם מסביר למה אתה מתקשה כ"כ.

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

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

ronib25

New member
איפה אני הייתי שם getch()

הייתי שם במקום ה return 0 אבל זה לא יעזור...
Grosseto אשמח לדעת איך הצלחת לראות מה יש שם ?
ואשמח עוד יותר שלא תקשו עליי...
 

BravoMan

Active member
במקום, או אחרי?

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

ronib25

New member
זה מה שעשיתי וזה יוצר לולאה אינסופית ריקה..

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

BravoMan

Active member
אם אתה הולך לצרף קוד,אנא עשה זאת בקובץ טקסט

פשוט, לא מסמך Word.
&nbsp
למעשה, הדרך הפשוטה ביותר היא לקחת את קובץ ה-c שכתבת, לשנות סיומת ל-txt ולצרף.
&nbsp
בכל מקרה, בלי להביט בקוד, אם נוצרת לולאה אין סופית, רוב הסיכויים ששכחת לקדם את המונה.
בלולאת for זה קורה באחד הסעיפים בסוגריים העגולים אחרי ה-for, בלולאת while כפי שכבר הראו לך פעמיים, אתה חייב לכתוב את זה בגוף הלולאה, בין סוגריים מסולסלים.
&nbsp
עם ה-if מפתרון שלך לסעיף א' אין צורך לעשות שום דבר.
הוא יכול להישאר בדיוק כפי שהוא ולהמשיך לעבוד בדיוק באותה צורה.
 

ronib25

New member
מה הכוונה לקדם את המונה ?

אם אתה מתכוון לזה שצריך לעשות למשל i++ אז עשיתי.. גם j++ עשיתי (רק הפלוסים לכיוון ההפוך),
בכל אופן אני אעבוד על זה כבר מחר, ובכל זאת אשמח לדעת איך לפתוח את מה שאתה רשמת ? אם הבנתי נכון רשמת פשוט את ה abc עם /n במקומות שצריך וזהו, לא ?ֿ
וכמובן תודה.
 

BravoMan

Active member
רשמתי לך לפני 2 הודעות בדיוק איך

להריץ תוכנה שלא עוצרת בסוף.
&nbsp
קרא שוב!
 

Grosseto

New member
זה באמת פתרון אלגנטי

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

הפרבולה

New member
דוגמה לשימוש ב for ו while

אם נתון קוד כזה למשל עם שימוש ב for
int i;
for( i=a; i<b; i++){
// do something
}

אז אתה יכול לממש את זה גם עם while ככה:​

i=a;
while (i<b) {
// do something
++i;
}
 

ronib25

New member
תגובה

זה דיי שימושי אבל אני לא מצליח.באמת שאשמח לפיתרון...
 
למעלה