Biện Pháp 3: Hình Thành Thói Quen Khái Quát Hóa Bài Toán, Kiểm Tra, Đánh Giá Các Chương Trình Kết Quả Và Xây Dựng Chương Trình Với Nhiều Thuật Toán Khác


scanf("%d" , &n ) ;

} while ((n>0) && (n <= 20)) ; return ;

}

void Nhap_mang ( int *P , byte n )

{ for( int i=0; i<n; i++)

{ printf("Phan tu thu %d: ",i);

scanf("%d",&P[i]);

}

return ;

}

void SX_tang ( int *P , byte n )

{ for ( int i=0 ; i <= n – 2 ; i ++)

for ( int j= i + 1 ; j <= n – 1 ; j ++) if (P[i] > P[j])

swap( &P[i] ,& P[j]);

return ;

}

void swap(int *pa, int *pb)

{ int x;

x = *pa; *pa = *pb; *pb = x; return ;

}

void In_mang ( int *P , byte n )

{ for( int i=0; i<n; i++)

printf("%4d", P[i]); return ;

}


2.2.3 Biện pháp 3: Hình thành thói quen khái quát hóa bài toán, kiểm tra, đánh giá các chương trình kết quả và xây dựng chương trình với nhiều thuật toán khác nhau sao cho chương trình hiệu quả hơn

a. Cơ sở đề xuất biện pháp 3:

Việc dạy học lập trình cho SV không chỉ dừng lại ở việc SV nắm bắt được các kiến thức về lập trình và có thể viết được chương trình để giải quyết các bài toán đặt ra mà còn phải hướng cho SV đến các thao tác như xác định được những bài toán cùng loại, khái quát hóa thành bài toán tổng quát từ một bài toán cụ thể.

Hơn nữa, mỗi thuật toán chỉ giải quyết một bài toán nào đó, nhưng có thể có nhiều thuật toán khác nhau cùng giải một bài toán. Cho nên cần thiết kế hoặc lựa chọn một thuật toán phù hợp đã có để giải bài toán cho trước. Biện pháp này sẽ giúp SV tìm tòi, so sánh để đưa ra thuật toán tối ưu, phù hợp với nội dung của bài toán.

b. Mục đích của biện pháp 3:

Biện pháp này giúp cho SV ngành KTĐT-VT hình thành ý thức tìm tòi phương pháp tối ưu, tìm cách cải tiến các quy trình sao cho đem lại hiệu quả cao hơn. Ngoài ra, còn giúp SV rèn luyện khả năng diễn đạt, mô tả chính xác thuật toán và tập thói quen kiểm tra nhiều lần kết quả (với nhiều bộ test khác nhau) nhằm giảm thiểu rủi ro xảy ra, nhằm khắc phục những sai sót trong quá trình hoạt động.

Biện pháp này nhằm hình thành và phát triển yếu tố thứ hai của tư duy điện toán: “Nhận dạng mẫu”, yếu tố thứ ba của tư duy điện toán: “Thiết kế thuật toán” để lựa chọn thuật toán tối ưu và yếu tố thứ tư của tư duy điện toán: “Trừu tượng hóa – Tổng quát hóa” lời giải của một bài toán cụ thể, sau đó đề xuất quy trình, thuật toán giải một dạng bài toán.

c. Cách thức thực hiện biện pháp 3:

Khi viết một chương trình, sử dụng các kĩ thuật lập trình giúp cho việc lập trình được hiệu quả hơn, giúp tiết kiệm nguồn tài nguyên của máy tính,


giúp cho thuật toán của chương trình chạy nhanh hơn trên máy tính, thuật toán dễ hiểu hơn...

Bên cạnh đó, sau khi viết chương trình, cần kiểm tra với nhiều bộ kiểm thử (test) khác nhau nhằm kiểm tra tất cả các trường hợp, tình huống xảy ra trong thực tế, việc làm này nhằm giảm thiểu rủi ro của một phần mềm khi đưa vào ứng dụng trong thực tế.

Để luyện tập khả năng tổng quát hóa, khái quát hóa, GV cần tập cho SV phân tích trong các bài toán, các vấn đề đã cho có các đặc điểm cơ bản chung cho mọi bài toán và các đặc điểm riêng cho từng bài toán.

Để rèn luyện, phát triển tư duy phân tích, đánh giá thuật toán, GV có thể từng bước hình thành, rèn luyện cho SV khả năng đánh giá độ phức tạp thuật toán ở mức độ đơn giản và dựa vào tiêu chí ở trên dưới các góc độ như: độ phức tạp về thời gian tính toán của thuật toán (số phép tính trên máy tính cần thực hiện).

Ví dụ minh họa biện pháp 3:

Khi dạy nội dung bài “Một số vấn đề kĩ thuật cần lưu ý khi lập trình” trong học phần “Kĩ thuật lập trình”. GV đưa ra một số kĩ thuật lập trình cần chú ý để giúp SV nắm bắt một số kĩ thuật trong lập trình giúp cho thuật chương trình thực hiện nhanh hơn, hoặc tiết kiệm tài nguyên bộ nhớ hơn.

Chẳng hạn như:

a. Sử dụng thuật toán “tốt nhất” có thể nhằm tăng hiệu quả cho việc viết chương trình.

Ví dụ: Tính tổng của n số tự nhiên kế tiếp theo kể từ số tự nhiên m.

Thực hiện viết theo hai cách và hãy so sánh hai cách viết đoạn chương trình sau:

Trong cách 1, sử dụng một vòng lặp với n lần lặp để cộng dồn giá trị của sum từng bước kể từ m đến n số tự nhiên tiếp theo. Do vậy, chương trình thực hiện lặp nhiều lần các phép tính “+=”, ++, phép so sánh và phép gán. Khi đó, chương trình có độ phức tạp thuật toán sẽ được đánh giá là chưa tối ưu vì


phải thực hiện rất nhiều phép toán không cần thiết. Trong khi đó ở cách 2, thay vòng lặp bằng 1 phép toán gán và 5 phép toán số học cơ bản (+, - , *, /). Số phép toán và câu lệnh thực hiện được thực hiện ít nhất có thể, giúp đoạn chương trình tốt hơn. Chính là nhờ phân tích bài toán và vận dụng kiến thức toán học, cụ thể là sử dụng công thức cấp số cộng trong toán học về tính tổng n số liên tiếp từ m. Cụ thể ta có số đầu tiên là m, số cuối cùng là (m + n – 1) nên tính được số phần tử là n. Từ đó, công thức tính tổng n số liên tiếp từ m như sau: tổng = (số đầu tiên m + số cuối cùng (m + n – 1)) * số phần tử n / 2.

Cách 1:

void main( )

{ long n, m, i, sum;

cout << ‘Nhap n = ’ ; cin >> n ; cout << ‘Nhap m = ’ ; cin >> m; sum = 0 ;

for ( i = m ; i < m + n ; i++) sum += i ;

cout << ‘Tong = ’ << sum ;

}

Cách 2:

void main( )

{ long n, m, i, sum;

cout << ‘Nhap n = ’ ; cin >> n ; cout << ‘Nhap m = ’ ; cin >> m; sum = ( m + m + n – 1) * n / 2 ; cout << ‘Tong = ’ << sum ;

}

Có thể bạn quan tâm!

Xem toàn bộ 235 trang tài liệu này.

Dạy học kĩ thuật lập trình cho sinh viên ngành Kĩ thuật điện tử - viễn thông theo hướng phát triển tư duy điện toán - 15


Qua hai cách viết đoạn chương trình trong ví dụ trên thì cách 2 được đánh giá là tốt hơn, hiệu quả hơn. GV khuyến khích SV nên chọn cách viết ở đoạn chương trình 2 ở trên.

b. Sử dụng hàm inline

Khai báo hàm ngắn và đơn giản (thường chỉ 1 dòng) thì nên sử dụng hàm inline. Điều này giúp tránh phải thực hiện 4 bước khi hàm được gọi và tránh dùng bộ nhớ stack. Và mã inline sẽ được chèn vào bất kỳ chỗ nào trong chương trình khi hàm được gọi thực hiện.

Ví dụ:

#include <iostream.h>


#include <cmath.h>

inline double CanhHuyen (double a, double b)

{ return sqrt( a * a + b * b) ; } int main ( )

{ double m = 5 , n = 8 ;

// 2 dòng lệnh sau thực hiện như nhau, cùng trả về 1 kết quả cout << CanhHuyen (m, n) << endl ;

cout << sqrt( m * m + n * n) << endl ; return 0 ; }

c. Hạn chế tính cùng một biểu thức nhiều lần

Ví dụ:


for (i=1 ; i<= 10 ; i++) x += strlen(str) ;

Y = 15 + strlen(str) ;

ChieuDai = strlen(str) ; for (i=1 ; i<= 10 ; i++)

x += ChieuDai ;

Y = 15 + ChieuDai ;


d. Không đặt các biểu thức tính toán bất biến trong vòng lặp

Khi viết chương trình, với những biểu thức tính toán không thay đổi thì nên đặt biểu thức tính toán đó ra ngoài vòng lặp. Điều này sẽ giảm đi việc thực hiện những phép tính toán không cần thiết trong chương trình.

Ví dụ:


for ( i = 0 ; i < 100 ; i++ ) Pilot ( i, i * sin(d)) ;

A = sin(d) ;

for ( i = 0 ; i < 100 ; i++ ) Pilot ( i, i * A ) ;

e. Sử dụng kĩ thuật “lính canh”

Để hạn chế những phép kiểm tra không cần thiết trong quá trình thực hiện tìm kiếm giá trị trong một chuỗi, một dãy, một mảng hay một danh sách nào đó, nên sử dụng giá trị cần tìm vào cuối cùng của chuỗi, dãy, mảng hay danh sách đó. Đó chính là “lính canh”.


Ví dụ: Kiểm tra giá trị SearchValue có xuất hiện trong chuỗi s cho trước hay không?

char s[100] , SearchValue ; int pos, Find, size ;

… Gán giá trị cho chuỗi s và biến SearchValue


Cách 1: Không sử dụng “lính canh” size = strlen (s) ;

pos = 0 ;

While (pos < size) &&

(s[pos] != SearchValue) pos ++ ;

if (pos >= size) Find = 0

else Find = 1 ;

Cách 2: Sử dụng “lính canh” size = strlen (s) ;

strcat (s, SearchValue)

pos = 0 ;

While (s[pos] != SearchValue) pos ++ ;

if (pos >= size) Find = 0

else Find = 1 ;


f. Quy tắc tăng tốc độ:

Có thể muốn tăng tốc độ của chương trình bằng cách thêm bộ nhớ. Cụ thể:

- Sử dụng thêm các dữ liệu có cấu trúc như mảng (array), danh sách (list), ngăn xếp (stack), hàng đợi (queue),… Thời gian cho các phép toán thông dụng có thể giảm bằng cách sử dụng thêm các cấu trúc dữ liệu với các dữ liệu bổ sung hoặc bằng cách thay đổi các dữ liệu trong cấu trúc sao cho dễ tiếp cận hơn.

- Lưu các kết quả được tính toán trước: Thời gian tính toán lại các hàm có thể giảm bớt bằng cách tính toán hàm chỉ một lần và lưu kết quả, những yêu cầu sau này sẽ được xử lý bằng cách tìm kiếm từ mảng hay danh sách kết quả thay vì tính lại hàm.

- Không bao giờ tính một phần tử cho đến khi cần để tránh những sự tính toán không cần thiết.


2.3 TỔ CHỨC HOẠT ĐỘNG DẠY HỌC MÔN KĨ THUẬT LẬP TRÌNH PHÁT TRIỂN TƯ DUY ĐIỆN TOÁN CHO SINH VIÊN KTĐT, VT

2.3.1 Tiến trình tổ chức dạy học môn Kĩ thuật lập trình nhằm phát triển tư duy điện toán cho sinh viên KTĐT-VT

2.3.1.1 Tiến trình chung cho việc tổ chức dạy học

Dựa vào những nguyên tắc dạy học trên, việc tổ chức dạy học nhằm phát triển tư duy điện toán cho sinh viên có thể thực hiện theo tiến trình chung gồm 4 giai đoạn với 10 bước thực hiện cụ thể như sau:

* Giai đoạn 1: Giai đoạn chuẩn bị trước khi bắt đầu môn học

Đây là giai đoạn được thực hiện đầu tiên khi GV nhận lớp học và môn học. Việc chuẩn bị này cần thiết vì sẽ giúp cho GV hiểu hơn về đối tượng người học và những yêu cầu cần thiết của môn học trước khi bắt đầu lên kế hoạch thực hiện nội dung môn học phù hợp với đối tượng người học. Sau khi GV đã thiết lập được kế hoạch giảng dạy chi tiết môn học này thì về sau GV có thể bỏ qua giai đoạn này.

- Bước 1: Tìm hiểu, khảo sát đối tượng người học, lớp học trước khi dạy, về đặc điểm, tính cách, hoàn cảnh điều kiện học tập, nguyện vọng, nhu cầu của SV. Ngoài ra, có thể tìm hiểu thêm về năng lực và phong cách học tập của SV.

- Bước 2: Tìm hiểu chương trình học của ngành học về chuẩn đầu ra, số tín chỉ,… Sau đó, tìm hiểu mục tiêu, chuẩn đầu ra và nội dung tổng thể của môn học đó.

* Giai đoạn 2: Lập kế hoạch dạy học và thiết kế giáo án bài học cụ thể

- Bước 3: Nghiên cứu, lựa chọn nội dung bài học cụ thể và xác định mục tiêu bài học.

Ở bước này, GV cần xác định được mục tiêu về kiến thức, về kỹ năng, về biểu hiện của sự phát triển tư duy điện toán phù hợp với phong cách học


tập của đối tượng người học. Đặc biệt, cần chú ý đến các yếu tố thành phần giúp hình thành nên năng lực tư duy điện toán cho SV tương ứng với nội dung bài học đó. Cũng chính nhờ sự phân tích mục tiêu bài học mà GV có thể xác định những nội dung học có thể vận dụng các biện pháp phát triển các kỹ năng, năng lực thành phần của tư duy điện toán hay không.

Sau khi nghiên cứu kỹ nội dung bài học, dựa vào các kỹ năng thành phần cần đạt được cho SV trong năng lực tư duy điện toán, GV xác định những nội dung của từng phần, từng đề mục, từng ví dụ minh họa,… trong bài học có thể phù hợp với việc vận dụng biện pháp phát triển tư duy điện toán cho SV.

- Bước 4: Lựa chọn biện pháp áp dụng vào bài dạy.

Trên cơ sở xác định được mục tiêu, yêu cầu cần có sau khi học, GV lựa chọn biện pháp vận dụng phù hợp kết hợp với phương pháp dạy học, kĩ thuật dạy học phù hợp với nội dung bài học nhằm nâng cao hiệu quả dạy học và đồng thời giúp phát triển năng lực tư duy cho SV.

- Bước 5: Soạn kế hoạch, giáo án cho bài học.

+ Tiến hành soạn kế hoạch bài dạy, giáo án theo đúng với định hướng phát triển tư duy điện toán.Với mỗi biện pháp có thể vận dụng ở nhiều tình huống khác nhau trong quá trình thực hiện kế hoạch dạy học. Đồng thời, trong mỗi nội dung bài học, tùy vào đặc điểm nội dung, yêu cầu của bài học thì có thể vận dụng biện pháp phát triển ở mức độ khác nhau.

Tùy thuộc vào giải pháp được chọn để vận dụng vào bài học và phương pháp dạy học đã chọn, GV sẽ thiết kế các hoạt động học tập tương ứng với từng nội dung trong bài học. Giáo án được thể hiện từng hoạt động cụ thể của GV và SV, thời gian thực hiện tương ứng với nội dung của bài học.

+ Xác định công cụ để đánh giá khả năng tư duy điện toán của SV như phiếu hỏi kiểm tra, phiếu đánh giá kết quả học tập hoặc đánh giá sản phẩm, bảng quan sát biểu hiện sáng tạo trong học tập.

..... Xem trang tiếp theo?
⇦ Trang trước - Trang tiếp theo ⇨

Ngày đăng: 02/09/2022