Trang 1 trong tổng số 1

Bài tập: In ra dòng chữ hiển thị trên bảng LED tại giây thứ T

Đã gửi: T7 01 Th6, 2024 23:28
bởi huynhbuutam
Giả định có một bảng đèn LED có thể hiện thị tối đa 10 kí tự, mỗi giây, nội dung hiển thị sẽ dịch chuyển từ phải sang trái 1 kí tự.
Viết chương trình chỉ ra nội dung sẽ hiển thị trên bảng LED tại giây thứ T được nhập từ bàn phím.
Chương trình ví dụ:

Mã: Chọn tất cả

Nhap S: TamIT
Nhap T: 13
Ket qua hien thi: IT     Tam

Mã nguồn:

Mã: Chọn tất cả

Uses Crt;
Var S, Bang : AnsiString;
	i, x, Time : LongInt;
Begin
	ClrScr;
	// Khởi tạo bảng (chạy chữ) gồm 10 kí tự trống
	Bang := '          ';
	Write('Nhap S: '); ReadLn(S);
	Write('Nhap T: '); ReadLn(Time);
	// Nếu xâu nhập vào ít hơn 10 kí tự thì bổ sung thêm các khoảng trống cho đủ 10 kí tự
	If (Length(S) < 10) Then Begin x := 10 - Length(S); For i := 1 To x Do S := S + ' '; End;
	// Nếu thời gian lớn hơn độ dài của xâu nhập vào
	If Time > Length(S) Then
		Begin
			// Vì vị trí của các kí tự hiển thị trên bảng (chạy chữ) sẽ trở lại như cũ
			// sau khoảng thời gian bằng độ dài của xâu
			Time := Time Mod Length(S);
			// Điền vào bảng (chạy chữ) từ cuối về đầu
			For i := 10 DownTo 1 Do
				// Nếu vị trí chuẩn bị lấy kí tự trong xâu nhập vào là hợp lệ (vị trí > 0)
				// Ở đây ta không xét trường hợp vị trí > Length(S)
				// vì i-10 chắc chắn <= 0
				// còn Time thì nhỏ hơn hoặc bằng Length(S) - Xem dòng lệnh ở hàng 17
				If (Time+i-10 > 0)
				Then Bang[i] := S[Time+i-10]
				// Ở vế ngược lại này, vì Time+i-10 <= 0
				// nên Length(S)+Time+i-10 sẽ < Length(S)
				// Còn i-10 thì không thể thấp hơn -9 (i chạy từ 10 xuống 1 - Xem hàng 19)
				// mà Length(S) lại >= 10 (Xem hàng 11)
				// Do đó, Length(S)+Time+i-10 sẽ > 0
				Else Bang[i] := S[Length(S)+Time+i-10];
		End
	Else // Lệnh dưới đây mang ý nghĩa tương tự như trên
			For i := 10 DownTo 1 Do
				If (Time+i-10 > 0)
				Then Bang[i] := S[Time+i-10];
	// In ra bảng (chạy chữ)
	WriteLn('Ket qua hien thi: ', Bang);
	ReadLn;
End.