עבור לתוכן

שאלה על שפת C (קלט ופלט) :)

Featured Replies

פורסם

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

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

לדוגמא:

המשתנה N שווה 4, תדלק הנורה L4

(1000 בבינארי)

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

ויש קשר להזזה שמאלה\ימינה? (משהו אמר לי על זה משהו)

תודה לעונים.

פורסם

תגדיר unsigned char ואז תשתמש ב-%X או %x ב-scanf.

פורסם
  • מחבר

לא התכוונתי לזה. סתם ככה להפוך אני יודע. אבל הבעייה היא כזאת:

בתרגיל אני צריך לקלוט מהקלט מספר. (משנה - CHAR) המספר הוא בבינארי. ואני צריך להוציא את המספר בהקסא.

אם אני קולט 1000 אני צריך להוציא 8.

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

איך זה הולך?

מקווה שעכשיו זה יותר ברור.

פורסם

אין לי מושג מה זה outportb...

בלינק שנתתי יש הסבר להמיר מבינארי לעשרוני.

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

פורסם
  • מחבר

חח אתה יודע מה הפקודה עושה? אני בשוק :eek2: ( :lol: בצחוק )

הפקודה הזאת זה פקודה של קלט ופלט... הפקודות המקבילות בשפת אסמבלר היא IN וOUT

פורסם

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

יש לך port שיכול לקבל או 1 או 0 ואתה צריך עבור המשתנה להוציא שמונה סיביות לפלט, נניח ב-little endian.

כלומר עבור הערך "8" אתה רוצה להוציא:


out(0);
out(0);
out(0);
out(1);
out(0);
out(0);
out(0);
out(0);

אם ככה, אתה רוצה את הלולאה הבאה:


void f (unsigned char x) /* unsigned is important */
{
int i = 0;
while( i++ < 8 ) out( (x >> i) & 1 );
}

פורסם
  • מחבר

אההה כאילו לעשות לולאה ולכפול ב1 לוגי....

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

סבבה :)

ואיך עושים הפוך?

מבינארי למספר...

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

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

זה יותר מסובך.. :\

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

כאילו ממשיך רגיל בתרגיל.....

ותודה !

פורסם

אסור!

x% חייב לקבל int, לא char, אחרת יש לך דריכת זכרון.

אנא נמק את דבריך אלה.

פורסם

קבל תיקון - לא דריכת זכרון, סתם קריאה של זכרון לא רלוונטי.

הדרך של printf לדעת מה הטיפוסים שהעברת לו היא באמצעות הרצפים המיוחדים (כל ה-% למיניהם).

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

כאשר הפונקציה מקבלת d%, היא יודעת שהיא צריכה לקחת ארבעה בתים (גודל של int, ייתכן שזה שונה במכונות שונות) מהמערך ולהדפיס אותם כמספר דצימלי. כשהיא מקבלת c%, היא צריכה לקחת בית אחד ולהדפיס אותו כתו. כשהיא מקבלת x%, היא צריכה לקחת 4 בתים ולהדפיס אותם כמספר הקסדצימלי, וכן הלאה.

כשעושים ככה:

printf("%d", 'a');

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

אם רוצים להדפיס את הערך המספרי של תו, אז צריך קודם להמיר אותו ל-int.

שים לב שבמקרה ההפוך:

char c;
scanf("%d", &c);

תהיה לך דריכת זכרון של ממש (ה-scanf ימלא 4 בתים, איפה שיש רק בית אחד).

פורסם

בסיס בינארי זה ממש ממש ממש ממש ממש ממש ממש ממש ...ניצנץ! בסיסי.

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


unsigned char g()
{
unsigned char x = 0;
int i = 0;
while ( i++ < 8 ) x = x | ( (unsigned char)input_bit() << 1u );
return x;
}

יש עוד דרכים, כמובן.

פורסם

קבל תיקון - לא דריכת זכרון, סתם קריאה של זכרון לא רלוונטי.

הדרך של printf לדעת מה הטיפוסים שהעברת לו היא באמצעות הרצפים המיוחדים (כל ה-% למיניהם).

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

כאשר הפונקציה מקבלת d%, היא יודעת שהיא צריכה לקחת ארבעה בתים (גודל של int, ייתכן שזה שונה במכונות שונות) מהמערך ולהדפיס אותם כמספר דצימלי. כשהיא מקבלת c%, היא צריכה לקחת בית אחד ולהדפיס אותו כתו. כשהיא מקבלת x%, היא צריכה לקחת 4 בתים ולהדפיס אותם כמספר הקסדצימלי, וכן הלאה.

כשעושים ככה:

printf("%d", 'a');

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

אם רוצים להדפיס את הערך המספרי של תו, אז צריך קודם להמיר אותו ל-int.

שים לב שבמקרה ההפוך:

char c;
scanf("%d", &c);

תהיה לך דריכת זכרון של ממש (ה-scanf ימלא 4 בתים, איפה שיש רק בית אחד).

מממ... טוב לדעת.

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

פורסם

זה תלוי בפלטפורמה, בקומפיילר, בקוד שלך, ובמצב הירח. אם c הוא משתנה אוטומטי, והקומפיילר הקצה ל-char שלך sizeof(int) בתים על המחסנית, אז לא תהיה בעיה. או אולי איזור הזכרון שאחרי c אינו בשימוש.

פורסם
int f(int num)
{
return (1 << (num - 1));
}

ארכיון

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

דיונים חדשים