BÀI TẬP ðIỀU KIỆN
Môn : NGÔN NGỮ LẬP TRÌNH C++
CÂU HỎI
CÂU 1.
Trình bày các cấu trúc ñiều khiển trong C++ (if…else, switch … case, vòng lặp for,
while, và do…while). Mỗi cấu trúc cho ví dụ minh họa.
CÂU 2.
Viết chương trình gồm hàm main() và 4 hàm khác thực hiện các công việc sau ñây:
Nhập một mảng số nguyên n phần tử từ bàn phím.
ðếm trong mảng có bao nhiêu phần tử có giá trị lẻ.
Sắp xếp mảng số nguyên theo thứ tự tăng dần.
Xuất mảng ñã sắp xếp ra màn hình.
Trang 2/11
BÀI GIẢI
CÂU I.
Một chương trình trong C++ bao gồm nhiều câu lệnh. Thông thường các câu lệnh
ñược thực hiện một cách lần lượt theo thứ tự mà chúng ñược viết ra. Các cấu trúc ñiều
khiển cho phép thay ñổi trật tự nói trên, do ñó máy có thể nhảy thực hiện một câu lệnh
khác ở một ví trí trước hoặc sau câu lệnh hiện thời.
1. Cấu trúc ñiều kiện: If … else
ðôi khi chúng ta muốn làm cho sự thực thi một lệnh phụ thuộc vào một ñiều kiện nào
ñ1o cần ñược thỏa. Cấu trúc If ñược dùng khi một lệnh hay một khối lệnh chỉ ñược thực
hiện khi một ñiều kiện nào ñó thoả mãn. Dạng của nó như sau:
if (biểu thức)
lệnh;
Trước tiên biểu thức ñược ước lượng. Nếu kết quả khác 0 (biểu thức ñúng) thì sau ñó
lệnh ñược thực thi. Ngược lại, kết quả có giá trị bằng 0 (biểu thức sai) thì lệnh sẽ bị bỏ qua
(không thực thi) và chương trình tiếp tục thực hiện lệnh tiếp sau cấu trúc ñiều kiện.
Ví dụ, ñoạn mã sau ñây sẽ viết x is 100 chỉ khi biến x chứa giá trị 100:
if (x == 100)
cout << "x is 100";
Một hình thức khác của cấu trúc If cho phép chúng ta chọn một trong hai lệnh : một
lệnh ñược thực thi nếu như ñiều kiện ñược thỏa và lệnh còn lại ñược thực hiện nếu như
ñiều kiện không thỏa. Hình thức này ñược gọi là lệnh if-else và cò hình thức chung là :
if (biểu thức)
lệnh 1;
else
lệnh 2;
Trước tiên biểu thức ñược ước lượng. Nếu kết quả khác 0 thì lệnh 1 ñược thực thi.
Ngược lại, lệnh 2 ñược thực thi.
Ví dụ: Tìm số lớn nhất trong 2 số a, b:
if (a<b)
max = b;
cout << "a < b";
else
max = a;
cout << "a > b";
Trang 3/11
Các lệnh if có thể ñược lồng nhau bằng cách ñể cho một lệnh if xuất hiện bên trong
một lệnh if khác. Một hình thức ñược sử dụng thường của của những lệnh if lồng nhau liên
quan ñến phần else gồm có một lệnh if-else khác.
Ví dụ:
if (ch >= ‘0’ && ch <= ‘9’)
kind = digit;
else {
if (ch >= ‘A’ && ch <= ‘Z’)
kind = chu_hoa;
else {
if (ch >= ‘a’ && ch <= ‘z’)
kind = chu_thuong;
else
kind = kytu_dacbiet;
}
}
Chú ý : trong trường hợp có nhiều lệnh If lồng nhau thì Else sẽ gắn liền với If gần
nhất.
2. Cấu trúc rẽ nhánh: Switch … case
Cấu trúc rẽ nhánh switch cung cấp phương thức lựa chọn giữa một tập các khả năng
dựa trên giá trị của biểu thức. Hình thức chung của câu lệnh switch là:
switch (biểu thức) {
case n1 ;
các lệnh 1;
case n2 ;
các lệnh 2;
….
case nk;
các lệnh k;
[default;
các lệnh k+1;]
}
Trang 4/11
Biểu thức (gọi là thẻ switch) ñược ước lượng trước tiên và kết quả ñược so sánh với
mỗi hằng số (gọi là các nhãn) theo thứ tự chúng xuất hiện cho ñến khi một so khớp ñược
tìm thấy. Lệnh ngay sau khi so khớp ñược thực hiện sau ñó.
Chú ý số nhiều: mỗi case có thể ñược theo sau bởi không hay nhiều lệnh (không chỉ
là một lệnh).
Việc thực thi tiếp tục cho tới hoặc là bắt gặp một lệnh break hoặc tất cả các lệnh xen
vào ñến cuối lệnh switch ñược thực hiện
Trường hợp default ở cuối cùng là một tuỳ chọn, không bắt buộc phải có, và ñược
thực hiện nếu như tất cả các case trước ñó không ñược so khớp.
Ví dụ: Lập chương trình phân loại học sinh theo ñiểm, sử dụng cấu trúc switch :
#include "stdio.h"
void main()
{
int diem;
tt: printf("\nVao du lieu :");
printf("\n Diem =");
scanf("%d",&diem);
switch (diem)
{
case 0:
case 1:
case 2:
case 3:printf("Kem\n");break;
case 4:printf("Yeu\n");break;
case 5:
case 6:printf("Trung binh\n");break;
case 7:
case 8:printf("Kha\n");break;
case 9:
case 10:printf("Gioi\n");break;
default:printf("Vao sai\n");
}
printf("Tiep tuc 1, dung 0 :");
scanf("%d",&diem);
if (diem==1) goto tt;
Trang 5/11
getchar();
return;
}
3. Cấu trúc lặp: While
Lệnh while (cũng ñược gọi là vòng lặp while) cung cấp phương thức lặp một lệnh
cho tới khi một ñiều kiện ñược thoả. Hình thức chung của lệnh lặp là :
while (biểu thức)
lệnh (hoặc khối lệnh)
Biểu thức ( cũng ñược gọi là ñiều kiện lặp) ñược ước lượng trước tiên. Nếu kết quả
khác 0 thì sau ñó lệnh (cũng ñược gọi là thân vòng lặp) ñược thực hiện và toàn bộ quá
trình ñược lặp lại. Ngược lại, vòng lặp kết thúc.
Ví dụ : Tính tổng của tất cả các số nguyên từ 1 ñến n. ðiều này ñược diễn giải như
sau:
i = 1;
sum = 0;
while (i <= n)
{
sum += i;
i++;
}
Giả sử n là 5. Bảng sau ñây cung cấp bảng phác họa vòng lặp bằng cách liệt kê các
giá trị của các biến có liên quan và ñiều kiện lặp.
Vòng lặp i n i <= n sum += i++
Một 1 5 1 1
Hai 2 5 1 3
Ba 3 5 1 6
Bốn 4 5 1 10
Năm 5 5 1 15
Sáu 6 5 0
ðôi khi chúng ta có thể gặp vòng lặp while có thân rỗng ( nghĩa là một câu lệnh null).
Ví dụ vòng lặp sau ñặt n tới thừa số lẻ lớn nhất của nó.
while ( n % 2 == 0 && n /=2);
Trang 6/11
Ở ñây ñiều kiện lặp cung cấp tất cả các tính toán cần thiết vì thế không thật sự cần
một thân cho vòng lặp. ðiều kiện vòng lặp không những kiểm tra n là chẵn hay không
chẵn, mà nó còn chia cho 2 và chắc chắn rằng vòng lặp sẽ dừng.
Bên trong thân của một toán tử while lại có thể sử dụng các toán tử while khác. bằng
cách ñó ta ñi xây dựng ñược các chu trình lồng nhau.
Khi gặp câu lệnh break trong thân while, máy sẽ ra khỏi toán tử while sâu nhất chứa
câu lệnh này.
Trong thân while có thể sử dụng toán tử goto ñể nhảy ra khỏi chu trình ñến một vị trí
mong muốn bất kỳ. Ta cũng có thể sử dụng toán tử return trong thân while ñể ra khỏi một
hàm nào ñó.
4. Cấu trúc lặp: Do … while
Lệnh do (cũng ñược gọi là vòng lặp do) cũng tương tự như lệnh while ngoại trừ thân
của nó ñược thực thi trước tiên và sau ñó ñiều kiện vòng lặp mới ñược kiểm tra. Hình thức
chung của lệnh do là :
do
lệnh;
while (biểu thức);
Lệnh ñược thực thi trước tiên và sau ñó biểu thức ñược ước lượng. Nếu kết quả của
biểu thức khác 0 thì sau ñó toàn bộ quá trình ñược lặp lại. Ngược lại, vòng lặp sẽ kết thúc.
Ví dụ, chương trình dưới ñây sẽ viết ra bất kỳ số nào mà bạn nhập vào cho ñến khi
bạn nhập số 0
// number echoer
#include <iostream.h>
int main ()
{
unsigned long n;
do {
cout << "\nEnter number (0 to end): ";
cin >> n;
cout << "You entered: " << n << " ";
} while (n != 0);
return 0;
}
Vòng lặp do ít ñược sử dụng thường xuyên hơn là vòng lặp while. Nó hữu dụng
trong những trường hợp khi chúng ta cần thân vòng lặp thực hiện ít nhất một lần mà không
quan tâm ñến ñiều kiện lặp.
Trang 7/11
Ví dụ, giả sử chúng ta muốn thực hiện lặp ñi lặp lại công việc ñọc một giá trị và in
bình phương của nó, và dừng khi giá trị là 0. ðiều này có thể ñược diễn giải trong vòng
lặp sau ñây:
do {
cin >> n;
cout << n * n << ‘\n’;
} while (n != 0);
Không giống như vòng lặp while, vòng lặp do ít khi ñược sử dụng trong những tình
huống mà nó có một thân rỗng. Mặc dù vòng lặp do với thân rỗng có thể là tương ñương
với một vòng lặp while tương tự nhưng vòng lặp while thì luôn dễ ñọc hơn
5. Cấu trúc lặp: For
Lệnh for (cũng ñược gọi là vòng lặp for) cũng tương tự như vòng lặp while nhưng
có 2 thành phần thêm vào: một biểu thức ñược ước lượng chỉ một lần trước hết và một
biểu thức ñược ước lượng mỗi lần ở cuối mỗi lần lặp. Hình thức tổng quát của lệnh for là :
for (biểu thức 1; biểu thức 2; biểu thức 3)
lệnh (hoặc khối lệnh);
Biểu thức 1 (thường ñược gọi là biểu thức khởi tạo) ñược ước lượng trước tiên. Mỗi
vòng lặp biểu thức 2 ñược ước lượng. Nếu kết quả không là 0 (ñúng) thì sau ñó lệnh ñược
thực thi và biểu thức 3 ñược ước lượng. Ngược lại, vòng lặp kết thúc. Vòng lặp for tổng
quát thì tương ñương với vòng lặp while sau:
biểu thức1;
while (biểu thức 2) {
lệnh;
biểu thức 3;
}
Vòng lặp for thường ñược sử dụng trong các trường hợp mà có một biến ñược tăng
hay giảm ở mỗi lần lặp. Ví dụ, vòng lặp for sau tính toán tổng của tất cả các số nguyên từ
1 tới n.
sum = 0;
for (i = 1; i <= n; ++i)
sum += i;
ðiều này ñược ưa chuộng hơn phiên bản của vòng lặp while mà chúng ta thấy trước
ñó. Trong ví dụ này i thường ñược gọi là biến lặp.
C++ cho phép biểu thức ñầu tiên trong vòng lặp for là một ñịnh nghĩa biến. Ví dụ
trong vòng lặp trên thì i có thể ñược ñịnh nghĩa bên trong vòng lặp:
Trang 8/11
for (int i = 1; i <= n; ++i)
sum += i;
Trái với sự xuất hiện, phạm vi của i không ở trong thân của vòng lặp mà là chính
vòng lặp. Xét trên phạm vi thì ở trên tương ñương với:
int i;
for (i = 1; i <= n; ++i)
sum += i;
Bất kỳ biểu thức nào trong 3 biểu thức của vòng lặp for có thể rỗng. Ví dụ, xóa biểu
thức ñầu và biểu thức cuối cho chúng ta dạng giống như vòng lặp while:
for (; i != 0;) // tương ñương với: while (i != 0)
something; // something;
Xóa tất cả các biểu thức cho chúng ta một vòng lặp vô hạn. ðiều kiện của vòng lặp
này ñược giả sử luôn luôn là ñúng.
for (;;) // vòng lặp vô hạn
something;
Trường hợp vòng lặp với nhiều biến lặp thì hiếm dùng. Trong những trường hợp như
thế, toán tử phẩy (,) ñược sử dụng ñể phân cách các biểu thức của chúng:
for (i = 0, j = 0; i + j < n; ++i, ++j)
something;
Bởi vì các vòng lặp là các lệnh nên chúng có thể xuất hiện bên trong các vòng lặp
khác. Nói các khác, các vòng lặp có thể lồng nhau. Ví dụ,
for (int i = 1; i <= 3; ++i)
for (int j = 1; j <= 3; ++j)
cout << '(' << i << ',' << j << ")\n";
cho tích số của tập hợp {1,2,3} với chính nó, kết quả như sau:
(1,1)
(1,2)
(1,3)
(2,1)
(2,2)
(2,3)
(3,1)
(3,2)
(3,3)
Trang 9/11
CÂU II.
#include<iostream.h>
void nhapmang(int a[50],int n)
{
for(int i=0;i<n;i++)
{
cout<<"Hay nhap vao phan tu a["<<i<<"]= ";
cin>>a[i];
}
}
void sapxep(int a[50],int n)
{
int tang,i;
cout<<"\nMang duoc sap xep lai la: \n";
for(i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(a[i]>a[j])
{
tang=a[i];a[i]=a[j];a[j]=tang;
}
}
cout<<a[i]<<" ";
}
cout<<endl;
}
void lietke_mang(int a[50],int n)
{
cout<<"\nCac phan tu cua mang la:\n";
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
Trang 10/11
cout<<endl;
}
void dem_so_le(int a[50],int n)
{
int t,i;
cout<<"\nCac phan tu le cua mang la:\n";
for(i=0;i<n;i++)
{
if(a[i]%2!=0)
cout<<a[i]<<" ";
}
cout<<endl;
for(t=i=0;i<n;i++)
{
if(a[i]%2!=0) t++;
}
cout<<"\nSo phan tu co gia tri le trong mang la: "<<t<<endl;
}
void dem_so_chan(int a[50],int n)
{
int t,i;
cout<<"\nCac phan tu chan cua mang la:\n";
for(i=0;i<n;i++)
{
if(a[i]%2==0)
cout<<a[i]<<" ";
}
cout<<endl;
for(t=i=0;i<n;i++)
{
if(a[i]%2==0) t++;
}
cout<<"\nSo phan tu co gia tri chan trong mang la: "<<t<<endl;
}
Trang 11/11
void main()
{
int a[50],n,t=0;
cout<<"Hay nhap vao so phan tu (n) cua mang: ";cin>>n;
nhapmang(a,n);
lietke_mang(a,n);
dem_so_le(a,n);
dem_so_chan(a,n);
sapxep(a,n);
}