Bài 38 Khuôn dạng tệp tiêu đề

Một phần của tài liệu Bài giảng ngôn ngữ lập trình C (Trang 100 - 102)

/ *g ọi hàm g() biến b được cấp phát

Bài 38 Khuôn dạng tệp tiêu đề

Tóm tắt nội dung:

Thời lượng: 1 tiết

Trong một chương trình lớn với nhiều tệp nguồn thường thì chúng ta tạo tệp tiêu đề cho mỗi tệp nguồn. Trong mỗi tệp tiêu đề chứa khai báo nguyên mẫu hàm và cấu trúc dữ liệu có sử dụng trong tệp nguồn. Vì lí do một hàm có thể được gọi ở trong nhiều tệp nguồn khác nhau nên tệp tiêu đề cho nó cũng có thể bị dịch nhiều lần khác nhau (mỗi một #include cho tệp là một lần dịch). Để tránh nội dung của một tệp tiêu đề có thể bị dịch nhiều lần trong chương trình người ta thường viết tệp tiêu đề theo khuôn mẫu sau.

#ifndef <tên tệp tiêu đề> #define <tên tệp tiêu đề>

<các khai báo của tệp tiêu đề>

#endif

Ví dụ tệp tiêu đề "func.h": #ifndef __FUNC_H #define __FUNC_H int func1(int, int); void func2(int); int func3(); #endif

Trong lần dịch đầu tiên __FUNC_H chưa được định nghĩa nên biên dịch có điều kiện sẽ thực hiện dịch nội dung có trong tệp tiêu đề. Nhưng đến khi dịch lần thứ hai do __FUNC_H đã được định nghĩa trong lần dịch thứ nhất nên biên dịch có điều kiện bỏ quả không dịch nội dung khai báo trong tệp tiêu đề.

Chương trình mẫu với nhiều tệp nguồn: Quản lí điểm học sinh Tệp tiêu đề "list.h":

#ifndef __LIST_H #define __LIST_H

/* khai báo cấu trúc danh sách và các hàm xử lí trên danh sách */ struct nut_hs

{

char ten[25]; int diem;

struct nut_hs* tiep; };

/* thêm một học sinh có ten vào danh sách có con trỏ đầu header

con trỏ đầu header của danh sách bị thay đổi nên truyền dạng tham biến */

void them_nuths(struct nut_hs**header_ptr, char* ten);

/* xoá một học sinh có ten vào danh sách có con trỏ đầu header

con trỏ đầu header của danh sách bị thay đổi nên truyền dạng tham biến */

int xoa_nuths(struct nut_hs**header_ptr, char *ten);

kết quả là con trỏ đến nút tìm thấy, NULL nếu khơng tìm thấy */ */

struct nut_hs* tim_nuths(struct nut_hs*header, char *ten);

/* sắp xếp danh sách trỏ bởi header theo tên học sinh */

void sapxep_nuths(struct nut_hs*header); #endif

Tệp nguồn "list.c":

/* thi hành cho tệp list.h */ #include "list.h"

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

void them_nuths(struct nut_hs**header_ptr, char* ten) {

struct nut_hs * hs;

hs = (struct nut_hs*)malloc(sizeof(struct nut_hs)); strcpy(hs->ten, ten);

hs->diem = -1; /* ban đầu chưa có điểm thi, vào điểm sau */ /* nối vào đầu danh sách */ (adsbygoogle = window.adsbygoogle || []).push({});

hs->tiep = *header_ptr; *header_ptr = hs;

}

int xoa_nuths(struct nut_hs**header_ptr, char *ten) {

struct nut_hs * hs, *p; hs = *header_ptr;

p = NULL; /* p trỏ tới nút trước nút cần xoá */ while(hs !=NULL&&strcmp(hs->ten, ten) !=0) { p = hs; hs = hs->tiep; } if (hs !=NULL) /* nếu tìm thấy nút cần xố */ {

/* kiểm tra có nút đứng trước nút cần xố khơng */ if (p !=NULL)

p->tiep = hs->tiep;

else /* nút đầu danh sách sẽ là nút sau nút cần xoá */ *header_ptr = hs->tiep; free(hs); return 1; } return 0; }

struct nut_hs* tim_nuths(struct nut_hs*header, char *ten) {

struct nut_hs * hs; hs = header;

while(hs !=NULL&&strcmp(hs->ten, ten) !=0) hs = hs->tiep;

Một phần của tài liệu Bài giảng ngôn ngữ lập trình C (Trang 100 - 102)