Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 190 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
190
Dung lượng
1,5 MB
Nội dung
Sinh viên: Trương Đức Khiêm Lớp: Tin 4B PhươngphápgiảitậpTinhọc Bàitập 3.34 trang 24 sách Bàitậptinhọc11 Bàitập 5.9 trang 59 sách Bàitậptinhọc11 I Bàitập 3.34: Tìm hiểu đề bài: − Dữ liệu vào: Không có − Dữ liệu ra: Tệp văn FIBO.DAT gồm 45 dòng Mỗi dòng số Fibonaccy Xây dựng ý tưởng giải thuật: − Sử dụng vòng lặp While… Do − Sơ đồ khối thuật toán: Trình bày lời giải: - Trang - Mở rộng toán: Không có {Do đến chương học sinh học câu lệnh bản.} II Bàitập 5.9: Tìm hiểu đề bài: − Dữ liệu vào: Số n số tháng mà đoàn thám hiểm quay lại đảo − Dữ liệu ra: Số thỏ đảo sau n tháng Xây dựng ý tưởng giải thuật: Dựa vào tính chất dãy số Fibonacci − Sử dụng vòng lặp While… Do − Sơ đồ thuật toán: Trình bày lời giải: - Trang - Nghiên cứu lời giải mở rộng toán: 4.1 Chương trình xác định số thỏ vòng 45 tháng 4.2 Về lời giải sách tập: Thiếu xác! Lí do, lời giải khai báo kiểu phần tử số Fibonaccy Integer, phần tử thứ 24 dãy số Fibonaccy có giá trị 46368 vượt miền trị kiểu Integer 215 − = 32767 Cho nên, nhập vào số tháng lớn 23 cho kết 9489 4.3 Mở rộng toán: Cho số tự nhiên N dãy số Fibonaccy: 1, 1, 2, 3, 5, 8, Hãy viết chương trình kiểm tra xem N biểu diễn thành tổng của số Fibonaccy khác hay không? − Cách giải: Ta tìm số Fibonaccy gần với số N Đây số hạng nằm dãy kết Sau đó, lấy hiệu số N số Fibonaccy gần với số N nhất, tiếp tục tìm số Fibonaccy gần với hiệu hiệu số Fibonaccy Kết số Fibonaccy liệt kê theo thứ tự từ lớn đến nhỏ - Trang - Sinh viên: Lê Thị Châu Long Lớp: Tin 4B Bàitập 3.38 trang 26 sách Bàitậptinhọc11Bàitập 5.11 trang 57 sách Bàitậptinhọc11 I Bài 3.38: Lập trình: • Nhập từ bàn phím số thực a N1 • Tìm đưa hình số nguyên dương N nhỏ thõa mãn A < ∑ i=1 i Tìm hiểu đề bài: − Input: Số thực A N1 − Output: Số nguyên N nhỏ thõa mãn A < ∑ i=1 i Ý tưởng giải thuật: Trình bày lời giải Mở rộng bài toán: - Trang - Lập trình: • Nhập từ bàn phím số thực a • N1 Tìm đưa hình số nguyên dương N lớn thõa mãn A < ∑ i=1 i II Bài 5.11: Cho tệp LINE.TXT, dòng không chứa xâu không 255 kí tự lập trình tạo tệp LINE.DAT chứa xâu tệp LINE.TXT, xâu chuẩn hóa theo quy tắc sau: • Xóa tất dấu cách đầu cuối xâu • Nhiều dấu cách lien tiếp (nếu có) thay dấu cách Tìm hiểu đề bài: − Input: Tệp LINE.TXT − Output: Tệp LINE.DAT Ý tưởng giải thuật: - Trang - Trình bày lời giải: Mở rộng bài toán: Cho tệp LINE.TXT, dòng không chứa xâu không 255 kí tự lập trình tạo tệp LINE.DAT chứa xâu tệp LINE.TXT, lưu thông tin sau: • Đếm số số nguyên có xâu • Tìm số nguyên số chẵn có xâu - Trang - Sinh viên: Nguyễn Thị Thanh Minh Lớp: Tin 4B Bàitập 3.41 trang 26 sách Bàitậptinhọc11 Bàitập 5.14 trang 57 sách Bàitậptinhọc11 I Bài 3.41: Tìm hiểu toán: - Input: Nhập thời gian: h m phút s giây - Output: Trạng thái đèn hải đăng sáng hay tắt Ý tưởng giải thuật: - Bước 1: Nhập thời gian h m phút s giây - Bước 2: Nếu h > 24 m > 60 s > 60 quay lại bước - Bước 3: Nếu h ≥ h ≤ 18 thông báo đèn trạng thái tắt Đến bước - Bước 4: Nếu (h × 360 + m × 60 + s − 12 × 360) mod(t1 + t ) < 10 thông báo đèn trạng thái tắt Ngược lại thông báo sáng - Bước 5: Kết thúc Trình bày lời giải Nghiên cứu lời giải mở rộng toán: 4.1 Xây dựng test: Thời gian Giờ Phút Giây 19 30 15 17 34 - Trang - Trạng thái Sáng Tắt 4.2 Bài toán dùng để kiểm tra trạng thái đèn với giá trị t1, t2 khác ta chia hiệu thời gian cho t1+t2 - Trang - II Bài 5.41: Tìm hiểu đề bài: - Input: Tệp văn DUONGI.TXT - Output: Khoảng cách nhóm so với trại Ý tưởng giải thuật: - Do cần biết khoảng cách nhóm so với trại nên ta gắn vào hướng nhóm theo hệ trục toạ độ: Gốc trại, chiều dương trục Ox hướng Đông, chiều dương trục Oy hướng Bắc - Dùng biến tạm h để tính toạ độ nhóm với quy ước rẽ trái h giảm 1, rẽ phải h tăng lên Trình bày lời giải: 1 2 h= 3 4 → x = x; y = y + → x = x − 1; y = y → x = x; y = y − → x = x + 1; y = y - Trang - Sinh viên: Phan Thi Hoa Lớp: Tin 4B Bàitập 3.29 trang 23 sách Bàitậptinhọc11 Bàitập 7.37 trang 74 sách Bàitậptinhọc11 I Bài 3.29: Lập trình giải toán sau: Nhập số nguyên a b từ bàn phím( a1) - Trang 181 - { if(abs(N%2)==1) { i++; strcpy(A[i],"INC"); } i++; strcpy(A[i],"DUP"); if(N>0) N=N/2; else N=(N+(N%2))/2; } if(N>0) strcpy(A[i+1],"PLUS1"); else strcpy(A[i+1],"MINUS1"); for(j=i+1;j>=0;j ) printf("%s\n",A[j]); getch(); return 0; } Với thuật toán này, giả sử: ▪ N = 19: N |N mod 2| 19 0 I ▪ N = -19: A[i] INC DUP INC DUP DUP DUP PLUS1 - Trang 182 - N -19 |N mod 2| -10 -5 -3 -2 -1 I A[i] INC DUP DUP INC DUP INC DUP DUP MINUS1 ● Xây dựng lớp toán tương đương: ▪ Xét ngôn ngữ khởi tạo nguyên bao gồm câu lệnh: PLUS1 Khởi tạo +1; INC Tăng nhận lên 1; DEC Giảm nhận 1; DUP Nhân đôi nhận Hãy viết chương trình: ◦ Nhập vào từ bàn phím số nguyên N Tạo dãy câu lệnh cho kết thực số nguyên N (|N| ≤ 2*109) ◦ Đưa hình dãy câu lệnh ngôn ngữ tạo hằng, câu lệnh hàng Ví dụ: Nếu liệu vào 3, kết đưa hình là: PLUS1 DUP INC ▪ Xét ngôn ngữ khởi tạo nguyên bao gồm câu lệnh: PLUS1 Khởi tạo +1; MINUS1 Khởi tạo -1; INC Tăng nhận lên 1; DUPK Nhân nhận với số K Hãy viết chương trình: ◦ Nhập vào từ bàn phím số nguyên N K Tạo dãy câu lệnh cho kết thực số nguyên N (|N| ≤ 2*109,2 ≤ |K| ≤ 100) ◦ Đưa hình dãy câu lệnh ngôn ngữ tạo hằng, câu lệnh hàng Ví dụ: Nếu liệu vào N = 3,k = kết đưa hình là: PLUS1 DUPK INC II Bàitập 7.16 – Sách BT TinHọc 11: Đề ra: Hãy viết chương trình cho phép nhập vào số thập phân nguyên dương N (N ≤ 2.109) In số N sau đổi N số thập lục phân Bài giải: Phân tích toán: ● Input: N(10), N ∈ Z+ ● Output: N(16) ● Cơ sở lý thuyết: - Trang 183 - ▪ Số thập lục phân N(16) = a1 an với ∈ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F}, i = 1, N n (a1a2 an)(16) =( ∑ 16 i =1 n −i )(10)=(a1.16n-1+a2.16n-2 + +an-1.16+an)(10), vế phải: a i = ai , ∈ { 0,1,2,3,4,5,6,7,8,9} 10, a i 11, 12, 13, a i 14, 15, =A =B =C =D =E =F Xây dựng ý tưởng giải thuật: ● Để đổi số thập phân N số thập lục phân ta thực sau: N 16 Dư a1 Thương 16 Dư a2 Thương Thương Dư an 16 => N(16) = an a2a1 ● Trước hết ta thấy cần lưu số thập lục phân xâu ký tự (hoặc mảng) phần tử chữ số số thập lục phân ● Từ cách đổi số N(10) sang N(16) cách lưu trữ kết trên, ta có thuật toán trình bày cụ thể sau: ▪ Bước 1: Nhập N(10), N ∈ Z+; ▪ Bước 2: Nếu n = s := ’0’ Ngược lại: s := ‘’; ▪ Bước 3: Nếu n > thì: ◦ Đổi số (n mod 16) xâu đưa vào biến ch sau: ▫ Nếu (n mod 16) = 10 ch := ’A’; ▫ Nếu (n mod 16) = 11 ch := ’B’; ▫ Nếu (n mod 16) = 12 ch := ’C’; ▫ Nếu (n mod 16) = 13 ch := ’D’; ▫ Nếu (n mod 16) = 14 ch := ’E’; ▫ Nếu (n mod 16) = 15 ch := ’F’; ▫ Nếu (n mod 16) < 10 chr(n mod 16 ,ch); ◦ s := ch + s; ◦ n := n div 2; ◦ Quay lại bước 3; ▪ Bước 4: In s kết thúc Chương trình: ● Chương trình Pascal: Uses Crt; - Trang 184 - Var N:Longint; S,ch:String[30]; Begin Clrscr; Write('Nhap so thap phan N = '); Readln(N); If N = Then S := '0' Else S := ''; While N > Do Begin Case (N mod 16) of 10:ch:='A'; 11:ch:='B'; 12:ch:='C'; 13:ch:='D'; 14:ch:='E'; 15:ch:='F'; Else Str(N mod 16,ch); End; S := ch + S; N := N div 16; End; Writeln(‘N(16)= ',s); Readln End ● Chương trình C++: #include #include #include char s[100],p[100]; int n; void ccc(char c[]) { strcpy(p,s); strcpy(s,c); strcat(s,p); } char *doi(long n) { strcpy(s,""); for(;;) { switch (n%16) - Trang 185 - { case 0:ccc("0");break; case 1:ccc("1");break; case 2:ccc("2");break; case 3:ccc("3");break; case 4:ccc("4");break; case 5:ccc("5");break; case 6:ccc("6");break; case 7:ccc("7");break; case 8:ccc("8");break; case 9:ccc("9");break; case 10:ccc("A");break; case 11:ccc("B");break; case 12:ccc("C");break; case 13:ccc("D");break; case 14:ccc("E");break; case 15:ccc("F");break; } n/=16; if(n==0) break; } return s; } int main() { printf("Nhap so thap phan n = "); scanf("%d",&n); strcpy(s,doi(n)); printf("N(16) = %s",s); getch(); return 0; } Nghiên cứu lời giải: ● Test: Giả sử ta nhập vào N = 456789 Do nên ban đầu S = ‘’, trình thực chương theo minh họa bảng bên Vậy, 456789(10) = 6F855(16) ● Nghiên cứu mở rộng giải thuật: ▪ Ta thấy, số thập lục phân đổi số số nhị phân bit Ví dụ ta có số nhị phân 1000 1101, để đổi số số thập lục phân, ta phân N(2) thành phần Từ ta có: Thành phần thứ (2) = 0001(2) = 1(16), thành phần thứ hai 8(16) thành phần thứ ba 1101 (2) = D(16) => N(2) = 18D(16) Vậy để đổi phân số thập lục phân ta lấy từ phải sang trái số nhị phân bit số tương ứng với số thập lục phân bảng bên sau ghép lại từ sang trái ta số thập lục phân, số bit số nhị phân cuối bit ta thêm bit sô vào đầu số nhị phân - Trang 186 - N > trình tiếp nhị phân N(2) = bảng bên 1000(2) = số nhị nhị phân phải không đủ ▪ Nhận xét: Từ ta thấy đổi số N (10) sang N(16) cách đổi N(10) sang N(2), từ N(2) đổi sang N(16) theo quy tắc tên ▪ Thuật toán cài đặt ngôn ngữ lập trình Pascal sau: Uses Crt; Label Nhan; Var N:Longint; S,t:String[30]; Begin Clrscr; Write('Nhap so thap phan N = '); Readln(N); If N = Then t := '0000' Else t := ''; While N > Do Begin If n mod = Then t := '0' + t Else t := '1' + t; N:=N div 2; End; While Length(t) mod Do t := '0' + t; S:=''; While t '' Do Begin If copy(t,1,4)='0000' Then Begin S := S +'0'; Goto Nhan; End; If copy(t,1,4)='0001' Then Begin S := S +'0'; Goto Nhan; End; If copy(t,1,4)='0010' Then Begin S := S +'2'; Goto Nhan; End; If copy(t,1,4)='0011' Then Begin S := S +'3'; - Trang 187 - Goto Nhan; End; If copy(t,1,4)='0100' Then Begin S := S +'4'; Goto Nhan; End; If copy(t,1,4)='0101' Then Begin S := S +'5'; Goto Nhan; End; If copy(t,1,4)='0110' Then Begin S := S +'6'; Goto Nhan; End; If copy(t,1,4)='0111' Then Begin S := S +'7'; Goto Nhan; End; If copy(t,1,4)='1000' Then Begin S := S +'8'; Goto Nhan; End; If copy(t,1,4)='1001' Then Begin S := S +'9'; Goto Nhan; End; If copy(t,1,4)='1010' Then Begin S := S +'A'; Goto Nhan; End; If copy(t,1,4)='1011' Then Begin S := S +'B'; Goto Nhan; End; If copy(t,1,4)='1100' Then Begin S := S +'C'; Goto Nhan; - Trang 188 - End; If copy(t,1,4)='1101' Then Begin S := S +'D'; Goto Nhan; End; If copy(t,1,4)='1110' Then Begin S := S +'E'; Goto Nhan; End; If copy(t,1,4)='1111' Then Begin S := S +'F'; Goto Nhan; End; Nhan:Delete(t,1,4); End; Writeln('N(16) = ',S); Readln End Nhận xét: Ta thấy hai thuật toán cài đặt phức tạp Để khắc phục nhược điểm ta cải tiến thuật toán thứ cách khởi tạo SH = ‘0123456789ABCDEF’, kết N (16) lưu vào mảng A xác định sau: ▪ i := 0; ▪ While N > Do ◦ i := i + 1; ◦ A[i] := SH[( N mod 16)+1]; ◦ N := N div 16; Sau ta in ngược mảng A se cho kết N(16) Thuật toán cài đặt ngôn ngữ lập trình Pascal sau: Uses Crt; Var A: Array[1 100] of Char; n: Longint; i, j: Integer; SH: String[16]; Begin Clrscr; Write('Nhap so thap phan N = '); Readln(N); i := 0; SH := '0123456789ABCDEF'; While N > Do Begin Inc(i); A[i] := SH[(N mod 16) +1]; - Trang 189 - N := N div 16; End; Write('N(16) = '); For j := i downto Write(A[j]); Readln End Chương trình C++: #include #include #include char Tam[100],A[100],SH[100]; long N; int i; int main() { printf("Nhap so thap phan N = "); scanf("%d",&N); i=-1; strcpy(SH,"0123456789ABCDEF"); while(N>0) { i++; Tam[i]=SH[(N%16)]; N=N/16; } Tam[i+1]='\0'; for(i=0;iN A[i] A[i] mod =1 d S S S S Đ S 1 - Trang 26 - Hoàng Thị Cẩm Tú Lớp: Tin 4b PHƯƠNG PHÁP GIẢI BÀI TẬP TIN HỌC Bài 4.31/42 ( sách tập tin học 11) Cho