עבור לתוכן

שורשים ב-c

Featured Replies

פורסם

תפקיד התוכנה הוא להדפיס לכמה מספרים בין 1 ל-30 יש שורש שלם ולא מצליח לי, זה מדפיס לי 15 במקום 5:

#include <stdio.h>

#include <conio.h>

void main()

{

clrscr();

int i,num,mone=0;

for(i = 1; i <= 30; i++)

{

for(num = 1; num <= 30; num++)

{

if(i / num == num)

mone++;

}

}

printf("\n\n %d",mone);

}

פורסם

1. את הלולאה הפנימית (num) אפשר להריץ עד i במקום עד 30. אבל זה לא קריטי לנכונות (רק ליעילות).

2. הבעיה המרכזית היא בתנאי. בגלל שכל המשתנים הם integer אז תוצאת החילוק (i/num) יוצאת מעוגלת. לדוגמא אם i שווה 5 ו-num שווה 2, תוצאת החילוק תהיה 2 (שזה 5 לחלק ל-2 ללא שארית) והתנאי מתקיים.

מה שכדאי לעשות זה להפוך את החילוק לכפל, כלומר לעבור לתנאי הבא:

if (i == num * num)

פורסם

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

אם אני זוכר נכון היא נקראת

n=sqr(num)

כמובן שצריך להוסיף פונקצית סיפריה

#include<math.h>

פורסם
  • מחבר

תודה!!!

באמת לא חשבתי על זה!

פורסם

להלן שיעור קצר בדיבאג :

שינוי קליל בקוד שלך ל :

#include <stdio.h>
int main()
{
int i,num,mone=0;
for(i = 1; i <= 30; i++)
{
for(num = 1; num <= 30; num++)
{
if(i / num == num)
{
printf("i is %d num is %d mone is %d\n",i,num,mone++);

}
}
printf("\n %d\n",mone);
}

הניב את הפלט :


i is 1 num is 1 mone is 0
i is 4 num is 2 mone is 1
i is 5 num is 2 mone is 2
i is 9 num is 3 mone is 3
i is 10 num is 3 mone is 4
i is 11 num is 3 mone is 5
i is 16 num is 4 mone is 6
i is 17 num is 4 mone is 7
i is 18 num is 4 mone is 8
i is 19 num is 4 mone is 9
i is 25 num is 5 mone is 10
i is 26 num is 5 mone is 11
i is 27 num is 5 mone is 12
i is 28 num is 5 mone is 13
i is 29 num is 5 mone is 14

כאן מאד פשוט לגלות את הבעיה (שכמו שאמרו לך, זו בעיית עיגול).

מטי.

פורסם

int counter = 0;
float x;
int i;

for( i = 1; i <= 30; i++ )
{
x = sqrt( i );
if( x == (float)trunc( x ) )
{
counter++;
}
}

פורסם

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

אם אני זוכר נכון היא נקראת

n=sqr(num)

כמובן שצריך להוסיף פונקצית סיפריה

#include<math.h>

sqr מעלה בריבוע

sqrt מוציא שורש

פורסם

אבל זה סתם מבזבז זמן.

תנסה לעשות:

for(i=0;i*i<30;i++)

printf("%d", i*i);

פורסם

אני מניח שהתכוונת


for(i=0,j=0;i*i<30;i++,j++)
;
printf("%d \n",j);

מטי.

פורסם

לא צריך להיות ; לאחר הלולאה(כי אז הוא יציג את המספר הריבועי הבא אחרי 30 - 36)

ולא צריך לשמור גם J. מספיק הI.

וצריך להדפיס את i בריבוע, לא את I מכיוון שאתה צריך את הריבוע לא את השורש.

אם רוצים גם את השורש:



for(i=0;i*i<30;i++)
printf("%d^2 = %d", i, i*i);

פורסם
תפקיד התוכנה הוא להדפיס לכמה מספרים בין 1 ל-30 יש שורש שלם....

זה כבר לא תיכנות, זה הבנת הנקרא.

מטי.

פורסם

טוב טעות שלי.

בכל מקרה לא צריך להשתמש ב- 2 משתנים.

for(i=1;i*i<30;i++);
printf("%d", i-1);

ארכיון

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

דיונים חדשים