■ Bài tập Pascal/ Free Pascal 01 đến 16 ■ Có bài giải (từ đơn giản đến nâng cao)

48 866 1
■ Bài tập Pascal/ Free Pascal 01 đến 16 ■ Có bài giải (từ đơn giản đến nâng cao)

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Bài 01 (Phần cơ bản)Bài 02 (Procedure và Function)Bài 03 (Đệ quy)Bài 04 (Phần Mảng (Array))Bài 05 (Phần Mảng 2 chiều)Bài 06 (Phần biến chuổi ký tự String)Bài 07 (Nâng cao Phần 1)Bài 08 (Nâng cao Phần 2)Bài 09 (Biến có cấu trúc (Record))Bài 10 (Nâng cao Phần 3)Bài 11 (Nâng cao Phần 4)Bài 12 (Ôn tập phần 1)Bài 13 (Ôn tập phần 2)Bài 14 (Ôn tập phần 3)Bài 15 (Ôn tập phần 4)Bài 16 (Ôn tập phần 5)

Bài tập Pascal – Từ đến nâng cao Bài 1.01 – Xin chào (Các lệnh WriteLn ReadLn) Bạn nhập họ tên người in hình câu chúc mừng người Var HoTen: String; Begin WriteLn('Hay nhap ho va ten'); ReadLn(HoTen); WriteLn('Xin chuc mung ban ', HoTen); ReadLn; End Để xoá hình kết lần chạy chương trình trước (bấm Ctrl-F9), ta cần đưa thêm lệnh xoá hình ClrScr dùng thư viện Crt chứa lệnh Uses Crt; Var HoTen: String; Begin ClrScr; WriteLn('Hay nhap ho va ten'); ReadLn(HoTen); WriteLn('Xin chuc mung ban ', HoTen); ReadLn; End Bài 1.02 – Các phép toán (Lệnh If điều_kiện then thực_hiện_lệnh) Bạn nhập vào hai số nguyên (Integer) phép toán (Char) in hình kết phép toán Uses Crt; Var a, b: Integer; pt: Char; Begin ClrScr; WriteLn('Hay nhap so thu nhat'); ReadLn(a); Biên soạn: Th.s Nguyễn Anh Việt Trang Bài tập Pascal – Từ đến nâng cao WriteLn('Hay nhap so thu hai'); ReadLn(b); WriteLn('Hay nhap phep toan (+ – * /)'); ReadLn(pt); If pt = '+' then WriteLn(a, pt, Else If pt = '-' WriteLn(a, pt, Else If pt = '*' WriteLn(a, pt, Else If pt = '/' WriteLn(a, pt, ReadLn; End b, ' then b, ' then b, ' then b, ' = ', a+b) {Chú ý: Trước Else phải bỏ dấu ;} = ', a-b) = ', a*b) = ', a/b :5:2); {In kết có dạng xxxxx.xx} Bài 1.03 – Tính Luỹ thừa (Vòng lệnh For Tên_biến := to n thực_hiện_lệnh) Bạn nhập vào số a số mũ n (Integer) in hình kết phép toán an Uses Crt; Var a, n, i: Integer; {Số nguyên nhỏ} lt: LongInt; {Số nguyên lớn} Begin ClrScr; WriteLn('Hay nhap co so'); ReadLn(a); WriteLn('Hay nhap so mu'); ReadLn(n); lt := 1; For i:=1 to n lt := lt * a; WriteLn(a, ' luy thua ', n, ' = ', lt); ReadLn; End Bài 1.04 – Tính Giai thừa (TD : 5! = = 120) Bạn nhập vào số n (Integer) in hình kết phép toán giai thừa n! Biên soạn: Th.s Nguyễn Anh Việt Trang Bài tập Pascal – Từ đến nâng cao Uses Crt; Var n, i: Integer; gt: LongInt; Begin ClrScr; WriteLn('Hay nhap so n'); ReadLn(n); gt := 1; For i := to n gt := gt * i; WriteLn(n, ' giai thua = ', gt); ReadLn; End Bài 1.05 – Tính Tổng Sn từ đến n (TD : S5 = 1+2+ 3+ 4+ = 15) Bạn nhập vào số n (Integer) in hình kết phép toán Cộng từ đến n Bài 1.06 – Tính Tổng Cn từ đến n (TD : C5 =2+ = 6) Bạn nhập vào số n (Integer) in hình kết phép toán Cộng số chẵn từ đến n Chú ý: a số chẵn a mod = 0, mod phép toán chia lấy số dư TD: mod 3=2 Bài 1.07 – Tính Tổng Ln từ đến n (TD : L5 =1+ 3+5 = 9) Bạn nhập vào số n (Integer) in hình kết phép toán Cộng số lẻ từ đến n Chú ý: a số lẻ a mod = Biên soạn: Th.s Nguyễn Anh Việt Trang Bài tập Pascal – Từ đến nâng cao Function hàm người lập trình tự tạo để thực chức đó, TD: Function GiaiThua(k: Integer): LongInt; hàm dùng để tính giai thừa số k trả giá trị giai thừa K Function GiaiThua(k: Integer): LongInt; Var GTGT: LongInt; Begin GTGT := 1; For i := to k GTGT := GTGT * i; GiaiThua := GTGT; End; Bài 2.01 – In giá trị giai thừa mảng chiều Bạn nhập dãy số nguyên tính giai thừa số dãy (Dãy 1, 4, 7, 5, => In 1, 24, 5040, 120, 2) Var A: Array [1 10] of Integer; i, n: Integer; Function GiaiThua(k: Integer): LongInt; Var GTGT: LongInt; Begin GTGT := 1; For i := to k GTGT := GTGT * i; GiaiThua := GTGT; End; Begin WriteLn('Hay nhap so phan tu cua day so'); ReadLn(n); {Nhập dãy số} For i := to n begin WriteLn('Hay nhap phan tu thu ', i); ReadLn(A[i]); End; Biên soạn: Th.s Nguyễn Anh Việt Trang Bài tập Pascal – Từ đến nâng cao {In giá trị giai thừa} For i := to n Write(GiaiThua(A[i]):6); ReadLn; End Bài 2.02 – In giá trị luỹ thừa phần tử mảng chiều Bạn nhập dãy số nguyên tính luỹ thừa số dãy (Dãy 1, 4, 7, 5, => In 1, 16, 49, 25, 4) Var A: Array [1 10] of Integer; i, n: Integer; Function LuyThua(a, k: Integer): LongInt; Var GTLT: LongInt; Begin GTLT := 1; For i := to k GTLT := GTLT * a; LuyThua := GTLT; End; Begin WriteLn('Hay nhap so phan tu cua day so'); ReadLn(n); {Nhập dãy số} For i := to n begin WriteLn('Hay nhap phan tu thu ', i); ReadLn(A[i]); End; {In giá trị luỹ thừa 2} For i := to n Write(LuyThua(A[i], 2):6); ReadLn; End Procedure tương tự Function, có đối số, không giá trị trả TD: Procedure NhanDoiMang; Biên soạn: Th.s Nguyễn Anh Việt Trang Bài tập Pascal – Từ đến nâng cao Procedure NhanDoiMang; Begin For i := to n A[i] := A[i] * 2; End; Bài 2.03 – In giá trị nhân đôi phần tử mảng chiều Bạn nhập dãy số nguyên nhân đôi số dãy (Dãy 1, 4, 7, 5, => In 2, 8, 14, 10, 4) Var A: Array [1 10] of Integer; i, n: Integer; Procedure NhanDoiMang; Begin For i := to n A[i] := A[i] * 2; End; Begin WriteLn('Hay nhap so phan tu cua day so'); ReadLn(n); {Nhập dãy số} For i := to n begin WriteLn('Hay nhap phan tu thu ', i); ReadLn(A[i]); End; {Nhân đôi phần tử mảng} NhanDoiMang; {In dãy số} For i := to n Write(A[i]:4); End; WriteLn; ReadLn; End Biên soạn: Th.s Nguyễn Anh Việt Trang Bài tập Pascal – Từ đến nâng cao Bài 2.04 – In giá trị nhân phần tử mảng chiều Bạn nhập dãy số nguyên nhân số dãy Chỉ sử dụng Procedure NhanDoiMang Bài 03 (Dãy 1, 4, 7, 5, => In 4, 16, 28, 20, 8) Bài 2.05 – In số nguyên tố mảng chiều Bạn nhập dãy số nguyên in số nguyên tố dãy Số nguyên tố số chia hết cho 2, 3, 5, 7, 11, 13, … (Dãy 1, 4, 7, 5, 23 => In 7, 5, 23) Var A: Array [1 10] of Integer; i, n, Dem: Integer; Function NguyenTo(k: Integer): Boolean; {Boolean: Chỉ có True False} Var j: Integer; Begin If (k In 1, 24, 5040, 120, 2) Var A: Array [1 10] of Integer; i, n: Integer; Function GiaiThua(k: Integer): LongInt; Begin If k = then GiaiThua := Else GiaiThua := GiaiThua(k-1) * k; End; Begin WriteLn('Hay nhap so phan tu cua day so'); ReadLn(n); {Nhập dãy số} For i := to n begin WriteLn('Hay nhap phan tu thu ', i); ReadLn(A[i]); End; {In giá trị giai thừa} For i := to n Write(GiaiThua(A[i]):6); ReadLn; End Biên soạn: Th.s Nguyễn Anh Việt Trang Bài tập Pascal – Từ đến nâng cao Bài 3.02 – In giá trị luỹ thừa phần tử mảng chiều Bạn nhập dãy số nguyên tính luỹ thừa đệ quy số dãy (Dãy 1, 4, 7, 5, => In 1, 16, 49, 25, 4) Var A: Array [1 10] of Integer; i, n: Integer; Function LuyThua(a, k: Integer): LongInt; Begin If k = then LuyThua := a Else LuyThua := LuyThua(a, k-1) * a; End; Begin WriteLn('Hay nhap so phan tu cua day so'); ReadLn(n); {Nhập dãy số} For i := to n begin WriteLn('Hay nhap phan tu thu ', i); ReadLn(A[i]); End; {In giá trị luỹ thừa 2} For i := to n Write(LuyThua(2, A[i]):6); ReadLn; End Procedure tương tự Function, có đối số giá trị trả TD: Procedure NhanMang(k: Integer); Procedure NhanMang(k: Integer); Begin For i := to n A[i] := A[i] * k; End; Bài 3.03 – In giá trị nhân phần tử mảng chiều Bạn nhập dãy số nguyên nhân đôi số dãy (Dãy 1, 4, 7, 5, => In 3, 12, 21, 15, 6) Biên soạn: Th.s Nguyễn Anh Việt Trang Bài tập Pascal – Từ đến nâng cao Var A: Array [1 10] of Integer; i, n: Integer; Procedure NhanMang(k: Integer); Begin For i := to n A[i] := A[i] * k; End; Begin WriteLn('Hay nhap so phan tu cua day so'); ReadLn(n); {Nhập dãy số} For i := to n begin WriteLn('Hay nhap phan tu thu ', i); ReadLn(A[i]); End; {Nhân phần tử mảng} NhanMang(3); {In dãy số} For i := to n Write(A[i]:4); End; WriteLn; ReadLn; End Bài 3.04 – In giá trị nhân phần tử mảng chiều Bạn nhập dãy số nguyên nhân số dãy (Dãy 1, 4, 7, 5, => In 7, 28, 49, 35, 14) Bài 3.05 – In số siêu nguyên tố có chữ số Bạn tìm số siêu nguyên tố có chữ số Số siêu nguyên tố số nguyên tố bỏ chữ số bên phải số nguyên tố 3137 (3137, 313, 31, số nguyên tố) (In 2333 2339 2393 2399 2939 3119 3137 3733 3739 3793 3797 5939 7193 7331 7333 7393) Biên soạn: Th.s Nguyễn Anh Việt Trang 10 Bài tập Pascal – Từ đến nâng cao WriteLn; End; {In DS} WriteLn('DS Hoc sinh'); For i:=1 to n begin Write(HS[i].Ho, ' '); Write(HS[i].Ten, ' '); Write(HS[i].DiemTB:3:2); WriteLn; End; {Sap thu tu} For i:=1 to n-1 For j:=i+1 to n If HS[i].DiemTB > HS[j].DiemTB then begin t2 := HS[i].Ho; {Hoan chuyen Ho} HS[i].Ho := HS[j].Ho; HS[j].Ho := t2; t2 := HS[i].Ten; HS[i].Ten := HS[j].Ten; HS[j].Ten := t2; {Hoan chuyen Ten} t1 := HS[i].DiemTB; {Hoan chuyen Diem TB} HS[i].DiemTB := HS[j].DiemTB; HS[j].DiemTB := t1; End; {In DS da sap thu tu} WriteLn('DS Hoc sinh da sap thu tu'); For i:=1 to n begin Write(HS[i].Ho, ' '); Write(HS[i].Ten, ' '); Write(HS[i].DiemTB:3:2); WriteLn; End; {In DS HS co diem TB >= 5} WriteLn('DS Hoc sinh co diem TB >= 5'); For i:=1 to n begin If HS[i].DiemTB < then Continue; Write(HS[i].Ho, ' '); Write(HS[i].Ten, ' '); Write(HS[i].DiemTB:3:2); WriteLn; End; Biên soạn: Th.s Nguyễn Anh Việt Trang 34 Bài tập Pascal – Từ đến nâng cao {Tim diem TB cao nhat} Max := HS[1].DiemTB; For i:=2 to n If Max < HS[i].DiemTB then Max := HS[i].DiemTB; {In DS HS co diem TB cao nhat} WriteLn('DS Hoc sinh co diem TB cao nhat'); For i:=1 to n If HS[i].DiemTB = Max then begin Write(HS[i].Ho, ' '); Write(HS[i].Ten, ' '); Write(HS[i].DiemTB:3:2); WriteLn; End; ReadLn; End Biên soạn: Th.s Nguyễn Anh Việt Trang 35 Bài tập Pascal – Từ đến nâng cao Bài tập 10.01 – Đổi số thập phân thành số nhị phân: Để đổi số thập phân thành số nhị phân ta thực sau: TD: Đổi số 137 => Đem chia kết phép chia lấy ngược số dư 137 68 34 17 2 1 Kết 137 10 = 10001001 Var n, k: Integer; CNP: String; Begin WriteLn('Hay nhap so can doi tu he 10 sang he 2'); ReadLn(n); k := n; While k>0 Begin If k mod = then CNP:='0' + CNP Else CNP := '1' + CNP; k := k div 2; End; WriteLn('So ', n, ' he 10 doi sang he la ', CNP); ReadLn; End Bài tập 10.02 – Đổi số thập phân thành số thập lục phân (hệ 16): Để đổi số thập phân thành số hệ 16 ta thực sau: TD: Đổi số 249 => Đem chia cho 16 đến kết phép chia lấy ngược số dư Chú ý số dư từ 10 đến 15 chuyển đổi thành A đến F Biên soạn: Th.s Nguyễn Anh Việt Trang 36 Bài tập Pascal – Từ đến nâng cao 249 9 16 15 15 F 16 Kết 249 10 = F9 16 Var n, k: Integer; CTLP: String; Begin WriteLn('Hay nhap so can doi tu he 10 sang he 16'); ReadLn(n); k := n; While k>0 Begin If k mod 16 = then CTLP:='0'+CTLP Else If k mod 16 = then CTLP:='1'+CTLP Else If k mod 16 = then CTLP:='2'+CTLP Else If k mod 16 = then CTLP:='3'+CTLP Else If k mod 16 = then CTLP:='4'+CTLP Else If k mod 16 = then CTLP:='5'+CTLP Else If k mod 16 = then CTLP:='6'+CTLP Else If k mod 16 = then CTLP:='7'+CTLP Else If k mod 16 = then CTLP:='8'+CTLP Else If k mod 16 = then CTLP:='9'+CTLP Else If k mod 16 = 10 then CTLP:='A'+CTLP Else If k mod 16 = 11 then CTLP:='B'+CTLP Else If k mod 16 = 12 then CTLP:='C'+CTLP Else If k mod 16 = 13 then CTLP:='D'+CTLP Else If k mod 16 = 14 then CTLP:='E'+CTLP Else CTLP:='F' + CTLP; k := k div 16; End; WriteLn('So ', n, ' he 10 doi sang he 16 la ', CTLP); ReadLn; End Bài tập 10.03 – Đổi số thập phân thành số theo hệ m (m từ đến 16): Var m, n, k: Integer; Ch: String; Begin WriteLn('Hay nhap so can doi tu he 10 sang he 16'); ReadLn(n); Biên soạn: Th.s Nguyễn Anh Việt Trang 37 Bài tập Pascal – Từ đến nâng cao WriteLn('Hay nhap he can doi (tu den 16)'); ReadLn(m); k := n; While k>0 Begin If k mod m = then Ch:='0'+Ch Else If k mod m = then Ch:='1'+Ch Else If k mod m = then Ch:='2'+Ch Else If k mod m = then Ch:='3'+Ch Else If k mod m = then Ch:='4'+Ch Else If k mod m = then Ch:='5'+Ch Else If k mod m = then Ch:='6'+Ch Else If k mod m = then Ch:='7'+Ch Else If k mod m = then Ch:='8'+Ch Else If k mod m = then Ch:='9'+Ch Else If k mod m = 10 then Ch:='A'+Ch Else If k mod m = 11 then Ch:='B'+Ch Else If k mod m = 12 then Ch:='C'+Ch Else If k mod m = 13 then Ch:='D'+Ch Else If k mod m = 14 then Ch:='E'+Ch Else Ch:='F' + Ch; k := k div m; End; WriteLn('So ', n, ' he 10 doi sang he ‘, m, ‘ la ', Ch); ReadLn; End Biên soạn: Th.s Nguyễn Anh Việt Trang 38 Bài tập Pascal – Từ đến nâng cao Bài tập 11.01 – Đổi số nhị phân thành số thập phân: Để đổi số nhị phân thành số thập phân ta thực sau: TD: Đổi số 10001001 Tính luỹ thừa = 27 128 26 64 25 32 Nhân tương ứng với giá trị luỹ thừa Cộng giá trị lại 128 0 24 16 23 8 128 + + = 137 22 21 20 1 0 Kết 10001001 = 137 10 Var So: Integer; LT, STP: LongInt; CNP: String; Begin WriteLn('Hay nhap chuoi can doi tu he sang he 10'); ReadLn(CNP); LT := 1; For i:=Length(CNP) downto Begin If CNP[i] = '0' then So :=0 Else So := 1; STP := STP + So; LT := LT * 2; End; WriteLn('Chuoi ', CNP, ' he doi sang he 10 la ', STP); ReadLn; End Bài tập 11.02 – Đổi số thập lục phân (hệ 16) thành số thập phân: Để đổi số thập phân thành số hệ 16 ta thực sau: Tính luỹ thừa 16 16 16 = 16 F 15 9 Các giá trị A, B, …, F => 10, 11, … , 15 Nhân tương ứng với giá trị luỹ thừa Cộng giá trị lại 240 240 + = 249 Kết F9 16 = 249 10 Biên soạn: Th.s Nguyễn Anh Việt Trang 39 Bài tập Pascal – Từ đến nâng cao Var So, LT, STP: LongInt; CTLP: String; Begin WriteLn('Hay nhap chuoi so can doi tu he 16 sang he 10'); ReadLn(CTLP); LT:=1; For i:= Length(CTLP) downto Begin If CTLP[i] = '0' then So := Else If CTLP[i] = '1' then So:= Else If CTLP[i] = '2' then So:= Else If CTLP[i] = '3' then So:= Else If CTLP[i] = '4' then So:= Else If CTLP[i] = '5' then So:= Else If CTLP[i] = '6' then So:= Else If CTLP[i] = '7' then So:= Else If CTLP[i] = '8' then So:= Else If CTLP[i] = '9' then So:= Else If CTLP[i] = 'A' then So:= 10 Else If CTLP[i] = 'B' then So:= 11 Else If CTLP[i] = 'C' then So:= 12 Else If CTLP[i] = 'D' then So:= 13 Else If CTLP[i] = 'E' then So:= 14 Else If CTLP[i] = 'F' then So:= 15 ; STP := STP + So * LT; LT := LT * 16; End; WriteLn('Chuoi ', CTLP, ' he 16 doi sang he 10 la ', STP); ReadLn; End Bài tập 11.03 – Đổi chuổi số theo hệ m (m từ đến 16) thành số thập phân: Var m: Integer; So, LT, STP: LongInt; Ch: String; Begin WriteLn('Hay nhap chuoi so can doi tu he m sang he thap phan'); ReadLn(Ch); WriteLn('Hay nhap he m (2 den 16)'); ReadLn(m); LT:=1; For i:= Length(Ch) downto Begin If CH[i] = '0' then So := Biên soạn: Th.s Nguyễn Anh Việt Trang 40 Bài tập Pascal – Từ đến nâng cao Else If Ch[i] = Else If Ch[i] = Else If Ch[i] = Else If Ch[i] = Else If Ch[i] = Else If Ch[i] = Else If Ch[i] = Else If Ch[i] = Else If Ch[i] = Else If Ch[i] = Else If Ch[i] = Else If Ch[i] = Else If Ch[i] = Else If Ch[i] = Else If Ch[i] = STP := STP + So LT := LT * m; End; WriteLn('Chuoi ', ReadLn; End '1' then '2' then '3' then '4' then '5' then '6' then '7' then '8' then '9' then 'A' then 'B' then 'C' then 'D' then 'E' then 'F' then * LT; So:= So:= So:= So:= So:= So:= So:= So:= So:= So:= So:= So:= So:= So:= So:= 10 11 12 13 14 15 ; Ch, ' he ', m, ' doi sang he 10 la ', STP); Biên soạn: Th.s Nguyễn Anh Việt Trang 41 Bài tập Pascal – Từ đến nâng cao Các toán cổ Bài tập 12.01 Trăm trâu trăm cỏ Trâu đứng ăn năm Trâu nằm ăn ba Lụ khụ trâu già Ba bó Hỏi số trâu số cỏ ? Bài tập 12.02 Em chợ phiên Anh gửi trăm tiền Mua cam quýt Với lại yên Không nhiều Mua lấy trăm Cam ba đồng Quýt đồng năm Thanh yên tươi tốt Năm đồng trái Hỏi thứ mua trái ? Biên soạn: Th.s Nguyễn Anh Việt Trang 42 Bài tập Pascal – Từ đến nâng cao Các ôn tập – Phần Bài tập 13.01 Nhập số n, tìm số nguyên tố lớn = 10 11 Bài tập 13.03 Nhập số n số k, tìm k số nguyên tố nhỏ >= n TD: n = 10 k = 3, số nguyên tố nhỏ >= 10 11, 13 17 Bài tập 13.04 Nhập số n số k, tìm k số nguyên tố lớn Tam giác vuông * Nhập 3, 4, => cạnh không tạo thành tam giác * Nhập 4, 4, => Tam giác cân * Nhập 4, 4, => Tam giác * Nhập 3, 4, => Tam giác thường Bài tập 13.10 Nhập vào toạ độ điểm xét xem chúng có tạo thành tam giác hay không, có xem tam giác có tích chất không (cân, đều, vuông cân) TD: * (-2, 1), (0, 5), (4, 3) => Tam giác vuông cân * (3, 1), (0, 1), (0, 4) => Tam giác vuông Biên soạn: Th.s Nguyễn Anh Việt Trang 43 Bài tập Pascal – Từ đến nâng cao Bài tập 13.11 Nhập vào toạ độ điểm xét xem chúng có tạo thành tam giác hay không, có tính diện tích tam giác TD: * (-2, 1), (0, 5), (4, 3) => Diện tích 10 * (3, 1), (0, 1), (0, 4) => Diện tích 4,5 Biên soạn: Th.s Nguyễn Anh Việt Trang 44 Bài tập Pascal – Từ đến nâng cao Các ôn tập – Phần Bài tập 14.01 Cho ma trận nguyên Anxn Hãy xây dựng ma trận B từ ma trận A cách loại bỏ đường chéo TD : 23 -> 78 Bài tập 14.02 Nhập mảng từ file MT.inp in hình MT1.inp 123 456 789 Bài tập 14.03 Nhập vào ma trận vuông tìm số lớn nhất, số nhò ma trận MT2.inp 987 654 321 MT2.out Bài tập 14.04 Nhập vào ma trận vuông (n>=3), xoá dòng ma trận MT3.inp 987 654 321 MT3.out 987 321 Bài tập 14.05 Nhập vào ma trận vuông (n>=3), xoá cột ma trận MT4.inp 123 456 789 MT4.out 23 56 89 Bài tập 14.06 Nhập vào ma trận vuông (n>=3) số k (k

Ngày đăng: 13/09/2017, 10:28

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan