שאלה פשוטה ב C

שאלה פשוטה ב C

אם יש לי מחרוזת ואני רוצה לרוץ עליה.. אחרי שנכנסתי ללולאה ואני רוצה לבדוק האם האותיות הן אותיות קטנות באנגלית
מותר לי לעשות if ( string<='a' && string>='z') break;
או שזה עובד רק עם משתנים רגילים?
 

nocgod

New member
אם הבנתי נכון

קודם כל בכל לולאה מותר לך לעשות בלי שום קשר לסוג המשתנה שאתה רץ עליו (כל עוד מדובר בלולאה או switch)
רק כדי לראות שהבנתי את השאלה שלך
while (str)
{
if ( str < 'a' || *str >'z')
break;

i++;
}


תשים לב ל2 דברים:
א. אם אתה משאיר את הסימן => או =< אתה לא תקבל קצוות (כלומר עם לא a או z)
ב. ערך לא יכול להיות גם קטן מ a וגם גדול מ z לכן תנאי התנאי ב if צריך להיות "אם התו קטן מ a או גדול מ z"
 
כן. כמובן טעות לוגית קטנה שלי :) מקוצר זמן XD

בכל מקרה, למה עשית מצביע *str >'z'
וב a
לא?,
למה צריך מצביע?
אפשר בלי?
 

nocgod

New member
זו טעות שלי :)

הכוכבית שם לא במקום, והיא מיותרת, אפשר בלי? במקרה הזה רצוי בלי.
בכללי כדאי לעשות את זה עם מצביעים, זה מפשט את הקוד ו"מיפה" אותו.
רק לשם השוואה ככה הקוד יראה כשעובדים עם אריתמטיקת מצביעים
while (*str)
{
if ( *str < 'a' || *str > 'z')
break;

str++;
}
 

nocgod

New member
עדיף?

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

(היה אפשר להוריד גם את הסוגריים המסולסלים)
לפי מה שהבנתי עדיף להימנע משימוש בביטויים כגון break ו-continue.

בנוגע לנכונות - אתה צודק, לא שמתי לב לכך.
 

nocgod

New member
למה עדיף להמנע מהם?

הם לא נגועים כלבת והם כלים לגיטימיים לcontrol flow.
לצרות העניין goto הוא משהו מקולל כי היא פוגע בזרימה תקינה ולכן ממנו עדיף להמנע. continue ו break נראים לי כמו דברים הכרחיים לפעמים (נגיד break הכרחי בswitch)

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

שוב מה שכתבת הוא בסדר (חוץ מה סימני גדול/קטן שווה) ומבחינת יעילות וביצועים תקבל בדיוק את אותה התוצאה (במקרה שלך תתבצעה הערכה אחת נוספת של *str >= 'a' ו *str <= 'z' אבל זה זניח מבחינת סיבוכיות)
 
למעלה