שפת C/שימוש בספריות

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

מעט על קבצי כותרת

עריכה

קובץ כותרת (header file בלעז) הוא קובץ שמכיל לרוב הצהרות על פונקציות, או, במילים אחרות, תאור למהדר לגבי פונקציות שמוגדרות במקום אחר. לקבצי כותרת בשפת C יש לרוב הסיומת .h (לדוגמה, stdio.h). תוכל לקרוא עוד על קבצי כותרת בהכלת קבצים על ידי הקדם מעבד.

צעדי השימוש בספריות

עריכה

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

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

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

  1. מציאת הספריה המתאימה
  2. מציאת קובץ הכותרת המתאים
  3. הוספת פקודה להכלת קובץ הכותרת
  4. קישור הספריה

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

מציאת הספריה המתאימה

עריכה

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

מציאת קובץ הכותרת המתאים בספרייה

עריכה

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

  • הקובץ stdio.h עוסק בקלט ופלט. בשלום עולם!, פלט וקלט, מחרוזות, ופלט וקלט קבצים השתמשנו בפונקציות printf, scanf, getchar, putchar, gets, puts ובמבנה FILE מתוכו.
  • הקובץ string.h עוסק במחרוזות. במחרוזות השתמשנו בפונקציות strlen, strcpy, strcat מתוכו.
  • הקובץ stdlib.h כולל פעולות סטנדרטיות רבות באופן כללי. בניהול זיכרון דינאמי השתמשנו בפונקציות malloc, free, callc, realloc מתוכו.
  • הקובץ math.h כולל פונקציות מתמטיות רבות, לדוגמה פונקציות טריגונומטריות.
  • הקובץ assert.h כולל את המאקרו assert, אותו ראינו בקדם מעבד.
  • הקובץ time.h כולל פונקציות רבות שקשורות בזמן, כגון time.
  • הקובץ ctype.h מכיל בתוכו פונקציות רבות הקשורות לבדיקת קלט, למשל על מנת לבדוק אם התו הוא אות באנגלית. פונקציות: isalpha, isalnum, isdigit ועוד.
  • הקובץ stdarg.h מאפשר לנו ליצור פונקציות בעלות מערך של משתנים שמספר איבריו לא ידוע מראש ומשתנה בכל קריאה.
  • הקובץ errno.h מאפשר לנו לטפל בשגיאות.
  • הקובץ stddef.h מכיל הגדרות מקרו כלליות.
  • הקבצים float.h ו limits.h מכילים בתוכם הגדרות של אורכי משתנים מבחינת זיכרון.
  • הקובץ signal.h מטפל באותות של התוכנית.
  • הקובץ Windows.h מאפשר להוציא צלילים מן המחשב בעזרת פונקציית (Beep(frequency,duration-milisecondes

וגם גישה לפורט חיצוני בעזרת הפונקציות (In32(Hardware Address- פורט כניסה, והפונקציה (Out32(Hardware Address,Value-in hexadecimal number. והפונקציה (Sleep(time-in milisecodes שגורמת להשהייה. קבצים נוספים: setjmp.h ,locale.h, iso646.h.

הפקודה להכלת קובץ הכותרת

עריכה

כדי להכיל קובץ כותרת, לדוגמה stdlib.h, יש לכתוב

#include <stdlib.h>

תוכל לקרוא עוד על הסימון # בקדם מעבד.

קישור הספריה

עריכה

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

דוגמה: חישוב סינוס

עריכה

נניח שאנו רוצים לקלוט מעלה (ברדיאנים) מהמשתמש, ולחשב את הסינוס שלו. שפת C איננה כוללת פקודה מיוחדת לחישוב סינוס (או כל פונקציה טריגונומטרית אחרת), אך כבר ראינו שהשפה כוללת פעולות חשבוניות. נוכל להשתמש בטור טיילור, לכן, כפי שעשינו בתרגיל קירוב סינוס על ידי טור טיילור. הנה הפיתרון המופיע שם, המתבסס על קירוב ע"י 10 האיברים הראשונים בטור:

#include <stdio.h>


int main()
{
  float angle;
  unsigned int i;  
  float sinus = 0;
  
  int sign = 1;
  unsigned long int factorial = 1;
  float power;

  printf("Please enter angle: ");
  scanf("%f", &angle);
  
  power = angle;
  
  for(i = 0; i < 10; ++i)
  {
    sinus += sign * power / factorial;
        
    sign = -sign;
    factorial *= (2 * i + 2) * (2 * i + 3);
    power *= angle * angle;
  }
  
  printf("sin(%f) ~= %f\n", angle, sinus);
}

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

  • מדוע החלטנו להשתמש דווקא ב10 איברים?
  • מה בכלל ערך השגיאה? האם לקחנו בחשבון שערך השגיאה גדל יחד עם המעלה הנקלטת (בערך מוחלט)?
  • האם כלל השתמשנו במחזוריות סינוס?

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

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

#include <stdio.h>
#include <math.h>


int main()
{
  float angle;
  
  printf("Please enter angle: ");
  scanf("%f", &angle);
  
  printf("sin(%f) ~= %f\n", angle, sin(angle));
}

זוהי אלטרנטיבה קצרה ובטוחה יותר.


הפרק הקודם:
מודולים
שימוש בספריות
תרגילים
הפרק הבא:
נספחים