תוכנה קטנה בפסקל שבניתי. התוכנית בתגובה #3 והקוד שלה בתגובה #4 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

תוכנה קטנה בפסקל שבניתי. התוכנית בתגובה #3 והקוד שלה בתגובה #4


PhoenixBoy

Recommended Posts

תודה.

התחלתי אתמול ללמוד פסקל כדי לדעת יותר לפני שאני אלמד את זה בבה"ס.

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

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

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

הורדה:

http://Rar.Co.iL/files/Rar-1125746172.rar

קישור לתוכן
שתף באתרים אחרים

הנה הקוד:

Program Colors;

Uses Crt;

Var
ColorNum, StartNum, EndNum: integer;

Begin
ClrScr;
TextColor(15);
Write('Enter start number: ');
ReadLn(StartNum);
Write('Enter end number: ');
ReadLn(EndNum);
Repeat
If EndNum<StartNum Then
Begin
ClrScr;
TextColor(12);
WriteLn('Please enter a higher number.');
TextColor(15);
Write('Enter end number: ');
ReadLn(EndNum);
End
Else

ClrScr;

For ColorNum := StartNum to EndNum do
Begin
TextColor(ColorNum);
WriteLn(ColorNum);
End;
Until (EndNum>StartNum) OR (EndNum=StartNum);
TextColor(15);
Write('Press any key to quit.');
ReadKey;
End.

קישור לתוכן
שתף באתרים אחרים

ReadLn לא מסוגלת למנוע קלט מסוים.

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

(אם הייתי זוכר טיפה פסקל, אולי הייתי זוכר איך קוראים לפונקציה הזו ואם היא בכלל קיימת)

קישור לתוכן
שתף באתרים אחרים

נחמד מאוד

רק טיפ קטן: במקום לבדוק בנפרד אם EndNum>StartNum ואם EndNum=StartNum, אתה יכול להשתמש באופרטור => או =< (כאשר סימן השווה הוא מימין לסימן הגדול/קטן). כך שהמשמעות של

(EndNum>StartNum) OR (EndNum=StartNum)

זהה ל

EndNum>=StartNum

קישור לתוכן
שתף באתרים אחרים

קודם כל נחמד מאוד.

אבל ניתן ליעל את התוכנה.

במקום להשתמש בלולאת REPEAT UNTIL ובתנאי IF, ניתן להשתמש רק בלולאת WHILE,

אשר יותר ברורה גם לעין (לפי דעתי).

While (EndNum<StartNum) do
  begin
   clrscr;
   writeln('enter number higher then : ',StartNum);
   readln(EndNum);
  end;

for ColorNum:= StartNum to EndNum do
  begin
   textcolor(ColorNum);
   writeln(ColorNum);
  end;

אם אתה רוצה לעשות את התוכנית יותר מעניינת, אז הינה לך משימה.

קלוט 2 מספרים, כאשר מספר אחד התחלתי ומספר שני סופי.

אם המספר ההתחלתי קטן מהסופי, הצג את המספרים בינהם לפי הסדר,

אחרת

אם המספר הסופי קטן מהמספר ההתחלתי הצג את המספרים בינהם בסדר יורד.

לדוגמא : עבור הקלט 3,1 התוכנה תציג :

1

2

3

עבור הקלט 1,3 התוכנה תציג :

3

2

1

(רמז : השתמש בdownto).

הינה לך משימה קטנה שחשבתי עליה עכשיו.

בהצלחה,

רן. ;)

קישור לתוכן
שתף באתרים אחרים

קודם כל נחמד מאוד.

אבל ניתן ליעל את התוכנה.

במקום להשתמש בלולאת REPEAT UNTIL ובתנאי IF, ניתן להשתמש רק בלולאת WHILE,

אשר יותר ברורה גם לעין (לפי דעתי).

While (EndNum<StartNum) do
begin
clrscr;
writeln('enter number higher then : ',StartNum);
readln(EndNum);
end;

for ColorNum:= StartNum to EndNum do
begin
textcolor(ColorNum);
writeln(ColorNum);
end;

אם אתה רוצה לעשות את התוכנית יותר מעניינת, אז הינה לך משימה.

קלוט 2 מספרים, כאשר מספר אחד התחלתי ומספר שני סופי.

אם המספר ההתחלתי קטן מהסופי, הצג את המספרים בינהם לפי הסדר,

אחרת

אם המספר הסופי קטן מהמספר ההתחלתי הצג את המספרים בינהם בסדר יורד.

לדוגמא : עבור הקלט 3,1 התוכנה תציג :

1

2

3

עבור הקלט 1,3 התוכנה תציג :

3

2

1

(רמז : השתמש בdownto).

הינה לך משימה קטנה שחשבתי עליה עכשיו.

בהצלחה,

רן. ;)

הבנתי... לא חשבתי על זה =] אני אעשה את זה.

קישור לתוכן
שתף באתרים אחרים

הנה עשיתי:

http://Rar.Co.iL/files/Rar-1125848660.rar

יש לי שאלה, איך עושים בפסקל? אני רוצה דרך הרמקול הפנימי של המחשב....

גם סידרתי את הקוד...

ואני חושב שהוא יותר יעיל עכשיו...

Program Colors;

Uses Crt;

Var
ColorNum, StartNum, EndNum: integer;

Begin
ClrScr;
TextColor(15);
Write('Enter start number: ');
ReadLn(StartNum);
Write('Enter end number: ');
ReadLn(EndNum);

ColorNum := 0;
ClrScr;
If EndNum<StartNum Then { If end number is higher then start number }
Begin
Repeat
For ColorNum := StartNum downto EndNum do
Begin
TextColor(ColorNum);
WriteLn(ColorNum);
End;
Until (EndNum<=StartNum);
End
Else { If end number is lower then/equal to start number }
Begin
Repeat
For ColorNum := StartNum to EndNum do
Begin
TextColor(ColorNum);
WriteLn(ColorNum);
End;
Until (EndNum>=StartNum);
End;


TextColor(15);
Write('Press any key to quit.');
ReadKey;
End.

קישור לתוכן
שתף באתרים אחרים

אם אני לא טועה הפונקציה היא sound.

אתה יכול לחפש בINDEX על מנת להיות בטוח ולקבל הסבר.

אתה רושם את ה"סאונד" ומספר "סידורי" כלשהו (כמו בצבעים, מספר=צבע. פה מספר=צליל מסויים).

sound(400);

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

לכן יש את הפקודה

nosound;

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

לכן יש פקודה נוספת :

delay(x);

פקודה זו "תוקעת" את התוכנית למספר מאיות שניה (MS) לפי הפרמטר בסוגריים (X).

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

נעשה זאת בשילוב 3 הפקודות שהצגתי :

sound(X);
delay(Y);
nosound;

הינה למדת עוד שטויות בפסקל.

;)

רן.

קישור לתוכן
שתף באתרים אחרים

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

Program Sound;

Uses Crt;

Begin
Sound(5000);
Delay(20000);
NoSound;
End.

כשאני מנסה להדר אני מקבל שגיאה:

Error 94: "." expected.

קישור לתוכן
שתף באתרים אחרים

אל תקרא לתוכנית שלך על שם שמור (sound), קרא לה S_ound אם משו אחר.

אולי זה יפתור את הבעיה.

בכל מקרה, הדילאי שלך נראה גבוהה למדי, יכול להיות שהתוכנית תתקע הרבה זמן. (זה 20 שניות לפי החישובים שלי, תעשה 2 שניות, מה צריך לחכות?)

תוריד 0 אחד.

לגבי התוכנית שלך (עכשיו חזרתי הביתה אני מסתכל) :

א) איפוס המשתנה colornum מיותר לחלוטין, מכיוון שכפי שהסברתי (לא זוכר אם בתארד הזה) בלולאת FOR מתבצעת הצבה בזקיף הלולאה

(במקרה שלנו - colornum),

לכן לא משנה איזה "ג'נק" (זבל) יהיה במשתנה הזה, ברגע שלולאת הFOR תחל, יוצב הערך ההתחלתי בזקיף הלולאה.

(במקרה שלנו זStartNum יוצב בColorNum).

ב) לא הבנתי למה השימוש בלולאת REPEAT UNTIL. אתה סתם יוצר לולאה אין סופית.

ניסית להריץ את התוכנית?

אין לך בכלל צורך בלולאת WHILE/REPEAT UNTIL (לולאת תנאי).

שים לב שבתוכנית שלך, נניח הקלט הוא 1 ואז 3. תגיע שורת הבדיקה הראשונה

(שאגב, יותר נורמלי לרשום אותי הפוך, כך : StartNum>EndNum, יותר נוח לעין ולמשפט עזר שהוספת בצד, השתמשת

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

את זה כפי שציינתי).

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

או שהם שווים, כמובן.

לאחר מכן (ELSE) -

התוכנית נכנסת ללולאת REPEAT UNTIL מיותרת לחלוטין (גם הלולאה REPEAT UNTIL בIF הראשון מיותרת מאותה סיבה)

ואף עלולה לתקוע את התוכנית! מכיוון שאנו לא קולטים יותר נתונים למשתנים, ולכן הערכים הנוכחים במשתנים (1 ו-3) לא ישתנו לעולם.

אם התנאי היה FALSE הלולאה הייתה נכנסת לסבב נוסף, מכיוון שזו לולאת REPEAT UNTIL, הלולאה תחזור עד אשר תנאי מסויים יקרה,

כל עוד התנאי לא קורה (FALSE) הלולאה תחזור על עצמה.

בתוכנית שלך, הערכים endnum ו startnum אינם משתנים בזמן הFOR (ולא צרכים גם להשתנות) ולכן הלולאה של REPEAT UNTIL מיותרת.

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

המספר הסופי 3 יותר גדול(או שווה) למספר ההתחלתי 1.

לכן לולאת REPEAT UNTIL מיותרת לחלוטין ולא עושה שום שימוש בתוכנית.

לולאת ה-FOR היא זו שחוזרת על עצמה לפי המספרים ההתחלתים והסופיים (אני מניח שאתה יודע את זה).

נ.ב.

----

במהלך ההסבר שלי שהסתכלתי שוב על התוכנית שלך, בילבל אותי לגמרי הפעולה וההסבר הבאים :

 If EndNum<StartNum Then { If end number is higher then start number }

התנאי הוא EndNum<StartNum וההסבר הוא "אם המספר הסופי גדול מהמספר ההתחלתי",

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

רן.

קישור לתוכן
שתף באתרים אחרים

וואו יש לך תגובות מעולות! אני לומד מהן הרבה...

בקשר לסאונד צדקת, הבעיה היתה בשם.

בקשר להערוה שרשמתי - אני בטעות שכחתי להחליף את ההערות...

והלולאת repeat נועדה כדי להציג את המספר ואת הצבע שהוא מייצג.

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...