Muốn vậy ngoài việc dạy đại trà tin học trong nhà trường nhằm đảm bảo tính phổ thông, hướng nghiệp và dạy nghề cần phải tạo điều kiện cho các học sinh có năng khiếu tin học được phát tri
Trang 1Phần Phần IIII:::: mở đầu mở đầu mở đầu A
A Lí do chọn đề tài Lí do chọn đề tài Lí do chọn đề tài Trong những năm gần đây, việc đào tạo về Công nghệ thông tin (CNTT) đ trở thành nhu cầu ngày càng cấp thiết hơn đối với mọi người, từ nhân viên bán hàng, kỹ sư, bác sĩ và phóng viên đến nhà doanh nghiệp, cán bộ quản lí… Phù hợp với xu thế phát triển của x hội, tin học đ trở thành một môn học chính thức và được yêu thích ở nhà trường Ngay từ trên ghế nhà trường không ít học sinh đ quyết tâm học tập để trở thành chuyên gia CNTT và một số em đ đạt thành tích cao tại các kỳ thi do tỉnh, quốc gia tổ chức
Một trong những mục tiêu khi đưa tin học vào trong nhà trường là nhằm giúp cho học sinh có khả năng phân tích, tổng hợp, trừu tượng hoá, khái quát vấn đề và đặc biệt là phát huy tư duy Muốn vậy ngoài việc dạy đại trà tin học trong nhà trường nhằm đảm bảo tính phổ thông, hướng nghiệp và dạy nghề cần phải tạo điều kiện cho các học sinh có năng khiếu tin học được phát triển về khả năng lập trình để giải quyết các bài toán Để góp phần vào việc phục vụ cho quá trình dạy và học tin học trong trường PTDT Nội trú, trong chuyên đề này tôi xin trình bày:
Các bước Các bước giải một bài toán trong tin học giải một bài toán trong tin học giải một bài toán trong tin học
Nội dung chuyên đề gồm 2 phần:
A- Tìm hiểu cấu trúc dữ liệu biểu diễn bài toán
B- Các bước để giải bài toán trong tin học
BBBB Phương Phương Phương pháp nghiên cứu pháp nghiên cứu pháp nghiên cứu Phương pháp chủ yếu khi viết chuyên đề: “Các bước Các bước Các bước giải bài toán trong tin giải bài toán trong tin học
học” ” ” là nghiên cứu Sách giáo khoa và một số tài liệu tham khảo, từ đó tổng hợp chắt lọc các kiến thức và nội dung cần thiết để xây dựng chuyên đề
C
C Đối tượng nghi Đối tượng nghi Đối tượng nghiên cứu ên cứu ên cứu Chuyên đề viết ra với mục đích phục vụ cho quá trình dạy và học tin học trong trường PTDT Nội trú nên nội dung ngắn gọn, dễ hiểu, không quá phức tạp Học sinh có thể tự nghiên cứu và hiểu được
Trang 2Phần 2 hần 2 hần 2: Nội dung : Nội dung : Nội dung A
A Tìm hiểu cấu trúc dữ liệu biểu diễnTìm hiểu cấu trúc dữ liệu biểu diễnTìm hiểu cấu trúc dữ liệu biểu diễn bài toán bài toán bài toán Các bài toán trong thực tế thường có dữ liệu vào và kết quả ra thuộc những kiểu dữ liệu quen biết như: số nguyên, số thực, kí tự… Khi cần lập trình cho những bài toán như vậy, người lập trình sử dụng các kiểu dữ liệu đó thường gặp một số hạn chế nhất định, phụ thuộc vào các yếu tố như: dung lượng bộ nhớ, khả năng xử lí của CPU…
Vì vậy, mỗi một ngôn ngữ lập trình thường cung cấp một số kiểu dữ liệu chuẩn cho biết phạm vi giá trị có thể lưư trữ, dung lượng bộ nhớ cần thiết để lưu trữ và các phép toán tác động lên dữ liệu
Trong ngôn ngữ Pascal ta có sơ đồ các kiểu dữ liệu như sau:
BOOLEAN
INTEGER
BASIC TYPE REAL
CHAR
SIMPLE TYPE
DATA TYPE USER DEFINED SUBRANGE
TYPE ENUMERATED
STRUCTURE TYPE ARRAY
SET
RECORD
STRING FILE
• BOOLEAN: Kiểu logic chỉ có thể nhận một trong hai giá trị TRUE hoặc FALSE
• INTEGER: Kiểu số nguyên (-32768 32767)
• REAL: Kiểu số thực (2.9x10-39 1.7x1038)
• CHAR: Kiểu kí tự gồm 256 kí tự trong bộ m ASCII
• SUB_RANGE: Kiểu miền con của một kiểu sơ cấp
Trang 3Ví dụ:
TYPE
CHU_HOA=’A’ ’Z”;
Chu_thuong=’a’ ’z’;
So_nguyen=0 200;
• ENUMERATED: Kiểu liệt kê đ−ợc định nghĩa bằng cách liệt kê tất cả các phần
tử có thể có
Ví dụ:
TYPE
THU=(Chunhat, ThuHai, ThuBa, ThuTu, ThuNam, ThuSau, ThuBay);
Color=(Red, Blue, Green, White, Black);
• ARRAY: Kiểu mảng gồm một tập hợp các phần tử cùng một kiểu dữ liệu cơ sở
đ−ợc xác định bởi chỉ số
Ví dụ:
TYPE
A=array[1 100] of integer;
B=array[1 100,1 100] of integer;
• RECORD: Kiểu bản ghi gồm một tập hợp các phần tử thuộc các kiểu dữ liệu khác nhau
Ví dụ:
TYPE
Hocsinh=record
• SET: Kiểu tập hợp gồm một số các đối t−ợng có cùng kiểu cơ sở
Ví dụ:
TYPE
Chucai= SET OF Char;
Chuso= SET OF 0 9;
Trang 4• STRING: KiÓu x©u gåm mét dy c¸c kÝ tù
VÝ dô:
TYPE
TRUONG: STRING[50];
HOTEN:STRING;
• FILE: KiÓu tÖp gåm mét tËp hîp c¸c d÷ liÖu cã liªn quan víi nhau vµ cã cïng kiÓu ®ưîc nhãm l¹i thµnh mét dy vµ ®ưîc lưu tr÷ trªn bé nhí nhí ngoµi
VÝ dô:
TYPE
Tep=FILE of integer;
Bai=text;
Trang 5
BBBB Các bước để giải bài toán trong tin học: Các bước để giải bài toán trong tin học: Các bước để giải bài toán trong tin học: I_ Bước 1: Xác định bài toán:
1- Khái niệm bài toán:
Trong quá trình tồn tại và phát triển, mọi cá nhân luôn phải liên tục giải quyết các bài toán Cuộc sống là một chuỗi các bài toán mà ta phải đối đầu để giải quyết
Theo nhiều nhà nghiên cứu thì mọi bài toán đều có thể diến đạt theo một sơ đồ chung:
A B Trong đó:
+ A: là giả thiết, điều kiện ban đầu hoặc là cái đ cho, cái đ có khi bắt đầu giải bài toán
+ B: là kết luận, mục tiêu cần đạt được hoặc là cái phải tìm, phải làm ra khi kết thúc bài toán
+ : là suy luận, giải pháp cần xác định hoặc là một chuỗi các thao tác cần thực hiện, cần thi hành để từ những cái đ có A có được cái phải tìm B
2- Xác định bài toán:
Theo sơ đồ trên thì xác định bài toán có nghĩa là xác định A, B và nếu có thể được thì xác định luôn các thao tác được phép sử dụng để đi từ A đến B
3- Bài toán trong tin học:
Một bài toán trên máy tính cũng mang đầy đủ các tính chất của một bài toán tổng quát đ nói ở trên nhưng có thể được diễn dạt theo môt cách nói khác
* A: là input hay còn gọi là thông tin vào
* B: là output hay còn gọi là thông tin ra
* là chương trình tạo ra từ các lệnh cơ bản của máy cho phép biến đổi từ
A thành B
4- Những khó khăn:
Để xác định một bài toán trên máy tính ta thường gặp những khó khăn sau:
- Thông báo về A hay B không đầy đủ và không rõ ràng
- Thông báo về các điều kiện đặt ra cho cách giải thường không được nêu ra một cách minh bạch
5- Một số ví dụ:
Ví dụ 1: Tìm ước chung lớn nhất của hai số nguyên dương M và N
Input: hai số nguyên dương M và N
Output: Ước chung lớn nhất của M và N
Trang 6Ví dụ 2: Bài toán tìm kiếm nhị phân:
Cho dy A tăng gồm N số nguyên khác nhau a1, a2, … aN và một số nguyên k cho trước Cần biết có hay không chỉ số i (1<=i<=N) mà ai = k Nếu có hy cho biết chỉ số đó Input: Dy A là dy tăng gồm N số nguyên khác nhau a1, a2, … aN , số nguyên k Output: Chỉ số i mà ai = k hoặc thông báo không có số hạng nào của dy A có giá trị bằng k
Ví dụ 3: Bài toán 8 quân hậu:
Hy tìm các cách đặt 8 quân hậu trên một bàn cờ vua sao cho không có quân hậu nào có thể ăn quân hậu nào
Input:
- Một bàn cờ một bảng hình vuông gồm 8 hàng và 8 cột
- Quân hậu là quân có thể ăn được bất kì quân nào nằm trên cùng một hàng, cùng một cột hay cùng một đường chéo
- Ta có tất cả 8 quân hậu
Output: Các bảng vuông trên đó đ có đánh dấu vị trí của 8 quân hậu sao cho không có quân hậu nào có thể ăn quân hậu nào khác, nghĩa là trên mỗi hàng, mỗi cột, mỗi
đường chéo chỉ có thể có một quân hậu
6- Một số nhận xét:
- Việc xác định bài toán là rất quan trọng nó ảnh hưởng rất lớn đến đến cách thức và chất lượng của việc giải quyết bài toán
- Một bài toán cho dù được diễn đạt bằng thông báo chính xác đến đâu đi chăng nữa thì phần lớn thông tin về A và B là tiềm ẩn trong đầu người giải Thông báo về A hoặc B chỉ là biểu tượng gợi nhớ tới các thông tin tiềm ẩn đó
- Bước đầu tiên để xác định một bài toán là phải phát biểu lại bài toán một cách chính xác theo ngôn ngữ riêng của mình vì đó chính là cách tiếp cận bài toán, hiểu bài toán
- Bước kế tiếp là tìm hiểu các thông tin Input A và thông tin Output B, tìm các mối liên giữa chúng
Trang 7II_ Bước 2: Chọn cấu trúc dữ liệu để biểu diễn bài toán: 1- Một số lưu ý khi chọn cấu trúc dữ liệu:
- Cấu trúc dữ liệu phải biểu diễn được đấy đủ các thông tin nhập và xuất của bài toán
- Cấu trúc dữ liệu phải phù hợp với thao tác của thuật toán mà ta lựa chọn để giải quyết bài toán
- Cấu trúc dữ liệu phải phù hợp với điều kiện cho phép của ngôn ngữ lập trình và MTĐT đang được sử dụng
2- Một số ví dụ:
Ví dụ 1: Tìm ước chung lớn nhất của hai số nguyên dương M và N
M, N là các số nguyên dương nên cấu trúc dữ liệu nguyên dương là hợp lý Có thể
sử dụng dữ liệu kiểu INTEGER
Ví dụ 2: Bài toán tìm kiếm nhị phân:
Để biểu diễn dy gồm N số nguyên thì cấu trúc dữ liệu ở đây sử dụng mảng một chiều là hợp lí Cụ thể là sử dụng một mảng gồm có N số nguyên (kiểu Integer)
Ví dụ 3: Bài toán quản lí học sinh của một lớp:
Thông tin về một học sinh bao gồm: Họ tên, Ngày sinh, Điểm Toán, văn, ngoại ngữ, lí, hoá, sinh, sử ,địa, TD, GDCD, Xếp loại Đưa ra kết quả xếp loại của từng học sinh trong một lớp
Để biểu diễn thông tin về một học sinh ta sử dụng một bản ghi (RECORD) để biểu diễn
Type HS = record
HoTen:string[20];
NgaySinh:string[10];
Toan, Van, NN, Sinh, Su, Dia, GDCD, TD:real;
DiemTB:real;
XepLoai:char;
End;
Để biểu diễn số học sinh trong một lớp ta sử dụng mảng (ARRAY):
Var LopA: array[1 Nmax] of HS;
Trang 83_ Bước 3: Tìm thuật toán:
Tìm thuật toán là bước quan trọng nhất để giải quyết một bài toán Mỗi thuật toán chỉ có thể giải được một bài toán nhưng một bài toán có thể có nhiều thuật toán khác nhau
Khi thiết kế thuật toán hoặc lựa chọn thuật toán người ta thường quan tâm đến các tài nguyên như: thời gian thực hiện, số lượng ô nhớ…
Ví dụ: với bài toán tìm kiếm nhị phân, dy đ cho là dy đ được sắp xếp nên thuật toán tìm kiếm nhị phân (sẽ trình bày ở dưới đây) cần ít thao tác hơn nhiều so với thuật toán tìm kiếm tuần tự
Ví dụ 1: Tìm ước chung lớn nhất cua hai số nguyên dương M và N
Ta có thuật toán Euclide được diễn tả bằng lưu đồ như sau:
ƯCLN là M
M>N M<>N
M:=M-N
end
Begin
Nhập M, N
M:=M+N
Trang 9VÝ dô 2: Bµi to¸n t×m kiÕm nhÞ ph©n:
Ta cã thuËt to¸n t×m kiÕm nhÞ ph©n nh− sau:
NhËp N vµ a1, a2 …aN
Dau<-1;Cuoi<-N
Giua:=[(Dau+Cuoi)/2]
Agiua=k? §óng §−a ra giua råi kÕt thóc
Agiua<k?
§óng
Dau<-giua+1
Cuoi<-Giua-1
Sai
Dau>Cuoi
§óng
Sai Sai
TB kh«ng cã phÇn tö
b»ng k råi kÕt thóc
Trang 10IV_ Bước 4: Lập trình:
1- Khái niệm:
Lập trình là dùng ngôn ngữ máy tính cụ thể nào đó (ví dụ Pascal) để diễn tả thuật toán, cấu trúc dữ liệu thành các câu lệnh để máy tính có thể thưc hiện được và giải quyết
đúng bài toán mà người lập trình mong muốn
2- Kĩ năng lập trình:
- Kĩ năng lập trình là kĩ năng cài đặt thành công các thuật toán bằng một ngôn ngữ lập trình cụ thể
- Đ gọi là kĩ năng thì chỉ có thể có được thông qua việc tèn luyện tích cực
- Kinh nghiệm cho thấy một thuật toán hay nhưng việc cài đặt lộn xộn, vụng về khi chạy trên máy tính có thể cho kết quả rất tồi tệ
3- Phát triển chương tình bằng cách tinh chế từng bước:
Tinh chế từng bước là phương pháp khoa học, có hệ thống giúp ta phân tích các thuật toán và cấu trúc dữ liệu từ đó viết thành chương trình
Muốn lập trình không phải chỉ nắm vững ngôn ngữ lập trình là đủ, vấn đề cốt yếu
là biết phát triển dần dần để chuyển các ý tưởng thành chương trình hoàn chỉnh
4- Phương pháp tinh chế từng bước:
Ban đầu chương trình được viết bằng những lời tự nhiên (ngôn ngữ tiếng Việt chẳng hạn)
- ở từng bước sau, mỗi câu lời được phân tích ra chi tiết hơn bằng nhiều câu lời khác tương ứng với sự phân tích một công việc thành những công việc nhỏ hơn Mỗi câu lời đó là một sự đặc tả công việc
- Càng ở những bước sau các lời tự nhiên được thay thế bằng câu lời trong ngôn ngữ lập trình
- Phương pháp tinh chế từng bước là một thể hiện của sự tư duy, giải quyết vấn đề
từ trên xuống trong đó sự phát triển của các bước là hướng về phía ngôn ngữ lập trình
đang được sử dụng
4- Các ví dụ:
Ví dụ 1: Bài toán tìm ước chung lớn nhất của hai số nguyên dương M, N
Theo thuật toán Euclid đ trình bày ở trên ta tinh chế chương trình như sau:
* Tinh chế lần 1:
Bắt đầu
Nhập M, N Lưu M vào a, lưu N vào b (Lưu lại giá trị cho M và N)
Chừng nào M khác N thì
Nếu M>N thì thay thế M bởi M-N
Trang 11Ngược lại thay thế N bởi N-M
Xuất ƯCLN của M, N là M
Kết thúc
* Ting chế lần 2:
Bắt đầu;
Nhập M, N; a<-M; b<-N;
While M<>N do
IF M>N then M<-M-N Else N<-N-M;
In ra “UCLN của M và N là M”;
Kết thúc
Chương trình có thể viết hoàn chỉnh như sau:
Program UCLN;
Var M,N,a,b: integer;
Begin
Write(‘ Moi ban nhap gia tri M, N’); readln(M,N);
a:=M; b:=N;
While M<>N do
If M>N then M:=M-N Else N:=N-M:
Writeln(‘ƯCLN của ‘,a,’,’,b,’ la:’,M);
Readln End
Ví dụ 2: Bài toán tìm kiếm nhị phân:
Tinh chế lần 1: ý tưởng của thuật toán
Sử dụng tính chất dy A là dy tăng, ta thu hẹp nhanh phạm vi tìm kiếm sau mỗi lần so sánh khoá với số hạng được chọn Để làm điều đó là chọn số hạng agiua ở “giữa dy”
để so sánh với k, trong đó giua= 2+1
N
Khi đó chỉ xảy ra một trong 3 trường hợp:
+ Nếu agiua = k thì đưa ra chỉ số giua cần tìm Việc tìm kiếm kết thúc
+ Nếu agiua > k thì do A là dy đ sắp xếp tăng nên việc tìm kiếm tiếp theo sẽ thực hiện trên dy a1, a2, … agiua-1
+ Nếu agiua < k thì việc tìm kiếm sẽ được thực hiện trên dy số agiua+, … aN
Trang 12Quá trình sẽ được lặp lại một số lần cho đến khi hoặc đ tìm thấy khoá k trong dy
A hoặc phạm vi tìm kiếm bằng rỗng
* Tinh chế lần 2:
Bắt đầu
B1- Nhập dữ liệu
B2- Dau<-1; Cuoi<-N;
B3- Kiểm tra điều kiện: Dau > Cuoi ?
B3.1: Nếu Dau< Cuoi thì :
B4- giua= +2
Cuoi Dau
B5- Nếu agiua = k thì thông báo chỉ số giua rồi kêt thúc
B6- Nếu agiua > k thì đặt Cuoi<-giua-1 rồi quay lại B3 B7- Nếu agiua < k thì đặt Dau<-giua+1 rồi quay lại B3 B3.2: Nếu Dau > Cuoi thì thông báo dy A không có số hạng nào có giá trị bằng k rồi kết thúc
* Tinh chế lần 3:
Bắt đầu
B1- Nhập dữ liệu: N, các số hạng của dy: a1, a2, … aN
B2- Dau<-1; Cuoi<-N;
B3- While Dau < Cuoi và chưa tìm thấy k thì
1 Tính - giua= +2
Cuoi Dau
2 IF Agiua = k then thông báo Tìm thấy k Ngược lại If Agiua > k then Cuoi<-giua-1
Ngược lại Dau<-giua+1 B4- Nếu không tìm thấy k (tức Dau>Cuoi) thì thông báo không có số hạng nào của dy bằng k
* Chương trinh hoàn chỉnh:
Program TKNP;
Uses crt;
Const Nmax=250;
Type Arrint=Array[1 Nmax] of integer;
Var N,i,k,Dau,Cuoi,giua:integer;
A:Arrint;
Trang 13BEGIN
Clrscr;
Write(‘Nhap so phan tu cua day so N=’); readln(N);
Writeln(‘Nhap cac phan tu cua day so tang:’);
For i:=1 to N do Begin
Write(‘PT thu ‘,i,’ la:’); readln(A[i]);
End;
Write(‘Nhap k=’); readln(k);
Dau:=1; Cuoi:=N; Timthay:=false;
While (Dau< Cuoi) and not(Timthay) do Begin
Giua:=(Dau+Cuoi) mod 2;
If A[giua] = k then Timthay:=true Else if A[giua]>k then Cuoi:=giua-1 Else Dau:=giua+1;
End;
If Timthay then writeln(‘Chi so tim duoc la:’,giua) Else writeln(‘Khong tim thay!’);
Readln END
V-bước 5: Hiệu chỉnh:
Sau khi được viết xong, chương trình vẫn còn có thể có nhiều lỗi khác chưa phát hiện được nên có thể không cho kết quả đúng Vì vậy, cần phải chạy thử chương trình với một số bộ Input tiêu biểu phụ thuộc vào đặc thù của bài toán và bằng cách nào đó ta đ biết trước Output Các bộ Input và Output tương ứng này được gọi là các Test Nếu có sai sót ta phải sửa chương trình và thử lại
Ví dụ 1: Với thuật toán tìm kiếm nhị phân ta có thể Test chương trình với các bộ test tương ứng với kết quả là tìm thấy hoặc không tìm thấy
Ví dụ 2: Với bài toán giải phương trình bậc hai: Ta có thẻ Test chương trình với các
bộ test tương ứng với kết quả của bài toán là: Vô nghiệm (Delta<0), Có nghiệm kép (Delta=0), Có hai nghiệm phân biệt (Delta>0)