שפת 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, אותו ראינו בקדם מעבד.

[עריכה] הפקודה להכלת קובץ הכותרת

כדי להכיל קובץ כותרת, לדוגמה 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));
}

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


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