Module E – Thư viện chuẩn

Chia sẻ: Dragon Tl | Ngày: | Loại File: DOC | Số trang:21

0
64
lượt xem
12
download

Module E – Thư viện chuẩn

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Hàm scanf coi ký tự trắng giữa các giá trị nhập vào như là dấu phân cách, không cần đặt dấu cách giữa các đặc tả chuyển đổi. Hàm scanf tự động loại bỏ các ký tự trắng khi nhập số

Chủ đề:
Lưu

Nội dung Text: Module E – Thư viện chuẩn

  1. 5. Module E – Thư viện chuẩn 2 5.1. Ví dụ.........................................................................................................................2 5.1.1. Ví dụ 1 - Nhập 2 số nguyên và float ...............................................................2 5.1.2. Ví dụ 2 - Nhập 2 số nguyên và ký tự ..............................................................2 5.1.3. Ví dụ 3 – Kiểm tra dữ liệu nhập vào...............................................................3 5.1.5. Ví dụ 5 - Tạo số ngẫu nhiên trong miền giới hạn..........................................5 5.2. Bài tập thực hành ....................................................................................................6 5.2.1. Bài tập thực hành 1...........................................................................................6 5.2.2. Bài tập thực hành 2...........................................................................................6 5.2.3. Bài tập thực hành 3...........................................................................................6 5.2.4. Bài tập thực hành 4...........................................................................................7 6. Module E - Mảng 7 6.1. Ví dụ.........................................................................................................................7 6.1.1. Ví dụ 1 – Khai báo mảng, thiết lập giá trị ban đầu.........................................7 6.1.2. Ví dụ 2 - Truyền tham số mảng cho hàm........................................................8 6.1.3. Ví dụ 3 - Mảng song song và nhập thông tin một bảng..................................9 6.1.4. Ví dụ 4 – Tìm kiếm trong mảng.....................................................................10 6.1.5. Ví dụ 5 – Mặt nạ để Tính tổng con...............................................................10 6.1.6. Ví dụ 6 - Sắp xếp mảng.................................................................................12 6.2. Bài tập thực hành...................................................................................................12 6.2.1. Bài tập thực hành 1.........................................................................................13 6.2.2. Bài tập thực hành 2.........................................................................................13 6.2.3. Bài tập thực hành 3.........................................................................................13 6.2.3. Bài tập thực hành 3.........................................................................................14 6.2.4. Bài tập thực hành 4.........................................................................................14 7. Module G – Xâu 14 7.1. Ví dụ.......................................................................................................................14 7.1.1. Ví dụ 1 – Khai báo xâu, đặt giá trị ban đầu và in xâu....................................14 7.1.2. Ví dụ 2 - Nhập xâu..........................................................................................15 7.1.3. Ví dụ 3 – Hàm xâu..........................................................................................15 7.1.4. Ví dụ 4 – Mảng xâu, khai báo và đặt giá trị ban đầu.....................................16 7.1.5. Ví dụ 5 – Mảng xâu, nhập và xắp xếp danh sách tên...................................16 7.2. Bài tập thực hành...................................................................................................17 7.2.1.Bài tập thực hành 1..........................................................................................17 7.2.2. Bài tập thực hành 2.........................................................................................18 7.2.3. Bài tập thực hành 3.........................................................................................18 8. Module F – File 18 8.1. Ví dụ.......................................................................................................................18 8.1.1. Ví dụ 1 – Ghi dữ liệu lên tệp.........................................................................18 8.1.1. Ví dụ 2 – Đọc dữ liệu từ tệp.........................................................................19 8.2. Bài tập thực hành...................................................................................................21 8.2.1. Bài tập thực hành 1.........................................................................................21 8.2.2. Bài tập thực hành 2.........................................................................................21
  2. 5. Module E – Thư viện chuẩn 5.1. Ví dụ 5.1.1. Ví dụ 1 - Nhập 2 số nguyên và float int items; float price; printf("Enter items, price : "); scanf("%d%f", &items, &price); Đầu ra của chương trình Enter items, price : 4 39.99 Hàm scanf coi ký tự trắng giữa các giá trị nhập vào như là dấu phân cách, không cần đặt dấu cách giữa các đặc tả chuyển đổi. Hàm scanf tự động loại bỏ các ký tự trắng khi nhập số 5.1.2. Ví dụ 2 - Nhập 2 số nguyên và ký tự /* scanf với đặc tả %c * scanfc.c */ #include Chỉ lấy dữ liệu số nguyên theo đặc tả chuyển đổi int main (void) { %d và bỏ lại ký tự xuống dòng \n trong bộ đệm int items; char tax; printf("Number of items : "); scanf("%d", &items); printf("Tax Status : "); scanf("%c", &tax); /* ERROR reads \n */ printf("%d items (tax status %c)\n", items, tax); return 0; } 2
  3. Hiện Number of items : 25 Tax status : 25 items (taxable status) Nguyên nhân để không nhập được ký tự sau khi nhập số là ký tự xống dòng còn trong bộ đệm, mà %c thì không tự động bỏ đi các ký tự trắng như %d Có một số cách để xử lý các ký tự xuống dòng \n còn bị bỏ lại trong bộ đệm như sau scanf("%d", &itmes); scanf("%c%c", &junk, &tax); /* lưu 1 ký tự đầu tiên trong junk */ scanf("%d", &items); scanf("%*c%c", &tax); /* Nuốt 1 đầu */ scanf("%d", &items); scanf(" %c", &tax); /* skip all whitespace first */ scanf("%d%*c", &items); /* swallow newline */ scanf("%c", &tax); scanf("%d", &items); clear(); /* clear the buffer */ scanf("%c", &tax); 5.1.3. Ví dụ 3 – Kiểm tra dữ liệu nhập vào /* Kiểm tra dữ liệu nhập vào * getInt.c */ #include int getInt(int min, int max); void clear(void); #define MIN 3 #define MAX 15 int main( ) { int input; input = getInt(MIN, MAX); printf("\nProgram accepted %d\n", input); return 0; } 3
  4. /* getInt nhận dữ liệu nhập vào trong khoảng từ * min đến max, * trả lại giá trị số nguyên đã được nhập */ int getInt(int min, int max) { int value, keeptrying = 1, rc; char after; do { printf("Enter a number\n in the range [%d,%d]:",min, max); rc = scanf("%d%c", &value, &after); if (rc == 0) { printf("**No input accepted!**\n\n"); clear(); } else if (after != '\n') { printf("**Trailing characters!**\n\n"); clear(); } else if (value < min || value > max) { printf("**Out of range!**\n\n"); } else keeptrying = 0; } while (keeptrying == 1); return value; } /* Xoá bộ đệm vào */ void clear (void) { while ( getchar() != '\n' ) ; /* null statement intentional */ } Đầu ra của chương trình như sau Enter a whole number in the range [3,15] : we34 // rc = 0 **No input accepted!** Enter a whole number in the range [3,15] : 34.4 // after != ‘n’ **Trailing characters!** Enter a whole number in the range [3,15] : 345 // 345 > MAX **Out of range!** Enter a whole number in the range [3,15] : 14 4
  5. Program accepted 14 5.1.4. Ví dụ 4 – In ra theo khuôn dạng /* Khuôn dạng của printf * printf.c */ int main( ) { /* integers */ printf("\n* ints *\n"); * ints * printf("00000000011\n"); 00000000011 printf("12345678901\n"); 12345678901 printf("-------------------------\n"); --------------------------- printf("%d|
  6. /* tạo ra 10 số ngẫu nhiên trong khoảng từ 6 đến 10 * random.c */ #include #include #include int main ( ) { int i, n, a = 6, b = 100; srand(time(NULL)); for (i = 0; i < 10 ; i++) { n = a + rand() % (b + 1 - a); printf("Random number %d is %d\n", i+1, n); } return 0; } Hàm srand đặt giá trị khởi đầu cho bộ phát số ngẫu nhiên. Chúng ta gọi hàm srand trước khi gọi hàm rand, thường tại bắt đầu của chương trình. Chúng ta sử dụng time(NULL) để phát ra số khởi đầu dựa trên thời gian của mỗi lần chạy 5.2. Bài tập thực hành 5.2.1. Bài tập thực hành 1 Viết chương trình cho phép nhập số nhỏ nhất và số lớn nhất, rồi in ra một bảng gồm 4 cột các số ngẫu nhiên nằm trong giới hạn đó 5.2.2. Bài tập thực hành 2 Viết chương trình in ra một bảng gồm 4 cột 100 số ngẫu nhiên có 4 chữ số khác nhau 5.2.3. Bài tập thực hành 3 Viết hàm có khai báo như sau double getDouble(double min, double max); 6
  7. Hàm này cho phép nhập số double trong khoảng từ min đến max, nếu không thì ra thông báo buộc người dùng nhập lại 5.2.4. Bài tập thực hành 4 Viết hàm có khai báo như sau int getEvenInteger(int min, int max) Hàm này cho phép nhập một số chẵn trong khoảng min va max. Nếu không thì ra thông báo bắt người dùng nhập lại. Sau đó viết chương trình để thử hàm này như sau Nhập số nhỏ nhất: 4 Nhập số lớn nhất 56 Nhập số chẵn: 5 **Đây không phải số chẵn **Nhập lại: 90 **Không được lớn hơn 56 **Nhập lại: 16 Số 15 đã được nhập Ấn phím bất kỳ để tiếp tục (Ctrl + C để thoát)! 6. Module E - Mảng 6.1. Ví dụ 6.1.1. Ví dụ 1 – Khai báo mảng, thiết lập giá trị ban đầu #include Mảng digits gồm BITS các số nguyên từ #define BITS 16 digits[0] đến digits[BITS-1] main() { int i; int digits[BITS] = {0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0}; //In các phần tử của mảng từ digits[0]..đến digits[BITS-1] for(i = 0; i < BITS; i++) printf(“%d”, digits[i]); printf(“\n”); //In các phần tử của mảng từ digits[BITS-1]..đến digits[0] for(i = BITS; i >= 0; i--) printf(“%d”, digits[i]); printf(“\n”); } Hiện 7
  8. 0000000001011100 0011101000000000 6.1.2. Ví dụ 2 - Truyền tham số mảng cho hàm /* Số hệ 10 sang hệ 2 * binary.c */ #include void binary(int, int []); void display(int digit[]); Truyền địa chỉ mảng #define BITS 16 (tên mảng là địa chỉ trỏ đến phần tử đầu int main ( ) { tiên của mảng) int decimal, digit[BITS]; printf("Enter a positive integer value : "); scanf("%d", &decimal); binary(decimal, digit); display(decimal, digit); return 0; } /* binary đặt biểu diễn nhị phân của * decimal trong mảng digit[BITS] với phần tử * đầu tiên chứa bit có nghĩa cao nhất */ void binary(int decimal, int digit[]){ int i; i = BITS - 1; while ( decimal != 0 && i >= 0) { digit[i] = decimal % 2; decimal /= 2; i--; } for (; i >= 0; i--) digit[i] = 0; } /* display in mảng digit[BITS] * thành các khối 8-bit */ void display(int decimal, int digit[]){ int i; printf("%d is binary is ", decimal); 8
  9. for (i = 0; i < BITS; i++) { printf("%d", digit[i]); if (i%8 == 7) putchar(' '); } } Đầu ra cua chương trình như sau Enter a positive integer value : 92 92 in binary is 00000000 01011100 6.1.3. Ví dụ 3 - Mảng song song và nhập thông tin một bảng /* Mảng song song * parallel.c */ #include #define MAX_ITEMS 20 int main ( ) { int i, nItems, keepgoing, s, sku[MAX_ITEMS]; double unitPrice[MAX_ITEMS]; printf("Enter skus and unit prices\n"); nItems = 0; keepgoing = 1; do { printf("SKU (0 to stop) : "); scanf("%d", &s); if (s != 0) { sku[nItems] = s; printf("Unit Price : "); scanf("%lf", &unitPrice[nItems]); nItems++; } else keepgoing = 0; } while ( keepgoing == 1 && nItems < MAX_ITEMS ); printf("SKU Unit Price\n"); for (i = 0; i < nItems; i++) printf("%06d $%9.2lf\n", sku[i], unitPrice[i]); return 0; } Chương trình cho phép nhập thông tin một bảng gồm 2 cột, cột mã hàng, lưu trong mảng sku[] và cột đơn giá lưu trong mảng unitprice[] 9
  10. Lưu ý là hàng 1 lưu tương ứng tại chỉ số 0 của mảng là sku[0] và unitprice[0] Chương trình kết thúc nhập khi đã đủ MAX_ITEMS hàng hoặc khi người dùng gõ mã 0 6.1.4. Ví dụ 4 – Tìm kiếm trong mảng /* Tìm kiếm tuyến tính * linearSearch.c */ #include #define MAX_ITEMS 3 #define SKU { 1234, 3456, 2345} #define PRICE {12.34, 45.23, 13.12} int find(int, int [], int); int main ( ) { int i, code, sku[MAX_ITEMS] = SKU; double unitPrice[MAX_ITEMS] = PRICE; printf("SKU : "); scanf("%d", &code); i = find(code, sku, MAX_ITEMS); if (i != -1) printf("The unit price of item %d " "is $%.2lf\n", sku[i], unitPrice[i]); else printf("%06d not found\n", code); return 0; } /* find trả lại chỉ số đầu tiên mà tại đó * search == key[index] trong mảng key[size], * hoặc -1 nếu không tìm thấy */ int find(int search, int key[], int size) { int i = 0, rc = -1; for (i = 0; i < size && rc == -1; i++) if (search == key[i]) rc = i; return rc; } 6.1.5. Ví dụ 5 – Mặt nạ để Tính tổng con /* Đặt cờ các phần tử 10
  11. * flagging.c */ #include #define MAX_SOLD 200 int main ( ) { int sku[MAX_SOLD], code; int units[MAX_SOLD], accountedFor[MAX_SOLD]; int i, j, nItems, total, keepreading; printf("Enter skus and units sold\n"); nItems = 0; keepreading = 1; do { printf("SKU (0 to stop) : "); scanf("%d", &sku[nItems]); if (sku[nItems] != 0) { printf("Units Sold : "); scanf("%d", &units[nItems]); nItems++; } else keepreading = 0; } while ( keepreading == 1 && nItems < MAX_SOLD ); /* Cờ bằng 0 cho tất cả các phần tử chưa được tính tổng */ for ( i = 0; i < nItems; i++ ) accountedFor[i] = 0; printf("SKU Units Sold\n"); for ( i = 0; i < nItems; i++ ) { /* Chỉ xem xét các phần tử chưa được tính tổng */ if (accountedFor[i] != 1) { /* sku tiếp theo được tính */ code = sku[i]; total = 0; for ( j = i; j < nItems; j++ ) { if (code == sku[j]) { total += units[j]; /* đặt cờ bằng 1 cho phần tử j đã được tính*/ accountedFor[j] = 1; } } printf("%06d %9d\n", code, total); } } return 0; } 11
  12. Chương trình này cho phép nhập một bảng gồm hai cột là mã hàng và số lượng hàng bán được (kết thúc nhập khi đã đủ MAX_SOLD hàng hoặc người dùng nhập mã 0). Cùng một mặt hàng có thể xuất hiện ở nhiều hàng trong bảng. Rồi chương trính dùng kỹ thuật mặt nạ để tính tổng con, số lượng các phần tử bán được cho cùng một loại mặt hàng. 6.1.6. Ví dụ 6 - Sắp xếp mảng /* Bubble Sort * bubbleSort.c */ #include #define MAX_ITEMS 3 #define SKU {1234, 3456, 2345} void bubbleSort(int a[], int size); int main ( ) { int i, sku[MAX_ITEMS] = SKU; bubbleSort( sku, MAX_ITEMS ); for (i = 0; i < MAX_ITEMS; i++ ) printf("%06d\n", sku[i]); return 0; } /* bubbleSort sắp xếp các phần tử của mảng a[size] * theo trình tự tăng */ void bubbleSort(int a[], int size) { int i, j; int temp; for (i = size - 1; i > 0; i--) { for (j = 0; j < i; j++) { if (a[j] > a[j+1]) { temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } } } 6.2. Bài tập thực hành 12
  13. 6.2.1. Bài tập thực hành 1 Viết hàm có khai báo như sau void histogram(int array[], int count); Hàm này được truyền một mảng các số và số các phần tử của mảng, rồi hiện biểu đồ của mảng này sử dụng các dấu sao. Ví dụ, nếu một mảng có tên x được chứa sáu giá trị { 5, 1, 2, 4, 3, 4 }, thì histogram(x, 6) sẽ hiện ra: ***** * ** **** *** **** (Nếu giá trị là 0 hay nhỏ hơn, in ra một dòng trống cho giá trị này) 6.2.2. Bài tập thực hành 2 Viết một hàm có khai báo như sau void firstword(char word[], char sentence[]) Hàm này copy từ đầu tiên của một xâu kết thức bởi null ”sentence” vào xâu kết thúc null "word". Nếu không có từ nào trong "sentence" (bởi vì nó là trống hoặc tất cả là khoảng trắng) thì "word" sẽ được đặt là trống. Giả thiết rằng một từ là một dãy lên tiếp các ký tự không trống, được phân tách với từ khác bởi các ký tự trắng Ví dụ, firstword(x, "This is a sentence"); Sẽ copy "This" vào mảng x, và firstword(x, " and$%^# so is this"); Sẽ copy "and$%^#" vào x. (Hint: find the position of the first non-blank, then copy things over until you hit a blank or the end of the string). 6.2.3. Bài tập thực hành 3 Viết một hàm có khai báo như sau 13
  14. int input_item(int code[], double unit_cost[], int n) Nhập thông tin 1 bảng chứa danh mục các hàng hoá gồm mã hàng (mảng code[]), đơn giá (unit_cost[]), và hàng cần nhập vào, trả lại lai số hàng đã nhập Giả thiết: - Kết thúc nhập khi mã hàng là 0 hoặc số hàng đã đủ 20 - Mã hàng là duy nhất, không trùng nhau. Nếu trùng, ra thông báo yêu cầu nhập lại 6.2.3. Bài tập thực hành 3 Viết một hàm có khai báo như sau void display_item(int code[], double unit_cost[], int n); Hàm hiên danh mục hàng hoá theo thứ tự đơn giá giảm dần 6.2.4. Bài tập thực hành 4 Viết một hàm có khai báo như sau void display_sale(int code[], int units_purchased[], int n); Hàm nhận thông tin danh sách n các giao dịch bán hàng trong hai mảng song song, mã hàng trong mảng code[] và số hàng bán được trong mảng units_purchased[] (Một mặt hàng có thể xuất hiện trên nhiều hàng) Hàm hiện bảng tổng kết số hàng bán đựoc theo mã hàng 7. Module G – Xâu 7.1. Ví dụ 7.1.1. Ví dụ 1 – Khai báo xâu, đặt giá trị ban đầu và in xâu /* Hiện xâu * displayStrings.c */ #include void print( char name[] ); int main( ) { int i; char name[31] = "My name is Arnold"; /* char name[31] = {'M','y',' ','n','a','m','e',' ','i','s',' ', 'A','r','n','o','l','d','\0'}; */ 14
  15. print( name ); return 0; } void print( char name[] ) { int i; printf("%s\n", name ); } Xâu là một mảng ký tự có thêm byte null ở cuối ‘\0’. Vì vậy không giống như mảng, khi truyền tham số xâu cho hàm, ta không cần truyền số phẩn tử của mảng. Kiểm tra ký tự ‘\0’ là biết đã đến kết thúc xâu chưa. 7.1.2. Ví dụ 2 - Nhập xâu /* Nhập xâu * inputStrings.c */ #include int main( ) { int i; char name[31]; //Nhận đến ký tự trắng và không quá 30 ký tự scanf(“%30s”, name); //Nhận đến ký tự xuống dòng và không quá 30 ký tự scanf(“%30[^\n]”, name); //Nhận đến ký tự xuống dòng gets(name); return 0; } Chú ý là dùng scanf không nhập được xâu trống 7.1.3. Ví dụ 3 – Hàm xâu /* Đào ngược xâu * reverseString.c */ #include #include 15
  16. int main ( ) { char str[31]; int i, len; printf("Enter a string : "); scanf("%30[^\n]%*c", str); printf("In reverse order : "); len = strlen(str); for (i = len - 1; i >= 0; i--) putchar(str[i]); putchar('\n'); return 0; } Hàm strlen trả lại số ký tự của xâu, không tính ký tự null ‘\0’ 7.1.4. Ví dụ 4 – Mảng xâu, khai báo và đặt giá trị ban đầu Mảng chứa 5 tên, mỗi tên không qua 30 ký tự int main(void) { char names[5][31] = { "Harry", "Jean", "Jessica", "Irene", "Jim" }; int i for(i = 0; i < 5; i++) printf(“%s”, name[i]); } 7.1.5. Ví dụ 5 – Mảng xâu, nhập và xắp xếp danh sách tên /* Xắp xếp danh sách các Tên * sortNames.c */ #include #include #define MN 10 #define MC 30 #define FM "30" void sort(char a[][MC+1], int size); int main(void) { char name[MN][MC+1]; int i, n, keepgoing; /* Nhập tên */ printf("Enter names (^ to stop)\n"); i = 0; do { printf("? "); 16
  17. scanf(" %"FM"[^\n]", name[i]); // Nếu xâu name[i] trùng với xâu “^” thì keepgoing = 0 keepgoing = strcmp(name[i], "^") != 0; i++; } while (keepgoing == 1 && i < MN); if (keepgoing == 1) n = MN; else n = i - 1; /* Xắp xếp tên */ bubble(name, n); /* Hiện các Danh sách */ for (i = 0; i < n; i++) printf("%s\n", name[i]); return 0; } /* bubbleSort xắp xếp các phần tử của mảng a[size] theo thứ tự tăng */ void bubble(char a[][MC+1], int size) { int i, j; char temp[MC+1]; for (i = size - 1; i > 0; i--) { for (j = 0; j < i; j++) { if (strcmp(a[j],a[j+1]) > 0) { strcpy(temp, a[j]); strcpy(a[j], a[j+1]); strcpy(a[j+1], temp); } } } 7.2. Bài tập thực hành 7.2.1.Bài tập thực hành 1 Viết hàm có khai báo như sau int input_names(int stdID[], char name[][31], double GPA[], int classID[], int n) Hàm này nhập danh sách sinh viên vào bảng danh sách sinh viên bao gồm mã sinh viên stdID, tên sinh viên name, điểm trung bình GPA, mã lớp classID. n là tham số đầu vào chứa số sinh viên đã có trong bảng. Hàm trả lại số sinh viên đã được nhập Trong đó: Mã SV là số nguyên từ 1 đến 99999 và là duy nhất 17
  18. Tên SV không quá 30 ký tự Điểm trung bình từ 0.0 đến 10.0 Mã lớp là số nguyên từ 1 đến 10 Kết thúc nhập khi mã SV là 0 hoặc khi số SV đã đủ 1000. 7.2.2. Bài tập thực hành 2 Với danh sách sinh viên đã được lưu trong các mảng như trong Bài tập thực hành 1 ở 7.2.1., viết hàm có khai báo như sau void sort_by_GPA(int stdID[], char name[][31], double GPA[], int classID[], int n) Hàm này sắp xếp danh sách sinh viên theo điểm trung bình GPA giảm, tức là sinh viên nào có điểm GPA cao sẽ ở đầu danh sách, điểm thấp sẽ ở cuối 7.2.3. Bài tập thực hành 3 Với danh sách sinh viên đã được lưu trong các mảng như trong Bài tập thực hành 1 ở 7.2.1., viết hàm có khai báo như sau void summary_by_class(int stdID[], char name[][31], double GPA[], int classID[], int n) Hàm này hiện bảng tổng kết tổng số sinh viên, số sinh viên đỗ (có điếm GPA >= 5) và số phần trăm đỗ theo từng lớp, ví dụ như sau Lớp Tổng số Số đỗ % đỗ --- ---------- --------- ----- 01 30 10 33 02 25 15 48 03 30 20 67 8. Module F – File 8.1. Ví dụ 8.1.1. Ví dụ 1 – Ghi dữ liệu lên tệp /* Save to the file * saveFile.c */ #include #include 18
  19. #define MAX_STUDENTS 5 #define MAX_CHARACTERS 30 #define FILE_NAME "list_student.dat" void main(void) { //Khai báo và đặt giá trị cho các mảng int i, stdID[MAX_STUDENTS] = {100, 101, 200, 201, 301}; char name[MAX_STUDENTS][MAX_CHARACTERS+1] = {“Nguyen Van Anh”, “Nguyen Van Binh”, “Tran Thi Tuyet”, “Do Van Binh”, “Ho Lan Huong”}; double GPA[MAX_STUDENTS] = {6.5, 7.6, 8.9, 2.5, 4.6}; int classID[MAX_STUDENTS] = {1, 1, 2, 2, 3}; FILE *fp; // Mở tệp để ghi fp = fopen(FILE_NAME, “w”); // Nếu không mở được thì hiện thông báo và thoát ra if(fp == NULL){ printf(“Lỗi, không mở được tệp”); getch(); return;} // Ghi lên tệp, mỗi hàng là thông tin của một sinh viên for(i = 0; i < MAX_STUDENTS; i++) fprintf(fp, “%d;%s;%lf;%d\n”, stdID[i], name[i], GPA[i], classID[i]); fclose(fp); } Dấu ; để phân cách giữa các trường Với chương trình trên thì file có tên là list_student.dat sẽ có nội dung như sau 100;Nguyen Van Anh;6.500000;1 101;Nguyen Van Binh;7.600000;1 200;Tran Thi Tuyet;8.9000000;2 201;Do Van Binh;2.500000;2 300;Ho Lan Huong;4.600000;3 File này gồm MAX_STUDENTS hàng, mỗi hàng ghi lai thông tin của một sinh viên, bao gồm mã sinh viên stdID, tên sinh viên name, điểm tring bình GPA, và số hiệu lớp classID, mỗi trường được phân cách bằng một dấu ;. Chú ý là điểm ghi theo khuôn dạng %.1lf, tức chỉ lưu một chữ số sau dấu chấm thập phân Chú ý: Nếu bạn muốn mở tệp để ghi vào cuối tệp thì phải mở kiểu “a” 8.1.1. Ví dụ 2 – Đọc dữ liệu từ tệp /* Đọc từ file * readFile.c */ 19
  20. #include #include #define MAX_STUDENTS 5 #define MAX_CHARACTERS 30 #define FILE_NAME "list_student.dat" void main(void) { //Khai báo các mảng int i, n, stdID[MAX_STUDENTS]; char name[MAX_STUDENTS][MAX_CHARACTERS+1]; double GPA[MAX_STUDENTS]; int classID[MAX_STUDENTS]; FILE *fp; // Mở tệp để đọc fp = fopen(FILE_NAME, “r”; // Nếu không mở được thì hiện thông báo và thoát ra if(fp == NULL){ printf(“Lỗi, không mở được tệp”); getch(); Đọc đến tận dấu ; return;} // Đọc từ tệp, mỗi hàng là 4 trờng i = 0; while (fscanf(fp, "%d;%[^;];%lf;%d%*c", &stdID[i], name[i], &GPA[i], &classID[i]) == 4) i++; Lấy ký tự xuống dòng ra // Số hàng được đọc lưu vào n mà không ghi n = i; vào đâu cả // Hiện danh sách đã được lưu trong các mảng printf("List of students\n"); printf("stdID Name GPA ClassID\n"); printf("----- ------------------------------ ---- -------\n"); for(i = 0; i < n; i++) printf("%05d %-30s %4.1lf %02d\n", stdID[i], name[i], GPA[i], classID[i]); getch(); } Dấu - để căn lề trái Chương trình này đọc tệp có khuôn dạng như ở Ví dụ 1 ở 8.1.1. vào các mảng và hiện danh sách này như sau List of students stdID Name GPA ClassID ----- ------------------------------ ---- ------- 00100 Nguyen Van Anh 6.5 01 00101 Nguyen Van Binh 7.6 01 00200 Tran Thi Tuyet 8.9 02 00201 Do Van Binh 2.5 02 00301 Ho Lan Huong 4.6 03 20
Đồng bộ tài khoản