CodeBlanks Logo Icon CodeBlanks

Arama ve filtreleme

  • C kursu
  • Orta seviye
  • Ders 68/116
  • 6 dk

Fonksiyon işaretçileriyle arama ve filtreleme yazarsın.

Başlığa göre arama

Bir kitabı başlığa göre bulmak için find_by_title fonksiyonu yazılır. İmza: Book *find_by_title(Library *lib, const char *title). Dönüş türü Book *; bulunan kitabın adresi ya da NULL.

Gövde: for (int i = 0; i < lib->count; i++) ile koleksiyonu dolaş; if (strcmp(lib->books[i].title, title) == 0) return &lib->books[i];. strcmp iki dizeyi karşılaştırır; 0 eşit demektir. Döngü bitince return NULL;. Bu desen, C'de arama fonksiyonlarının standart yazımıdır; işaretçi dönüşü hem sonucu hem başarısızlığı taşır.

Filtreleme desenleri

Bir koleksiyonu filtrelemek için koşul fonksiyonu kullanılır: typedef int (*BookPred)(Book *);. BookPred, bir Book alıp int döndüren fonksiyon işaretçisidir. filter fonksiyonu bu işaretçiyi alır ve koşulu sağlayan kitapları yazdırır.

Örnek koşul: int is_borrowed(Book *b) { return b->borrowed; }. filter içinde for ile dolaş, if (pred(&lib->books[i])) ile koşulu çağır. Bu, fonksiyon işaretçilerinin gerçek bir kullanımıdır; koşul değişse bile filter aynı kalır. Bu teknik, C'de nesne yönelimli olmayan dillerde strateji deseninin karşılığıdır.

Uygulama find_by_title ekle

Var olan koda Book *find_by_title(Library *lib, const char *title) ekle. Gövde: for (int i = 0; i < lib->count; i++) ile dolaş; if (strcmp(lib->books[i].title, title) == 0) return &lib->books[i];; döngü sonunda return NULL;. main'de bir kitap ekle, Book *found = find_by_title(&lib, "C Tutorial"); ve if (found) print_book(found); çağır.

Başlangıç kodu

main.c
#include <stdio.h>
#include <string.h>

typedef struct {
    char title[64];
    int year;
    int borrowed;
} Book;

typedef struct {
    char name[64];
    int id;
} Member;

typedef struct {
    Book books[10];
    int count;
} Library;

void library_init(Library *lib) {
    lib->count = 0;
}

void library_add(Library *lib, Book b) {
    lib->books[lib->count++] = b;
}

void print_book(Book *b) {
    printf("Book: %s (%d)\n", b->title, b->year);
}

int checkout(Book *b) {
    if (b->borrowed) return 0;
    b->borrowed = 1;
    return 1;
}

int return_book(Book *b) {
    if (!b->borrowed) return 0;
    b->borrowed = 0;
    return 1;
}

int main(void) {
    Library lib;
    library_init(&lib);
    Book b1 = {"C Tutorial", 2024, 0};
    library_add(&lib, b1);
    checkout(&lib.books[0]);
    printf("%d\n", lib.books[0].borrowed);
    return_book(&lib.books[0]);
    printf("%d\n", lib.books[0].borrowed);
    return 0;
}

// find_by_title fonksiyonunu yaz
// main'de find_by_title ile "C Tutorial" ara ve print_book çağır

Örnek çözüm

main.c
#include <stdio.h>
#include <string.h>

typedef struct {
    char title[64];
    int year;
    int borrowed;
} Book;

typedef struct {
    char name[64];
    int id;
} Member;

typedef struct {
    Book books[10];
    int count;
} Library;

void library_init(Library *lib) {
    lib->count = 0;
}

void library_add(Library *lib, Book b) {
    lib->books[lib->count++] = b;
}

void print_book(Book *b) {
    printf("Book: %s (%d)\n", b->title, b->year);
}

int checkout(Book *b) {
    if (b->borrowed) return 0;
    b->borrowed = 1;
    return 1;
}

int return_book(Book *b) {
    if (!b->borrowed) return 0;
    b->borrowed = 0;
    return 1;
}

Book *find_by_title(Library *lib, const char *title) {
    for (int i = 0; i < lib->count; i++) {
        if (strcmp(lib->books[i].title, title) == 0) return &lib->books[i];
    }
    return NULL;
}

int main(void) {
    Library lib;
    library_init(&lib);
    Book b1 = {"C Tutorial", 2024, 0};
    library_add(&lib, b1);
    Book *found = find_by_title(&lib, "C Tutorial");
    if (found) print_book(found);
    return 0;
}

Beklenen çıktı

Book: C Tutorial (2024)

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Arama araçlarını eşle

Kavram Anlamı
strcmp Dize karşılaştırma
Book * Dönüş türü
NULL Bulunamadı
lib->count Döngü sınırı

2 find_by_title kitabı bulamazsa ne döndürür?

  • Boş Book
  • NULL Doğru cevap
  • 0
  • -1

Açıklama: Bulunamazsa NULL döndürür; çağıran NULL denetler.

3 strcmp karşılaştırmasını tamamla

Soru
if (____(lib->books[i].title, title) == 0) return &lib->books[i];
Cevap
if (strcmp(lib->books[i].title, title) == 0) return &lib->books[i];

Açıklama: strcmp iki dizeyi karşılaştırır; 0 eşit demektir.

Orta seviye bölümündeki tüm dersler