עבור לתוכן

אהלן בעיה בשפת C עם WHILE

Featured Replies

פורסם

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

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

הבעיה שאני אמור להכניס את התרגיל הזה ללולאה כך שכל עוד המשתמש לא יקיש q, המחשב ידרוש ממנו שוב ושוב להקיש אות ושני מספרים.

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

אשמח אם למישהו יש רעיון, אני תקוע כבר שעות עם התרגיל הזה, ופשוט לא עולה על התשובה!

תודה רבה!

#include <stdio.h>
#include <conio.h>
#include <math.h>
int main()
{
int a,b,r,j,k,i;
char ch=0;
float z;


while (ch<'q'||ch>'q'){
ch=1;

printf("please enter a char and the 2 numbers ");
scanf ("%c%d%d",&ch,&a,&b);
switch (ch)
{
case 'a':
case 'A':
printf ("Avarege of two numbers is %.2f\n\n",z=0.5*(a+b));
break;
case '*':
printf ("the product of numbers is %d\n\n",a*b);
break;
case 'm':
if (a>b)
printf ("the minimum is %d\n\n" ,b);
if (b>a)
printf ("the minimum is %d\n\n" ,a);
if (a==b) printf ("two numbers are equals\n\n");
break;
case 'M':
if (a>b)
printf ("the maximum is %d\n\n" ,a);
if (b>a)
printf ("the maximum is %d\n\n" ,b);
if (a==b) printf ("two numbers are equals\n\n");
break;
case 'g':

if (a>b){
j=b;
r=a%b;
while (r<0||r>0){
if (r>0||r<0)
r=a%b;
a=b;b=r;
if (r==0)
printf("the mehalek is %d\n\n",a);}
if (j==b) printf("the mehalek is %d\n\n",b);}
if (b>a){
j=a;
r=b%a;
while (r<0||r>0){
if (r>0||r<0)
r=b%a;
b=a; a=r;
if (r==0)
printf("the mehalek is %d\n\n",b);}
if (j==a) printf("the mehalek is %d\n\n",a);}
break;

case '^':

printf("the hezka is %.2f\n\n",z=pow(a,b));
break;
case 'q':
case 'Q':
printf("Finish!\n\n");
break;
default: printf("Erore\n\n");
break;
}}
if (ch=='q')
printf("Finish!\n\n");

getch();
return 0;

}

  • תגובות 35
  • צפיות 3.1k
  • נוצר
  • תגובה אחרונה
פורסם

נתחיל מזה שבשביל לבדוק אם ch לא שווה q אתה יכול להשתמש באופרטור =! (לא שווה). חוץ מזה, אתה בודק רק את q ולא את Q. גם לא ברור למה אתה עושה ch=1.

בכל מקרה, תנסה לעשות (fflush(stdin לפני ה-scanf.

פורסם
  • מחבר

אתה גדול!! :yelclap:

פתרת בעיה כל כך מעצבנת בשניה , בזמן שישבתי על זה שעות!!

תודה רבה!

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

פורסם

זה ניקה את הקלט. ch כל קיבל בקריאת הקלט השנייה את התו 'n\' ולכן לא הופיע באחד האפשרויות של הסוויץ'.

אתה חייב לפצל קוד לפונקציות, לדאוג להזחה (indentation) ובכלל לתקן את האנגלית. כל אלה יביאו לקריאה ברורב יותר של הקוד.

פורסם

פתרון נוסף, אגב, הוא להוסיף רווח בתחילת ה-scanf, דהיינו:


scanf (" %c%d%d",&ch,&a,&b);

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

פורסם
  • מחבר

קודם כל שוב תודה רבה לשניכם, מכל דבר כזה אני לומד.

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

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

בכל מקרה תודה רבה לשניכם!

פורסם

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

מצד שני, אם אתה מתחיל, עדיף שתעבוד עם האצבעות :xyxthumbs:

פורסם
  • מחבר

סליחה שאני מביא את זה שוב, אבל זה פשוט לא נתפס :bash:

עוד תוכנית עם לופ for ועוד פעם אותו דבר.

ניסיתי רווח בSCANF וגם את הstdin.

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

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



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


int main()
{
int i=0;
float v=1,vx,vy,a,t=0.1,h,s,l,g=9.81;
for (;v>0&&v<=100;){

printf("Enter v <0.0-100.0 m/s> and a <0.0-90.0 degrees>:");
fflush(stdin);
scanf(" %f%f",&v,&a);
if (v>0&&v<=100)
{
g=9.81;
a=0.017453*a;
vx=(cos(a))*v;
vy=(sin(a))*v;
s=vx*t;
l=pow(t,2);
h=vy*t-(g*l/2);}
else h=-1;
for (t=0.1;h>0;t=t+0.1){
s=vx*t;
l=pow(t,2);
h=vy*t-(g*l/2);
printf("time is %.1f s is %.2f h is %.2f\n",t,s,h);
}
printf("finish\n");
fflush(stdout);
}
getch();
return 0;
}

פורסם

כמה הערות:

א. את הרווח ב-scanf צריך רק לפני c% (לפני כל שאר סוגי הקלטים הוא תמיד מדלג על רווחים... אולי חוץ מ-s%).

ב. מה הטעם ב-for אם יש לו רק תנאי (בלי אתחול ובלי קידום)? תשתמש ב-while במקום.

ג. עדיף לעבוד עם double מאשר float (ואז צריך להשתמש ב-lf% במקום f% ב-scanf/printf).

ד. תדאג לסדר את הקוד שלך, כדי שיהיה יותר קריא: תדאג לטאבים במקומות הנכונים, רד שורה אחרי else, שים סוגריים מסולסלים בכל if/else/for (גם אם זו רק פקודה אחת), ותמיד תסגור סוגריים מסולסלים בשורה משל עצמם (ולא בסוף הפקודה שקדמה להם).

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

פורסם
  • מחבר

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

אני יושב על הבעיה הזאת שבוע, זה פשוט אבוד!!

אשמח לשמוע איזשהו כיוון לבעיה, כי פשוט מיואש... :kopfpatsch:

פורסם

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

פורסם
  • מחבר

אני לא מוצא אותו, זה הברייקפוינט?

פורסם

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

פורסם
  • מחבר

הייתי צריך לעשות את זה מזמן..........

תודה שוב שניצל אתה כל פעם מציל אותי מחדש...

:yelclap: :yelclap: :yelclap: :yelclap: :yelclap: :yelclap:

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

פורסם

אני יודע (t). המטרה היית ללמד אותך לעשות את זה בעצמך.

And hey, whaddya know? it worked.

ארכיון

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

דיונים חדשים