עבור לתוכן

זקוק לעזרה ב-BASE .. מבוא -C

Featured Replies

פורסם

תחילת הדרך של מבוא למדעי המחשב.. זקוק לעזרה בקשר לתרגיל הנ"ל:

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

ותדפיס למסך את ההודעה ההבאה:

The decimal number: YYYY is the same as: ZZZZ ( x )

כאשר YYYY הוא המספר שנקלט , X הוא הבסיס בו נתבקש לייצג את המספר, ו ZZZZ הינו הייצוג לפי בסיס X עבור YYYY

הערה 1 : המספר ZZZZ בן 4 ספרות

התוכנית שאני כתבתי:

#include <stdio.h>
int main()
{
int num,base,deciNum,dig4,dig3,dig2,dig1;
scanf("%d",&deciNum);
scanf("%d",&base);
dig4=(deciNum%base);
dig3=((deciNum/base)%base)*10;
dig2=(((deciNum/base)/base)%base)*100;
dig1=((((deciNum/base)/base)/base)%base)*1000;
num=dig1+dig2+dig3+dig4;
printf("The decimal number: %d is the same as: %X(%d)",deciNum,num,base);
return 0;
}

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

תודה רבה !!

פורסם

לא הבנתי מה הבעיה.

תרשום קלט ופלט שגוי.

פורסם
  • מחבר

השתמשתי באחוז x כי בבסיס 16 זה בטבלת ASCII ולכן צריך לתרגל לאותיות..לא הבנתי את הפלט קלט שגוי? תודה.

פורסם

א. אין קשר ל-ASCII או לבסיס 16. אתה מתעסק פה עם מספרים.

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

פורסם
  • מחבר


6
2
The decimal number: 6 is the same as: 110(2). . .

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

אך במקרה שאני מזין 1234 ובסיס 16, אני אמור לקבל 04D2 , וכפי שאתה שם לב יש אות במספר, וזאתי למעשה הבעיה שלי. מכווין שבתוכנית אני מכפיל ב 10 זה משנה את הערך של התו ובמקום להיות D הוא יהיה תו אחר או מספר אחר.

הנה לדוגמא מה שקורה שאני מכניס 1234 ובסיס 16 , ומשאיר את ה%X. למעשה יש כאן בעיה לוגית .


1234
16
The decimal number: 1234 is the same as: 214(16)
Press any key to continue . . .

פורסם

אז למה אתה מכפיל ב-10 ולא ב-16?

או שתכפיל ב-10 ותדפיס באמצעות d%

או שתכפיל ב-16 ותדפיס באמצעות x%.

הבסיסים שבו אתה בונה את המספר צריך להתאים לבסיס שבו אתה מדפיס.

פורסם
  • מחבר

אז למה אתה מכפיל ב-10 ולא ב-16?

או שתכפיל ב-10 ותדפיס באמצעות d%

או שתכפיל ב-16 ותדפיס באמצעות x%.

הבסיסים שבו אתה בונה את המספר צריך להתאים לבסיס שבו אתה מדפיס.

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

אני לא יכול להשתמש בIF , אז איך אני יודע מתי לעשות ל-10 ומתי לעשות ל-16? כי אני מפצל את זה לשתי מקרים הרי לא?

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


#include <stdio.h>
int main()
{
int num,base,deciNum;
int dig4,dig3,dig2,dig1;
scanf("%d",&deciNum);
scanf("%d",&base);
dig4=(deciNum%base);
dig3=((deciNum/base)%base);
dig2=(((deciNum/base)/base)%base);
dig1=((((deciNum/base)/base)/base)%base);
printf("The decimal number: %d is the same as: %x%x%x%x(%d)",deciNum,dig1,dig2,dig3,dig4,base);
return 0;
}

INPUT AND OUTPUT #1:


1234
16
The decimal number: 1234 is the same as: 04d2(16)

Input and output #2:


7
2
The decimal number: 7 is the same as: 0111(2)

מה דעתך?

פורסם

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

מה שהתכוונתי הוא שתעשה ככה:

#include <stdio.h>
int main()
{
int num,base,deciNum,dig4,dig3,dig2,dig1;
scanf("%d",&deciNum);
scanf("%d",&base);
dig4=(deciNum%base);
dig3=((deciNum/base)%base)*16;
dig2=(((deciNum/base)/base)%base)*16*16;
dig1=((((deciNum/base)/base)/base)%base)*16*16*16;
num=dig1+dig2+dig3+dig4;
printf("The decimal number: %d is the same as: %X(%d)",deciNum,num,base);
return 0;
}

מובן?

פורסם
  • מחבר

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

הבעיה שלי בהבנה לא הבנתי איך מ13*16 => dig2 זה הופך בהמרה הקאסדצימלית לאות d?

תודה רבה.

פורסם
  • מחבר

לא הבנתי את השאלה שלך.

"הבסיסים שבו אתה בונה את המספר צריך להתאים לבסיס שבו אתה מדפיס"- אתה יכול להסביר את המשפט?

לא הבנתי למה אתה מכפיל ב16 שאתה משתמש בבסיס הקאסדצימלי (%X).- ומחבר את המשתנים DIG אחרי ההכפלה ב16.?

ההבעיה שלי היא בהבנה הלוגית הפעולה המתמטית שעשיתה.

תודה רבה.

פורסם

הממ, קצת קשה לי להסביר את זה בלי להסתרבל יותר מדי.

בפתרון הראשון שלך לתרגיל, מה שעשית הוא ליצור מספר "פיקטיבי" מתוך המספר המקורי. כלומר, נניח שיש לך איזשהו מספר, שכשאתה ממיר אותו לבסיס 6 הוא מיוצג כ-"2345". מה שעשית הוא ליצור כל ספרה בנפרד (dig1 החזיק את 5, dig2 החזיק את 4 וכן הלאה), ואז חיברת את הספרות ע"י הכפלה:

num = 2*1000 + 3*100 + 4*10 + 5 = 2345

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

הפתרון שהצעתי הוא בעצם לייצג את ההמרה לבסיס 6 באמצעות בסיס 16. ארבעת ה-dig-ים יחזיקו עדיין את אותם ערכים, אבל כשאתה מחבר את הספרות, תבצע את זה ככה:

num = 2*0x1000 + 3*0x100 + 4*0x10 + 5 = 0x2345

כלומר - לכפול את 2 ב-1000 בבסיס 16 (שזה 16*16*16), לכפול את 3 ב-100 בבסיס 16 (שזה 16*16) וכן הלאה.

המספר שיוצא לך הוא 0x2345 - מספר שאם תדפיס אותו באמצעות x%, הוא יודפס ב-2345 (אם תדפיס אותו באמצעות d% אז הוא ייצא לך הייצוג בבסיס של 0x2345, שזה משהו שאתה לא רוצה).

עכשיו טיפה יותר מובן...?

פורסם
  • מחבר

הבנתי. תודה רבה אחי. :xyxthumbs:

אתה גדול.

ארכיון

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

דיונים חדשים