các bài tập cơ bản hệ điều hành
Trang 1Hướng dẫn thực hành bài 1
A Lý thuyết
- Kỹ năng lập trình C căn bản
- Các kỹ thuật lập trình liên quan ñến tập tin
B Thực hành
1 Viết chương trình (VCT) mã hóa nội dung của một tập tin & chương trình giải mã tương ứng
2 VCT nhập vào tên của một file EXE có sẵn và gọi thực hiện file EXE ñó
3 VCT ñọc & hiển thị nội dung 1 tập tin ra màn hình dưới dạng Hex (như dạng hiển thị nội dung tập tin của phần mềm NC khi nhấn phím F3 rồi nhấn tiếp F4 – nhưng không cần xuất ra ñường thẳng ñứng phân cách)
Hướng dẫn:
- Các biến, hàm và kỹ năng cần biết:
o Các biến, hàm liên quan ñến tập tin:
Con trỏ FILE: FILE *
Mở file: FILE *fopen(const char *filename, const char *mode)
• filename: tên tập tin
• mode: r, w, a, r+, w+, a+, t(text), b(binary)
ðọc dữ liệu: size_t fread(void *ptr, size_t size, size_t n, FILE* stream)
Ghi dữ liệu: size_t fwrite(const void *ptr, size_t size, size_t n, FILE* stream)
• ptr: vùng ñệm ñể ñọc / ghi
• size: kích thước (theo byte) 1 item cần ñọc / ghi
• n: số item cần ñọc / ghi
• stream: con trỏ ñến file sẽ ñọc / ghi
• Trả về số item ñã ñược ñọc / ghi
o Chỉ thị nhập / xuất cho hàm scanf / printf:
Ký tự (char): %c
Chuỗi (char []) có ký tự kết thúc chuỗi: %s
Số nguyên (int):
• Dạng bát phân: %o
• Dạng thập phân: %d
• Dạng thập lục phân: %x (chữ thường a, b…), %X (chữ hoa A, B…)
Số thực (float): %f
Số nguyên dài (long): %ld long int
Số thực dài (double): %lf long float
ðịnh dạng số khoảng trống xuất:
• Cho số nguyên: %n n khoảng trống dành biểu diễn số nguyên (n âm: canh trái, n dương: canh phải) Nếu n = 0 thì không canh lề Ví dụ:
Trang 2o int a = 123, b = 15;
o printf(“%-4d%5d”, a, );
o Kết quả: dành 4 khoảng trống và canh trái cho biến a; dành 5
khoảng trống và canh phải cho biến b
• Cho số thực: %n.md n khoảng trống dành biểu diễn số thực tính luôn dấu chấm “.” (n âm: canh trái, n dương: canh phải), m là số chữ số lẻ của
số thực ñó Lưu ý, nếu dùng cách này ñể biểu diễn số nguyên thì số nguyên ñó tự ñộng thêm số 0 ở ñầu ñể bảo ñảm tổng số chữ số của số nguyên bằng m Ví dụ:
o int a = 4; float b = 1.2, c = 2.126;
o printf(“%-5.3d%6.2f%7.2f”, a, , c);
o Kết quả: dành 5 khoảng trống, canh trái, 3 số ñể biểu diễn biến a;
dành 6 khoảng trống, canh phải, 2 số lẻ ñể biểu diễn biến b; dành 7 khoảng trống, canh phải, 2 số lẻ ñể biểu diễn biến c
Bài 1:
Gợi ý: Có thể chọn phương pháp mã hóa ñơn giản là xoay vòng (tăng hoặc giảm giá trị
mã ASCII của mỗi ký tự (mỗi byte) của tập tin muốn mã hóa Muốn giải mã ta chỉ việc làm ngược lại quá trình trên Ví dụ: tập tin có nội dung VIT CON
Chọn cách mã hóa tăng mỗi lần 2 nấc: V (86) X (88) , I (73) K (75)…
Giải mã sẽ làm ngược lại: X (88) V (86), K (75) I (73)…
Chú ý:
- Vì bảng mã ASCII chỉ có 256 ký tự tương ứng với mã ASCII từ 0 ñến 255 Do
ñó, ta phải chú ý mã hóa các ký tự có mã ASCII 254 0, 255 1… ứng với cách mã hóa tăng 2 như trên
- Muốn biết ký tự có mã ASCII là n là ký tự gì, ta giữ Alt rồi nhấn các chữ số của n
ñó rồi thả Alt ra Ví dụ ta giữ Alt, nhấn 6, 5 rồi thả Alt ra, lập tức ta có chữ A vì
mã ASCII của ký tự A là 65
- Công thức gợi ý:
Mã ASCII của ký tự ñã mã hóa = (Mã ASCII của ký tự cần mã hóa + n) % 256
n > 0 : tăng, n < 0: giảm
Bài 2:
Sử dụng một trong cách hàm sau ñể gọi thực hiện một lệnh ngoài DOS:
- int system(const char *command) trong thư viện PROCESS.H hoặc STDLIB.H
- Nhóm lệnh exec… hay spawn… trong thư viện PROCESS.H
Trang 3Lưu ý: ñể gọi thực thi một tập tin EXE thì chương trình phải có một bộ nhớ ñủ lớn ðể
chỉnh lại kích thước vùng nhớ cho chương trình trong BC++ 3.1 for DOS, ta làm như sau:
Chọn menu Options > Compiler > Code generation… > Chọn Model Compact trở lên
Bài 3:
ðọc nội dung tập tin rồi xuất giá trị từng byte ra màn hình với chỉ thị %x ñể xuất dạng
Hex Kết hợp cách ñịnh dạng số khoảng trắng xuất ñể gióng cột cho thẳng hàng