שאלה בC:

asp123

New member
שאלה בC:

יש לי את התוכנה הזו:
#include<stdio.h> void main() { int n=0,i=1; printf("enter a number:"); scanf("%d", &n); clrscr(); /* for(i=1 ; i<=n; i=i+i+1) printf("%d\n\r", i); */ while(i<=n) { printf("%d\n\r", i); i+=i+1; } getch(); }​
עכשיו כאשר מציבים 5 הפלט אמור להיות 1 3 6 10 15 משום מה כאשר אני מריץ את התוכנית היא נותנת רק שתי מספרים 1 ו 3 למה
בבקשה תענו לי מהר.. תודות מראש לכל מי שינסה לעזור
 

כאגאי

New member
יש לך בעיה פה: i+=i+1

אי אפשר לדעת מה יקרה שם. תשנה את זה ל 2 שורות לפי מה שצריך להיות.
 

asp123

New member
טוב אני צריך עזרה במשהו אחר את זה

כבר פתרתי. מישהו יודע איך עושים עצרת ? לדוגמא:
n!=n*(n+1)*(n+2)*(n+n)​
אני אמור לעשות תוכנה בC שקולטת מספר טבעי שלם בC ועושה עצרת של אותו המספר אני קצת מבולבל בקטע איך עושים את החישוב
עם for או while או שתיהן
אז עזרה לא תזיק לי
תודה מראש לכל מי שינסה לעזור.
 

HaRmosh

New member
תראה, כעקרון אין הבדל מהותי

בין for ל-while, אלא יותר הבדל מבני - עניין של נוחות. בקשר לשאלה הספציפית, תחשוב על לולאה שרצה על המספרים בין 1 למספר עצמו, וכופלת משתנה מסויים כל פעם במספר אחר. יותר מזה באמת אין מה לרמוז
 

shaiis7

New member
עצרת

int main(); int n,azeret=1; pintf("קלוט מספר לעצרת"); scanf("%d",&n); if (n) for(int i=1; i<=n;i++) azeret*=i; printf("%d התוצאה",azeret); return 0; אני בעקרון עצרת אני מקווה שזה נכון
 

shaiis7

New member
תשובה

כשאתה קולט חמש הלולאה נכנסת בפעם ראשונה עם הערך 1 שזה הערך ההתחלתי של הלולאה ומודפה 1. בפעם השנייה i שווה ל3 ומודפס 3, אך בפעם השלישית i כבר 7 ולכן התנאי של לולאת הfor לא מתקיים, וכאשר עוברים לwhile התנאי בה גם לא מתקיים כי 7 גדול מ5.
 

nosa85

New member
../images/Emo41.gifניצול שרשור../images/Emo41.gif בעיה בC

שלום.. אני עדיין מתחילה ב C ויש לי בעיה קטנה כתבתי קוד שאמור לקחת מספר ולהפוך את הסדר שלו (למשל 123 יודפס 321) בדקתי בדיבאגגיר והכל בסדר אבל כשאני מנסה להדפיס את תוכל במשתנה tmp זה נותן לי 0 הנה הקוד:
num_tmp=num; counter=0; while ((num_tmp%10!=0) || (num_tmp!=0)) { counter++; num_tmp=num_tmp/10; } flag=0; tmp=0; tmp2=counter-1; num_tmp=num; for(i=counter-1;i>=0;i--) { if (num_tmp%10==0) { if ((num_tmp%10==0) && (flag==0)) { flag=1; continue; } else if ((num_tmp%10==0) && (flag=1)) tmp=(num_tmp%10)*(pow(10,tmp2))+tmp; flag=1; } tmp=(num_tmp%10)*(pow(10,i))+tmp; num_tmp=num_tmp/10; } printf("The revearsed number is: %d\n",tmp);​
אם מישהו יכול להעיף מבט ולהגיד לי איפה טעיתי.. כבר שברתי ת'ראש ולא מצליחה לאתר את הטעות ו
 

gmorphus

New member
בלאגן...

אתה עשית פה קצת בלאגן... את מה שאתה רוצה לעשות אפשר לעשות ב3 שורות בערך. אני אנסה להסביר: קודם הלולאה הראשונה מיותרת כי אין לך מה לבטל אפסים מובילים כי פשוט לא תהיה להם משמעות אח"כ. האמת היא שאין לי כח לנסות להבין מה עשית פה (ואני אשמח אם תסביר מה כל חלק אמור לעשות - זה ד"א חלק מכתיבה נכונה של קוד: שיהיה מובן, קריא, ועם תיעוד). מה שבטוח זה שיש לך הרבה יותר משתנים, אתה לא צריך לעשות חזקה בשום שלב, והתוכנית הרבהי ותר מידי ארוכה ולא יעילה. אני אנסה להדריך אותך לפתרון: יש לך מספר ביד, num. כדי להפוך את סדר הספרות שלה אתה צריך להוציא אותן אחת אחת ולהכניס אותן לתוך משתנה אחר, כאשר אתה חייב להוסיף אותן מימין למה שקיים שם כבר. דוגמא: נניח שיש לי את המספר num = 123 ואני רוצה להפוך את סדר הספרות ולהכניס לתוך result. אני אקח את הספרה 3 ע"י num%10 ואכניס לתוך result. ואמחק אותה מnum ע"י num/10. קיבלתי num = 12, result = 3. עכשיו אני מוציא את הספרה 2, שוב ע"י num%10. מוחק אותה מnum ע"י num/10 ומכניס אותה מימין לספרה 3. איך אני עושה את זה? המספר שאני אמור לקבל הוא 32 נכון? אז מה שלי קופץ מיד לראש זה להכפיל את מה שיש כרגע בresult 10, ופשוט להוסיף למספר את 3 ככה: result = result*10+3. קיבלתי: num = 1, result = 32. אני עושה אותו דבר עם 1 שנשאר בnum ורואה שאני צריך לעשות אותה פעולה כדי להכניס אותו לresult... עכשיו num יהיה אפס, ואני מפסיק. אתה בטוח יכול להמשיך מפה. רמז: מספיקה לך לולאה אחת ושני משתנים (תלוי כמובן אם אכפת לך שnum יישאר כמו שהוא היה...)
 

gmorphus

New member
טעות קטנה:

איפה שכתוב result = result*10+3 אמור להיות result=result*10+2 כמובן...
 

nosa85

New member
אהה.. ../images/Emo51.gif../images/Emo26.gif

אגב זו בת ולא בן.. אז ככה, אני יודעת שעשיתי בלאגן לא קטן וסיבכתי את העניינים, בדיקת האפסים הכרחית כי יש דרישה שמספר כמו 1000 יכתב 1 ולא 0001 בקשר להערות אני אוסיף כאגמור לכתוב את הקוד.. הבנתי את הפתרון שלך, זה באמת יותר טוב, אני סיבכתי את הכל עם הבסיסים וכו'.. אני אנסה לישם את זה ואם איתקל בבעיות אני אפנה אליכם שוב..
רבה
 

nosa85

New member
אופס..

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

nosa85

New member
עוד שאלה קטנה..

ככה בודקים מספר ראשוני נכון? (למדתי את זה פעם בפסקל אבל משום מה זה לא מחזיר תשובה נכונה) בבקשה תראו אם הבדיקה נכונה?
even_num=0; num_tmp2=num; for(j=1;j<sqrt(num_tmp2);j++) //prime number check { if (num%j==0) even_num=j; } if (even_num==0) printf("\nThe number is a prime number\n"); else printf("\nThe number is not a prime number\n");​
 

HaRmosh

New member
שתי הערות:

1. j צריך להתחיל מ-2 ולא מ-1, אחרת כל מספר יתחלק ב-1 בבדיקה הראשונה, ותקבלי שהוא לא ראשוני. 2. אפשר לשפר מעט, ע"י כך שברגע שתפסת מספר j שמחלק את המספר הנבדק הלולאה תעצור ותדפיס ישר תשובה, מבלי לבדוק את שאר המחלקים - כי ברגע שנמצא אחד המספר כבר לא ראשוני.
 
למעלה