שלום לכולם !
אני מנסה לכתוב תוכנית אשר תקלוט מספר אשר ייצג את מספר המשתנים ותדפיס טבלת אמת .נגיד שקלטתי את המספר 3 אזי צריך להדפיס טבלת אמת של שלושה משתנים שיש לה 8 שורות.
תודה
קודם כל אתה יודע שהמספר שקלטת מהמשתמש הוא זה שיקבע את רוחב הטבלה.
בעזרת המספר שנקלט אתה גם יכול למצוא את מספר האפשריות ובעצם את הערך הדצימלי הגדול ביותר.
נגיד וקלטת את המספר n, מספר האפשריות (והשורות בטבלה שאתה אמור להציג) מחשבים על ידי 2 בחזקת n. הערך הדצימלי הגדול ביותר בטבלה היא התוצאה הקודמת פחות 1.
כלומר אם n = 4 אז יש לך 2 בחזקת 4 אפשריות שזה 16 והטבלה שלך צריכה להכיל את הערכים מ0 עד 15.
אני הייתי עושה משהו כזה:
קוד:
unsigned int n, i, m;
puts("Enter a number: ");
scanf("%d", &n);
m = pow(2, n); //m = 2 ^ n
for (i = 0; i < m; i++) { //I = 0 to (m-1)
//Convert I to binary
}
בתוך הלולאת for נישאר רק להציג את השורה הנוכחית שערכה הדצימלי הוא I, על ידי פירוש I לערכו הבינארי. אתה מוזמן לנסות בעצמך או פשוט ללחוץ על הספוליר:
זהירות - ספויילר!
קוד:
[
#include <stdio.h>
#include <math.h>
int main(int argc, char* argv[]) {
unsigned int n, m;
printf("Enter a number: ");
scanf("%d", &n);
printf("\n");
m = (unsigned int) pow(2, n); //m = 2 ^ n
for (unsigned int i = 0; i < m; i++) { //I = 0 to (m-1)
//Convert I to binary:
unsigned int b = 1 << (n -1);
for (unsigned int j = 0; j < n; j++, b = b >> 1) {
if (i & b) putchar('1');
else putchar('0');
}
putchar('\n');
}
return 0;
}
מכיוון שבb יש רק סיבית אחת דלוקה בכל פעם התנאי בעצם יתקיים רק אם הסיבית שדלוקה במשתנה b תהיה גם דלוקה במשתנה i.
ה & היחיד זה AND לוגי (כפל בוליאני) בין הסיביות של המשתנה b למשתנה i
נגיד ב b יש את הערך הבינארי הבא (השמטתי עוד כמה אפסים משמאל):
00001000
וב I יש ערך כל שהוא:
abcdefgh (כל אות מסמלת סיבית - 1 או 0)
עכשיו יש לזכור שכפל בולאני עם סיבית שערכה 0 כמו כפל רגיל התשובה היא תמיד 0 לא משנה עם מה כופלים, וכאשר נכפול ב1 התשובה תלוי בסיבית השניה איתה כופלים.
בעקרון (x הוא סיבית - 1 או 0):
x & 0 = 0
x & 1 = x
לפי זה כפל בולאני בין I ל b:
00001000
abcdefgh
=
0000e000
ולכן התשובה תלויה רק בסיבית e שהיא בדיוק הסיבית אליה b מצביע, התשובה תהיה 0 אם e כבויה והתשובה תהיה לא 0 (מספר כל שהוא, ששווה בעצם ל b) וכך התנאי פועל.
b משמש לי כסוג של מצביע לסיבית שכל פעם אני מזיז לסיבית הבאה ועם התנאי למעלה אני בודק האם הסיבית דלוקה או לא.