שאלה ממש פשוטה בפסקל....

  • פותח הנושא pel8
  • פורסם בתאריך

pel8

New member
שאלה ממש פשוטה בפסקל....

אני בכיתה י' ולא מצליחה לי שאלה אחת.... היינו צריכים לכתוב תוכנית שתדפיס את כל המספרים הדו ספרתיים הראשוניים תוך שימוש במשתנים בוליאניים ותוך שימוש בלולאות מכוונות..... הנה מה שעשיתי: program hw; var i,j,count,num:integer; rishoni:boolean; begin rishoni:=false; count:=2; j:=11; while (j>10) and (j<100) do begin repeat if j mod count=0 then rishoni:=true; count:=count+1; until rishoni:=true if rishoni=false then writeln(j); j:=j+1; end; end. ומשום מה זה לא עובד.....מישהו יכול לומר לי למה? תודה מראש!
 

double X

New member
הבעיה שלך היא בתנאי העצירה

של הREPEAT באמצע. לפי מה שאני רואה, כאשר RISHONI הוא FALSE, זה אומר שהמספר הוא ראשוני (שים לב שמבחינה לוגית זה אמור להיות הפוך... כשזה TRUE זה אומר שזה ראשוני. אבל זה לא קריטי מבחינת התיכנות). הלולאה הפנימית שלך מנסה בעצם לחלק את המספר J בכל המספרים האפשריים כדי לוודא שהוא לא מתחלק לאף אחד מהם. הבעיה היא שאתה לא מגביל את הערך של COUNT, ולכן עבור כל ערך של J, גם אם הוא ראשוני, אתה תגיעה בסופו של דבר לחלק אותו בעצמו (כשיתקיים ש COUNT=J), ולכן עבור התוכנית הוא ייחשב כלא ראשוני. תנאי העצירה שלך באמצע צריך להיות: until count=J
 

pel8

New member
אוקי...רגע אבל

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

double X

New member
כן, תוסיף

אתה צריך להוסיף איפוס של COUNT אחרי שאתה יוצא מהלולאה, וגם אתחול של RISHONI בחזרה לTRUE במידה והוא FALSE (האיתחול צריך להיעשות בתוך בדיקת התנאי). (ואני בחורה :)
 

double X

New member
שים לב גם לטעות הלוגית שלך

אתה חוזר על הלולאה האמצעית עד ש RISHONI=TRUE , ואז בודק האם RISHONI=FALSE , מה שלעולם לא יקרה אם סיימת את הלולאה (ואם לא סיימת אותה, אז היא פשוט אינסופית). טעות כזו צריכה לקפוץ לך ישר מול העיניים.
 

pel8

New member
אז זה עדיין רושם לי את כל המספרים..

וגם אני בחורה....חחחח מה לעשות? תעזרי לי בבקשה כי כבר ניסיתי את כל הדרכים שאני מכירה.... הנה איך שהתוכנית נראת עכשיו: program hw; var i,j,count,num:integer; rishoni:boolean; begin rishoni:=true; count:=2; j:=10; while (j>10) and (j<100) do begin repeat if j mod count=0 then rishoni:=false; count:=count+1; until (j-1=count); count:=2; if rishoni then writeln(j) else rishoni:=true; j:=j+1; end; end.
 

double X

New member
בלבלת הכל :)

ככה היא צריכה להיראות:
program hw; var i,j,count,num:integer; rishoni:boolean; begin rishoni:=true; count:=2; j:=11; *** while (j>10) and (j<100) do begin repeat if j mod count=0 then rishoni:=false; count:=count+1; until (j=count); *** count:=2; if rishoni then writeln(j) rishoni:=true; *** j:=j+1; end; end.​
 

double X

New member
לגבי התנאי בUNTIL

לדעתי, כשמתקיים ש COUNT=J, הלולאה לא מתבצעת שוב. אבל אני לא זוכרת כל כך אם זו הלוגיקה של פסקל, אז מקסימום, אם זה עדיין ידפיס את כל המספרים, תנסי לשנות את התנאי ל COUNT=J-1 .
 

double X

New member
ודבר אחרון

בשורה הרביעית מהסוף, הוצאתי את האיתחול של RISHONI=TRUE מחוץ לIF. נראה לי שחסרה שם איזו נקודה פסיק :)
 

pel8

New member
אוייי תודה! ואני יכולה עוד שאלה?

תודה רבה רבה רבה רבה רבה רבה לך..... כבר מתנפץ לי הראש ולא שמתי לב לשינויים הקטנים..... אני יכולה עוד שאלה? היינו צריכים לכתוב תוכנית שמחשבת ומדפיסה סכום ספרות של מספר טבעי שנקלט אם סכום הספרות גדול מספרה אחת יש לחשב את סכום הספרות שוב ושוב עד שזה יגע למספר אחד.... הנה מה שעשית: program hw; var count,num,sum:integer; begin writeln('please enter a number'); readln(num); count:=0; sum:=0; while num>0 do begin sum:=sum+num mod 10; num:=num div 10; end; writeln(sum); if sum>10 then while sum>0 do begin count:=count+sum mod 10; sum:=sum div 10; end; writeln(count); end. הבעיה היא שתוכנית עובדת רק על מס' קטנים יותר מאלף.... מה לעשות? איפה הבעיה....?
 

double X

New member
את בטוחה?

על המספר 1000 עצמו זה לא עובד? ו1024 נניח? זה אמור לעבוד... הבעיה שלך היא אחרת, ואני אתן לך דוגמא: נניח ואת מכניסה את המספר 4979. סכום הספרות הוא 29. לפי התוכנית שלך, הסכום הזה נכנס לעוד לולאה שאמורה לסכום גם אותו. אבל סכום הספרות של 29 הוא 11, שעדיין דו-ספרתי... הכיוון שלך צריך להיות לולאה אחת בלבד שלא מסתיימת עד שסכום הספרות קטן מ 10 , ובתוכה לדאוג לסכום את הספרות שוב ושוב. תחשבי על זה ונסי לשנות את התוכנית שלך.
 

pel8

New member
אבל אני חושבת על זה על הבוקר!

ולא עולה לי רעיון... תני לי כיוון.... בבקשה..............
 
למעלה