4.6 מערכת הרצאה
הפונקציה time מחזירה את הזמן הנוכחי, כלומר את מספר השניות שחלפו מאז 1 בינואר 1970 (מה שנקרא Epoch time). היא מקבלת מצביע למשתנה מסוג time_t, ומחזירה את אותו ערך גם כתוצאה.
אם מעבירים לה מצביע, היא גם שומרת את התוצאה שם:
הערך הזה לא קריא למשתמש – אבל ניתן להמיר אותו בעזרת ctime.
הפונקציה ctime מקבלת ערך מסוג time_t (כמו שהוחזר מ־time) ומחזירה מחרוזת קריאה שמייצגת את התאריך והשעה.
התוצאה תהיה משהו כמו:
שים לב: המחרוזת מוחזרת כמצביע למקום קבוע בזיכרון – אין צורך (ואסור) לשחרר אותה עם free.
הפונקציה sleep משהה את ביצוע התוכנית למספר שניות. היא נמצאת בקובץ <unistd.h> בלינוקס ו־POSIX, או כגרסה שונה ב־Windows.
משמשת כדרך פשוטה לבצע עיכוב (delay), לדוגמה לצורכי הדגמה או סנכרון.
הפונקציה system מריצה פקודה של מערכת ההפעלה, כאילו הקלדת אותה ב־terminal (בלינוקס) או ב־cmd (ב־Windows). היא מקבלת מחרוזת, ומחזירה את קוד היציאה של הפקודה.
שימושים נפוצים:
-
לפתוח קבצים
-
להריץ סקריפטים
-
לבצע פעולות חיצוניות מהתוכנית
שימוש ב־system מסוכן אם התוכן מגיע מהמשתמש – עלול לאפשר הרצת קוד זדוני (shell injection). אין להשתמש בפונקציה זו ללא הבנה מלאה של הסיכונים.
הפונקציה exit מסיימת את ריצת התוכנית באופן מיידי. היא מקבלת קוד יציאה (בדרך כלל 0 אם הצליח, ערך אחר אם הייתה שגיאה).
אפשר גם להשתמש ב־atexit כדי לרשום פונקציות שירוצו לפני היציאה. השימוש ב־exit עוצר הכל, כולל לולאות, ללא חזרה מהפונקציה הראשית.
הפונקציה getenv מאפשרת לקרוא ערך של משתנה סביבה (Environment Variable). מערכת ההפעלה מחזיקה רשימת משתנים שמייצגים מידע חשוב כמו שם המשתמש, נתיב הבית, קבצי קונפיגורציה ועוד.
משתנים נפוצים:
- "PATH" – נתיב הפקודות
- "USER" או "USERNAME"
- "HOME" או "APPDATA"
הערך שמוחזר הוא מצביע – אין לשנות או לשחרר אותו. אם המשתנה לא קיים, מוחזר NULL.
הפונקציה rand מחזירה מספר שלם פסאודו־אקראי. כל קריאה ל־rand תחזיר מספר בין 0 לבין RAND_MAX (ערך קבוע שמוגדר ב־stdlib.h, בדרך כלל 32767).
בפועל, המספרים ש־rand מייצרת אינם באמת אקראיים – אלא נובעים מאלגוריתם קבוע, והם תלויים במה שנקרא "seed". לכן, אם תריץ את התוכנית פעמיים בלי לשנות seed, תקבל את אותה סדרת מספרים.
אם רוצים מספר אקראי בטווח מסוים, אפשר להשתמש באופרטור מודולו:
או:
הפונקציה srand (קיצור של seed rand) מגדירה את נקודת ההתחלה של סדרת המספרים ש־rand תפיק. אם לא נקרא ל־srand, נקבל תמיד את אותה הסדרה.
בדרך כלל רוצים שהמספרים יהיו שונים בכל הרצה של התוכנית – ולכן משתמשים בזמן הנוכחי כ־seed:
השילוב הזה גורם לכך שבכל הרצה תתקבל סדרת מספרים שונה.
דוגמה מלאה:
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
int main() {
srand(time(NULL));
for (int i = 0; i < 5; i++) {
printf("%d\n", rand() % 100); // מספרים בין 0 ל־99
}
return 0;
}
לסיכום:
-
randמחזירה מספר אקראי -
srandקובעת את מקור האקראיות (seed) -
כדי לקבל תוצאות שונות כל פעם, קרא
srand(time(NULL))פעם אחת בתחילת התוכנית -
תמיד תבדוק שהתוצאה היא בטווח הרצוי, עם
%או חישוב אחר