C
Arama ve filtreleme
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.
Örnek çözümü göster
#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;
}
Kendini test et
-
Arama araçlarını eşle
- strcmp
- Dize karşılaştırma
- Book *
- Dönüş türü
- NULL
- Bulunamadı
- lib->count
- Döngü sınırı
-
find_by_title kitabı bulamazsa ne döndürür?
Cevabı göster
NULL — Bulunamazsa NULL döndürür; çağıran NULL denetler.
-
strcmp karşılaştırmasını tamamla
if (____(lib->books[i].title, title) == 0) return &lib->books[i];
Cevabı göster
if (strcmp(lib->books[i].title, title) == 0) return &lib->books[i];
Sıradaki ders: Birleştirme