Birleştirme
- C kursu
- Orta seviye
- Ders 116/116
- 6 dk
Tüm parçaları birleştirerek çalışan bir uygulama yazarsın.
Birleştirme
Son derste tüm parçaları birleştirirsin. task_free fonksiyonu, bağlı listenin tüm düğümlerini serbest bırakır. main ise oluşturma, kaydetme, yükleme, yazdırma, sayma ve temizleme adımlarını sırayla yapar.
task_free, listede dolaşır ve her düğümü free ile iade eder; sonunda *list = NULL yapar. main iki görev ekler, dosyaya kaydeder, listeyi serbest bırakır, dosyadan yükler, listeyi yazdırır, yüksek öncelikli sayısını hesaplar ve temizler. Bu, gerçek bir konsol uygulamasının iskeletidir: veri oluştur, kalıcı depola, geri yükle, göster ve temizle. Proje tamamlandığında orta seviye C becerilerin sentezlenmiş olur.
Uygulama Tüm parçaları birleştir
void task_free(Task **list) yaz; listede dolaş, her düğümü free et, *list = NULL yap. main içinde: iki görev ekle, task_save(g_list, "tasks.txt"); çağır, task_free(&g_list); yap, task_load(&g_list, "tasks.txt"); çağır, printf("liste:\n"); yaz, task_print(g_list); çağır, yüksek sayısını yazdır, task_free(&g_list); yap, printf("bitti\n"); yaz.
Başlangıç kodu
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Task {
char name[32];
int priority;
struct Task *next;
} Task;
Task *g_list = NULL;
Task *task_new(const char *name, int priority) {
Task *t = malloc(sizeof(Task));
strncpy(t->name, name, 31);
t->name[31] = '\0';
t->priority = priority;
t->next = NULL;
return t;
}
void task_push_front(Task **list, Task *t) {
t->next = *list;
*list = t;
}
void task_print(const Task *list) {
const Task *cur = list;
while (cur) {
printf("%s: %d\n", cur->name, cur->priority);
cur = cur->next;
}
}
typedef int (*TaskFilter)(const Task *);
int is_high_priority(const Task *t) {
return t->priority >= 3;
}
int task_count_if(const Task *list, TaskFilter filter) {
int count = 0;
const Task *cur = list;
while (cur) {
if (filter(cur)) count++;
cur = cur->next;
}
return count;
}
int task_save(const Task *list, const char *path) {
FILE *f = fopen(path, "w");
if (!f) return 0;
const Task *cur = list;
while (cur) {
fprintf(f, "%s %d\n", cur->name, cur->priority);
cur = cur->next;
}
fclose(f);
return 1;
}
int task_load(Task **list, const char *path) {
FILE *f = fopen(path, "r");
if (!f) return 0;
char name[32];
int priority;
while (fscanf(f, "%31s %d", name, &priority) == 2) {
task_push_front(list, task_new(name, priority));
}
fclose(f);
return 1;
}
// task_free fonksiyonunu yaz
// main'de kaydet, serbest bırak, yükle, yazdır, say, serbest bırak, bitti yazdır
int main(void) {
task_push_front(&g_list, task_new("Ödeme", 1));
task_push_front(&g_list, task_new("Paketle", 3));
task_save(g_list, "tasks.txt");
Task *cur = g_list;
while (cur) { Task *n = cur->next; free(cur); cur = n; }
g_list = NULL;
task_load(&g_list, "tasks.txt");
int high = task_count_if(g_list, is_high_priority);
printf("yüksek: %d\n", high);
return 0;
}Örnek çözüm
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Task {
char name[32];
int priority;
struct Task *next;
} Task;
Task *g_list = NULL;
Task *task_new(const char *name, int priority) {
Task *t = malloc(sizeof(Task));
strncpy(t->name, name, 31);
t->name[31] = '\0';
t->priority = priority;
t->next = NULL;
return t;
}
void task_push_front(Task **list, Task *t) {
t->next = *list;
*list = t;
}
void task_print(const Task *list) {
const Task *cur = list;
while (cur) {
printf("%s: %d\n", cur->name, cur->priority);
cur = cur->next;
}
}
typedef int (*TaskFilter)(const Task *);
int is_high_priority(const Task *t) {
return t->priority >= 3;
}
int task_count_if(const Task *list, TaskFilter filter) {
int count = 0;
const Task *cur = list;
while (cur) {
if (filter(cur)) count++;
cur = cur->next;
}
return count;
}
int task_save(const Task *list, const char *path) {
FILE *f = fopen(path, "w");
if (!f) return 0;
const Task *cur = list;
while (cur) {
fprintf(f, "%s %d\n", cur->name, cur->priority);
cur = cur->next;
}
fclose(f);
return 1;
}
int task_load(Task **list, const char *path) {
FILE *f = fopen(path, "r");
if (!f) return 0;
char name[32];
int priority;
while (fscanf(f, "%31s %d", name, &priority) == 2) {
task_push_front(list, task_new(name, priority));
}
fclose(f);
return 1;
}
void task_free(Task **list) {
Task *cur = *list;
while (cur) {
Task *n = cur->next;
free(cur);
cur = n;
}
*list = NULL;
}
int main(void) {
task_push_front(&g_list, task_new("Ödeme", 1));
task_push_front(&g_list, task_new("Paketle", 3));
task_save(g_list, "tasks.txt");
task_free(&g_list);
task_load(&g_list, "tasks.txt");
printf("liste:\n");
task_print(g_list);
int high = task_count_if(g_list, is_high_priority);
printf("yüksek: %d\n", high);
task_free(&g_list);
printf("bitti\n");
return 0;
}Beklenen çıktı
liste: Ödeme: 1 Paketle: 3 yüksek: 1 bitti
Proje tamamlandı
Tebrikler! Beş derslik görev yöneticisi projesini tamamladın. Bu projede struct, bağlı liste, fonksiyon işaretçisi ve dosya I/O kavramlarını birleştirdin.
Program artık görev oluşturuyor, listeye ekliyor, dosyaya kaydediyor, geri yüklüyor, yazdırıyor, filtreliyor ve belleği temiz bir şekilde serbest bırakıyor. Bu, orta seviye C programcısının bilmesi gereken tüm temel becerileri kapsar. İleri seviyede sistem programlama, çoklu işlem ve çekirdek temelleri seni bekliyor. Sağlam bir temel attın; bundan sonraki adımlar daha derin ve daha güçlü olacak.
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 task_free ne yapar?
- Listeye yeni görev ekler
- Listedeki tüm düğümleri serbest bırakır Doğru cevap
- Listeyi dosyaya kaydeder
- Listeyi yazdırır
Açıklama: task_free her düğümü free ile iade eder ve listeyi NULL yapar.
2 Birleştirme adımlarını eşle
| Kavram | Anlamı |
|---|---|
task_push_front |
Görev ekle |
task_save |
Dosyaya kaydet |
task_load |
Dosyadan yükle |
task_free |
Belleği temizle |
3 task_free gövdesini tamamla
free(____);
free(cur);
Açıklama: free(cur); geçerli düğümü serbest bırakır.