Phân tích một số bài tập Nhập môn lập trình C++
Môn: Nhập môn lập trình 1. Phân tích đoạn chương trình lỗi Đề bài: Bài 33 – KTLT: Tính S(n) = Căn (2 + Căn (2 +….. Căn (2 +căn(2) ))). có n dấu căn Code bị lỗi: -> vì sao nhập bất kì số nào cũng cho kết quả là 1.41421 ?? #include<iostream> #includ ...
Môn: Nhập môn lập trình
1. Phân tích đoạn chương trình lỗi
Đề bài:
Bài 33 – KTLT: Tính S(n) = Căn (2 + Căn (2 +….. Căn (2 +căn(2) ))). có n dấu căn
Code bị lỗi:
-> vì sao nhập bất kì số nào cũng cho kết quả là 1.41421 ??
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include<iostream> #include<math.h> using namespace std; int n; void nhap(int n) { do { cout << "Nhap vao so N(n>0)"; cin >> n; if (n < 1) { cout << "Nhap khong hop le! Hay nhap lai!"<<endl; } } while (n<1); } float can(int n) { float s = sqrt(2); for (int i = 0; i < n; i++) { s = sqrt(2 + s); } //cout << "Tong la: " << s; return s; } void main() { nhap(n); cout << "Tong la: " << can(n) << endl; system("pause"); } |
Các lỗi cụ thể:
– Line 7: Truyền biến n vào hàm nhap, mục đích nhập dữ liệu cho biến n, tuy nhiên lại truyền vào theo kiểu tham trị (truyền Tham trị -> sau khi ra khỏi chương trình con, biến ở ngoài CTC, truyền vào sẽ không thay đổi giá trị).
– Line 21, 22:
+ Tính dư số lần lấy căn. Cụ thể ý đồ của người code là muốn lấy căn n lần, nhưng lúc viết vòng for họ không kiểm soát được vòng for của mình sẽ thực hiện được bao nhiêu lần.
+ Do lấy căn n lần, mà lúc đầu họ khởi tạo s=căn 2; nên họ chỉ cần n-1 dấu căn nữa thì đúng. Tuy nhiên dòng for của họ thực hiện n lần. như vậy là dư 1 lần lấy căn.
-> code tham khảo chuẩn
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #include<iostream> #include<math.h> using namespace std; int n; void nhap() { do { cout << "Nhap vao so N(n>0)"; cin >> n; if (n < 1) { cout << "Nhap khong hop le! Hay nhap lai!" << endl; } } while (n < 1); cout << n; } float can(int n) { float s = sqrt(2); for (int i = 0; i < n-1; i++) { s = sqrt(2 + s); } //cout << "Tong la: " << s; return s; } void main() { nhap(); cout << "Tong la: " << can(n) << endl; system("pause"); } |
2. Bài ví dụ Số nghịch đảo
a. Đề bài số nghịch đảo
Mẹ bảo Tí dạy đứa em nhỏ học toán, làm quen với các con số. Tý thấy thằng em mình khá thông minh, so sánh các số bình thường có vẻ quá đơn giản đối với nó. Vì vậy Tý ra yêu cầu mới, các số bình thường sẽ được đọc từ trái sang, bây giờ sẽ đọc ngược lại, đọc các chữ số từ bên phải sang.
Bài toán có vẻ hơi hóc búa với em của Tý, các bạn hãy viết chương trình để giải quyết vấn đề này.
Input
Chứa 2 số nguyên có 5 chữ số A và B. A và B luôn khác nhau và không chứa chữ số 0.
Output
In ra số có giá trị lớn hơn (theo quy tắc mới).
Example
Test 1:
Input:
734 893
Output:
437
Test 2:
Input:
221 231
Output:
132
Test 3:
Input:
839 237
Output:
938
b. Ý tưởng số nghịch đảo
– B1: Chuyển 2 số vừa nhập sang số nghịch đảo
– B2: Tìm số lớn nhất trong 2 số vừa nhập ở bước 1.
c. Code tham khảo số nghịch đảo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #include <iostream> using namespace std; int a, b; void nhapdl() { cin >> a >> b; } int songichdao(int x) { int y = 0; while (x != 0) { y = y * 10 + (x % 10); x = x / 10; } return y; } int max(int a, int b) { if (a > b) return a; return b; } void xuli() { a = songichdao(a); b = songichdao(b); cout << max(a, b); } int main() { nhapdl(); xuli(); system("pause"); return 0; } |
3. Bài ví dụ chiếc vé may mắn
a. Đề bài Chiếc vé may mắn
Một số may mắn là số được tạo ra chỉ bởi 2 số 4 và 7. Ví dụ, 47, 44 là số may mắn, còn 13 thì không phải.
Tèo là một người rất thích các chiếc vé xe lửa, mỗi chiếc vé đều có số ghi trên đó và tất cả các số đều có chẵn chữ số. Tèo gọi một chiếc vé là chiếc vé may mắn nếu số ghi trên vé đó là số may mắn và tổng các chữ số nửa đầu bằng tổng các chữ số ở nửa cuối.
Các bạn xem hộ Tèo chiếc vé mà cậu có là chiếc vé may mắn không nhé.
Input
Dòng đầu tiên là số nguyên dương n là số ghi trên vé của Tèo.
(đề bài luôn đảm bảo dữ liệu nhập vào có số lượng số là một số chẳn, và nằm trong kiểu dữ liệu int).
Output
In ra “YES” nếu đó là chiếc vé may mắn, nếu không in ra “NO”.
Example
Test 1:
Input:
47
Output:
NO
Test 2:
Input:
4738
Output:
NO
Test 3:
Input:
4774
Output:
YES
b. Ý tưởng Chiếc vé may mắn
– B1: Kiểm tra xem số được nhập vào có các chữ số hoàn toàn là 4 và 7 không?
– B2: Kiểm tra xem tổng phần đầu và phần cuối có bằng nhau không?
c. Code tham khảo Chiếc vé may mắn
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #include <iostream> using namespace std; int n=0; void nhapdl(int &n) { //cout << &n << endl; cin >> n; } int kt47(int n) { int x; while (n != 0) { x = n % 10; if (!((x == 4) || (x == 7))) return 0; n = n / 10; } return 1; } int slcs(int n) { int dem = 0; while (n != 0) { dem++; n = n / 10; } return dem; } int tinhtong(int n, int k) { int s = 0, dem = 0; while (n != 0) { s = s + (n % 10); dem++; if (dem == k) return s; n = n / 10; } } int kttong(int n) { int dodai = slcs(n); int s2 = tinhtong(n, dodai / 2); int s = tinhtong(n, dodai); int s1 = s - s2; if (s1 == s2) return 1; return 0; } void xuli() { if (kt47(n) && kttong(n)) cout << "YES"; else cout << "NO"; } int main() { //cout << &n<<"
"; nhapdl(n); //cout << n; xuli(); system("pause"); return 0; } |
4. Làm sao để học tốt?
– Tự tay code thật nhiều bài tập.
– Nếu mới bắt đầu học, và chưa biết viết thế nào cho chuẩn hãy thường xuyên lên các diễn đàn/ website tìm và đọc code của người khác. (Đọc phải hiểu).
– Tự chạy thử và tìm hiểu cách hoạt động các đoạn code mà bạn đang thắc mắc:
Ví dụ bạn không nhớ pow(a,b) là a^b hay b^a thì cứ việc cout ra màn hình pow(2,3) xem kết quả như thế nào?
– Hãy đọc và hiểu thông báo lỗi của visual.
– Chủ động hỏi bài, tuyệt đối không chép code.
– Chủ động tra lệnh và cách hoạt động của lệnh, và các vấn đề khác trên google.