עבור לתוכן

שארית בשפת C:

Featured Replies

פורסם

1.

השאלות שלי ככה:

אחרי שאני מבצע % 2 על מספר מסויים, איך אני מקבל את הערך אחרי השארית?

לדוגמא: אם ביצעתי על 2 % 9 אז השארית = ל1 והערך שנשאר אחרי השארית הוא 4...

2.

אני צריך לקבל מספר כלשהו ולבדוק האם הוא עשרוני הוא בינארי איך אני יכול לבדוק זאת?

פורסם

1. x / y בין שתי INTEGER יתן את החלוקה בלי השארית. x % y בין שתי INTEGER יתן את השארית בלבד.

2. כדי לבדוק האם מספר x הוא בבסיס b. תבצע לולאה שבכל פעם עושה x % b, אם התוצאה של זה גדולה/שווה מ b אזי הוא לא בבסיס הזה. לאחר מכן תעדכן את

x = x / b.

3. אם הגעת לסוף x וכל התוצאות היו קטנות מ b, אזי הוא בבסיס הנ"ל.

פורסם
  • מחבר

איך אני יכול להציג את המספר הבינארי?

ללא מערך?

פורסם

פשוט תדפיס אותו ? מה זה משנה באיזה בסיס הוא ? או שיש לך מספר בבסיס אחר שאתה רוצה להמיר לבסיס בינארי ואז להציג ?

פורסם
  • מחבר

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

פורסם

ל-PRINTF יש אפשרות להדפיס את המספר באיזה בסיס שאתה רוצה.

פורסם
  • מחבר

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

1. x / y בין שתי INTEGER יתן את החלוקה בלי השארית. x % y בין שתי INTEGER יתן את השארית בלבד.

2. כדי לבדוק האם מספר x הוא בבסיס b. תבצע לולאה שבכל פעם עושה x % b, אם התוצאה של זה גדולה/שווה מ b אזי הוא לא בבסיס הזה. לאחר מכן תעדכן את

x = x / b.

3. אם הגעת לסוף x וכל התוצאות היו קטנות מ b, אזי הוא בבסיס הנ"ל.

זה יהיה בעייתי עם המספר 10 100 וכו' כי הם תקינים כעשרוניים וגם כבינאריים...לעומת 01 שלא תקין...

פורסם

1. לא הבנתי בדיוק מה אתה רוצה, מן הסתם כל מספר שתקין בבסיס X יהיה תקין בכל בסיס מעליו...אי אפשר להבדיל. ואם אתה קובע ש 01 לא תקין, הוא לא תקין באף בסיס...

2. לגבי הצגת מספר, אני מניח שאת האלגוריתם הבנת, אז אחרי שיש לך את התוצאה ההפוכה, אתה פשוט יכול להפוך אותה לתוך משתנה שהוא ההפך (כל שארית מהראשון תכפיל ב 10 * המיקום בשני).

פורסם
  • מחבר

אוקיי...אז איך אני מקבל מספר בינארי והופך אותו לעשרוני?

איך בכלל משתנה יכול לשמור מספר כזה למשל:01010110

ואיך אני מפרק אותו והופך אותו לעשרוני...

פורסם

אתה יכול לעשות מערך של אותיות/אינטגרים שכל איבר בו הוא ספרה.

אתה לא מכיר את האלגוריתם להפוך מספר מבסיס לבסיס ?

פורסם
  • מחבר

אני צריך לפתור את התרגיל ללא מערך...

ואני לא מכיר את היישום של האלגוריתים בשפת C....

פורסם

ל-PRINTF יש אפשרות להדפיס את המספר באיזה בסיס שאתה רוצה.

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

אני צריך לפתור את התרגיל ללא מערך...

ואני לא מכיר את היישום של האלגוריתים בשפת C....

אז תדפיס את המספר ביט-ביט, מהסוף להתחלה:

int get_bit(int x, int bit_num) {
return (x >> bit_num) & 1;
}

void print_bin(int x) {
if (x == 0) {
// במקרה שהמספר הוא 0, סתם להדפיס 0
printf('0');
return;
}

int i = sizeof(x)*8 - 1; // להתחיל הביט העליון ביותר במספר

for ( ; (i >= 0) && (get_bit(x,i) == 0) ; --i); // לדלג על כל ביטי האפס

for ( ; i >= 0 ; --i) {
printf("%d", get_bit(x,i));
}

}

הפונקציה get_bit מחזירה את הביט במקום ה-i (כאשר 0 הוא הביט הימני ביותר)

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

פורסם

או פשוט:

void print_bin(int x)
{
if(x==0)
printf("0");

//else כמובן שלא חייבים

print_bin(x/10);
printf("%d", x%10);
}

שניצל: אם כבר- מה יותר יעיל, להדפיס '0' או "0"?

האם בזמן ריצה זה משנה, או רק בקומפילציה?

פורסם

איכס, רקורסיה :)

קודם כל, אתה צריך לעשות שאם x==0 אז הוא יצא מהרקורסיה (כלומר חייבים else)

חוץ מזה, שים לב שאם x!=0, אז הפונקציה תדפיס לך 0 מיותר בסוף...

פתרון אפשרי הוא להוסיף פרמטר לפונקציה שאומר לה מה לעשות אם x==0 (להדפיס 0 או לא), שהערך הדיפולטי שלו הוא true, ובתוך הפונקציה היא תקרא לו עם false.

תיאורטית נראה לי שיותר יעיל להדפיס '0', אבל אני לא יודע אם מעשית יש הבדל (יכול להיות שהקומפיילר מייעל את זה).

אפשר לבדוק :) תקמפל את שתי האפשרויות ותשווה את האסמבלי שיוצא.

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

פורסם

אה... אופס שכחתי ריטרנ.

ארכיון

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

דיונים חדשים