Chúng ta sử dụng timeNULL để phát ra số khởi đầu dựa trên thời gian của mỗi lần chạy Viết hàm có khai báo như sau double getDoubledouble min, double max;... Hàm này cho phép nhập số dou
Trang 15 Module E – Thư viện chuẩn 3
5.1 Ví dụ 3
5.1.1 Ví dụ 1 - Nhập 2 số nguyên và float 3
5.1.2 Ví dụ 2 - Nhập 2 số nguyên và ký tự 3
5.1.3 Ví dụ 3 – Kiểm tra dữ liệu nhập vào 4
5.1.5 Ví dụ 5 - Tạo số ngẫu nhiên trong miền giới hạn 6
5.2 Bài tập thực hành 7
5.2.1 Bài tập thực hành 1 7
5.2.2 Bài tập thực hành 2 7
5.2.3 Bài tập thực hành 3 7
5.2.4 Bài tập thực hành 4 8
6 Module E - Mảng 8 6.1 Ví dụ 8
6.1.1 Ví dụ 1 – Khai báo mảng, thiết lập giá trị ban đầu 8
6.1.2 Ví dụ 2 - Truyền tham số mảng cho hàm 9
6.1.3 Ví dụ 3 - Mảng song song và nhập thông tin một bảng 10
6.1.4 Ví dụ 4 – Tìm kiếm trong mảng 11
6.1.5 Ví dụ 5 – Mặt nạ để Tính tổng con 11
6.1.6 Ví dụ 6 - Sắp xếp mảng 13
6.2 Bài tập thực hành 13
6.2.1 Bài tập thực hành 1 14
6.2.2 Bài tập thực hành 2 14
6.2.3 Bài tập thực hành 3 14
6.2.3 Bài tập thực hành 3 15
6.2.4 Bài tập thực hành 4 15
7 Module G – Xâu 15 7.1 Ví dụ 15
7.1.1 Ví dụ 1 – Khai báo xâu, đặt giá trị ban đầu và in xâu 15
7.1.2 Ví dụ 2 - Nhập xâu 16
7.1.3 Ví dụ 3 – Hàm xâu 16
7.1.4 Ví dụ 4 – Mảng xâu, khai báo và đặt giá trị ban đầu 17
7.1.5 Ví dụ 5 – Mảng xâu, nhập và xắp xếp danh sách tên 17
7.2 Bài tập thực hành 18
7.2.1.Bài tập thực hành 1 18
7.2.2 Bài tập thực hành 2 19
7.2.3 Bài tập thực hành 3 19
8 Module F – File 19 8.1 Ví dụ 19
8.1.1 Ví dụ 1 – Ghi dữ liệu lên tệp 19
8.1.1 Ví dụ 2 – Đọc dữ liệu từ tệp 20
8.2 Bài tập thực hành 21
8.2.1 Bài tập thực hành 1 22
8.2.2 Bài tập thực hành 2 22
Trang 35 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
scanf("%c", &tax); /* ERROR reads \n */
printf("%d items (tax status %c)\n", items, tax);
return 0;
}
Chỉ lấy dữ liệu số nguyên theo đặc tả chuyển đổi %d
và bỏ lại ký tự xuống dòng \n trong bộ đệm
Trang 4Number 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(" %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
input = getInt(MIN, MAX);
printf("\nProgram accepted %d\n", input);
return 0;
}
Trang 5/* 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);
Đầ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
Trang 6* ints * 00000000011 12345678901 - 4321|< %d
4321|< %10d 0000004321|< %010d
4321 |< %-10d
* floats * 00000000011 12345678901 - 4321.987655|< %f
* doubles * 00000000011 12345678901 - 4321.987655|< %lf
4321.988|< %10.3lf 004321.988|< %010.3lf 4321.988 |< %-10.3lf
* chars * 00000000011 12345678901 - d|< %c
100|< %d 144|< %o 64|<
5.1.5 Ví dụ 5 - Tạo số ngẫu nhiên trong miền giới hạn
Trang 7/* tạo ra 10 số ngẫu nhiên trong khoảng từ 6 đến 10
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
Viết hàm có khai báo như sau
double getDouble(double min, double max);
Trang 8Hà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
Trang 9void binary(int, int []);
void display(int digit[]);
#define BITS 16
int main ( ) {
int decimal, digit[BITS];
printf("Enter a positive integer value : ");
/* 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
Trang 10for (i = 0; i < BITS; i++) {
Đầu ra cua chương trình như sau
Enter a positive integer value : 92
} while ( keepgoing == 1 && nItems < MAX_ITEMS );
printf("SKU Unit Price\n");
for (i = 0; i < nItems; i++)
Trang 11Lư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
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
Trang 12*/
#include <stdio.h>
#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");
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 */
Trang 13Chươ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
int i, sku[MAX_ITEMS] = SKU;
bubbleSort( sku, MAX_ITEMS );
for (i = 0; i < MAX_ITEMS; i++ )
Trang 146.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
int input_item(int code[], double unit_cost[], int n)
Trang 15Nhậ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
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'}; */
print( name );
Trang 17Hà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
// Nếu xâu name[i] trùng với xâu “^” thì keepgoing = 0
Mảng chứa 5 tên, mỗi tên không qua 30 ký tự
Trang 18Viế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
Tên SV không quá 30 ký tự
Điểm trung bình từ 0.0 đến 10.0
Trang 19Hà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
8.1.1 Ví dụ 1 – Ghi dữ liệu lên tệp
/* Save to the file
Trang 20#define FILE_NAME "list_student.dat"
// 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);
}
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ênname, đ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”
Trang 21while ( fscanf(fp, "%d;%[^;];%lf;%d%*c", &stdID[i],
name[i], &GPA[i], &classID[i]) == 4 ) 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
mà không ghi vào đâu cả
Trang 228.2.1 Bài tập thực hành 1
Viết hàm có khai báo như sau
int save_file(char file_name[], int stdID[], char name[][31 int
Cho hai têp students.dat và marks.dat
Khuôn dạng của tệp students.dat như sau
100;Nguyen Van Binh;1
101;Nguyen Tien Manh;1
200;Nguyen Van Minh;2
Mỗi sinh viên được luu trên 1 hàng, gồm mã, tên, số hiệu lớp, các trường cách nhau bởi dấu ;
Khuôn dạng của tệp marks.dat như sau
00100 Nguyen Van Binh 8.3
00101 Nguyen Tien Manh …
….