עבור לתוכן

שאלה בשפת C על לולאה

Featured Replies

פורסם

נתנו לנו תרגיל בשפת C ואני שובר את הראש איך לפתור תודה מראש לעוזרים ...

התוכנית קולטת ערכים של 3 משתנים (x,y,z) ומסכמת אותם ומכניסה למשתנה בשם Res

ובודקת

*אם גדול מ12,000,000  אז תופיע הודעת OVERFLOW

*אם קטן התוכנית תקלוט עוד משתנה (נגיד n)

שעליו להיות בתווך של מ-0 עד 100   ותעלה את Res  בחזקת n

זאת אומרת שבסופו של דבר הפתרון בסוף הוא    Res = Res^n

הבעיה היחידה שלי היא איך אני מעלה את הRes בחזקת ה-n

פורסם

אני אומנם לא יודע C, אבל מבחינה לוגית אני מאמין שהפתרון יהיה אותו פתרון כמו בפסקל (שכללית זאת שפה שדי דומה לC):

כדי לעשות Res^n מציבים את הערך של res באיזשהו משתנה (X), כדי לקבל את התשובה צריך לכפול את X ב Res (את התוצאה של הכפל הזה כמובן מציבים או ב X או ב Res) בתוך לולאה שתרוץ n-1 פעמים...

יש לי הרגשה שזה לא יצא הכי ברור, אני ינסה להסביר את זה שוב:

מציבים את הערך של Res במשתנה X.

פותחים לולאה שתרוץ n-1 פעמים שבתוכה יוצב לתוך Res הערך של Res כפול X (כך שRes גדל כל פעם)

אה, ואל תשכח לבדוק קודם אם n=0...

מקווה שתבין...

פורסם

פתרון יותר פשוט - לאתחל משתנה ב-1, ואז כל פעם לכפול אותו ב-res, ככה n פעמים :)

ואז לא צריך לבדוק 0.

פורסם
  • מחבר

השאלה היא איך אני גורם לו לכפול אותו n פעמים

יש מבין ???

פורסם

ככה:


int x = 1;
for (int i = 0 ; i < n ; ++i) {
x *= res;
}
res = x;

יש מבין?[

פורסם
  • מחבר

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

הבעיה עכשיו היא שכשאני מכניס מספרים כמו 1 או 2 התוצאה יוצאת נכונה אבל ב3 ומעלה הוא מפשל ...

אם אפשר הסבר למה אני ישמח ...

#include <stdio.h>
#include <conio.h>

long int x , y , z , Res ;
int n ;

void main (void)
{
clrscr() ;


printf ("ENTER X VALUE: ") ;
scanf ("%ld",&x) ;
printf ("ENTER Y VALUE: ") ;
scanf ("%ld",&y) ;
printf ("ENTER Z VALUE: ") ;
scanf ("%ld",&z) ;

Res=x+y+z ;

if (Res>12000000)
{
printf ("OVERFLOW") ;
goto sof ;
}
get_n : printf ("ENTER N VALUE: ") ;
scanf ("%d", &n) ;


if (0<n && n<100)
{
while (n>1)
{
Res=Res*Res ;
n-- ;
}
printf ("Res = %ld \n", Res) ;
goto sof ;
}

goto get_n ;
sof: getch() ;
}

פורסם

בלולאה שלך המשתנה RES עולה בחזקת 2 בכל סיבוב

אתה צריך לקבוע משתנה עזר שיהיה בערך המקורי של RES

וכל סיבוב לכפול בו

פורסם

זה לא ממש בעיה:

#include <stdio.h>
#include <math.h>

void main()
{

int x,y,z,n,res,v=0;

printf("Please enter 3 nums.\n");

scanf("%d %d %d",&x,&y,&z);

res=x+y+z;

if(res>12000000)
printf("Overflow\n");

if(res<12000000)
{
while(v!=1)
{
printf("Please enter another num.\n");

scanf("%d",&n);

if(n>=0 && n<=100)
v=1;

else
printf("Error. Please enter vaild values.");
}

res=pow((double)res,(double)n);

printf("The sum is: %d",res);
}
}

פורסם

אוקי, כמה דברים:

1. אל תשתמש ב-goto. זה יוצר קוד מכוער ולא קריא, וזה פשוט תכנות גרוע.

2. למה אתה משתמש ב-while ולא ב-for?

3. בעצם, למה לא עשית בדיוק מה שאמרתי? (הכוונה היא ל-EliranB, לא orlupo)

פורסם
  • מחבר

כי לא ידעתי איך ליישם את זה ע"י FOR

אתה יכול לתת דוגמה ..?

פורסם
  • מחבר

תודה ...

פורסם

ככה:


int x = 1;
for (int i = 0 ; i < n ; ++i) {
x *= res;
}
res = x;

יש מבין?[

טיפה עיניים ::)

פורסם

למה שלא תשתמש בMATH.H ובPOW כפי שהציעו לך כבר?

הרבה יותר נוח, והרבה יותר יעיל ומהיר(אני מניח שכל הפונ הספרייה ממומשות בASM ולא בC).

פורסם

יכול להיות שהוא לא למד את זה אבל שיהיה...

אני למדתי על math.h עוד ביום הראשון שלומדים את התוכנית של "Hello World".

ארכיון

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

דיונים חדשים