You are on page 1of 4

Trường Đại học Bách Khoa Hà Nội Kỹ Thuật Lập Trình

Học kỳ 1, năm học 2019/2020 Lớp Tự Động Hóa – K62


Cán bộ giảng dạy: Nguyễn Hồng Quang Ngày 03 tháng 09 năm 2019

Bài tập dài nhà số 2


Họ và tên sinh viên:
Mã số sinh viên: Lớp:
Bài số 1. Dãy Fibonaci là dãy số nguyên nối tiếp nhau theo trật tự như sau:
0, 1, 1, 2, 3, 5, 8, 13, 21 …..
Ngoại trừ hai số đầu tiên, thì số tiếp theo trong dãy Fibonaci là tổng của 2 số đứng trước.
a. Sinh viên cần phải viết một chương trình cho phép người sử dụng nhập vào số n - với n
là số nguyên dương – chương trình phải in ra màn hình toàn bộ dãy Finaboci tính từ phẩn
tử thứ 1 tới phần tử thứ n. Kết quả in ra màn hình phải có định dạng như sau:
Thứ tự Giá trị
1 - 0
2 - 1
3 - 1
4 - 2
5 - 3
6 - 5
7 - 8
8 - 13
9 - 21
b. Theo giới hạn của ngôn ngữ lập trình C, thì giá trị của số nguyên n, cho dù là số long int
thì chỉ nằm trong khoảng một số có 9 chữ số - số nguyên 32 bit . Như vậy, nếu chương trình
sử dụng các biến hiển thị kết quả là kiểu số nguyên có khả năng chương trình sẽ bị tràn số.
Viết một hàm để cung cấp cơ chế kiểm tra xem khi nào dãy số bị tràn.

c. Để khắc phục việc tràn số này, sinh viên được yêu cầu viết một hàm mới, cho phép tính
toán được số Fibonaci với chiếu dài của dãy số này có thể lên tới 80 số số hạng. Chương trình
cho phép người dùng có thể nhập vào số hạng Fibonaci cần in và in ra kết quả trên màn hình.

Gợi ý: để hiện thị số này, sinh viên nên khai báo một mảng số nguyên int nResult[80] và sử
dụng mảng này để hiện thị kết quả
Bài số 2.

Viết chương trình đọc dữ liệu từ file do thầy giáo cung cấp. File dữ liệu này cung cấp
dữ liệu dạng text, có độ dài ngắn của các dòng là khác nhau. Chương trình đọc được
phải hiển thị dữ liệu lên màn hình cho người dùng có thể quan sát.

Lưu ý, do thiết kế đặc biệt của màn hình hiển thị (Terminal Console), nên kích thước
của màn hình này bị giới hạn về độ dài của mỗi dòng dữ liệu và số lượng dòng được
hiển thị. Trong bài toán này, số dòng hiển thị được đặt cố định là 20, độ dài của mỗi
dòng dữ liệu thì được yêu cầu do người dùng nhập vào, với giá trị nhỏ nhất là 40 và
giá trị lớn nhất là 80 ký tự.

Chương trình hiển thị của bạn được yêu cầu dừng lại ở dòng số 20 và hỏi người dùng
có tiếp tục hiển thị tiếp không ? Nếu người dùng đồng ý thì chương trình sẽ hiển thị
20 dòng tiếp và quá trình cứ lặp lại cho đến khi đọc xong toàn bộ dữ liệu.

Do dữ liệu của mỗi dòng là dài ngắn khác nhau, nên chương trình yêu cầu “bẻ” một
dòng dài thành các dòng ngắn – có độ dài nhỏ hơn chiều dài tối đa số ký tự được hiển
thị. Việc “bẻ” dòng này được yêu cầu không làm “vỡ” từ.

Sau đây là hai loại dòng dữ liệu được dùng trong file mẫu, với mỗi kiểu có chỉ số ID
duy nhất như sau:

Dạng 1:

#define TCB_MAGIC 0X123


typedef struct TCB
{
void *Next;
void *Prev;
shot Id; /* data Id number */
char State; /* task process state */
char Priority; /* task priority */
char Name[16]; /* task name */
short Mode; /* task mode flag */
short hTask; /* task handle */
short hStdIn; /* standard input handle */
short hStdOut; /* standard output handle */
long delta; /* running delta time delay */
} TCB;

Dữ liệu có định dạng như sau:

short là số nguyên và độ rộng 4 byte

long là số nguyên và độ rộng 12 byte

char là số nguyên và độ rộng 1 byte và giữa hai char cách nhau bởi một khoảng trống

Sử dụng thứ tự hiển thị với 1 dòng như sau:

STATE PRIORITY NAME MODE HTASK HSTDIN HSTDOUT


DELTA

Dạng 2:

/* Driver Control Block Structure */


#define CTDCB_MAGIC 0X123
typedef struct CTDCB
{
void *Next;
void *Prev;
shot Id; /* data Id number */
char InUseFlag; /* dcb in use flag */
char Command; /* command to driver */
short Channel; /* hardware channel */
short DrvHandle; /* driver handle */
short LogUnit; /* logic unit number */
short Length; /* length of buffer */
char Buffer[30]; /* data buffer */
short ErrGeneric; /* generic error code */
short ErrHandle; /* local error handle */
long ErrDriver; /* driver specific error */
long Time; /* time to service request */
long TimeOut; /* server timeout period */
} CTDCB;

Dữ liệu có định dạng như sau:

short là số nguyên và độ rộng 4 byte

long là số hex và độ rộng 8 byte

char là số nguyên và độ rộng 2 byte và giữa hai char cách nhau bởi một khoảng trống

Sử dụng thứ tự hiển thị với 2 dòng như sau:

INUSEFLAG COMMAND CHANNEL DRVHANDLE LOGUNIT TIME


TIMEOUT ERRGENERIC ERRHANDLE ERRDRIVER

You might also like