שאלה ב-c

Evil Guy

New member
שאלה ב-c

צריך לרשום פונקציית לוג. מקבלת מספר ובסיס ומחזירה את המעריך.
האילוצים הם לא להשתמש בספרית math ו-2 המשתנים מגיעים מסוג שלם.
זה מה כתבתי:

int lg(int base, int x)
{
int counter=0;
float tempx;
tempx= (float)x;
while (tempx>=base)
{
tempx=tempx/base;
counter++;
}
return counter;
}

אשמח להסברון למה היא קורסת לי...
 

BravoMan

Active member
קורסת?

הדבר היחיד שאני רואה שיכול להביא לקריסה של ממש בפונקציה הזו הוא אם base = 0.

מה שכן, שים לב שההמרה של x ל-float שאתה מבצע היא חסרת תכלית, במצב הנוכחי.
לפי הכללים של שפת C, כל עוד יש רכיב "שלם" (int, long, etc) שמשתתף בביטוי, תוצאת הביטוי תהיה שלם, כלומר החלוקה עדיין תחתוך את החלק העשרוני של המספר.

כדי לקבל חלוקה "אמתית" יהיה עליך להמיר גם את base ל-float.
 

Evil Guy

New member
אני חושב שהבעיה לא קשורה לקוד.

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

BravoMan

Active member
בוקר טוב אליהו...

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

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

Evil Guy

New member
יש מצב שאתה צודק


 
אתה בטוח?

משום מה זכור לי שאם יש float בחלוקה (אפילו אם יש גם int), התוצאה תהיה float.

כמובן, ההמרה המפורשת מיותרת, כי גם השורה tempx=x תבצע המרה (כי tempx הוא float)
 

Evil Guy

New member
עשיתי אקסטרה המרות רק בשביל להיות בטוח שלא שם

הבעיה..
 

Evil Guy

New member
בכל מקרה, זה רק תת-תת סעיף מעבודה שואתית ביות

הסעיף כולו:

2. טור הנדסי ) 20 נק'(
סדרה הנדסית היא סדרה של מספרים בה המנה בין כל שני מספרים עוקבים הוא קבוע q. בחלק זה נבקש
מהמשתמש להכניס מספר שלם וחיובי n, התכנית תנסה למצוא סדרה הנדסית עם קבוע חלוקה q שלם וגדול מ 5
שסכומה ייתן את המספר n . על הסדרה לכלול מספרים שלמים הגדולים מאפס ואורכה לפחות שני איברים.
סדרה כזו תימצא בהכרח עבור n הגדול מ 2, כאשר a1=1 ו q=n-1 .
במידה ונמצא יותר מסדרה אחת יודפסו כולן.
סדר ההדפסות יקבע להלן:
.5 סדרות ארוכות יותר יודפסו לפני סדרות קצרות יותר.
.2 סדרות באורך זהה יודפסו לפי סדר עולה של q .
עבור חישובי עזר כתבו את הפונקציות הבאות:
א. כתבו פונקציה:
int power(int x,int y)
המחשבת את x בחזקת y .
ב. כתבו פונקציה:
int lg(int base,int x)
המחשבת את הלוגריתם של x לפי בסיס base מעוגל כלפי מטה.
שימו לב שהפונקציות עובדות על מספרים מטיפוס int ומחזירות טיפוס int . להזכירכם, ביישום הפונקציות אין
להשתמש בפונקציות ספריה אחרות כגון math.h .
ג. כתבו פונקציה:
void print_sum(int a1,int q,int n)
המדפיסה שורה של סכום סדרה הנדסית כאשר נתון האיבר הראשון a1 קבוע החלוקה q ומספר האיברים n .
על הדפסה זו להיות זהה לפורמט שיובא בדוגמא וכפי שיודפס בתוכנית לדוגמא.
ד. כתבו פונקציה:
void geometric()
המקבלת מן המשתמש מספר n>2 ומנסה למצוא את הסדרות הגאומטריות שסכומם הוא המספר.
דוגמאות:
Enter a number:
2
Invalid input. Try again...
31
31 = 1 + 2 + 4 + 8 + 16
31 = 1 + 5 + 25
31 = 1 + 30
Enter a number:
121
121 = 1 + 3 + 9 + 27 + 81
121 = 11 + 110
121 = 1 + 120

רעיון לאלגוריתם יותר יעיל ממלא לולאות שרצות על a1 ו-q
לא בצורה חכמה ויעילה?
 

BravoMan

Active member
הייתי בטוח...

אבל עכשיו החלטתי לבדוק ונראה שהצדק איתך...

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

נו, חיים לומדים...
 

nocgod

New member
ככה זה גם ב++C

חלוקה בין 2 int תביא int (כאילו חלוקת שלמים)
חלוקה בין float ל int או float ל float מביאה חלוקה כמצופה עם שברים והכל...
קל לשכוח את זה אם אתה לא כותב דברים כאלה ביום יום :)
 
למעלה