לולאות for ב#C - עמוד 2 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

לולאות for ב#C


eido300

Recommended Posts

  • תגובות 37
  • נוצר
  • תגובה אחרונה
במקרה של לבצע את אותה פעולה על שני משתנים, עדיף להגדיר מערך ולעבור עליו ב-foreach.

ב-C++/C אין לך foreach. אפשר בכל מקרה להגדיר מערך, אבל הסינטקס מסורבל יותר, וכשיש בדיוק שני אובייקטים, הייתי מעדיף את שיטת הלולאה מאשר את המערך.

צריך להיזהר מאוד מ-if מקוצר כי הוא יכול להפוך ביטויים למורכבים מאוד.

צריך להיזהר מאוד מכתיבת קוד באופן כללי...

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

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

מזל שאנחנו ב-#C ולא ++C :)

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

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

אני מאוד אוהב את מה ש#C הכניסה בכל מה שקשור לsyntactic sugars. פעמים רבות זה בדיוק ההבדל בין ספריה סטנדרטית נוחה לשימוש (collections, templates/generics וכו'), לבין משהו נורא עקום ומסורבל שנותן תחושה כאילו אונסים את השפה, ועל הדרך את המתכנת (++C).

אבל חלק גדול מהקוד הקיים בעולם עדיין כתוב ב++C או בC, וצריך לפעמים גם לתחזק ולהרחיב אותו. :)

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

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

אחד הדברים היפים בלולאות for הוא שאפשר לעשות שם דברים לא סטנדרטיים כאלה.

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


for (int i=0, X x=x1 ; i<2 ; i++, x=x2)
{
...
}

וכמובן הדרך הנכונה ( :P ) להגדיר לולאות אינסופיות:


for(;

רעיון מעניין (הפעולה על 2 משתנים מאותו טיפוס לא הלולאה אינסופיות;))

במקרה של לבצע את אותה פעולה על שני משתנים, עדיף להגדיר מערך ולעבור עליו ב-foreach.

אבל זה נראה יותר פשוט...

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

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

אם התחלנו על קיצורים, יש לך if מקוצר, לדוגמה: expres ? a : b

כלומר אם expressions הוא נכון, תבצע את a, אחרת תבצע את b.

הif הוא מקונן לכן א"א להשתמש בif המקוצר. (אני בכל אופן לא יודע איך מקוננים אותו:huh:).

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

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

אז יצרתי: 4 textbox (אחד לכל שחקן) ו-2 buttun (אחד ל"חלק" ואחד ל"החזר לחבילה").

הכנסתי במערך cards את שמות הקלפים, ויצרתי שיטה שבעזרת random תכניס לאינדקס של המערך מספר אקראי ואת הקלף שבתא הזה ידפיסו לאחד מהtextbox. הbuttun "חלק" קורא לשיטה וה"החזר לחבילה" שם מחרוזת ריקה בכל הtextbox.

אלה הקלפים:

 string[] cards = { "ace hearts", "2 hearts", "3 hearts", "4 hearts", "5 hearts", "6 hearts", "7 hearts", "8 hearts", "9 hearts", "10 hearts", "jack hearts", "queen hearts", "king hearts", "ace daimonds", "2 daimonds", "3 daimonds", "4 daimonds", "5 daimonds", "6 daimonds", "7 daimonds", "8 daimonds", "9 daimonds", "10 daimonds", "jack daimonds", "queen daimonds", "king daimonds", "ace club", "2 club", "3 club", "4 club", "5 club", "6 club", "7 club", "8 club", "9 club", "10 club", "jack club", "queen club", "king club", "ace spades", "2 spades", "3 spades", "4 spades", "5 spades", "6 spades", "7 spades", "8 spades", "9 spades", "10 spades", "jack spades", "queen spades", "king spades"};

זה הקוד:


[LEFT] void deal(string[] cards)
{
Random r = new Random();

[/LEFT]


כל t הוא כנגד textbox אחד בהתאמה ו-a הוא בשביל האינדקס


[LEFT] for (int t1 = 0, t2 = 0, t3 = 0, t4 = 0, a = 0; t4 != 13; )
{[/LEFT]


aמאותחל במספר אקראי בין 0 ל51 (כמספר התאים במערך)


[LEFT] a = r.Next(51);
[/LEFT]


כדי למנוע הדפסת קלף פעמיים,כל קלף שמודפס מוגדר כ-null וכאן בודקים אם זה null או לא


[LEFT] if (cards[a] != null)[/LEFT]


אם לא, בודקים איפה להדפיס את זה , ככה: בכל textbox אמורים להיות 13 קלפים לכן כל פעם שמדפיסים קלף מגדילים ב-1 את המשתנה של הtextbox, ואז בודקים אם במשתנה שלו יש 13 או לא, אם אין- מדפיסים בו את הקלף שבתא הזה, ואם יש עוברים לתא הבא.


[LEFT]{
if (t1 != 13)
{[/LEFT]


מדפיסים את הקלף


[LEFT] textBox1.Text = cards[a] + "\n";
[/LEFT]


הופכים אותו ל-null(כדי לא להדפיס קלף פעמיים)


[LEFT] cards[a] = null;
[/LEFT]


ומגדילים את המשתנה ב-1. (ככה זה גם בשאר הקוד אז אני לא אוסיף עוד הערות.)


}
else
{
if (t2 != 13)
{
textBox2.Text = cards[a] + "\n";
cards[a] = null;
t2++;
}
else
{
if (t3 != 13)
{
textBox3.Text = cards[a] + "\n";
cards[a] = null;
t3++;
}
else
{
textBox4.Text = cards + "\n";
cards[a] = null;
t4++;
}
t1++;

אשמח אם תוכלו להגיד אם יש דרך יותר פשוטה,תודה

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

שוב תודה

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

כן, אבל כפי שאתה יכול לראות בויקיפדיה, זה קוד של בערך 5 שורות.

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

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

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

ונכון, צודק, אני עכשיו באמת מנסה לכתוב את זה לבד.

אבל רק שאלה - איך זה יכול להיות שהוא משנה את המערך עצמו הרי לא העבירו אותו בתור ref?

תודה.

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

עריכה : יש לי רעיון אני עכשיו עובד עליו:cwm40:

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

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

זה השיטה shuffle


{
var r = new Random();
for (var i=cards.Length;i>1;i--)
{
var a = r.Next(51);
string b = cards[a];
cards[a] = cards[i-1];
cards[i-1] = b;
}
}
 void shuffle(string[] cards)

וזה השיטה שמדפיסה את הקלפים כשלוחצים על "חלק":


{
shuffle(cards);
for (var i=0;i!=13;i++ )
{
textBox1.Text += cards[i]+"\r\n";//מציג מ0 עד 12
textBox2.Text += cards[i + 12] + "\r\n";//מציג מ13 עד 25
textBox3.Text += cards[i + 25] + "\r\n";//מציג מ26 עד 38
textBox4.Text += cards[i + 38] + "\r\n";//מציג מ39 עד 51


}

}
void deal(string[] cards)

בעיקרון הכל עבר טוב חוץ מזה שבסוף אחת התיבות מסומנת אני כבר אעלה תמונה.

מישהו יכול להגיד למה זה קורה?

הנה התמונות[ATTACH=CONFIG]3182[/ATTACH] [ATTACH=CONFIG]3183[/ATTACH]

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

3 הערות:

א. (Random.Next(x מחזירה מספר בין 0 ל-x-1, לא בין 0 ל-x.

ב. יש לך טעות באינדוקסים בפונקציה deal (נסה לעלות עליה בעצמך).

ג. לא מימשת את ה-shuffle נכון (תקרא שוב את האלגוריתם).

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

ה. למה אתה משתמש ב-TextBox? הרבה יותר הגיוני יהיה להשתמש ב-ListBox.

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

וואוו תשובה מהירה, אני יעבור על זה ואראה איך אני מתקן את זה.

(למרות שעד עכשיו הכל עבד חלק.)

תודה רבה

א.צודק, תיקנתי.

ב.כנ"ל.

ג.על זה לא הצלחתי לעלות.

ד.אוקיי, אבל יש מה לעשות?

ה. 1.כי רק את זה אני מכיר, 2.כי בזה לא הצלחתי למצוא את המאפיין text.

void shuffle(string[] cards)        {
var r = new Random();
for (var i=cards.Length;i>1;i--)
{
var a = r.Next(cards.Length);
string b = cards[a];
cards[a] = cards[i-1];
cards[i-1] = b;
}
}
void deal(string[] cards)
{
shuffle(cards);
for (var i=0;i!=13;i++ )
{
textBox1.Text += cards[i]+"\r\n";//מציג מ0 עד 12
textBox2.Text += cards[i + 13] + "\r\n";//מציג מ13 עד 25
textBox3.Text += cards[i + 26] + "\r\n";//מציג מ26 עד 38
textBox4.Text += cards[i + 39] + "\r\n";//מציג מ39 עד 51


}

}

מה לגבי איך שזה עכשיו?

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

ארכיון

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


×
  • צור חדש...