Menu
CoddyTech

פונקציה להצגת איש קשר

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C של Coddy. שיעור 53 מתוך 63.

challenge icon

אתגר

קל

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

פונקציות חדשות שבהן משתמשים בשיעור הזה:

  • fgets(buffer, size, stdin): קוראת שורת קלט, כולל רווחים (בניגוד ל־scanf, שעוצרת בתו רווח). היא שומרת את הקלט ב־buffer, וקוראת לכל היותר size - 1 תווים. היא גם שומרת את תו ירידת השורה '\n' בסוף.
  • strcspn(str, "\n"): מחזירה את האינדקס של ההופעה הראשונה של '\n' בתוך str. משתמשים בה כדי להסיר את תו ירידת השורה שנשאר בסוף בעקבות fgets: str[strcspn(str, "\n")] = '\0';
  • strchr(str, ch): מחפשת את התו ch בתוך str ומחזירה מצביע למיקומו, או NULL אם הוא לא נמצא.

התוכנית שלכם צריכה:

  1. להשתמש בהגדרה של המבנה Contact מהשיעורים הקודמים, עם השדות:
    • מערך תווים בשם name בגודל 50
    • מערך תווים בשם phone בגודל 20
    • מערך תווים בשם email בגודל 40
    • מספר שלם בשם age
  2. להשתמש באותה פונקציה createContact מהשיעורים הקודמים, אשר:
    • מקצה באופן דינמי זיכרון עבור מבנה Contact
    • מאתחלת את כל השדות לערכי ברירת מחדל
    • מחזירה מצביע לאיש הקשר
  3. לכתוב פונקציה בשם populateContact, אשר:
    • מקבלת כפרמטר מצביע למבנה Contact
    • משתמשת ב־fgets() כדי לקרוא כל שדה מחרוזת (שם, טלפון, דוא"ל), כך שאפשר יהיה להזין שמות עם רווחים
    • משתמשת ב־strcspn() כדי להסיר את תו ירידת השורה שבסוף כל שדה מחרוזת לאחר קריאתו
    • משתמשת ב־scanf("%d", ...) כדי לקרוא את שדה הגיל, שהוא מספר שלם
    • לפני קריאת כל שדה, מדפיסה בדיוק את ההנחיה המתאימה, ללא ירידת שורה אחריה: Enter name: , Enter phone: , Enter email: , Enter age: (כך ש־=== CONTACT DETAILS === מופיע באותה שורה מיד אחרי Enter age: )
    • הערה: גרסה זו של populateContact אינה כוללת בדיקת אורך של מספר הטלפון: אל תוסיפו אותה, כי בקלטי הבדיקה נעשה שימוש במספרי טלפון קצרים כמו 555-1234
  4. לכתוב פונקציה בשם displayContact, אשר:
    • מקבלת כפרמטר מצביע קבוע למבנה Contact: const struct Contact *contactPtr
    • לא מחזירה ערך (void)
    • מדפיסה את פרטי איש הקשר בדיוק בתבנית הבאה:
      • === CONTACT DETAILS ===
      • Name: [name]
      • Phone: [phone]
      • Email: [email]
      • Age: [age] years old
      • ========================
    • לאחר הצגת הפרטים הבסיסיים, מחשבת ומציגה פרטים נוספים:
      • מחשבת את אורך השם באמצעות strlen() ומדפיסה: Name length: [length] characters
      • קובעת את קטגוריית הדור לפי הגיל ומדפיסה:
        • אם הגיל בין 0 ל־12: Generation: Child
        • אם הגיל בין 13 ל־19: Generation: Teenager
        • אם הגיל בין 20 ל־39: Generation: Young Adult
        • אם הגיל בין 40 ל־59: Generation: Middle-aged Adult
        • אם הגיל הוא 60 ומעלה: Generation: Senior
      • בודקת אם כתובת הדוא"ל מכילה את התו '@' באמצעות strchr() ומדפיסה:
        • אם '@' נמצא: Email format: Valid
        • אם '@' לא נמצא: Email format: Invalid
  5. בפונקציה הראשית:
    • יוצרת איש קשר באמצעות הפונקציה createContact
    • בודקת אם יצירת איש הקשר הצליחה
    • קוראת לפונקציה populateContact כדי למלא את פרטי איש הקשר
    • קוראת לפונקציה displayContact כדי להציג את פרטי איש הקשר בתבנית המעוצבת
    • משחררת את הזיכרון שהוקצה באופן דינמי
    • מדפיסה Program completed successfully

האתגר הזה מדגים כיצד ליצור פונקציית תצוגה שמקבלת מצביע קבוע למבנה, ובכך מבטיחה שהפונקציה לא תוכל לשנות את הנתונים המקוריים. תתרגלו שימוש ב־fgets() לקריאת מחרוזות שמכילות רווחים, ב־strcspn() להסרת תווי ירידת שורה בסוף מחרוזת, באופרטור החץ כדי לגשת לשדות של מבנה דרך מצביע, ב־strchr() לחיפוש תווים, ובלוגיקה מותנית לסיווג נתונים. השימוש ב־const בהצהרת הפרמטר הוא נוהג מומלץ שמונע שינויים מקריים בפרטי איש הקשר בתוך פונקציית התצוגה.

נסו בעצמכם

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

typedef struct {
    char name[50];
    char phone[20];
    char email[40];
    int age;
} Contact;

Contact* createContact() {
    Contact* contact = (Contact*)malloc(sizeof(Contact));
    if (contact == NULL) {
        return NULL;
    }
    
    strcpy(contact->name, "");
    strcpy(contact->phone, "");
    strcpy(contact->email, "");
    contact->age = 0;
    
    return contact;
}

void populateContact(Contact* contactPtr) {
    printf("Enter name: ");
    scanf("%s", contactPtr->name);
    
    printf("Enter phone: ");
    scanf("%s", contactPtr->phone);
    
    printf("Enter email: ");
    scanf("%s", contactPtr->email);
    
    printf("Enter age: ");
    scanf("%d", &contactPtr->age);
    
    if (contactPtr->age < 0 || contactPtr->age > 120) {
        printf("Invalid age entered\n");
    } else if (strlen(contactPtr->phone) < 10) {
        printf("Invalid phone number\n");
    } else {
        printf("Contact populated successfully\n");
    }
}

int main() {
    Contact* contact = createContact();
    
    if (contact == NULL) {
        return 1;
    }
    
    populateContact(contact);
    
    printf("Contact Information:\n");
    printf("Name: %s\n", contact->name);
    printf("Phone: %s\n", contact->phone);
    printf("Email: %s\n", contact->email);
    printf("Age: %d\n", contact->age);
    
    free(contact);
    printf("Contact deleted successfully\n");
    
    return 0;
}

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

תרגלו בעצמכם: קומפיילר C אונליין