עבור לתוכן

בעיה בתוכנית C

Featured Replies

פורסם

כתבתי תוכנית ב- C שעובדת אצלי מצויין בבית עם הקומפיילר של DEV C++ 4.9.9.2.

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

משום מה בפעולה BinariesSum הלולאהלא נגמרת מתי שהיא נגמרת על המחשב שלי.

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

מישהו יכול לעזור? (כל הפרוייקט שלי בבית מצורף)

[attachment deleted by admin]

פורסם

איזה קלטים אתה מזין? זה קורה בכל קלט? אתה בטוח שאין לך overflow?

נסה להשתמש בהדפסות עזר בפונקציה BinariesSum, או אפילו בדיבאגר.

פורסם
  • מחבר

רק רציתי לציין שבבית אני עובד עם Windows ובאוניברסיטה מותקן Linux.

הקלט תמיד תקין (זו הנחה של התרגיל) (זה לא עובד על השרתים גם אם אני נותן לדוגמה 11 ו- 13).

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

בדקתי וגיליתי שהפעולה binary1 / i עובדת כמו שצריך אבל binary2 / i לא.

הבנתי שהבעיה היא עם הפעולה binary2 / i. משום מה זה מחזיר מספר לא נכון.

binary2 / 1 הוא מחזיר תוצאה נכונה אבל binary2 / 10 והלאה (i גדול יותר) התוצאה שגויה.

בדקתי ואכן binary2 לא משתנה והוא המספר הנכון וגם i גדל כל פעם פי 10.

אני לא מבין למה התוצאה של החישוב שגויה.

מישהו יכול לעזור? (רק בבקשה עד יום חמישי הקרוב כי אני צריך להגיש את התרגיל עד חצות).

פורסם

איפה בקוד שלך יש binary2 / i? מה זה אומר "לא עובד כמו שצריך"? מה הערכים שלהם, ומה התוצאה?

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

פורסם
  • מחבר

זה מה שעשיתי וראיתי שהחישוב של binary2 / i בפעולה BinariesSum לא מתבצע כמו שצריך.

לדוגמה אם binary2 = 1101 ו- i = 10 התוצאה שאני מקבל על השרתים של האוניברסיטה היא 2147483758.

התוצאה בפועל אמורה להיות 110.

פורסם

תעלה את הקוד המלא כאן, כולל הדפסות העזר שלך (בקוד שהעלית קודם אין שום מקום בו מופיע binary2/i)

פורסם
  • מחבר

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

הנה הקוד:

#include <stdio.h>

void PrintBinariesSum(unsigned long decimal1, unsigned long decimal2);
unsigned long ConvertDecimalToBinary(unsigned long decimal);
unsigned long BinariesSum(unsigned long binary1, unsigned long binary2);

int main()
{
unsigned long num1, num2;
scanf("%u %u", &num1, &num2);
PrintBinariesSum(num1, num2);
return 0;
}

void PrintBinariesSum(unsigned long decimal1, unsigned long decimal2)
{
unsigned long binNumber1, binNumber2, sum;
// Getting the binary presentation of the two numbers
binNumber1 = ConvertDecimalToBinary(decimal1);
binNumber2 = ConvertDecimalToBinary(decimal2);
// Getting the sum of the numbers
sum = BinariesSum(binNumber1, binNumber2);
// Printing the numbers
printf("%10d\n", binNumber1);
printf("%10d\n", binNumber2);
printf("%10d\n", sum);
}

unsigned long ConvertDecimalToBinary(unsigned long decimal)
{
unsigned long tempNum, power, binNumber;
// Calculating the power of the binary number
tempNum = decimal;
for (power = 1; tempNum >= power * 2; power *= 2);
// Calculating the binary number
tempNum = decimal;
binNumber = 0;
for (; (power > 0) || (tempNum > 0); power /= 2)
{
binNumber = (binNumber * 10) + (tempNum / power);
tempNum -= (tempNum / power) * power;
}
return binNumber;
}

unsigned long BinariesSum(unsigned long binary1, unsigned long binary2)
{
unsigned long i, sum, carriage, digit;
sum = 0;
carriage = 0;
// Passing all the digits
for (i = 1; i <= 1000000000; i *= 10)
{
// Calculating the digit
digit = carriage + (binary1 / i) % 10 + (binary2 / i) % 10;
carriage = 0;
// Updating the carriage
if (digit > 1)
{
carriage = 1;
digit -= 2;
}
// Adding the digit
sum += digit * i;
}
return sum;
}

פורסם

כשאתה קורא לתוך unsigned long אתה אמור להשתמש ב-lu% ולא u%. אני לא יודע אם ההבדל מהותי, אבל בכל מקרה זה עדיף.

מה הערכים של binary1,binary2 בכניסה לפונקציה? מה התוצאה? תן עוד פרטים.

פורסם
  • מחבר

הפונקציה מקבלת שני מספרים בינריים ומחזירה את הסכום הבינרי שלהם.

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

פורסם

:facepalm:

מה הערכים של binary1,binary2 בכניסה לפונקציה? מה התוצאה? תן עוד פרטים.

ארכיון

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

דיונים חדשים