4.6 מערכת הרצאה

הפונקציה time מחזירה את הזמן הנוכחי, כלומר את מספר השניות שחלפו מאז 1 בינואר 1970 (מה שנקרא Epoch time). היא מקבלת מצביע למשתנה מסוג time_t, ומחזירה את אותו ערך גם כתוצאה.

#include <time.h>

time_t now = time(NULL);
printf("מספר השניות מאז 1970: %ld\n", now);

אם מעבירים לה מצביע, היא גם שומרת את התוצאה שם:

time_t now;
time(&now);

הערך הזה לא קריא למשתמש – אבל ניתן להמיר אותו בעזרת ctime.


הפונקציה ctime מקבלת ערך מסוג time_t (כמו שהוחזר מ־time) ומחזירה מחרוזת קריאה שמייצגת את התאריך והשעה.

time_t now = time(NULL);
char *str = ctime(&now);
printf("התאריך הנוכחי הוא: %s", str);

התוצאה תהיה משהו כמו:

התאריך הנוכחי הוא: Wed Jul 2 23:01:34 2025

שים לב: המחרוזת מוחזרת כמצביע למקום קבוע בזיכרון – אין צורך (ואסור) לשחרר אותה עם free.


הפונקציה sleep משהה את ביצוע התוכנית למספר שניות. היא נמצאת בקובץ <unistd.h> בלינוקס ו־POSIX, או כגרסה שונה ב־Windows.

#include <unistd.h>

printf("מחכה 3 שניות...\n");
sleep(3);
printf("נמשיך אחרי ההשהיה\n");

משמשת כדרך פשוטה לבצע עיכוב (delay), לדוגמה לצורכי הדגמה או סנכרון.


הפונקציה system מריצה פקודה של מערכת ההפעלה, כאילו הקלדת אותה ב־terminal (בלינוקס) או ב־cmd (ב־Windows). היא מקבלת מחרוזת, ומחזירה את קוד היציאה של הפקודה.

system("ls"); // בלינוקס – מציג את תוכן התיקייה הנוכחית

שימושים נפוצים:

  • לפתוח קבצים

  • להריץ סקריפטים

  • לבצע פעולות חיצוניות מהתוכנית

שימוש ב־system מסוכן אם התוכן מגיע מהמשתמש – עלול לאפשר הרצת קוד זדוני (shell injection). אין להשתמש בפונקציה זו ללא הבנה מלאה של הסיכונים.


הפונקציה exit מסיימת את ריצת התוכנית באופן מיידי. היא מקבלת קוד יציאה (בדרך כלל 0 אם הצליח, ערך אחר אם הייתה שגיאה).

if (בעיה_חמורה) {
    printf("שגיאה קריטית. סיום התוכנית.\n");
    exit(1);
}

אפשר גם להשתמש ב־atexit כדי לרשום פונקציות שירוצו לפני היציאה. השימוש ב־exit עוצר הכל, כולל לולאות, ללא חזרה מהפונקציה הראשית.


הפונקציה getenv מאפשרת לקרוא ערך של משתנה סביבה (Environment Variable). מערכת ההפעלה מחזיקה רשימת משתנים שמייצגים מידע חשוב כמו שם המשתמש, נתיב הבית, קבצי קונפיגורציה ועוד.

char *home = getenv("HOME");
if (home != NULL) {
    printf("תיקיית הבית: %s\n", home);
}

משתנים נפוצים:
- "PATH" – נתיב הפקודות
- "USER" או "USERNAME"
- "HOME" או "APPDATA"

הערך שמוחזר הוא מצביע – אין לשנות או לשחרר אותו. אם המשתנה לא קיים, מוחזר NULL.

הפונקציה rand מחזירה מספר שלם פסאודו־אקראי. כל קריאה ל־rand תחזיר מספר בין 0 לבין RAND_MAX (ערך קבוע שמוגדר ב־stdlib.h, בדרך כלל 32767).

#include <stdlib.h>
#include <stdio.h>

int r = rand();
printf("מספר אקראי: %d\n", r);

בפועל, המספרים ש־rand מייצרת אינם באמת אקראיים – אלא נובעים מאלגוריתם קבוע, והם תלויים במה שנקרא "seed". לכן, אם תריץ את התוכנית פעמיים בלי לשנות seed, תקבל את אותה סדרת מספרים.

אם רוצים מספר אקראי בטווח מסוים, אפשר להשתמש באופרטור מודולו:

int r = rand() % 10; // מספר בין 0 ל־9

או:

int min = 5, max = 15;
int r = min + rand() % (max - min + 1); // מספר בין 5 ל־15

הפונקציה srand (קיצור של seed rand) מגדירה את נקודת ההתחלה של סדרת המספרים ש־rand תפיק. אם לא נקרא ל־srand, נקבל תמיד את אותה הסדרה.

srand(42); // תמיד תיתן את אותה סדרת מספרים

בדרך כלל רוצים שהמספרים יהיו שונים בכל הרצה של התוכנית – ולכן משתמשים בזמן הנוכחי כ־seed:

#include <stdlib.h>
#include <time.h>

srand(time(NULL));

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

דוגמה מלאה:

#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)) פעם אחת בתחילת התוכנית

  • תמיד תבדוק שהתוצאה היא בטווח הרצוי, עם % או חישוב אחר