Bài 6: Kiểm thử và sửa lỗi chương trình

Khởi động (SGK Cánh diều - Trang 113)

Hướng dẫn giải

Bởi vì chương trình vừa viết xong còn lỗi và chưa được sửa.

(Trả lời bởi Thanh An)
Thảo luận (1)

Hoạt động (SGK Cánh diều - Trang 114)

Hướng dẫn giải

Tham khảo:

a) Gợi ý:

Ý tưởng

Dùng một vòng do while để nhập a, b, c nếu a = 0, thì nhập lại.

Chúng ta dùng hàm sqrt() trong thư viện math.h để tính căn delta hoặc tính căn không dùng hàm sqrt()tại đây.

Chúng ta tạo hàm giaiPT trả về kiểu int chính là số nghiệm của phương trình (1).

Chúng ta sẽ đưa tham chiếu 2 biến x1 , x2 vào hàm giaiPT để gán giá trị hai nghiệm.

Nếu pt (1) vô nghiện thì giaiPT sẽ trả về 0 , đồng thời gán x1 = x2 =0 .

Nếu pt (1) có nghiệm kép thì giaiPT sẽ trả về 1 , đồng thời gán x1 = x2 = -b/2a .

Nếu pt (1) có 2 nghiệm thì giaiPT sẽ trả về 2 , gán x1 = (-b+√delta ) / 2a  x = (-b-√delta ) / 2a .

b) Gợi ý:

#include <iostream>

using namespace std;

void nhap(int &n, int a[]){

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

        cout<<"a["<<i+1<<"]= ";cin>>a[i];

    }

}

void xuat(int n, int a[]){

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

        cout<<a[i]<<"  ";

    }  

}

 int tinhTBCongint (int n, int a[]){

    int sum=0, dem=0;

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

       sum+=a[i]; dem++; 

    }

    return sum/n;

}

int tinhTBCongDuong(int n, int a[]){

    int sum=0, dem=0;

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

        if(a[i] > 0) {

            sum+=a[i]; dem++;

        }

    }

    if(dem==0) return 0;

    return sum/dem;

}

int tinhTBCongAm(int n, int a[]){

    int sum=0, dem=0;

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

        if(a[i]<0) {

            sum+=a[i]; dem++;

        }

    }

    if(dem==0) return 0;

    return sum/dem;

}

int main(){

    int n;

    int a[100];

    do{

        cout<<"Nhap n: "; cin>>n;

    }while(n <= 0 || n >=100);

    nhap(n,a);

    cout<<"\n--------XUAT MANG----\n";

    xuat(n,a);

    cout<<"Trung binh cong: "<<tinhTBCongint(n,a)<<"\n\n";

    cout<<"Trung binh so duong: "<<tinhTBCongDuong(n,a)<<"\n\n";

    cout<<"Trung binh so am: "<<tinhTBCongAm(n,a)<<"\n\n";

}

(Trả lời bởi Time line)
Thảo luận (1)

Luyện tập 1 (SGK Cánh diều - Trang 116)

Hướng dẫn giải

Tham khảo:

a) Gợi ý:

 

Ý tưởng

Dùng một vòng do while để nhập a, b, c nếu a = 0, thì nhập lại.

Chúng ta dùng hàm sqrt() trong thư viện math.h để tính căn delta hoặc tính căn không dùng hàm sqrt()tại đây.

Chúng ta tạo hàm giaiPT trả về kiểu int chính là số nghiệm của phương trình (1).

Chúng ta sẽ đưa tham chiếu 2 biến x1 , x2 vào hàm giaiPT để gán giá trị hai nghiệm.

Nếu pt (1) vô nghiện thì giaiPT sẽ trả về 0 , đồng thời gán x1 = x2 =0 .

Nếu pt (1) có nghiệm kép thì giaiPT sẽ trả về 1 , đồng thời gán x1 = x2 = -b/2a .

Nếu pt (1) có 2 nghiệm thì giaiPT sẽ trả về 2 , gán x1 = (-b+√delta ) / 2a  x = (-b-√delta ) / 2a .

b) Gợi ý:

#include <iostream>

using namespace std;

void nhap(int &n, int a[]){

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

        cout<<"a["<<i+1<<"]= ";cin>>a[i];

    }

}

void xuat(int n, int a[]){

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

        cout<<a[i]<<"  ";

    }  

}

 int tinhTBCongint (int n, int a[]){

    int sum=0, dem=0;

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

       sum+=a[i]; dem++; 

    }

    return sum/n;

}

int tinhTBCongDuong(int n, int a[]){

    int sum=0, dem=0;

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

        if(a[i] > 0) {

            sum+=a[i]; dem++;

        }

    }

    if(dem==0) return 0;

    return sum/dem;

}

int tinhTBCongAm(int n, int a[]){

    int sum=0, dem=0;

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

        if(a[i]<0) {

            sum+=a[i]; dem++;

        }

    }

    if(dem==0) return 0;

    return sum/dem;

}

int main(){

    int n;

    int a[100];

    do{

        cout<<"Nhap n: "; cin>>n;

    }while(n <= 0 || n >=100);

    nhap(n,a);

    cout<<"\n--------XUAT MANG----\n";

    xuat(n,a);

    cout<<"Trung binh cong: "<<tinhTBCongint(n,a)<<"\n\n";

    cout<<"Trung binh so duong: "<<tinhTBCongDuong(n,a)<<"\n\n";

    cout<<"Trung binh so am: "<<tinhTBCongAm(n,a)<<"\n\n";

}

(Trả lời bởi Time line)
Thảo luận (1)

Luyện tập 2 (SGK Cánh diều - Trang 116)

Hướng dẫn giải

- Đặt tên biến và hàm rõ ràng và mô tả đúng chức năng của chúng.

- Sử dụng các lời gọi hàm phù hợp để tái sử dụng mã.

- Đặt các phần của mã trong các hàm và lớp để dễ dàng tái sử dụng và kiểm thử.

- Sử dụng các phương thức kiểm thử để đảm bảo rằng chương trình hoạt động đúng và dễ dàng gỡ lỗi khi có lỗi.

- Ghi chú mã một cách rõ ràng để giải thích chức năng và cách sử dụng mã.

- Thường xuyên lưu mã để tránh mất dữ liệu khi xảy ra lỗi.

- Sử dụng các công cụ gỡ lỗi để tìm lỗi và sửa lỗi một cách nhanh chóng và dễ dàng hơn.

Tóm lại, các thói quen lập trình tốt có thể giúp giảm thiểu số lỗi trong chương trình và dễ dàng gỡ lỗi nếu có lỗi xảy ra.

(Trả lời bởi Thanh An)
Thảo luận (1)

Vận dụng (SGK Cánh diều - Trang 116)

Hướng dẫn giải

Tham khảo:

a) Gợi ý

Bước 1: Ta khai báo một mảng tĩnh số nguyên có 100 ô nhớ int a[100].

Bước 2: Ta khai báo số nguyên int n là số lượng phần tử có trong mảng với điều kiện n>1 hoặc n<100 nếu không thỏa mãn thì yêu cầu nhập lại n.

Bước 3: Ta khỏi tạo hàm void Nhap(int a[], int n) dùng để nhập dữ liệu từ bàn phím cho mảng. Trong hàm ta sử dụng vòng for bắt đầu từ int i =0 và kết thúc khi i

Bước 4: Ta khởi tạo hàm void Xuat(int a[], int n) dùng để hiển thị dữ liệu từ mảng ra màn hình. Trong hàm ta sử dụng vòng for bắt đầu từ int i =0 và kết thúc khi i

Bước 5: Ta khởi tạo hàm int TimKiem(int a[], int n) dùng để tìm kiếm phần tử; ta khai báo biến int x là số cần tìm và nhập vào giá trị của x; tiếp theo sử dụng vòng lặp for bắt đầu từ int i =0 và kết thúc khi i

Bước 6: Trong hàm main ta gọi hàm Nhap(a,n), Xuat(a,n) để hiển thị mảng gốc ta gọi thêm hàm TimKiem(a,n) rồi chạy chương trình.

b) Sắp xếp một dãy số giảm dần

#include

int main(){

int a[100];

int n;

printf("\nNhap so luong phan tu n = ");

do{

scanf("%d", &n);

if(n <= 0){

printf("\nNhap lai n = ");

}

}while(n <= 0);

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

printf("\nNhap a[%d] = ",i);

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

}

// Sap xep dung thuat toan sap xep chon

int tg;

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

for(int j = i + 1; j < n; j++){

if(a[i] < a[j]){

// Hoan vi 2 so a[i] va a[j]

tg = a[i];

a[i] = a[j];

a[j] = tg;

}

}

}

printf("\nMang da sap xep la: ");

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

printf("%5d", a[i]);

}

}

(Trả lời bởi Time line)
Thảo luận (1)

Câu 1 (SGK Cánh diều - Trang 116)

Hướng dẫn giải

Kiểm thử chương trình là một quá trình quan trọng để đảm bảo rằng chương trình hoạt động đúng như mong đợi và giảm thiểu số lượng lỗi có thể xảy ra trong quá trình sử dụng. Tuy nhiên, kiểm thử không thể đảm bảo rằng chương trình đã hết lỗi vì không thể kiểm thử tất cả các trường hợp có thể xảy ra. Một số lỗi có thể không được phát hiện trong quá trình kiểm thử do thiếu hoặc không đủ các trường hợp kiểm thử, hoặc do các lỗi tràn số, lỗi đồng bộ hóa hoặc các lỗi khác liên quan đến nền tảng phần cứng hoặc môi trường chạy của chương trình.

Vì vậy, kiểm thử là một phần quan trọng của quá trình phát triển phần mềm, tuy nhiên nó không thể đảm bảo rằng chương trình đã hết lỗi và chương trình vẫn cần được kiểm tra và bảo trì sau khi được triển khai.

(Trả lời bởi Thanh An)
Thảo luận (1)

Câu 2 (SGK Cánh diều - Trang 116)

Hướng dẫn giải

Khi nghi ngờ một chức năng nào đó của chương trình chưa chắc đúng như ta mong muốn, chúng ta có thể thực hiện một số biện pháp sau:

- Xác định chính xác vấn đề: Ta cần xem xét lại đầu vào, thuật toán và kết quả trả về của chức năng để hiểu rõ hơn về vấn đề.

- Lặp lại thao tác để kiểm tra: Ta nên lặp lại thao tác đó nhiều lần để kiểm tra xem vấn đề có lặp lại không. Nếu vấn đề xuất hiện một cách định kỳ, ta có thể tìm ra nguyên nhân và khắc phục nó.

- Kiểm tra lại mã: Ta cần kiểm tra lại mã của chương trình, đảm bảo không có lỗi cú pháp hoặc sai sót nào trong quá trình viết code.

- Sử dụng công cụ gỡ lỗi: Ta nên sử dụng các công cụ gỡ lỗi để tìm ra nguyên nhân vấn đề.

- Tìm kiếm sự trợ giúp từ người có chuyên môn: Nếu không tìm ra được nguyên nhân, ta có thể hỏi người khác, ví dụ như các thành viên khác trong nhóm phát triển chương trình hoặc tìm kiếm hỗ trợ từ các diễn đàn trực tuyến.

- Tìm kiếm tài liệu: Ta có thể tìm kiếm trong tài liệu của chương trình hoặc thư viện liên quan để tìm ra lời giải cho vấn đề.

(Trả lời bởi Thanh An)
Thảo luận (1)