8200_bai_tap_lap_trinh_c by raicars

VIEWS: 411 PAGES: 76

									Bài 1. Viết chương trình nhập từ bàn phím n số nguyên dương nhỏ hơn 100, in ra màn hình
hai cột song song, một cột là các số, còn cột kia là tổng của các chữ số tương ứng ở cột thứ
nhất. Tìm và in ra số có tổng của các chữ số là lớn nhất, nếu có nhiều hơn một số như vậy
thì in số đầu tiên.

Bài 2. Một người gửi tiết kiệm a đồng với lãi suất s% một tháng (tính lãi hàng tháng). Việt
một chương trình tính và in ra màn hình hai cột song song, cột thứ nhất là số tháng đã gửi, cột
thứ hai tổng số tiền (cả vốn và lãi) ứng với số tháng ở cột thứ nhất cho một khoảng thời gian
từ 1 đến t tháng, với a, s, t được nhập từ bàn phím.

Bài 3. Một người gửi tiết kiệm à đồng với lãi suất là s% một tháng trong kỳ hạn 6 tháng (6
tháng tính lãi một lần). Viết chương trình tính và in ra màn hình hai cột song song, cột thứ
nhất là số tháng đã gửi, cột thứ hai là tổng tiền (cả vốn và lãi) ứng với số tháng ở cột thứ
nhất cho một khoảng thời gian từ 6 tháng đến t tháng, với a, s, và t được nhập từ bàn phím.
(Biết rằng nếu lĩnh không chắn kỳ nào thì không được tính lãi kỳ ấy).

Bài 4. Cho x là một số thực, hãy xây dựng hàm tính và in ra màn hình hai cột song song, cột
thứ nhất là giá trị của đối số, cột thứ hai là giá trị của hàm f ứng với đối số ở cột thứ nhất:


Sau đó, viết một chương trình nhạp từ bán phím một mảng gồm n số thực, và gọi hàm đã lập
được ở trên với đối số là các số vừa nhập.

Bài 5. Viết chương trình tính và in ra màn hình số tiền điện tháng 10/99 của n khách hàng theo
các chỉ số trên đồng hồ điện của tháng 9 và của tháng 10 được nhập vào từ bàn phím (phải
kiểm tra để đảm bảo rằng chỉ số của tháng sau phải lớn hơn chỉ số của các tháng trước).
Biết rằng: 50 số đầu tiền giá 500 đồng/số, 100 số tiếp theo giá 800 đồng/số, 100 số tiếp theo
nữa giá 1000 đồng/số, 100 số tiếp theo nữa giá 1200 đồng/số, và từ số thứ 351 trở đi giá 1500
đồng/số.

Bài 6. Viết một chương trình nhập vào từ bàn phím điểm kiểm tra của một môn học của n
học sinh và in kết quả ra màn hình dưới dạng hai cột song song, một cột là điểm và cột thứ
hai là xếp loại theo điểm với các qui định sau:

Dưới 5: Yếu
Từ 5 đến dưới 7: Trung bình
Từ 7 đến dưới 9: Khá
Từ 9 trở lên: Giỏi

Bài 7. Viết chương trình giải phương trình bậc hai ax2+bx+c=0 với a, b, c bất kỳ được nhập
vào từ bàn phím. In ra màn hình phương trình bậc hai với các hệ số đã nhập, giá trị của delta
và các nghiệm thức của nó (nếu cố), ngươcij lại thì in là không có nghiệm thực.

Bài 8. Năm 1999, dân số nước ta là 76 triệu người, tỷ lệ tăng tự nhiên là k% một năm. Lập
một chương trình in ra màn hình hai cột song song, cột thứ nhất là năm, cột thứ hai là dân số
của năm tương ứng ở cột một cho đến khi dân số tăng s lần so với năm 1999. Các số k và s
được nhập vào từ bàn phím.

Bài 9. Viết chương trình giải bất phương trình bận hai với a, b, c bất kỳ được nhập từ bàn
phím: ax2+bx+c>0 . In ra màn hình bất phương trình với các hệ số đã nhập, giá trị của delta
và các nghiệm thực của bất phương trình.

Bài 10. Xây dựng một hàm sắp xếp thep thứ tự tăng dần một mảng gồm n số thực. Viết
chương trình để nhập n số thực từ bàn phím, sử dụng hàm sắp xếp nói trên, và in ra màn hình
hai cột song song, một cột là mảng chưa sắp xếp, một cột là mảng đã được sắp xếp.

Bài 11. Xây dựng một hàm sắp xếp thep thứ tự giảm dần một mảng gồm n số thực. Viết
chương trình để nhập n số thực từ bàn phím, sử dụng hàm sắp xếp nói trên, và in ra màn hình
hai cột song song, một cột là mảng chưa sắp xếp, một cột là mảng đã được sắp xếp.

Bài 12. Cho F là một số thực lớn hơn 2, và S=1/2+1/3+…+1/n. Hãy xây dựng một hàm để tìm
giá trị lớn nhất của n sao cho S<=F. Viết một chương trình để nhập vào từ bàn phím m số
thực Fi, sử dụng hàm nói trên đối với các hàm Fi đã nhập và in ra màn hình thành ba cột song
song: các giá trị của Fi, n, và S tương ứng.

Bài 13. Cho F là một số thực lớn hơn 2, và S=1/2+1/3+…+1/n. Hãy xây dựng một hàm để tìm
giá trị nhỏ nhất của n sao cho S<=F. Viết một chương trình để nhập vào từ bàn phím m số
thực Fi, sử dụng hàm nói trên đối với các hàm Fi đã nhập và in ra màn hình thành ba cột song
song: các giá trị của Fi, n, và S tương ứng.

Bài 14. Xây dựng một hàm tính giá trị trung bình của n số thực. (Giá trị trung bình của một

dãy số được cho bằng công thức:         ).
Sử dụng hàm nói trên để viết chương trình nhập n số thực từ bàn phím và in ra màn hình cột
số đã nhập, tổng, giá trị trung bình của chúng.

Bài 15. Xây dựng một hàm tính giá trị trung bình của n số thực. (Độ lêcnh chuẩn của dãy số

được cho bằng công thức:          , với     ).
Sử dụng hàm nói trên để viết chương trình nhập n số thực từ bàn phím và in ra màn hình cột
số đã nhập, tổng, giá trị trung bình và độ lệch chuẩn của chúng.

Bài 16. Hãy xây dựng một hàm để nhập từ bàn phím một mảng số thực. Viết một chương
trình sử dụng hàm đã xây dựng được ở trên để nhập số liệu cho hai mảng số thực, một mảng
có n phẩn tử, và một mảng có m phần tử, in ra màn hình hai cột song song, mỗi cột là một
mảng với ô cuối cùng là tổng của các phần tử trong mảng, và cuỗi cùng là tổng của hai
mảng.

Bài 17. Hãy xây dựng một hàm để nhập từ bàn phím một mảng số thực. Viết một chương
trình sử dụng hàm đã xây dựng được ở trên để nhập số liệu cho hai mảng số thực, một mảng
có n phẩn tử, và một mảng có m phần tử, in ra màn hình ba cột song song, hai cột đầu là hai
mảng đã nhập, cột thứ ba tổng của hai cột đầu, dòng cuỗi cùng của cả ba cột là tổng của các
phần tử trong cột.
Bài 18. Cho tuổi và số con của n phụ nữ trong độ tuổi 15-49, hãy xây dựng một hàm tính và in
bản phân bố của các phụ nữ này theo nhóm 5 tuổi. Viết chương trình để nhập tuổi và số con
của n phụ nữ trong độ tuổi 15-49, sau đó sử dụng hàm đã xây dựng ở trên để in bảng phân bố
theo tuổi.

Bài 19. Cho tuổi và số con của n phụ nữ trong độ tuổi 15-49, hãy xây dựng một hàm tính và in
bản phân bố của các phụ nữ này theo nhóm 5 tuổi. Viết chương trình để nhập tuổi và số con
của n phụ nữ trogn độ tuổi 15-49, sau đó sử dụng hàm đã xây dựng ở trên để in bảng phân bố
số con của các phụ nữ này theo tuổi.

Bài 20. Cho một xây bất kỳ, không sử dụng các hàm thư viện về xâu, hãy xây dựng một hàm
đổi tất cả các chữ thường thành chữ hoa (các ký tự khác giữ nguyên) và in cả hai ra màn
hình. Viết một chương trình nhập một xây bất kỳ từ bàn phím, sau đó sử dụng hàm đã xây
dựng ở trên để in kết quả ra màn hình.

Bài 21. Cho một xây bất kỳ, không sử dụng các hàm thư viện về xâu, hãy xây dựng một hàm
đổi tất cả các chữ hoa thành chữ thường (các ký tự khác giữ nguyên) và in cả hai ra màn
hình. Viết một chương trình nhập một xây bất kỳ từ bàn phím, sau đó sử dụng hàm đã xây
dựng ở trên để in kết quả ra màn hình.

Bài 22. Cho một xây bất kỳ, không sử dụng cac shamf thư viện về xâu, hãy xây dựng một
hàm đổi tất cả các chữ hoa của xây thành chữ thường, và ngược lại, đổi các chữ thường
của xâu thành chữ hoa (các chữ khác giữ nguyên) và in cả hai ra màn hình. Viết một chương
trình nhập một xâu bất kỳ từ bàn phím, sau đó sử dụng hàm đã xây dựng ở trên đê in kết quả
ra màn hình.

Bài 23. Cho cấu trúc:

Code:
 struc thisinh{
       int      sbd;                //Số báo danh
       char     hoten[25];          //Họ và tên
       float    m1,m2,m3l           //Điểm ba môn thi
       float    tong;               //Tổng điểm ba môn
 } danhsach[100];

Hãy xây dựng một hàm để nhập số liệu cho n thí sinh. Sau đó viết một chương trình sử dụng
hàm nói trên để nhập số liệu và in bảng điểm của các thí sinh này theo dạng ba cột: Số báo
danh, Họ tên, Tổng điểm.

Bài 24. Cho một xây bất, hãy xây dựng một hàm để sửa các lỗi chính tả không viết hoa đầu
câu trong xâu này, in ra xâu chưa sửa và xâu đã sửa. Sau đó viết một chương trình để nhập
một xâu và sử dụng hàm nói trên để sửa lỗi.

Bài 25. Cho cấu trúc:

Code:
 struc dienthoai{
       int                 sdt;                   //Số điện thoại
       char                hoten[25];        //Họ và tên
       float               sotien;              //Số tiền phải nộp
 } thuebao[100];

Hãy xây dựng một hàm để nhập số liệu cho n thuê bao. Sau đó viết một chương trình sử
dụng hàm nói trên để nhập số liệu và in bảng số tiền phải nộp của các thuê bao theo dạng ba
cột: Họ tên, số điện thoại, số tiền phải nộp.

Bài 26. Hãy xây dựng một hàm in ra màn hình nội dung một tệp văn bản bất kỳ (có dựng lại
sau mỗi trang màn hình). Sau đó, viết một chương trình để nhập vào từ bàn phím tên của một
tệp văn bản và sử dụng hàm nói trên để in nội dung của tệp này ra màn hình.

Bài 27. Cho tuổi và trình độ văn hóa (0-4) của n người, hãy xây dựng một hàm in bản phân bố
của số người này theo nhóm 5 tuổi và trình độ văn hóa. Sau đó, viết một chương trình để
nhập tuổi và trình độ văn hóa của n người, sử dụng hàm nói trên để in kết quả ra màn hình.

Bài 28. Viết một chương trình để nhập tuổi và trình độ văn hóa (0-4) của n người, sau đó ghi
các số liệu này lên một tệp mode văn bản.

Bài 29. Cho một xâu bất kỳ, hãy xây dựng một hàm để sửa các lỗi chính tả không có dấu
cách sau dấu phảy và sau dấu chấm, in ra màn hình xâu chưa sửa và xâu đã sửa. Sau đó viết
chương trình để nhập một xâu bất kỳ và sử dụng hàm nói trên để sửa lỗi.

Bài 30. Cho một xâu bất kỳ, hãy xây dựng một hàm để sửa các lỗi chính tả không có dấu
cách giữa các từ, in ra xâu gốc và xâu đã sửa. Sau đó viết một chương trình để nhập một xâu
ký tự bất kỳ và sử dụng hàm nói trên để sửa lỗi.

Bài 31. Cho một xâu bất kỳ, hãy xây dựng một hàm để viết hoa chữ cái đầu tiên của tất cả
các từ trong xâu đã cho, in ra xâu gốc và xâu đã sửa. Sau đó viết một chương trình để nhập
một xâu ký tự bất kỳ và sử dụng hàm nói trên để sửa lỗi.

Bài 32. Cho cấu trúc:

Code:
 struc tiendien{
       char    hoten[25];           //Họ và tên
       float   csc,csm;             //Chỉ số cũ, chỉ số mới
       float   dg;                  //Đơn giá/Kw
 float tong;                        //Tổng tiền phải nộp
 } danhsach[100];

Hãy xây dựng một hàm để nhập số liệu cho n hộ sử dụng điện. Sau đó, viết một chương
trình sử dụng hàm nói trên để nhập số liệu và in bảng tính tiền sử dụng điện thoại của các
hộ này theo dạng hai cột: Họ tên, số điện tiêu thụ, Tổng số tiền.

Bài 33. Hãy xây dựng một hàm để nhập từ bàn phím một mảng các số thực. Viết chưng trình
sử dụng hàm nói trên để nhập số liệu cho hai mảng số thực cùng có n phần tử, in ra màn hình
ba cột song song, hai cột đầu là hai mảng đã nhập, còn cột thứ ba là hiệu của hai cột đầu,
dòng cuối cùng của cả ba cột là tỏng của các phần tử trong cột.


Bài 34. Cho F là một số thực lớn hơn 2, và      , với x là một số nguyên dương bất kỳ. Hãy
xây dựng một hàm để tìm giá trị lớn nhất của n sao cho S<=F, in ra màn hình các giá trị của
x, F, S và n. Viết một chương trình để nhập vào từ bàn phím số thực F, số nguyên dương x và
sử dụng hàm nói trên đối với các giá trị đã nhập để in kết quả ra màn hình.


Bài 35. Cho F là một số thực lớn hơn 2, và      , với x là một số nguyên dương bất kỳ. Hãy
xây dựng một hàm để tìm giá trị nhỏ nhất của n sao cho S<=F, in ra màn hình các giá trị của
x, F, S và n. Viết một chương trình để nhập vào từ bàn phím số thực F, số nguyên dương x và
sử dụng hàm nói trên đối với các giá trị đã nhập để in kết quả ra màn hình.

Bài 36. Hãy xây dựng một hàm để nhập từ bán phím một mảng cac số thực. Viết chương
trình sử dụng hàm nói trên để nhập số liệu cho hai mảng số thực cùng có n phần tử, in ra màn
hình ba cột song song, hai cột đầu là hai mảng đã nhập, cột thứ ba là tích của hai cột đầu,
dòng cuỗi cùng của cả ba cột là tổng các phần tử trong cột.

Bài 37. Viết một chương trình để nhập số báo danh, họ tên và điểm thi ba môn Toán, Lý, Hóa
của n thí sinh, sau đó ghi các số liệu này lên một tệp ở mode văn bản.

Bài 38. Hãy xây dựng một hàm in ra mnaf hình nội dung của một tệp văn bản bất kỳ theo
dạng trang màn hình có đánh số trang. Sau đó, viết một chương trình để nhập từ bàn phím tên
của một tệp văn bản và sử dụng hàm nói trên để in nội dung của tệp này ra màn hình.

Bài 39. Hãy xây dựng một hàm in ra mnafh ình nội dung của một tệp văn bản bất kỳ theo
dạng trang màn hình, ở dòng đầu của mỗi trang có đánh số trang ở góc bên phải và tên tệp
góc trái. Sau đó, viết một chương trình để nhập từ bàn phím tên của một tệp văn bản và sử
dụng hàm nói trên để in nội dung của tệp này ra màn hình.

Bài 40. Cho cấu trúc

Code:
 struc thisinh{
       int      sbd;                    //Số báo danh
       char     hoten[25];          //Họ và tên
       float     m1,m2,m3l          //Điểm ba môn thi
       float    tong;                  //Tổng điểm ba môn
 } danhsach[100];

Viết chương trình (có sử dụng các hàm) để thêm và bớt các thí sinh theo thứ tự giảm dần của
tổng điểm, và in ra mnaf hình danh sách đã sắp.
Trích:
tuananhk43
Bài 1. Viết chương trình nhập từ bàn phím n số nguyên dương nhỏ hơn 100, in ra màn hình hai
cột song song, một cột là các số, còn cột kia là tổng của các chữ số tương ứng ở cột thứ nhất.
Tìm và in ra số có tổng của các chữ số là lớn nhất, nếu có nhiều hơn một số như vậy thì in số
đầu tiên.
Code:
#include <iostream.h>
#include<conio.h>
#include<iomanip.h>
//Ham tinh tong cac chu so
//Vd n=15 thi tra ve gia tri la 6
int tong(int n){
       int a,b;
       a=(int)n/10;
       b=n-a*10;
       return a+b;
}
//Ham nhap cac gia tri cho mot mang
void nhap(int *a,int n){
       for (int i=0;i<n;i++){
          cout<<"Nhap a["<<i<<"]=";
          cin>>a[i];
       }
}
//Ham in cac gia tri thanh hai cot
void in(int *a,int n){
    int tong1=0, tong2=0;
    int max; //Dung de tinh gia tri lon nhat cua tong
    int val;
    cout<<setw(15)<<"STT"<<setw(15)<<"Tong"<<"\n";
    max=tong(a[1]);
       for(int i=0;i<n;i++){
               cout<<setw(15)<<a[i]<<setw(15)<<tong(a[i])<<"\n";
               if (max<tong(a[i]))
               {
                   max=tong(a[i]);
                   val=a[i];
        }
       }
    cout<<"-------------------------------\n";
    cout<<setw(15)<<val<<setw(15)<<max<<"\n";
}
int main(){
       //clrscr();
       int n;
       int a[100];
       cout<<"Nhap N="; cin>>n;
       nhap(a,n);
       in(a,n);
       //getch();
}




Đáp án Bài 2. Một người gửi tiết kiệm a đồng với lãi suất s% một tháng (tính lãi hàng tháng).
Việt một chương trình tính và in ra màn hình hai cột song song, cột thứ nhất là số tháng đã
gửi, cột thứ hai tổng số tiền (cả vốn và lãi) ứng với số tháng ở cột thứ nhất cho một khoảng
thời gian từ 1 đến t tháng, với a, s, t được nhập từ bàn phím.

Code:
 #include <iostream.h>
 #include <iomanip.h>
 void main(){
   float a, s, kq;
   int t;
   cout<<"nhap so tien gui ban dau: "; cin>>a;
   cout<<"nhap lai suat hang thang: "; cin>>s;
   cout<<"nhap so thang tiet kiem : "; cin>>t;
   kq = a;
   cout<<"+---+-----------------+"<<endl
       <<"| T | Tien von va lai |"<<endl
       <<"+---+-----------------+"<<endl;
   for(int i=1; i<=t; i++){
     kq *= (1+s/100);
     cout<<"|"<<setw(2)<<i<<" |"
       <<setw(17)<<setprecision(2)<<setiosflags(ios::showpoint |
 ios::fixed)
       <<kq
       <<"|"<<endl;
   }
   cout<<"+---+-----------------+"<<endl;
 }

khi nhập lãi xuất, nếu lãi xuất là 0,7 % / tháng thì hãy nhập 0.7 (chứ không phải nhập là
0.007)

khi đó sau mỗi tháng tiền lãi và vốn sẽ = tiền tháng trước + tiền tháng trước x lãi suất
đó chính là công thức trên: kq *= (1 + s/100)
Bài 3. Một người gửi tiết kiệm à đồng với lãi suất là s% một tháng trong kỳ hạn 6 tháng (6
tháng tính lãi một lần). Viết chương trình tính và in ra màn hình hai cột song song, cột thứ nhất
là số tháng đã gửi, cột thứ hai là tổng tiền (cả vốn và lãi) ứng với số tháng ở cột thứ nhất cho
một khoảng thời gian từ 6 tháng đến t tháng, với a, s, và t được nhập từ bàn phím. (Biết rằng
nếu lĩnh không chắn kỳ nào thì không được tính lãi kỳ ấy).
Code:
 #include <iostream.h>
 #include <iomanip.h>
 void main(){
   float a, s, kq;
   int t;
   cout<<"nhap so tien gui ban dau: "; cin>>a;
   cout<<"nhap lai suat hang thang: "; cin>>s;
   cout<<"nhap so thang tiet kiem : "; cin>>t;
   kq = a;
   cout<<"+---+-----------------+"<<endl
       <<"| t | Tien von va lai |"<<endl
       <<"+---+-----------------+"<<endl;
   for(int i=1; i<=t; i++){
     if(i%6==0)
       for(int k=0;k<6;k++)kq *= (1+s/100);
     cout<<"|"<<setw(2)<<i<<" |"
          <<setw(17)<<setprecision(2)<<setiosflags(ios::showpoint |
 ios::fixed)
          <<kq
          <<"|"<<endl;
   }
   cout<<"+---+-----------------+"<<endl;
 }

bài này giống bài 2, chú ý tính lãi sau mỗi 6 tháng




Đáp án Bài 4. Cho x là một số thực, hãy xây dựng hàm tính và in ra màn hình hai cột song
song, cột thứ nhất là giá trị của đối số, cột thứ hai là giá trị của hàm f ứng với đối số ở cột
thứ nhất:


Sau đó, viết một chương trình nhạp từ bán phím một mảng gồm n số thực, và gọi hàm đã lập
được ở trên với đối số là các số vừa nhập.


Code:
  #include <iostream.h>
  #include <iomanip.h>
  #include <math.h>
  const float PI=4.1415;
  //Ham nhap mang cac so thuc
  void nhapMang(float *a,char *name, int n){
      for (int i=0; i<n;i++)
      {
           cout<<name<<"["<<i+1<<"]=";
           cin>>a[i];
      }
  }
  //Ham tinh gia tri cua ham F theo cong thuc
  //Neu X<=0 thi F(x)=0
  //Neu 0<X<=2 thi F(x)=x*x-x
  //Neu x>2 thi F(X)=(x*x-sin(x*x*PI))
  float f(float x)
  {
      if (x<=0)
           return 0;
      else
           if (x<=2)
                return float(pow(x,2)-x);
           else
                return float(pow(x,2)-sin(pow(x,2)*PI));
  }
  //Than ham main
  void main(){
      float a[10], x;
      int n;
      cout<<"Nhap so phan tu N="; cin>>n;
      //Goi ham nhap mang
      nhapMang(a,"a",n);
      //Dinh dang hien thi so thuc
      cout<<setiosflags(ios::showpoint|ios::fixed);
      cout<<setprecision(2);
      //In gia tri cua mang tuong ung voi gia tri ham F(X)
      //Hien thi hai cot song song
      cout<<"+-----------+-----------------+"<<endl
           <<"|      X     |       F(X)      |"<<endl
           <<"+-----------+-----------------+"<<endl;
      for(int i=0; i<n; i++)
      {
        cout<<"|"<<setw(10)<<a[i]<<" |";
        cout<<setw(17)<<f(a[i])<<"|"<<endl;
      }
      cout<<"+----------+------------------+"<<endl;
  }




Bài 5. Viết chương trình tính và in ra màn hình số tiền điện tháng 10/99 của n khách hàng theo
các chỉ số trên đồng hồ điện của tháng 9 và của tháng 10 được nhập vào từ bàn phím (phải
kiểm tra để đảm bảo rằng chỉ số của tháng sau phải lớn hơn chỉ số của các tháng trước).
Biết rằng: 50 số đầu tiền giá 500 đồng/số, 100 số tiếp theo giá 800 đồng/số, 100 số tiếp theo
nữa giá 1000 đồng/số, 100 số tiếp theo nữa giá 1200 đồng/số, và từ số thứ 351 trở đi giá 1500
đồng/số.
Sửa đầu bài 1 tý cho đơn giản: nhập số lượng điện tiêu thụ, tính số tiền phải trả theo đơn
giá trên (chưa có thuế VAT), VAT =10%

Code:
 /*đơn giá:
 từ số: đơn giá
 0-50: 500
 51-150: 800
 151-250: 1000
 251-351: 1200
 351 - ...: 1500 */
 #include <iostream.h>
 #include <iomanip.h>
 void main(){
   int n;
   float t=0;
   cout<<"nhap luong dien tieu thu: ";
   cin>>n;
   if(n>350)t+=(n-=350)*1500.0;
   if(n>250)t+=(n-=250)*1200.0;
   if(n>150)t+=(n-=150)*1000.0;
   if(n> 50)t+=(n-= 50)* 800.0;
   if(n> 0)t+=(n       )* 500.0;
   cout<<"tien dien: "
   <<setprecision(0)
   <<setiosflags(ios::fixed)
   <<(t*1.1);
 }

Giờ nếu nhập 2 chỉ số thì trừ nó đi cho nhau thì sẽ ra lượng điện tiêu thụ
động tác kiểm tra số sau lớn hơn số trước thiết nghĩ rất đơn giản, để các bạn sv tự làm

Khi học đến phần mảng, chúng ta sẽ nhập số người tương ứng là số phần tử của mảng, sau
đó vận dụng bài này để tính tiền điện cho từng người (từng giá trị trong mảng)

chú ý: t là số tiền phải trả, t*1.1 là số tiền đã có thuế 10%



Bài 7. Viết chương trình giải phương trình bậc hai ax2+bx+c=0 với a, b, c bất kỳ được nhập
vào từ bàn phím. In ra màn hình phương trình bậc hai với các hệ số đã nhập, giá trị của delta
và các nghiệm thức của nó (nếu cố), ngươcij lại thì in là không có nghiệm thực.

chú ý: nếu a=0 thì sẽ thành pt bậc nhất, nên tiện đây đưa luôn bài gpt b1
Code:
 #include <iostream.h>
 #include <iomanip.h>
 void main(void)
 {
   float a,b;
   cout<<"Nhap 2 he so cua pt bac nhat:";
     cin>>a>>b;
     if(a!=0)
       cout<<"pt co 1 nghiem thuc x="<<(-b/a);
     else
       if(b==0)
          cout<<"pt lay nghiem nao cung dc";
       else
          cout<<"pt vo nghiem";
 }

giờ nếu a khác 0 thì có pt bậc 2:
Code:
 #include <iostream.h>
 #include <iomanip.h>
 #include <math.h>
 void main(void)
 {
   float a,b,c,d,x1,x2;
   cout<<"nhap 3 hs cua ptb2: ";
   cin>>a>>b>>c;
   d=b*b-4*a*c;
   if(d>=0){
     x1=(-b-sqrt(d))/(2*a);
     x1=(-b+sqrt(d))/(2*a);
     cout<<"pt co 2 nghiem thuc"<<endl
        <<"nghiem thuc 1="<<x1<<endl
         <<"nghiem thuc 2="<<x2;

     }
     else{
       cout<<"pt k co nghiem thuc"<<endl
           <<"pt co 2 nghiem phuc lien hop"<<endl;
       float thuc,ao;
       thuc=-b/2/a;
       ao=sqrt(-d)/2/a;
       cout<<"nghiem ao 1="<<thuc<<"-i"<<ao<<endl;
           <<"nghiem ao 2="<<thuc<<"+i"<<ao<<endl;
       }
 }

Các bạn hãy vận dụng kiến thức của mình để kết hợp thành 1 bài hoàn chỉnh đủ theo đúng
nghĩa với a, b, c bất kỳ




Bài 8. Năm 1999, dân số nước ta là 76 triệu người, tỷ lệ tăng tự nhiên là k% một năm. Lập
một chương trình in ra màn hình hai cột song song, cột thứ nhất là năm, cột thứ hai là dân số
của năm tương ứng ở cột một cho đến khi dân số tăng s lần so với năm 1999. Các số k và s
được nhập vào từ bàn phím.
Giải:
Code:
 #include <iostream.h>
 #include <iomanip.h>
 #include <math.h>
 #include <conio.h>
 void main(void)
 {
     clrscr();
     int k; //% tang dan so hang nam
     float s;//So lan tang
     cout<<"Nhap % tang K="; cin>>k;
     cout<<"Nhap so lan tang S="; cin>>s;
     long dansocu=76000000,dansomoi;
     dansomoi=dansocu;
     int nam=1999;
     //Thiet lap dinh dang
     cout<<setiosflags(ios::showpoint|ios::fixed);
     cout<<setprecision(2);
     cout<<"\n------------------------------------------";
     cout<<"\n"<<setw(20)<<"NAM"<<setw(20)<<"DAN SO";
     cout<<"\n------------------------------------------";
     while(dansomoi<=s*dansocu)
     {
       cout<<"\n"<<setw(20)<<nam<<setw(20)<<dansomoi;
       dansomoi=dansomoi+dansomoi*((float)k/100);
       nam++;
     }
     cout<<"\n------------------------------------------\n";
     getch();
 }

Bài 10. Xây dựng một hàm sắp xếp theo thứ tự tăng dần một mảng gồm n số thực. Viết
chương trình để nhập n số thực từ bàn phím, sử dụng hàm sắp xếp nói trên, và in ra màn hình
hai cột song song, một cột là mảng chưa sắp xếp, một cột là mảng đã được sắp xếp.
Giải:
Code:
 #include <iostream.h>
 #include <iomanip.h>
 #include <math.h>
 #include <conio.h>
 void NhapMang(float a[],float b[],int n)
 {
     cout<<"\nNhap mang\n";
     for (int i=0;i<n;i++)
     {
       cout<<"a["<<i<<"]=";
         cin>>a[i];
         b[i]=a[i];
     }
 }
 void InMang(float a[],float b[],int n)
 {
    cout<<setw(10)<<"TT";
    cout<<setw(20)<<"Mang chua sap xep";
    cout<<setw(20)<<"Mang da sap xep";
     cout<<"\n-----------------------------------------------------";
      for (int i=0;i<n;i++)
      {
           cout<<endl<<setw(10)<<i+1<<setw(20)<<a[i]<<setw(20)<<b[i];
      }
     cout<<"\n-----------------------------------------------------\n";
 }
 void SapXep(float a[],int n)
 {
     //Sap xep tang dan
     for(int i=0;i<n-1;i++)
         for(int j=i+1;j<n;j++)
             if (a[i]>a[j])
             {
                  float tg;
                  tg=a[i]; a[i]=a[j]; a[j]=tg;
             }
 }
 void main(void)
 {
     clrscr();
     float a[100],b[100];
     int n;
     cout<<"Nhap N=";
     cin>>n;
     NhapMang(a,b,n);
     SapXep(b,n);

      //Thiet lap dinh dang
      cout<<setiosflags(ios::showpoint|ios::fixed);
      cout<<setprecision(2);
      InMang(a,b,n);
      getch();
 }

Bài 11. Xây dựng một hàm sắp xếp thep thứ tự giảm dần một mảng gồm n số thực. Viết
chương trình để nhập n số thực từ bàn phím, sử dụng hàm sắp xếp nói trên, và in ra màn hình
hai cột song song, một cột là mảng chưa sắp xếp, một cột là mảng đã được sắp xếp.
Giải:
Code:
 #include <iostream.h>
 #include <iomanip.h>
 #include <math.h>
 #include <conio.h>
 void NhapMang(float a[],float b[],int n)
 {
     cout<<"\nNhap mang\n";
     for (int i=0;i<n;i++)
     {
       cout<<"a["<<i<<"]=";
         cin>>a[i];
         b[i]=a[i];
     }
 }
 void InMang(float a[],float b[],int n)
 {
    cout<<setw(10)<<"TT";
    cout<<setw(20)<<"Mang chua sap xep";
    cout<<setw(20)<<"Mang da sap xep";
    cout<<"\n-----------------------------------------------------";
     for (int i=0;i<n;i++)
     {
          cout<<endl<<setw(10)<<i+1<<setw(20)<<a[i]<<setw(20)<<b[i];
     }
    cout<<"\n-----------------------------------------------------\n";
 }
 void SapXep(float a[],int n)
 {
     //Sap xep giam dan
     for(int i=0;i<n-1;i++)
         for(int j=i+1;j<n;j++)
             if (a[i]<a[j])
             {
                  float tg;
                  tg=a[i]; a[i]=a[j]; a[j]=tg;
             }
 }
 void main(void)
 {
     //clrscr();
     float a[100],b[100];
     int n;
     cout<<"Nhap N=";
     cin>>n;
     NhapMang(a,b,n);
     SapXep(b,n);

        //Thiet lap dinh dang
        cout<<setiosflags(ios::showpoint|ios::fixed);
        cout<<setprecision(2);
        InMang(a,b,n);
        //getch();
 }

Bài 12. Cho F là một số thực lớn hơn 2, và S=1/2+1/3+…+1/n. Hãy xây dựng một hàm để
tìm giá trị lớn nhất của n sao cho S<=F. Viết một chương trình để nhập vào từ bàn phím m số
thực Fi, sử dụng hàm nói trên đối với các hàm Fi đã nhập và in ra màn hình thành ba cột song
song: các giá trị của Fi, n, và S tương ứng.
Giải:

Code:
 #include <iostream.h>
 #include <iomanip.h>
 #include <math.h>
 #include <conio.h>
 int max(double f, double &s)
 {
     int i=1;
        s=0;
        while(s<=f)
        {
             s+=(double)1/double(i++);
        }
        return i;
 }
 void main(void)
 {
     clrscr();
     double f[100], s[100];
     int n,i;
     cout<<"Nhap N="; cin>>n;
     for(i=0;i<n;i++)
     {
          cout<<"F["<<i<<"]"; cin>>f[i];
     }
     //Thiet lap dinh dang
     cout<<setiosflags(ios::showpoint|ios::fixed);
     cout<<setprecision(2);

        clrscr();
        cout<<endl<<setw(10)<<"F"<<setw(10)<<"MAX"<<setw(10)<<"S";
        cout<<"\n--------------------------------";
        for(i=0;i<n;i++)
        {
          cout<<endl<<setw(10)<<f[i]<<setw(10)<<max(f[i],s[i]);
          cout<<setw(10)<<s[i];
        }
        cout<<"\n--------------------------------\n";
        getch();
 }




Bài 11 (chế lại đầu bài): Nhập n phần tử số thực từ bàn phím, in mảng ra màn hình,
sắp xếp giảm dần, in mảng vừa sắp xếp.

Code:
 #include    <iostream.h>   //khai bao   thu vien su dung luong nhap xuat
 #include    <iomanip.h>    //thu vien   dinh dang nhap xuat
 #include    <math.h>       //thu vien   cac ham toan hoc
 #include    <conio.h>      //thu vien   cung cap cac ham ve man hinh, ban phim

 void NhapMang(float a[], int n){
     cout << "Nhap mang" << endl;            //thong bao qua trinh nhap bat dau
     for (int i = 0; i < n ; i++){           //vong lap duyet tu chi so 0 den n-1
       cout << "a[" << i << "] = ";             //moi lan: thong bao phan tu sap
 duoc nhap
       cin >> a[i];                            //nhap gia tri tu ban phim cho phan
 tu thu i
     }                                          //ket thuc vong lap
 }                                       //ket thuc ham NhapMang

 void InMang(float a[], int n){
      //Thiet lap dinh dang
      cout << setiosflags(ios::showpoint|ios::fixed);
      cout << setprecision(2);
      //in tung phan tu cua mang, cach nhau boi dau cach (space)
      for (int i = 0; i < n; i++)cout << a[i] << " ";
      cout << endl;
 }
 void SapXep(float a[], int n){
      //Sap xep giam dan
      for(int i = 0; i < n-1; i++)
        for(int j = i+1; j<n; j++)
               if (a[i] < a[j]){
                 float tg = a[i];
                 a[i] = a[j];
                 a[j] = tg;
               }
 }
 void main(void)
 {
      clrscr();                  //xoa man hinh
      float a[100];              //khai bao bien mang a co 100 phan tu số thực
      int n;                     //khai bao bien n luu so luong phan tu trong
 mang
      cout << "Nhap N = ";       //thong bao cho nguoi dung nhap so luong
      cin >> n;                  //nhap gia tri cho bien n tu ban phim
      NhapMang(a,n);             //nhap n gia tri cho tung phan tu cua mang
      cout << "Mang truoc khi sap xep:"<<endl;
      InMang(a,n);               //in mang truoc khi sap xep
      SapXep(a,n);               //sap xep mang
      cout << "Mang sau khi sap xep:"<<endl;
      InMang(a,n);               //in mang sau khi da sap xep
      getch();                   //cho nguoi dung an phim bat ky de thoat
 }

Chú ý: nếu muốn sắp xếp tăng dần thì thay toán tử so sánh nhỏ hơn trong đoạn code
trên bởi toán tử so sánh lớn hơn.

Cụ thể hàm sắp xếp tăng dần sẽ là:
Code:
 void SapXep(float a[], int n){
     //Sap xep tăng dần
     for(int i = 0; i < n-1; i++)
       for(int j = i+1; j<n; j++)
             if (a[i] > a[j]){
               float tg = a[i];
               a[i] = a[j];
               a[j] = tg;
             }
 }

Còn sắp xếp giảm dần sẽ là:
Code:
 void SapXep(float a[], int n){
     //Sap xep tăng dần
     for(int i = 0; i < n-1; i++)
       for(int j = i+1; j<n; j++)
             if (a[i] < a[j]){
               float tg = a[i];
               a[i] = a[j];
               a[j] = tg;
             }
 }



Bài 11 (chế lại đầu bài): Nhập n phần tử số thực từ bàn phím, in mảng ra màn hình,
sắp xếp giảm dần, in mảng vừa sắp xếp.

Ta làm bài trên theo cách đưa quá trình nhập số lượng phần tử vào trong hàm nhập bằng cách
khai báo đối số của hàm nhập: đối số n là tham chiếu

Code:
 #include   <iostream.h>   //khai bao   thu vien su dung luong nhap xuat
 #include   <iomanip.h>    //thu vien   dinh dang nhap xuat
 #include   <math.h>       //thu vien   cac ham toan hoc
 #include   <conio.h>      //thu vien   cung cap cac ham ve man hinh, ban phim

 void NhapMang(float a[], int &n){ // n là tham chiếu
     cout << "Nhap N = ";     //thong bao cho nguoi dung nhap so luong
     cin >> n;                //nhap gia tri cho bien n tu ban phim
     cout << "Nhap mang" << endl;     //thong bao qua trinh nhap bat dau
     for (int i = 0; i < n ; i++){    //vong lap duyet tu chi so 0 den n-1
       cout << "a[" << i << "] = ";      //moi lan: thong bao phan tu sap
 duoc nhap
       cin >> a[i];                     //nhap gia tri tu ban phim cho phan
 tu thu i
     }                                   //ket thuc vong lap
 }                                    //ket thuc ham NhapMang

 void InMang(float a[], int n){
     //Thiet lap dinh dang
     cout << setiosflags(ios::showpoint|ios::fixed);
     cout << setprecision(2);
     //in tung phan tu cua mang, cach nhau boi dau cach (space)
     for (int i = 0; i < n; i++)cout << a[i] << " ";
     cout << endl;
 }
 void SapXep(float a[], int n){
     //Sap xep giam dan
     for(int i = 0; i < n-1; i++)
       for(int j = i+1; j<n; j++)
             if (a[i] < a[j]){
               float tg = a[i];
               a[i] = a[j];
               a[j] = tg;
             }
 }
 void main(void)
 {
      clrscr();                //xoa man hinh
      float a[100];            //khai bao bien mang a co 100 phan tu số thực
      int n;                   //khai bao bien n luu so luong phan tu trong
 mang
      NhapMang(a,n);           //nhap số lượng n và gia tri cho tung phan tu
 cua mang
      cout << "Mang truoc khi sap xep:"<<endl;
      InMang(a,n);             //in mang truoc khi sap xep
      SapXep(a,n);             //sap xep mang
      cout << "Mang sau khi sap xep:"<<endl;
      InMang(a,n);             //in mang sau khi da sap xep
      getch();                 //cho nguoi dung an phim bat ky de thoat
 }




Đề bài: Viết hàm nhập n phần tử số thực từ bàn phím:

Chúng ta chỉ viết 1 hàm, khi cần sử dụng trong bài nào, ta sẽ đưa hàm này vào bài đó
Cách 1: (kiểu kinh điển)
Code:
 void NhapMang(float a[], int &n){ // n là tham chiếu
     cout << "Nhap N = ";     //thong bao cho nguoi dung nhap so luong
     cin >> n;                //nhap gia tri cho bien n tu ban phim
     cout << "Nhap mang" << endl;     //thong bao qua trinh nhap bat dau
     for (int i = 0; i < n ; i++){    //vong lap duyet tu chi so 0 den n-1
       cout << "a[" << i << "] = ";      //moi lan: thong bao phan tu sap
 duoc nhap
       cin >> a[i];                     //nhap gia tri tu ban phim cho phan
 tu thu i
     }                                   //ket thuc vong lap
 }                                    //ket thuc ham NhapMang

Cách 2: Sử dụng con trỏ như là biến mảng
Code:
 void NhapMang(float *a, int &n){
     cout << "Nhap N = ";     //thong bao cho nguoi dung nhap so luong
     cin >> n;                //nhap gia tri cho bien n tu ban phim
     cout << "Nhap mang" << endl;     //thong bao qua trinh nhap bat dau
     for (int i = 0; i < n ; i++){    //vong lap duyet tu chi so 0 den n-1
       cout << "a[" << i << "] = ";      //moi lan: thong bao phan tu sap
 duoc nhap
       cin >> *(a+i);                   //nhap gia tri tu ban phim cho phan
 tu thu i
     }                                   //ket thuc vong lap
 }                                    //ket thuc ham NhapMang

Ở đây a được hiểu là địa chỉ của đầu mảng, tương đương với a[0]
và (a+i) là địa chỉ của phần tử thứ i trong mảng

Cách 3: Kết hợp 2 kiểu trên
Code:
 void NhapMang(float *a, int &n){
     cout << "Nhap N = ";     //thong bao cho nguoi dung nhap so luong
     cin >> n;                //nhap gia tri cho bien n tu ban phim
     cout << "Nhap mang" << endl;     //thong bao qua trinh nhap bat dau
     for (int i = 0; i < n ; i++){    //vong lap duyet tu chi so 0 den n-1
       cout << "a[" << i << "] = ";      //moi lan: thong bao phan tu sap
 duoc nhap
       cin >> a[i];                     //nhap gia tri tu ban phim cho phan
 tu thu i
     }                                   //ket thuc vong lap
 }                                    //ket thuc ham NhapMang

Cách sử dụng: Hàm nhập mảng với 3 cách trên đều có thể được sử dụng vào bài 11 chế với
bài giải lần 2 ở trên

Câu hỏi: Nếu đề bài là Nhập n phần tử số nguyên từ bàn phím thì chúng ta sẽ thay đổi
chỗ nào trong 3 hàm trên?



Đề bài: Nhập mảng n phần tử số nguyên từ bàn phím
a0) Liệt kê các số chẵn có trong mảng
b0) Đếm các số chẵn có trong mảng
c0) Tính tổng các số chẵn có trong mảng

a1) Liệt kê các số nguyên tố có trong mảng
b1) Đếm các số nguyên tố có trong mảng
c1) Tính tổng các số nguyên tố có trong mảng

Phân tích:
Ta đã có hàm nhập n phần tử số nguyên ở trên roài.
sau khi nhập xong số lượng n, và n phần tử số nguyên cho mảng
ta sẽ duyệt qua mọi phần tử của mảng:
trong mỗi lần duyệt, nếu gặp phần tử thỏa mãn điều kiện ( là số chẵn (a0), hoặc là số nguyên
tố (a1) ) thì sẽ xử lý phần tử đó theo yêu cầu (liệt kê, đếm hoặc là tính tổng ....)

Ta có code C++ giải các ý a1, b1, c1 như sau:
Code:
 #include   <iostream.h>   //khai bao    thu vien su dung luong nhap xuat
 #include   <iomanip.h>    //thu vien    dinh dang nhap xuat
 #include   <math.h>       //thu vien    cac ham toan hoc
 #include   <conio.h>      //thu vien    cung cap cac ham ve man hinh, ban phim

 void NhapMang(int *a, int &n){
     cout << "Nhap N = ";     //thong bao cho nguoi dung nhap so luong
     cin >> n;                //nhap gia tri cho bien n tu ban phim
     cout << "Nhap mang" << endl;     //thong bao qua trinh nhap bat dau
     for (int i = 0; i < n ; i++){    //vong lap duyet tu chi so 0 den n-1
       cout << "a[" << i << "] = ";      //moi lan: thong bao phan tu sap
 duoc nhap
        cin >> *(a+i);                   //nhap gia tri tu ban phim cho phan
 tu thu i
      }                                   //ket thuc vong lap
 }                                     //ket thuc ham NhapMang
 int kiemtra_snt(int x){ // tra ve 1 neu x la snt, nguoc lai tra ve 0
      for(int i=2; i<=sqrt(x); i++)
        if(x%i==0)return 0;      //x chia het cho i => x khong phai la snt
      return 1;
 }
 void lietke_snt(int a[], int n){      //ham in ra cac so nguyen to
      for(int i=0; i < n; i++)
        if(kiemtra_snt(a[i])) cout<<a[i]<<" ";
      cout<<endl;
 }
 int dem_snt(int a[], int n){ //ham tra ve so luong so nguyen to
      int c=0;                    //khai bao bien c dung de dem snt
      for(int i=0; i < n; i++)
        if(kiemtra_snt(a[i])) c++; //tang bien dem len 1
      return c;                     //tra ve so luong snt dem duoc
 }
 int tong_snt(int a[], int n){ //ham tra ve so luong so nguyen to
      int t=0;                    //khai bao bien t dung de tinh tong
      for(int i=0; i < n; i++)
        if(kiemtra_snt(a[i])) t += a[i]; //cong luy tien vao bien t
      return t;                     //tra ve tong cac so nguyen to
 }
 void main(void)
 {
      clrscr();                //xoa man hinh
      int a[100];                      //khai bao bien mang a co 100 phan tu
 so nguyen
      int n;                   //khai bao bien n luu so luong phan tu trong
 mang
      NhapMang(a,n);           //nhap n gia tri cho tung phan tu cua mang
      cout<<"Liet ke snt: ";
      lietke_snt(a,n);
      cout<<"so luong snt: "<<dem_snt(a,n)<<endl;
      cout<<"Tong cac so nguyen to: "<<tong_snt(a,n)<<endl;
      getch();                 //cho nguoi dung an phim bat ky de thoat
 }

Còn các ý a0, b0, c0 quả thực rất đơn giản, ta chỉ việc thay hàm kiemtra là sẽ cho kết quả
như ý muốn!




Đề bài: Nhập n phần tử số nguyên, in ra màn hình giá trị nhỏ nhất và lớn nhất trong
mảng

Phân tích: Bài này có nhiều cách giải
Cách 1 (đơn giản nhất):
+đầu tiên yêu cầu người dùng nhập số lượng phần tử là n
+lặp n lần, mỗi lần nhập 1 giá trị, vừa nhập xong là so sánh với biến min và max, nếu giá trị
vừa nhập bé hơn min thì min sẽ bằng số vừa nhập, và nếu số đó lớn hơn biến max thì max sẽ
bằng số đó

Cách 2: dùng mảng (kinh điển)
+ nhập mảng n phần tử số nguyên từ bàn phím (đã có thuật toán và code ở trên)
+ gán tạm thời min và max bằng phần tử đầu tiên
+ duyệt qua toàn mảng: nếu giá trị đang duyệt bé hơn min hoặc lớn hơn max thì cập nhật lại
min và max

Cách 3: dài dòng nhất
+ nhập mảng n phần tử số nguyên từ bàn phím (đã có thuật toán và code ở trên)
+ sắp xếp tăng dần (hoặc giảm dần)
+ nếu sắp xếp tăng dần thì min sẽ là phần tử đâu tiên, và max sẽ là phần tử cuối cùng trong
mảng đã sắp xếp.

giờ muộn roài, đi ngủ cái đã, lúc khác post code lên.




Bài 16. Hãy xây dựng một hàm để nhập từ bàn phím một mảng số thực. Viết một
chương trình sử dụng hàm đã xây dựng được ở trên để nhập số liệu cho hai mảng số thực,
một mảng có n phẩn tử, và một mảng có m phần tử, in ra màn hình hai cột song song, mỗi
cột là một mảng với ô cuối cùng là tổng của các phần tử trong mảng, và cuối cùng là tổng
của hai mảng.
Giải:

Code:
  #include <iostream.h>
  #include <iomanip.h>
  #include <math.h>
  //Do bài yêu cầu nhập hai mang
  //Chúng ta cho thêm tham số name để hiển thị tên mạng khi nhập
  void nhapMang(double *a,char *name, int n){
      for (int i=0; i<n;i++)
      {
        cout<<name<<"["<<i+1<<"]=";
        cin>>a[i];
      }
  }
  void main(){
      double a[100],b[100];
      int n,m,i;
      //Nhập số lượng phần tử mảng A
      cout<<"Nhap N="; cin>>n;
       //Nhập số lượng phần tử mảng B
       cout<<"Nhap M="; cin>>m;

       //Nhap hai mang a[N], b[M]
       nhapMang(a,"a",n);
       nhapMang(b,"b",m);
      // Thiết lập định dạng
       cout<<setiosflags(ios::showpoint|ios::fixed);
       cout<<setprecision(2);

       //Max chua so phan tu lon hon
       int max=m>n?m:n;
       double s1=0.0,s2=0.0;//Tong mang a la s1, tong mang b la s2
       cout<<endl<<setw(5)<<"TT"<<setw(10)<<"A"<<setw(10)<<"B";
       cout<<"\n---------------------------------";
       for(i=0;i<max;i++)
       {
         if ((i<m) && (i<n))
         {
                cout<<endl<<setw(5)<<i+1<<setw(10)<<a[i]<<setw(10)<<b[i];
                s1=s1+a[i];
                s2=s2+b[i];
         }
           //Luc nay chi con phan tu cua mang A hoac B
         else if (i<n)//Neu i<n thi In phan tu cua mang a
         {
             cout<<endl<<setw(5)<<i+1<<setw(10)<<a[i];
             s1=s1+a[i];
         }
         else if (i<m)//Neu i<m thi In phan tu cua mang b
         {
             cout<<endl<<setw(5)<<i+1<<setw(10)<<" "<<setw(10)<<b[i];
             s2=s2+b[i];
           }
       }
       cout<<"\n---------------------------------";
       cout<<endl<<setw(5)<<"Tong:"<<setw(10)<<s1<<setw(10)<<s2<<endl;
       cout<<"Tong: s1+s2="<<s1+s1<<endl;
  }




Đề bài: Nhập n phần tử số nguyên, in ra màn hình giá trị nhỏ nhất và lớn nhất trong
mảng

Cách 1 (đơn giản nhất):
+đầu tiên yêu cầu người dùng nhập số lượng phần tử là n
+lặp n lần, mỗi lần nhập 1 giá trị, vừa nhập xong là so sánh với biến min và max, nếu giá trị
vừa nhập bé hơn min thì min sẽ bằng số vừa nhập, và nếu số đó lớn hơn biến max thì max sẽ
bằng số đó

Code:
 #include <iostream.h>
 void main(){
   int x, i, n, min, max;
   cout << "Nhap so luong n = "; cin >> n;                           //nhap so luong
   if ( n > 0 ) {                                                    //so luong > 0
     cout<<" Gia tri phan tu thu dau tien = "; cin >> x;             //nhap a[0]
     min = max = x;                                                  //min=max=a[0]
     for ( i = 2 ; i<=n; i++ ){                                      //vong lap i=2->n
       cout<<" Gia tri phan tu thu "<<i<<" = "; cin >> x;            //nhap a[i]
       if ( x < min ) min = x;                                       //cap nhat min
       if ( x > max ) max = x;                                       //cap nhat max
     }
     cout << "Gia tri lon nhat = " << max << endl;                   //in ket qua
     cout << "Gia tri nho nhat = " << min << endl;
   }
 }




Đề bài: Nhập n phần tử số nguyên, in ra màn hình giá trị nhỏ nhất và lớn nhất trong
mảng

Cách giải 2: dùng mảng (kinh điển)
+ nhập mảng n phần tử số nguyên từ bàn phím (đã có thuật toán và code ở trên)
+ gán tạm thời min và max bằng phần tử đầu tiên
+ duyệt qua toàn mảng: nếu giá trị đang duyệt bé hơn min hoặc lớn hơn max thì cập nhật lại
min và max

Code:
 #include <iostream.h>
 void NhapMang(int *a, int &n){
   cout << "Nhap N = "; cin >> n;
   cout << "Nhap mang" << endl;
   for (int i = 0; i < n ; i++){
     cout << "a[" << i << "] = ";
     cin >> *(a+i);
   }
 }

 void TimMinMax(int a[], int n, int &min, int &max){
   min = max = a[0];
   for (int i = 1; i < n ; i++){
     if ( a[i] < min ) min = a[i];
     if ( a[i] > max ) max = a[i];
     }
 }

 void main(){
   int a[100], n, min, max;
   NhapMang (a, n);
   TimMinMax (a, n, min, max);
   cout << "Gia tri lon nhat = " << max << endl;
   cout << "Gia tri nho nhat = " << min << endl;
 }

Chú ý: biến min và max trong đối số hàm TimMminMax là tham chiếu nhé
void TimMinMax(int a[], int n, int &min, int &max)

ở code trên hàm tìm min và max dùng cách kinh điển,
ta có thể thay đổi bằng cách dùng con trỏ như sau:
Code:
 void TimMinMax(int *a, int n, int &min, int &max){
   min = max = *a;
   for (int i = 1, *p=++a; i < n ; i++, p++){
     if ( *p < min ) min = *p;
     if ( *p > max ) max = *p;
   }
 }

chú ý a tương đương với con trỏ trỏ vào đầu mảng nên *a tương đương với a[0]
ban đầu p trỏ vào phần tử a[1] (khối khởi tạo con trỏ *p=++a, tức là p trỏ tới a[1] )
trong mỗi vòng lặp p trỏ vào a[i], và cập nhật min và max nếu a[i] < min hoặc a[i] > max
sau đó p trỏ đến phần tử tiếp theo (lệnh p++ )
(biến i ở đây đảm bảo duyệt sẽ duyệt từ a[1] đến a[n-1] : duyệt hết)
Có ai ko hiểu cách làm việc của hàm tìm min max thứ 2 này không?




Đề bài: Nhập n phần tử số nguyên, in ra màn hình giá trị nhỏ nhất và lớn nhất trong
mảng

Cách giải 3: dài dòng nhất
+ nhập mảng n phần tử số nguyên từ bàn phím (đã có thuật toán và code ở trên)
+ sắp xếp tăng dần (hoặc giảm dần)
+ nếu sắp xếp tăng dần thì min sẽ là phần tử đâu tiên, và max sẽ là phần tử cuối cùng trong
mảng đã sắp xếp.

Code:
 #include <iostream.h>
 void NhapMang(int *a, int &n){
   cout << "Nhap N = "; cin >> n;
     cout << "Nhap mang" << endl;
     for (int i = 0; i < n ; i++){
       cout << "a[" << i << "] = ";
       cin >> *(a+i);
     }
 }

 void SapXep(int a[], int n) { //sắp xếp tăng dần
   for (int i = 0; i < n - 1; i++)
     for (int j = i + 1; j < n; j++)
       if ( a[i] > a[j] ){
         int tg = a[i];
         a[i] = a[j];
         a[j] = tg;
       }
 }

 void main(){
   int a[100], n;
   NhapMang (a, n);
   SapXep (a, n);
   cout << "Gia tri nho nhat = " << a[0]   << endl;
   cout << "Gia tri lon nhat = " << a[n-1] << endl;
 }




Đề bài: Nhập n phần tử số nguyên. Nhập phần tử cần tìm kiếm X. Nếu trong n
phần tử đã nhập có X thì báo "tìm thấy", "số lần tìm thấy" và "các vị trí tìm thấy",
ngược lại báo "không tìm thấy"

Ví dụ: mảng A gồm các phần tử (theo thứ tự chỉ số tăng dần từ 0) là 5, 2, 1, 6, 2, 4, 1, 3
giá trị tìm kiếm X = 2
vậy kết quả sẽ là: Tìm thấy 2 (2 lần) tại vị trí: 1, 4

Phân tích:
sau khi nhập mảng
ta sẽ đếm số lượng phần tử X có trong mảng
nếu đếm thấy có: tiến hành liệt kê các vị trí
ngược lại thì thông báo không có.
Đơn giản vậy thôi
ta sẽ chia các công việc ra từng hàm riêng
hàm nhập kinh điển
hàm đếm trả về số lượng phần tử có giá trị bằng giá trị cho trước
hàm liệt kê: tươg tự hàm trên, mỗi khi gặp a[i] bằng x thì in vị trí ra (vị trí là i)

Code C++ đây thực hành nào:
Code:
 #include <iostream.h>

 void NhapMang(int a[], int &n){
   cout << "Nhap so luong phan tu cua mang: "; cin >> n;
   for (int i = 0; i < n ; i++){
     cout << "a[" << i << "] = "; cin >> a[i];
   }
 }

 int DemSoLan(int a[], int n, int x) {
   int kq = 0;
   for (int i=0; i < n; i++) if (a[i] == x) kq++;
   return kq;
 }

 void LietKe(int a[], int n, int x) {
   for (int i = 0; i < n; i++) if (a[i] == x) cout << i << " ";
 }

 void main(){
   int a[100], n, x, d;
   NhapMang (a, n);
   cout << "Gia tri tim kiem = "; cin >> x;
   d == DemSoLan (a, n, x);
   if (d > 0){
     cout << "Tim thay " << x << " (" << d << " lan) tai vi tri: ";
     LietKe (a, n, x);
   }
   else
     cout << "Khong tim thay " << x;
 }




Đề bài: Nhập n phần tử số nguyên. Nhập phần tử cần tìm kiếm X. Đưa ra màn hình
"TÌM THẤY" nếu có X trong mảng, ngược lại báo "KHÔNG THẤY"

Code:
 #include <iostream.h>

 void NhapMang(int a[], int &n){
   cout << "Nhap N = "; cin >> n;
   for (int i = 0; i < n ; i++){
        cout << "a[" << i << "] = "; cin >> a[i];
   }
 }
 int TimKiem(int a[], int n, int x) {
   for (int i=0; i < n; i++) if(a[i]==x) return 1;
   return 0;
 }

 void main(){
   int a[100], n, x;
   NhapMang (a, n);
   cout << "Gia tri tim kiem = "; cin >> x;
   if( TimKiem (a, n, x) ){
        cout<<"TIM THAY";
   else
        cout<<"KHONG THAY";
 }




BAI TAP

Tìm ước số chung lớn nhất của hai số nguyên được nhập từ bàn phím

Giải thích:

Tính ước số chung lớn nhất của 91 và 287.

Trước hết lấy 287 (số lớn hơn trong 2 số) chia cho 91:

287 = 91*3 + 14 (91 & 14 sẽ được dùng cho vòng lặp kế)

Nhận xét: bất kỳ số nào chia hết bởi 287 và 91 cũng sẽ chia hết bởi 287 - 91*3 = 14. Tương
tự, số chia hết bởi 91 và 14 cũng chia hết bởi 91*3 + 14 = 287. Do đó, ƯSCLN(91,287) =
ƯSCLN(91,14). Bài toán trở thành tìm ƯSCLN(91,14). Lặp lại quy trình trên cho đến khi phép
chia không còn số dư như sau:

91 = 14*6 + 7 (14 & 7 sẽ được dùng cho vòng lặp kế)
14 = 7*2 (không còn số dư, kết thúc, nhận 7 làm kết quả)

Cuối cùng ta có: 7 = ƯSCLN(14,7) = ƯSCLN(91,14) = ƯSCLN(287,91).

Code:
 #include <iostream.h>
 #include <math.h>
 int main()
 {
     int a,b;
     cout<<"Nhap a,b"; cin>>a>>b;
        int   x= abs(a), y= abs(b), r;
        while (y!=0)
        {
            r=x%y;
            x= y;
            y= r;
        }
        cout<<"USCLN="<<x;
 }

Hoặc
Code:
 #include <iostream.h>
 #include <math.h>
 int main()
 {
     int a,b;
     cout<<"Nhap a,b"; cin>>a>>b;
     a=abs(a);
     b=abs(b);
     while(a-b)
     {
         if (a>b)
              a=a-b;
         else
              b=b-a;
     }
     cout<<"USCLN="<<a;
 }




BAI TAP
Muốn tìm bội số chung nhỏ nhất của hai số a,b ta tìm ước số chung lớn nhất của a và b. Sau
đó lấy tích a*b chia cho ước số chung đó.
Code:
 #include <iostream.h>
 #include <math.h>
 int main()
 {
     int a,b;
     cout<<"Nhap a,b"; cin>>a>>b;
     int    x= abs(a), y= abs(b), r;
     while (y!=0)
     {
         r=x%y;
         x= y;
           y= r;
       }
      //x là ước số chung lớn nhất của a và b.
       cout<<"USCLN="<<a*b/x;
 }




Bài tập: Nhập mảng n phần tử số nguyên, nhập giá trị m, in ra màn hình các số không
lớn hơn m theo thứ tự tăng dần, các số còn lại theo thứ tự giảm dần

Phân tích: Cho một ví dụ để các bạn hiểu yêu cầu nhé: Giả sử mảng nhập vào có 10 phần tử
là: 2 9 8 3 7 4 6 5 1 0 và m là 6 thì cần phải in ra: 0 1 2 3 4 5 6 9 8 7

Bài này có nhiều cách giải, sau đây là 1 cách:
+khai báo mảng, khai báo biến số lương n, khai báo biến m
+Nhập mảng: nhập n, nhập n phần tử
+nhập m
+sắp xếp toàn bộ mảng theo thứ tự tăng dần
+tìm k là vị trí phần tử bé nhất trong mảng đã sắp xếp nhưng lớn hơn m
+từ k đến cuối mảng: sắp xếp giảm dần (có thể dùng thuật toán soi gương ở đây)
+in mảng ra màn hình sẽ được kết quả mong muốn.

code C++ nè:

Code:
 #include <iostream.h>
 void NhapMang(int *a, int &n){
   cout << "Nhap N = "; cin >> n;
   for (int i = 0; i < n ; i++){
      cout << "a[" << i << "] = ";
      cin >> a[i];
   }
 }
 void sap_xep(int a[], int n, int m){
   int i,j,k;
   for(i=0; i<n-1; i++)
      for(j=i+1; j<n; j++)
         if(a[i]>a[j]){
              int tg=a[i];
              a[i]=a[j];
              a[j]=tg;
         }

     for(k=0; k<n; k++)
        if(a[k]>m) break;

     for(i=k; i<n-1; i++)
        for(j=i+1; j<n; j++)
           if(a[i]<a[j]){
               int tg=a[i];
               a[i]=a[j];
               a[j]=tg;
           }
 }
 void liet_ke(int a[], int n){
   for(int i=0; i<n; i++)
      cout<<a[i]<<" ";
 }
 void main(){
   int a[100], n, m;
   NhapMang(a,n);
   cout<<"nhap m="; cin>>m;
   sap_xep(a,n,m);
   liet_ke(a,n);
 }

Các bước trong code trên là y hệt với quá trình phân tích, nên malyfo ko viết chú thích vào nữa
hẳn các bạn cũng hiểu cả!
phần trước có bài bài tập gptb2 với hệ số a, b, c bất kỳ, đã post 2 bài là gptb1 và gptb2 riêng
biệt, nhưng k thấy có bạn nào ghép nó lại cả

giờ rảnh malyfo ghép lại nè:

Code:
 #include <iostream.h>
 #include <iomanip.h>
 #include <math.h>
 void gptb2(float a, float b, float c){
   float d,x1,x2;
   d=b*b-4*a*c;
   if(d>=0){
     x1=(-b-sqrt(d))/(2*a);
     x1=(-b+sqrt(d))/(2*a);
     cout<<"pt co 2 nghiem thuc"<<endl
     <<"nghiem thuc 1="<<x1<<endl
     <<"nghiem thuc 2="<<x2<<endl;
   }
   else{
     cout<<"pt k co nghiem thuc\n";
     cout<<"pt co 2 nghiem phuc lien hop"<<endl;
     float thuc,ao;
     thuc=-b/2/a;
     ao=sqrt(-d)/2/a;
     cout<<"nghiem ao 1="<<thuc<<"-i"<<ao<<endl;
     cout<<"nghiem ao 2="<<thuc<<"+i"<<ao<<endl;
     }
 }
 void gptb1(float a, float b){
   if(a!=0)
     cout<<"pt co 1 nghiem thuc x="<<(-b/a)<<endl;
   else
     if(b==0)
        cout<<"pt co vo so nghiem"<<endl;
      else
        cout<<"pt khong co nghiem thuc";
 }
 void main(void){
   float a,b,c;
   cout<<"nhap 3 hs cua ptb2: ";
   cin>>a>>b>>c;
   if(a!=0)
     gptb2(a,b,c);
   else
     gptb1(b,c);
 }




Bài 6. Viết một chương trình nhập vào từ bàn phím điểm kiểm tra của một môn học của n
học sinh và in kết quả ra màn hình dưới dạng hai cột song song, một cột là điểm và cột thứ
hai là xếp loại theo điểm với các qui định sau:
Dưới 5: Yếu
Từ 5 đến dưới 7: Trung bình
Từ 7 đến dưới 9: Khá
Từ 9 trở lên: Giỏi
Giải:
Code:
 #include <iostream.h>
 #include <iomanip.h>
 void main(){
     clrscr();
     float a[100];
     int n;
     cout<<"Nhap so hoc sinh N=";
     cin>>n;
     for (int i=0;i<n;i++)
     {
        cout<<"a["<<i<<"]=";
        cin>>a[i];
     }
     cout<<setprecision(0)<<setiosflags(ios::fixed);
     cout<<endl;
       cout<<setw(10)<<"TT"<<setw(10)<<"Diem"<<setw(20)<<"Xep loai"<<endl;
     for (int i=0;i<n;i++)
     {
       char *xeploai;
       if (a[i]<5)
             xeploai="Yeu";
       else if(a[i]<7)
             xeploai="Trung Binh";
       else if(a[i]<9)
             xeploai="Kha";
       else
               xeploai="Gioi";
          cout<<setw(10)<<i<<setw(10)<<a[i]<<setw(20)<<xeploai<<endl;
        }
        getch();

 }




Đề Bài: Nhập mảng n phần tử số nguyên, kiểm tra xem mảng có phải là tăng dần
không? nếu không phải thì sắp xếp tăng dần. Nhập số nguyên cần tìm kiếm m, tìm
kiếm theo thuật toán tìm kiếm nhị phân. nếu thấy báo số lượng tìm thấy, vị trí tìm
thấy, ngược lại thông báo không thấy. Sau khi tìm xong, hỏi có tìm nữa khôg? nếu tìm
nữa thì lại nhập m, rồi tìm y chang như trên ... cứ thế cho đến khi trả lời là không
muốn tìm nữa thì thôi


Và đây là Code hoàn thiện ghép nối các module trên

Code:
 #include <iostream.h>

 void NhapMang(int *a, int &n){
   cout << "Nhap N = "; cin >> n;
   for (int i = 0; i < n ; i++){
       cout << "a[" << i << "] = ";
       cin >> a[i];
   }
 }

 void SapXep_TangDan(int a[], int n){
   for(int i=0; i<n-1; i++)
      for(int j=i+1; j<n; j++)
         if(a[i]>a[j]){
           int tg=a[i];
           a[i]=a[j];
           a[j]=tg;
         }
 }

 int TimKiem_NhiPhan(int a[], int n, int x){
     int i=0, j=n-1;
     while(i<j){
       int m = (i+j)/2;
       if(x>a[m])
          i=m+1;
         else
            j=m;
       }
       return   (x == a[ i ]) ? i+1 : 0;
 }

 int KiemTra_TangDan (int a[], int n){
   for( int i = 0; i < n - 1; i ++ ) if ( a[i] > a[i+1] ) return 0;
   return 1;
 }

 void main(){
   int a[100], n;
   NhapMang(a, n);
   if(! KiemTra_TangDan(a, n)) SapXep_TangDan(a, n);

     int m, i;
     cout << "Mảng sắp xếp tăng dần:";
     for(i = 0; i < n; i++) cout << a[i] << " ";
     cout << endl;

     cout << "Nhap gia tri can tim: "; cin >> m;

     if( i = TimKiem_NhiPhan(a, n, m) )
        cout << m << " o vi tri: " << i << endl;
     else
        cout << " Khong co phan tu " << m << " trong day " << endl;
 }

Chú ý là bài trên chưa có tìm số lượng.
và cũng chưa làm được "Sau khi tìm xong, hỏi có tìm nữa khôg? nếu tìm nữa thì lại nhập m,
rồi tìm y chang như trên ... cứ thế cho đến khi trả lời là không muốn tìm nữa thì thôi"




Giải quyết bài toán kiểu "Sau khi tìm xong, hỏi có tìm nữa khôg? nếu tìm nữa thì lại nhập
m, rồi tìm y chang như trên ... cứ thế cho đến khi trả lời là không muốn tìm nữa thì
thôi"

cụ thể cho bài trên
Code:
 ...//các hàm ở trên k post lại nhé
 void main(){
   int a[100], n;
   NhapMang(a, n);
   if(! KiemTra_TangDan(a, n)) SapXep_TangDan(a, n);

     int m, i;
     cout << "Mang sap xep tang dan:";
     for(i = 0; i < n; i++) cout << a[i] << " ";
     cout << endl;
     char c;
     do{
           cout << "Nhap gia tri can tim: "; cin >> m;

           if( i = TimKiem_NhiPhan(a, n, m) )
                   cout << x << " o vi tri: " << i << endl;
           else
                   cout << " Khong co phan tu " << x << " trong day " << endl;
           cout<<"Tim tiep khong? (c/k)"; cin>>c;
     }while(c=='c'||c=='C');
 }

Vậy cách chung để giải quyết là:
khai báo 1 biến kiểu ký tự để chứa trả lời
đặt công việc cần làm trong vòng lặp kiểm tra sau do - while
khi làm xong công việc thì hỏi lại người dùng có muốn chạy lại không? (c/k)
và nếu là Có thì sẽ làm lại!

Code:
 char c;
 do{
   //làm công việc gì đó, mà khi làm xong hỏi có làm tiếp kô, nếu đồng ý sẽ
 làm lại
   cout<<"Tim tiep khong? (c/k)"; cin>>c;
 }while(c=='c'||c=='C');




Viết chương trình nhập vào từ bàn phím bán kính R của hình cầu. Hãy tính và in ra diện tích
và thể tích hình cầu đó:
Code:
 #include<iostream.h>
 #include<iomanip.h>
 float main()
 {
    const float PI=3.1415;
    float s,v,r;
    //Yêu cầu nhập r>0, trong khi r<=0 thì nhập lại r
    do
    {
        cout<<"Nhap ban kinh R=";cin>>r;
    }while(r<=0);
    s=4*PI*r*r;
    v=4*PI*r*r*r/3;
    cout<<setiosflags(ios::showpoint|ios::fixed);
    cout<<setprecision(2);
    cout<<"\nV="<<v;
    cout<<"\nS="<<s<<endl;
 }
Nhập mảng n phần tử số nguyên, tìm giá trị phần tử xuất hiện nhiều nhất trong mảng,
nếu có nhiều giá trị khác nhau cùng xuất hiện nhiều nhất thì liệt kê hết các giá trị đó ra.


ví dụ 1:
có 11 phần tử: 1 4 4 2 2 4 5 6 3 6 6
thì thông báo
giá trị 4 xuất hiện 3 lần
giá trị 6 xuất hiện 3 lần.

ví dụ 2:
có 12 phần tử: 1 2 3 3 3 2 2 3 3 4 4 5
thì thông báo
giá trị 3 xuất hiện 5 lần

Phân tích cách 2
sau khi có mảng n phần tử số nguyên
ta sắp xếp tăng dần(hoặc giảm dần cũng OK) mảng đó
khi đó cũng dùng mảng đếm d để lưu số lần xuất hiện của từng phần tử (chỗ này có khác đi 1
tí để dễ dàng việc loại bỏ giá trị lặp hơn
bằng cách duyệt từ đầu đến hết mảng đã sắp xếp
mỗi khi gặp giá trị trùng (trùng thì đứng cạnh nhau do đã sắp xếp) thì tăng số biến đếm thôi
d[0]=1;
for( i = 1; i < n; i++ ) d[i] = ( a[i]==a[i-1] ) ? d[i-1]+1 : 1 ;

khi đó tìm max = giá trị max trong mảng d
rồi liệt kê lại các giá trị a[k] tương ứng với d[k] có giá trị bằng max

Các bạn cùng phân tích nhé! OK?
Code:
  #include <iostream.h>

  void NhapMang(int *a, int &n){
    cout << "Nhap N = "; cin >> n;
    for (int i = 0; i < n ; i ++){
         cout << "a[" << i << "] = ";
         cin >> a[i];
    }
  }
 void SapXep_TangDan(int a[], int n){
   for(int i=0; i<n-1; i++)
       for(int j = i + 1; j < n; j ++)
         if(a[i] > a[j]){
                int tg = a[i];
                a[i] = a[j];
                a[j] = tg;
         }
 }

 void Dem(int *a, int *d, int n){
   d[0]=1;
   for(int i = 1; i < n; i ++)
        if( a[i] == a[i-1] )
               d[i] = d[i-1] + 1;
        else
               d[i] = 1;
        //d[i] = ( a[i]==a[i-1] ) ? d[i-1]+1 : 1 ;
 }

 int max(int *a, int n){
   int m = a[0];
   for(int i = 1; i < n; i ++) if (a[i] > m) m = a[i];
   return m;
 }

 void LietKe(int *a, int *d, int n){
   int m = max(d, n);
   for(int k = 0; k < n; k ++)
        if(d[k] == m)
               cout<<"Gia tri "<<a[k]<<" xuat hien "<<m<<" lan"<<endl;
 }

 void main(){
   int a[100], d[100], n;
   NhapMang(a, n);
   SapXep_TangDan(a, n);
   Dem(a, d, n);
   LietKe(a, d, n);
 }




BAI TAP
Viết chương trình đọc và 2 số nguyên và in ra kết quả của phép (+), phép trừ (-), phép nhân
(*), phép chia (/). Nhận xét kết quả chia 2 số nguyên.

Code:
 #include<iostream.h>
 #include<math.h>
 int main()
 {
       int a,b; //hai toan hang a,b
       char ch;//dau cua phep toan
       int s;
       cout<<"Nhap a="; cin>>a;
       cout<<"Nhap b="; cin>>b;
       cout<<"Nhap toan hang ch=";      cin>>ch;
       switch (ch)
       {
               case '+':
                       s=a+b;
                       cout<<a<<ch<<b<<"="<<s;
                       break;
               case '-':
                       s=a-b;
                       cout<<a<<ch<<b<<"="<<s;
                       break;
               case '*':
                       s=a*b;
                       cout<<a<<ch<<b<<"="<<s;
                       break;
               case '/':
                       if(b!=0)//Neu b<>0 thi a/b
                       {
                               s=a/b;
                               cout<<a<<ch<<b<<"="<<s;
                       }
                       else
                               cout<<"Khong thuc hien phep chia";
                       break;

                  default:
                          cout<<"Khong thuc hien duoc";
         }
 }



BAI TIEP

Viết chương trình nhập vào bán kính hình cầu, tính và in ra diện tích, thể tích của hình cầu đó.
Hướng dẫn: S = 4*PI*R*R và V = (4/3)*PI*R*R*R.

Code:
 #include<iostream.h>
 const float PI=3.1415;
 int main()
 {
       float r,s,v;
       do
       {
               cout<<"Nhap ban kinh R="; cin>>r;
         }while(r<=0);
         s=4*PI*r*r;
         v=4*PI*r*r*r/3;
         cout<<endl<<"Dien tich s="<<s;
         cout<<endl<<"The tich v="<<v;
 }

Viết chương trình nhập vào một số a bất kỳ và in ra giá trị bình phương (a2), lập phương (a3)
của a và giá trị (a4).

Code:
 #include<iostream.h>
 #include<math.h>
 int main()
 {
       double a;
       cout<<"Nhap a=";
       cin>>a;
       double a2,a3,a4;
       a2=pow(a,2);
       a3=pow(a,3);
       a4=pow(a,4);
       cout<<endl<<"a2="<<a2;
       cout<<endl<<"a3="<<a3;
       cout<<endl<<"a4="<<a4;
 }



BAI TIEP

Viết chương trình nhập vào số giây từ 0 đến 86399, đổi số giây nhập vào thành dạng
"gio:phut:giay", mỗi thành phần là một số nguyên có 2 chữ số. Ví dụ: 02:11:05

Code:
 #include<iostream.h>
 int main()
 {
       long int num;
       int h,m,s;
       cout<<"Nhap so:"; cin>>num;
       //S la so giay
       s=num%60;
       num=num/60;
       //m la so phut
       m=num%60;
       num=num/60;
       //h la so gio
       h=num%60;
       num=num/60;

         //Neu h<10 phai them so 0 dang truoc
         if (h<10)
                 cout<<"\n0"<<h;
         else
                  cout<<h;

         if (m<10)
                 cout<<":0"<<m;
         else
                 cout<<":"<<m;

         if (s<10)
                 cout<<":0"<<s;
         else
                 cout<<":"<<s;

 }



BAI TIEP

Viết chương trình nhập vào số nguyên dương, in ra thông báo số chẵn hay lẻ. Hướng dẫn:
Nhập vào số nguyên dương x. Kiểm tra nếu x chia chẵn cho hai thì x là số chẵn (hoặc chia
cho 2 dư 0) ngược lại là số lẻ.

Code:
 #include<iostream.h>
 int main()
 {
       int x;
       do
       {
               cout<<"Nhap X="; cin>>x;
       }while(x<=0);
       if (x%2==0)
               cout<<"X la so chan";
       else
               cout<<"X la so le";
 }

BAI TAP

Viết chương trình nhập vào 4 số nguyên. Tìm và in ra số lớn nhất.

Code:
 #include<iostream.h>
 int main()
 {
       int a,b,c,d;
       cout<<"Nhap a,b,c,d";
       cin>>a>>b>>c>>d;
       int max,m1,m2;
       max=(m1=(a>b)?a:b)>(m2=(c>d)?c:d)?m1:m2;
       /*
       Hoac
       m1=(a>b)?a:b);
         m2=(c>d)?c:d);
         max=m1>m2?m1:m2;
         */
         cout<<"Max="<<max;
 }

Bài 5: Viết chương trình nhập vào số giây, đổi số giây nhập vào thành dạng
"gio:phut:giay", mỗi thành phần là một số nguyên có 2 chữ số.
Code:
 #include <iostream.h>
 void main(){
   long t;
   cout<<"Nhap tong so giay can quy doi:"; cin>>t;
   int s = t%60;
   int m = t/60%60;
   int h = t/60/60%24;
   if(h<10)cout<<0; cout<<h<<':';
   if(m<10)cout<<0; cout<<m<<':';
   if(s<10)cout<<0; cout<<s;
 }

Nếu muốn viết ra giờ:phút:giây am/pm
thì ta chỉnh một chút như sau:
Code:
 #include <iostream.h>
 void main(){
   long t;
   cout<<"Nhap tong so giay can quy doi:"; cin>>t;
   int s = t%60;
   int m = t/60%60;
   int h = t/60/60%24;
   if(h<10)cout<<0;
   if(h>12)cout<<(h-12)<<':'; else cout<<h<<":";
   if(m<10)cout<<0; cout<<m<<':';
   if(s<10)cout<<0; cout<<s;
   if(h>12)cout<<" pm"; else cout<<" am";
 }




Bài 5: Viết chương trình nhập vào số giây, đổi số giây nhập vào thành dạng
"gio:phut:giay", mỗi thành phần là một số nguyên có 2 chữ số.
Code:
 #include <iostream.h>
 void main(){
     long t;
     cout<<"Nhap tong so giay can quy doi:"; cin>>t;
     int s = t%60;
     int m = t/60%60;
     int h = t/60/60%24;
     if(h<10)cout<<0; cout<<h<<':';
     if(m<10)cout<<0; cout<<m<<':';
     if(s<10)cout<<0; cout<<s;
 }

Nếu muốn viết ra giờ:phút:giây am/pm
thì ta chỉnh một chút như sau:
Code:
 #include <iostream.h>
 void main(){
   long t;
   cout<<"Nhap tong so giay can quy doi:"; cin>>t;
   int s = t%60;
   int m = t/60%60;
   int h = t/60/60%24;
   if(h<10)cout<<0;
   if(h>12)cout<<(h-12)<<':'; else cout<<h<<":";
   if(m<10)cout<<0; cout<<m<<':';
   if(s<10)cout<<0; cout<<s;
   if(h>12)cout<<" pm"; else cout<<" am";
 }

Áp dụng bài trên, viết 1 hàm quy đổi, in ra thời gian vào và ra của lịch học buổi sáng
tiết 1 bắt đầu vào lúc 6h30 sáng
Code:
 #include <iostream.h>
 void qd(long t){
   int s = t%60;
   int m = t/60%60;
   int h = t/60/60%24;
   if(h<10)cout<<0;
   if(h>12)cout<<(h-12)<<':'; else cout<<h<<":";
   if(m<10)cout<<0; cout<<m<<':';
   if(s<10)cout<<0; cout<<s;
   if(h>12)cout<<" pm"; else cout<<" am";
   cout<<endl;
 }
 void main(){
   long t=(long)6*60*60 + 30*60;
   cout<<"vao t1="; qd(t); t+=45*60;
   cout<<" ra t1="; qd(t); t+=5*60;
   cout<<"vao t2="; qd(t); t+=45*60;
   cout<<" ra t2="; qd(t); t+=5*60;
   cout<<"vao t3="; qd(t); t+=45*60;
   cout<<" ra t3="; qd(t); t+=10*60;
   cout<<"vao t4="; qd(t); t+=45*60;
   cout<<" ra t4="; qd(t); t+=5*60;
   cout<<"vao t5="; qd(t); t+=45*60;
     cout<<" ra t5="; qd(t); t+=5*60;
     cout<<"vao t6="; qd(t); t+=45*60;
     cout<<" ra t6="; qd(t);
 }




Nhập vào số nguyên dương n. In ra màn hình các số nguyên tố từ 1 đến n

Bài này chưa có thuật toán nào hay hơn sàng Eratosthene là một giải thuật cổ xưa để lập bảng
tất cả các số nguyên tố nhỏ hơn một số n cho trước. Giải thuật dựa trên tính chất: mọi hợp
số m đều có ước nguyên tố không vượt quá căn bậc hai của m. Giải thuật đầu tiên xóa số 1 ra
khỏi tập các số nguyên tố. Số tiếp theo số 1 là số 2, là số nguyên tố. Bắt đầu từ số 2 xoá tất
cả các bội của 2 ra khỏi bảng.Số đầu tiên không bị xoá sau số 2 (số 3) là số nguyên tố. Tiếp
theo lại xoá các bội của 3... Tất cả các số chưa bị xoá là số nguyên tố.

Với bài toán của bạn có thể cài đặt giải thuật này như sau:

Code:
 #include <iostream.h>
 #include <conio.h>
 #include <iomanip.h>
 int main()
 {
       int N;
       cout<<"Nhap N: ";       cin>>N;
       char *a = new char(N+1);
       int i, j;
       for(i = 2; i <= N/2; i++)
               //if(!a[i])
                       for(j = i+i; j < N; j += i)
                               a[j] = 1;
       for(i = 2; i <= N; i++)
               if(!a[i])
                       cout<<setw(10)<<i;
       cout<<endl;
 }

Hoặc

Code:
 #include<iostream.h>
 #include<iomanip.h>

 //Ham kiểm tra n có phải là số nguyên tố không
 int nguyento(int n)
 {
       if (n<2)
         {
                 return 0;
         }
         int d=0;
         for(int i=2;i<=int(n/2);i++)
                 if      (n%i==0)
                 {
                         d++;
                 }
         return d;
 }
 void main()
 {
       int n;
       cout<<"Nhap N="; cin>>n;
       int a[n];

         for(int i=0;i<n;i++)
                 a[i]=0;

         for(int i=0;i<n;i++)
                 if(nguyento(i))//Nếu i KHÔNG là số nguyên tố thì gán a[i]=0
                         a[i]=0;
                 else
                         a[i]=1; //i là số nguyên tố
         for(int i=2;i<n;i++)
                 if (a[i]) //Nếu a[i]==1, nghĩa là i là số nguyên tố thì in
                         cout<<setw(10)<<i;
         cout<<endl;
 }




Viết chương trình nhập vào số tự nhiên N rồi thông báo lên màn hình số đó có phải là số
nguyên tố hay không.

Ý tưởng:

N là số nguyên tố nếu N không có ước số nào N div 2. Từ định nghĩa này ta đưa ra→từ 2

Giải thuật:

- N div 2 lưu vào biến d.→Đếm số ước số của N từ 2
- Nếu d=0 thì N là số nguyên tố.

Code:
 #include<iostream.h>
 #include<iomanip.h>
 void main()
 {
       int n;
       cout<<"Nhap N="; cin>>n;
         if (n<2)
         {
                 cout<<n<<" khong phai la so nguyen to";
                 return 0;
         }
         int d=0;
         for(int i=2;i<=int(n/2);i++)
                 if      (n%i==0)
                 {
                         d++;
                 }
         if (d==0)
                 cout<<setw(10)<<n<<" la so nguyen to";
         else
                 cout<<setw(10)<<n<<" KHONG la so nguyen to";
 }



Đề bài: Viết chương trình nhập vào số tự nhiên N rồi thông báo lên màn hình số đó
có phải là số nguyên tố hay không.

Phân tích: ta biết số nguyên tố chỉ chia hết cho 1 và chính nó. vậy khi số nguyên N không là
số nguyên tố, thì x là hợp số, tức là N=a.b , và không mất tính tổng quát ta có thể giả sử a<=b.
Khi đó max(a) = b, và N = a . a Vậy ta suy ra giá trị lớn nhất của a là căn bậc 2 của N

Nên ta chỉ cần kiểm tra các số nguyên trong khoản từ 2 đến căn bậc 2 của N, nếu tồn tại 1 giá
trị i mà N chia hết cho i thì kết luận N không phải số nguyên tố, ngược lại thì N là số nguyên
tố

Code:
 #include <iostream.h>
 #include <math.h>
 int kiemtra_snt ( int x ) {
   for ( int i=2; i <= sqrt( x ); i++ )
     if ( x % i == 0 ) return 0;
   return 1;
 }
 void main(){
   int n;
   cout << "Nhap gia tri can kiem tra tinh nguyen to: ";
   cin >> n;
   if ( kiemtra_snt ( n ) )
     cout << n << " la so nguyen to";
   else
     cout << n << " KHONG la so nguyen to";
 }

code không dùng hàm
Code:
 #include <iostream.h>
 #include <math.h>
 void main(){
    int n,i;
    cout << "Nhap gia tri can kiem tra tinh nguyen to: ";
    cin >> n;
    i=2;
    while(i<=sqrt( n ) && n%i!=0)i++;
    if (i<=sqrt( n ) )
         cout << n << " KHONG la so nguyen to";
    else
         cout << n << " la so nguyen to";

Chú ý: Câu lệnh while(i<=sqrt( n ) && n%i!=0)i++; có nghĩa là: TRONG KHI i trong miền
kiểm tra, và N không chia hết cho i thì tăng i lên 1 và tiếp tuc kiểm tra. Vòng lặp while kết
thúc khi biểu thức điều kiện nhận giá trị SAI, biểu thức điều kiện trên nhận giá trị SAI khi ít
nhất 1 trong 2 thành phần của biểu thức đó phải SAI (vì đang dùng toán tử && ) VÀ CHÚ Ý
ĐẾN BIỂU THỨC ĐIỀU KIỆN NHÉ

THOÁT KHỎI WHILE BỞI i<=sqrt( n ) MANG GIÁ TRỊ ĐÚNG, THÌ X KHÔNG PHẢI LÀ
SNT
NGƯỢC LẠI: X LA SỐ NGYÊN TỐ

Viết chương trình nhập vào số giây từ 0 đến 86399, đổi số giây nhập vào thành dạng
"gio:phut:giay", mỗi thành phần là một số nguyên có 2 chữ số.

Ví dụ: 02:11:05

Code:
 #include<iostream.h>
 int main()
 {
       long int num; //num là số giây nhập vào từ bàn phím
         // s là số giây, m là số phút, h là số giờ
       int h,m,s;
       cout<<"Nhap so:"; cin>>num;
       //S la so giay
       s=num%60;
       num=num/60;
       //m la so phut
       m=num%60;
       num=num/60;
       //h la so gio
       h=num;

         //Nếu h<10 phải thêm số o đằng trước ví dụ h=9 => "0"+"9"="09"
         if (h<10)
                 cout<<"\n0"<<h;
         else
                 cout<<h;

         if (m<10)
                 cout<<":0"<<m;
         else
                 cout<<":"<<m;
        if (s<10)
                cout<<":0"<<s;
        else
                cout<<":"<<s;

 }


Cho F là một số thực lớn hơn 2, và S=1/2+1/3+…+1/n. Hãy xây chương trình để tìm giá
trị lớn nhất của n sao cho S<=F


Code:
 #include <iostream.h>
 void main()
 {
       int f,i;
       float s=0;
       cout<<"Nhap F="; cin>>f;
       for (i=1;;i++)
       {
               s+=1/(float)i;
               if (s>f) break;
       }
       cout<<"i="<<i;
       cout<<"\nS="<<s<<endl;

 }

Hoặc:

Code:
 #include <iostream.h>
 void main()
 {
       int f,i;
       float s=0;
       cout<<"Nhap F="; cin>>f;
       i=0;
       while(s<=f)
       {
               i++;
               s+=1/(float)i;
       }
       cout<<"i="<<i;
       cout<<"\nS="<<s<<endl;

 }

Viết chương trình nhập vào n số thực từ bàn phím. Tìm và in ra số lớn nhất và số nhỏ
nhất

Code:
 #include<iostream.h>
 void main()
 {
       int n;
       float s,max,min;
       cout<<"Nhap N="; cin>>n;
       for(int i=1;i<=n;i++)
       {
               cout<<"Nhap S"; cin>>s;
               if(i==1)
               {
                       min=s;
                       max=s;
               }else{
                       if (max<s)max=s;
                       if (min>s) min=s;
               }
       }
       cout<<"Min="<<min;
       cout<<"Max="<<max;
 }




BAI TAP
Tìm ước chung lớn nhất (UCLN) của 2 số nguyên m và n.
Áp dụng thuật toán Euclide bằng cách liên tiếp lấy số lớn trừ đi số nhỏ khi nào 2 số bằng
nhau thì đó là UCLN. Trong chương trình ta qui ước m là số lớn và n là số nhỏ. Thêm biến phụ
r để tính hiệu của 2 số. Sau đó đặt lại m hoặc n bằng r sao cho m > n và lặp lại. Vòng lặp
dừng khi m = n.

Code:
 #include<iostream>
 void main()
 {
 int m, n, r;
 cout << "Nhập m, n: " ; cin >> m >> n ;
 if (m < n) { int t = m; m = n; n = t; } // nếu m < n thì đổi vai trò hai số
 while (m != n) {
 r = m - n ;
 if (r > n) m = r; else { m = n ; n = r ; }
 }
 cout << "UCLN = " << m ;
 }
Bội số chung và ước số chung(viet theo kieu cu)
Code:
 #include <stdio.h>
 #include <conio.h>
 unsigned USCLN (unsigned n, unsigned m)
 {
   while (n != 0 && m != 0)
     if (n>m)
        n -= m;
     else
        m -= n;
   if (n == 0)
     return m;
   else
     return n;
 }

 unsigned BSCNN (unsigned n, unsigned m)
 {
   return n * m / USCLN(n, m);
 }

 void main()
 {
   unsigned n, m;

     printf("\nNhap hai vao so nguyen duong : ");
     scanf("%u%u", &n, &m);
     printf("\nUSCLN cua %u va %u = %u", n, m, USCLN(n,m));
     printf("\nBSCNN cua %u va %u = %u", n, m, BSCNN(n,m));
     getch();
 }




Bài in ra lịch của một năm bất kỳ lớn hơn 1700 (Bài này tớ làm đấy   )

Code:
 #include <iostream.h>
#include <conio.h>
#include <stdlib.h>
int songay(int,int);
bool namnhuan(int nam);
void InLich(int,int);
int ThuDauTien(int,int);
void main()
{
     int nam;
   char chon;
   do
   {
        do
        {
              cout<<"Nhap vao nam(> 1700): ";
            cin>>nam;
        }while(nam < 1700);
        for(int i = 1;i <= 12;i++)
        {
             cout<<"Thang "<<i<<endl;
            InLich(i,nam);
            cout<<endl;
        }
       cout<<"\nBan co muon tiep tuc khong(y/n): ";
       cin>>chon;
       system("cls");
   }while(chon == 'y');
   cout<<"Thanh Nam cam on ban da su dung chuong trinh {an Enter de
thoat)";
   getch();
}
int songay(int thang,int nam)
{
      switch(thang)
   {
        case 1:
        case 3:
       case 5:
       case 7:
       case 8:
       case 10:
       case 12:
            return 31;
       case 2:
            if(namnhuan(nam))
                return 29;
           else
                return 28;
       case 4:
       case 6:
       case 9:
       case 11:
            return 30;
   }
   return 0;
}
bool namnhuan(int nam)
{
   return ((nam % 4 == 0 && nam % 100 != 0)||(nam % 400 == 0));
}
void InLich(int thang,int nam)
{
     int ngayd = ThuDauTien(thang,nam);
   if(ngayd == 0)
   ngayd = 7;
      int i;
   int sn = songay(thang,nam);
   cout<<"\nMon\tTUE\tWED\tTHU\tFRI\tSAT\tSun\n";
   for(i = 1;i <= ngayd - 1;i++)
   cout<<"\t";
   for(i = 1;i <= sn;i++)
   {
          cout<<i<<"\t";
       if((i + ngayd - 1) % 7 == 0)
       cout<<endl;
   }
}

long int funct1 (int nam,int thang)
{
      long int result;
   if ( thang <= 2 )
   nam -= 1;   //
   result = nam;
   return (result);
}

long int funct2 (int thang)
{
    long int result;
    if ( thang <= 2 )
    result = thang + 13;
    else
    result = thang + 1;
    return(result);
}

long int day_count (int thang, int nam)
{
    long int number;
    number = 1461 * funct1(nam,thang) / 4 + 153 * funct2(thang) / 5 + 1;
    return (number);
}

int ThuDauTien(int thang,int nam)
{
    long int number_of_days1;
   int day_of_week;
   number_of_days1 = day_count (thang, nam);
   day_of_week = (number_of_days1 - 621049) % 7;
    return day_of_week;
}
Bài kiểm tra số nguyên tố (cach khac)

Code:
 /*Ham tinh so nguyen to */
 #include<iostream.h>
 #include<conio.h>
 #include<math.h>
 bool LaNguyenTo(int n);
 void main()
 {
       int n;
    cout<<"Nhap vao mot so bat ky(hmcdt4): ";cin>>n;
       if(LaNguyenTo(n))
                cout<<"La so nguyen to";
       else
                {
                cout<<"Khong la so nguyen to vi no chia het cho ";
              for(int j=2;j<n;j++)
              {
                if(n%j==0)
                  cout<<j<<" va ";
              }
              cout<<"The thoi";
          }
    getch();
 }
 bool LaNguyenTo(int n)
 {
                bool co=true;
       if(n<2)
       {cout<<"Du lieu nhap sai va so do ";
       return !co;}
       else
       {
                for(int i=2;i<=sqrt(n)+1;i++)
                {
                         if(n%i==0)
                {
                                 co=false;
                         break;
                }
                }
       }
    return 0;
 }
lai la lai suat ngan hang ne!! gui tien di cho giau to nhe

Code:
 (Ngân hàng)Tìm số tiền nhận trong n tháng khi biết lãi xuất

Code:
 #include<iostream.h>
 #include<conio.h>
 #include<math.h>
 void main()
 {
       double sotiengui,tienlai,laixuat;
    int sothang;
    cout<<"Nhap vao so tien gui: ";cin>>sotiengui;
    cout<<"Nhap vao lai xuat(%): ";cin>>laixuat;
    cout<<"Nhap vao so thang gui: ";cin>>sothang;
    for(int i=1;i<=sothang;i++)
    {
       tienlai=laixuat*sotiengui;
         sotiengui=sotiengui+tienlai;
    }
    cout<<"Vay so tien nguoi do gui trong "<<sothang<<" thang la:
 "<<sotiengui;
    getche();
 }




In ra dãy số ngược với dãy số nhập vào
eg:cin 12345 >>>>> cout 54321
hmck43dt4 (hay khong ,rat don gian)

Code:
 #include <iostream.h>
 #include <conio.h>
 void main()
 {
          long a;
     do
     {
                cout<<"a (Phai la so nguyen duong) = ";
                cin>>a;
     }while(a<0);
     cout<<"Vay "<<a<<" duoc viet nguoc lai la: ";
        if (a > 0)
        {
                while (a > 0)
                {
                        cout<<a%10;
                        a = a / 10;
                }
        }
        getche();
 }




bai nay cuc de nhung van post len vi so co 1 so anh em
con chua biet lam
Tính x^1/1! + x^2/2! + x^3/3! + ... + x^n/n!

Code:
 #include<iostream.h>
 #include<conio.h>
 #include<math.h>
 void main()
 {
       float x,tong=0.0,n,tg,mu=1.0,gt=1.0;
    cout<<"Nhap vao mot so thuc x= ";cin>>x;
    cout<<"Nhap vao n= ";cin>>n;
    for(int i=1;i<=n;i++)
    {
       mu=mu*x;
       gt=gt*i;
       tg=mu/gt;
       tong=tong+tg;
    }
    cout<<"Vay ";
    for(int j=2;j<=n;j++)
    {
       cout<<x<<"^"<<j<<"/"<<j<<"!"<<" + ";
    }
    cout<<x<<" = "<<(tong);
     getch();
 }




Đề bài: Nhập vào mảng n phần tử số nguyên, sau đó in ra ước chung lớn nhất của tất
cả các số đó

code sửa lại từ ý tưởng vdtt

Code:
 #include <iostream.h>
 void sapxep ( int a[], int n ) {
   for( int i = 1; i <= n - 1; i ++ )
   for( int j = i + 1; j <= n; j ++ )
     if( a[i] < a[j] ) {
       int tg = a[i]; a[i] = a[j]; a[j] = tg;
     }
 }
 void main(){
   int n, a[100];
   cout << "Nhap n="; cin >> n;
   for( int i = 1; i <= n; i ++ ) {
     cout << "a[" << i << "]=";
     cin >> a[i];
   }
   sapxep(a, n);
   do{
     a[1] = a[1] - a[n];
     sapxep(a, n);
   } while( a[1] != a[n] );
   cout << "Uoc chung lon nhat cua ";
   for ( i = 1; i <= n; i ++ ) cout << a[i] << ' ';
   cout << "la "<< a[1] << endl;
 }
Đề bài: Nhập vào mảng n phần tử số nguyên, sau đó in ra ước chung lớn nhất của tất
cả các số đó
Code:
 #include <iostream.h>
 void sapxep ( int a[], int n ) {
   for( int i = 0; i < n - 1; i ++   )
   for( int j = i + 1; j < n; j ++   )
     if( a[i] < a[j] ) {
       int tg = a[i]; a[i] = a[j];   a[j] = tg;
     }
 }
 void main(){
   int n, a[100];
   cout << "Nhap n="; cin >> n;
   for( int i = 0; i < n; i ++ ) {
     cout << "a[" << i << "]=";
     cin >> a[i];
   }
   sapxep(a, n);
   do{
     a[0] = a[0] - a[n-1];
     sapxep(a, n);
   } while( a[0] != a[n-1] );
   cout << "Uoc chung lon nhat cua   ";
   for ( i = 0; i < n; i ++ ) cout   << a[i] << ' ';
   cout << "la "<< a[0] << endl;
 }

và theo cách thứ 2 cũng của vdtt

Code:
 #include <iostream.h>
 int ucln (int a, int b) {
   while ( a != 0 && b != 0 )
      if ( a > b ) a -= b; else b -= a;
   return a ? a : b;
 }
 void main ( ) {
   int x[100], n;
   cout << "Nhap n: "; cin >> n;
   for( int i = 0; i < n; i ++ ){
      cout << "x[" << i << "]="; cin >> x[i];
   }
   int d = ucln(x[0], x[1]);
   for( i = 2; i < n; i ++ )
      if (d == 1) break;
      else d = ucln(d, x[i]);
   cout << "uoc chung lon nhat la: " << d;
 }
Bài 5. Viết chương trình tính và in ra màn hình số tiền điện tháng 10/99 của n khách hàng
theo các chỉ số trên đồng hồ điện của tháng 9 và của tháng 10 được nhập vào từ bàn phím
(phải kiểm tra để đảm bảo rằng chỉ số của tháng sau phải lớn hơn chỉ số của các tháng
trước).
Biết rằng: 50 số đầu tiền giá 500 đồng/số, 100 số tiếp theo giá 800 đồng/số, 100 số tiếp theo
nữa giá 1000 đồng/số, 100 số tiếp theo nữa giá 1200 đồng/số, và từ số thứ 351 trở đi giá 1500
đồng/số.
Giải:

Code:
 #include <iostream.h>
 #include <iomanip.h>
 #include <math.h>
 #include <conio.h>
 struct KhacHang
 {
     int csc,csm;
     double tien;
 };
 //Ham tinh tien dien theo gia qui dinh
 //intput: So dien tieu thu
 //output: So tien phai tra
 double tinhtien(int tieuthu)
 {
     double tien;
     if (tieuthu<=50)
        tien=tieuthu*500;
     else if(tieuthu<=150)
        tien=50*500+(tieuthu-50)*800;
     else if(tieuthu<=250)
        tien=50*500+100*800+(tieuthu-150)*1000;
     else if(tieuthu<=350)
        tien=50*500+100*800+100*1000+(tieuthu-250)*1200;
     else
        tien=50*500+100*800+100*1000+100*1200+(tieuthu-350)*1500;
     return tien;
 }
 void main(void)
 {
     clrscr();
     int n;
     KhacHang a[100];
     cout<<"Nhap so khach hang N=";
     cin>>n;
     int i=0;
     while(i<n)
     {
       clrscr();
       cout<<"\nNhap khach hang thu "<<i+1;
       cout<<"\nChi so cu:"; cin>>a[i].csc;
         cout<<"\nChi so moi:";cin>>a[i].csm;
         //Neu chi so cmoi > chi so moi thi tang i
         //Tinh tien phai tra cho khac hang thu i
         if (a[i].csm>=a[i].csc){
                 int tieuthu=a[i].csm-a[i].csc;
                 a[i].tien=tinhtien(tieuthu);
                 i++;
         }
        }
        //Thiet lap dinh dang
        cout<<setiosflags(ios::showpoint|ios::fixed);
        cout<<setprecision(2);
        clrscr();
        //Hien thi CSC, CSM, Tien phai tra
        cout<<"----------------------------------------\n";
        cout<<"|"<<setw(5)<<"TT"<<setw(10)<<"CSC";
        cout<<setw(10)<<"CSM"<<setw(15)<<"Tien |\n";
        cout<<"----------------------------------------\n";
        for(i=0;i<n;i++)
        {
          cout<<setw(5)<<i<<setw(10)<<a[i].csc<<setw(10)<<a[i].csm;
          cout<<setw(15)<<a[i].tien<<endl;
        }
        cout<<"----------------------------------------\n";
        getch();

 }




Đề bài: Viết chương trình thực hiện thao tác cộng, trừ, nhân, chia trên hai số nguyên
(thực) được nhập vào từ bàn phím. Và in ra kết quả nguyên. (Dùng ép kiểu).*/

Code:
 #include <stdio.h>
 #include <conio.h>
 #define Tong(a,b) a+b
 #define Hieu(a,b) a-b
 #define Tich(a,b) a*b
 #define Thuong(a,b) a/b
 void main()
 {
 int x,y,tong,hieu;
 float tich, thuong;
 clrscr();
 printf("Moi nhap 2 so nguyen: ");
 scanf("%d %d",&x,&y);
 tong=Tong(x,y);
 printf("\nTong cua %d va %d la: %d",x,y,tong);
 hieu=Hieu(x,y);
 printf("\nHieu cua %d va %d la: %d",x,y,hieu);
 tich=Tich(x,y);
 printf("\nTich cua %d va %d la: %d",x,y,int(tich));
 [w]if[/w] (y==0)
 {
   printf("\nError: Khong chia duoc cho 0");
 }
 else
 {
   thuong=Thuong(x,y);
   printf("\nThuong (nguyen) cua %d va %d la: %d",x,y,int(thuong));
 }
 getch();
 }




/*bai tap tinh tien dien
ko khoa hoc nhung de hieu hon nhieu*/

#include <iostream.h>
#include <iomanip.h>
void main(){
int t9,t10,s;
float t;char ch[25];
cout<<"moi nhap ten";cin>>ch[25];
cout<<"nhap so dien t9";cin>>t9;
cout<<"nhap so dien t10";cin>>t10;
s=t10-t9;
if (s>0){
if (s<50) t=s*500;
else if(s<150) t=50*500+(s-50)*800;
else if(s<250) t=50*500+100*800+(s-150)*1000;
else if(s<250) t=50*500+100*800+(s-150)*1000;
else t=50*500+100*800+100*1000*(s-250);

cout<<"tien "<<t;}
else
cout <<"moi nhap lai"<<endl;
}
Bài: Nhập vào một dãy số nguyên cho đến khi nhập vào giá trị "Chia hết cho 5". Tính tổng các
phần tử chẵn. Tổng các phần tử lẻ.
Code:
 #include<iostream.h>
 void main()
 {
       int n; //Gia tri nhap vao tam thoi
       int s_le=0;// Tong cac phan tu le
       int s_chan=0;//Tong cac phan tu chan
       do
       {
               cout<<"Nhap N="; cin>>n;
               if (n%2==0) s_chan+=n; //Neu n chan: tinh tong chan
               else s_le+=n; //Neu n le tinh tong le
       }while(n%5!=0);
       cout<<"\nTong le: "<<s_le;
       cout<<"\nTong chan: "<<s_chan;
 }




Bài 25. Cho cấu trúc:

Code:

struc dienthoai{
int sdt; //Số điện thoại
char hoten[25]; //Họ và tên
float sotien; //Số tiền phải nộp
} thuebao[100];

Hãy xây dựng một hàm để nhập số liệu cho n thuê bao. Sau đó viết một chương trình sử
dụng hàm nói trên để nhập số liệu và in bảng số tiền phải nộp của các thuê bao theo dạng ba
cột: Họ tên, số điện thoại, số tiền phải nộp.

Code:
#include<iostream.h>
#include<iomanip.h>
struct dienthoai{
      int            sdt;
      char           hoten[25];
      float          sotien;
} thuebao[100];

//Hàm nhập danh sách n thuê bao
void nhap(int n,dienthoai *a)
{
      for(int i=0;i<n;i++)
      {
              cout<<"\n Nguoi Thu "<<i;
              cout<<"\nSDT:"; cin>>a[i].sdt;
              cin.ignore(1); //Loai bo ky tu thua
              cout<<"\nHo ten"; cin.get(a[i].hoten,25);
              cin.ignore(1);
              cout<<"\nSo tien: "; cin>>a[i].sotien;
      }
}

//Hàm in danh sách các thuê bao theo dạng ba cột "Số điện thoại","Họ và
tên","Số tiền"
void inds(int n,dienthoai *a)
{

         cout<<setw(20)<<"Dien thoai";
         cout<<setw(20)<<"Ho ten";
         cout<<setw(20)<<"So tien"<<endl;
         for(int i=0;i<n;i++)
         {
                 cout<<setw(20)<<a[i].sdt;
                 cout<<setw(20)<<a[i].hoten;
                 cout<<setw(20)<<a[i].sotien<<endl;
         }
}
main()
{
         dienthoai a[100];
         int n;
         cout<<"So thue bao: "; cin>>n;
         nhap(n,a);
         inds(n,a);
}
tuananhk43
Bài 25. Cho cấu trúc:

Code:

struc dienthoai{
int sdt; //Số điện thoại
char hoten[25]; //Họ và tên
float sotien; //Số tiền phải nộp
} thuebao[100];

Hãy xây dựng một hàm để nhập số liệu cho n thuê bao. Sau đó viết một chương trình sử dụng
hàm nói trên để nhập số liệu và in bảng số tiền phải nộp của các thuê bao theo dạng ba cột:
Họ tên, số điện thoại, số tiền phải nộp.

Code:
 #include<iostream.h>
 #include<iomanip.h>
 struct dienthoai{
       int            sdt;
       char           hoten[25];
       float          sotien;
 } thuebao[100];

 //Hàm nhập danh sách n thuê bao
 void nhap(int n,dienthoai *a)
 {
       for(int i=0;i<n;i++)
       {
               cout<<"\n Nguoi Thu "<<i;
               cout<<"\nSDT:"; cin>>a[i].sdt;
               cin.ignore(1); //Loai bo ky tu thua
               cout<<"\nHo ten"; cin.get(a[i].hoten,25);
               cin.ignore(1);
               cout<<"\nSo tien: "; cin>>a[i].sotien;
       }
 }

 //Hàm in danh sách các thuê bao theo dạng ba cột "Số điện thoại","Họ và
 tên","Số tiền"
 void inds(int n,dienthoai *a)
 {

         cout<<setw(20)<<"Dien thoai";
         cout<<setw(20)<<"Ho ten";
         cout<<setw(20)<<"So tien"<<endl;
         for(int i=0;i<n;i++)
         {
                 cout<<setw(20)<<a[i].sdt;
                   cout<<setw(20)<<a[i].hoten;
                   cout<<setw(20)<<a[i].sotien<<endl;
          }
 }
 main()
 {
          dienthoai a[100];
          int n;
          cout<<"So thue bao: "; cin>>n;
          nhap(n,a);
          inds(n,a);
 }

Sửa lại chút
Code:
 #include<iostream.h>
 #include<iomanip.h>
 struct dienthoai{
       int            sdt;
       char           hoten[25];
       float          sotien;
 } thuebao[100];

 //Hàm nhập danh sách n thuê bao
 void nhap(int n,dienthoai *a)
 {
       for(int i=0;i<n;i++)
       {
               cout<<"\n Nguoi Thu "<<i+1;
               cout<<"\nSDT:"; cin>>a[i].sdt;
               cin.ignore(1); //Loai bo ky tu thua
               cout<<"\nHo ten"; cin.get(a[i].hoten,25);
               cin.ignore(1);
               cout<<"\nSo tien: "; cin>>a[i].sotien;
       }
 }

 //Hàm in danh sách các thuê bao theo dạng ba cột "Số điện thoại","Họ và
 tên","Số tiền"
 void inds(int n,dienthoai *a)
 {

          cout<<setw(20)<<"Dien thoai";
          cout<<setw(20)<<"Ho ten";
          cout<<setw(20)<<"So tien"<<endl;
          for(int i=0;i<n;i++)
          {
                  cout<<setw(20)<<a[i].sdt;
                  cout<<setw(20)<<a[i].hoten;
                  cout<<setw(20)<<a[i].sotien<<endl;
          }
 }
 main()
 {
          int n;
           cout<<"So thue bao: "; cin>>n;
           nhap(n,thuebao);
           inds(n,thuebao);
 }




Bài 1.

Viết hàm chèn phần tử có giá trị X vào phía sau tất cả các phần tử có giá trị chẵn trong mảng.
Viết hàm tìm phần tử là số nguyên tố trong tất cả các phần tử của mảng.

Bài 2.

Nhập vào một mảng số nguyên n phần tử từ bàn phím, in ra màn hình phần tử có số lần xuất
hiện nhiều lần nhất trong mản vừa nhập.


Bài 1
Câu a


Code:
 void      insertX(int* a, int* N, int X) {
 // a      là tên mảng, nó là con trỏ trỏ vào vị trí đầu tiên của mảng
 // N      là con trỏ, giá trị của nó là số phần tử của mảng, sau khi chèn
 // X      vào N sẽ tăng
         int i = 0, j;
         while (i < *N) {
              if (a[i] % 2 == 0) { // nếu a[i] chẵn
                  // dịch mảng sang phải
                  for (j = ++(*N); j >= i + 2; j--)
                      a[j] = a[j - 1];
                  // sau khi dịch mảng, chỗ hở ra dành cho X
                  a[i + 1] = X;
                  i += 2; // nhảy qua X
              }
              else i++;
         }
 }

Câu b

Code:
 void searchprimes(int* a, int N) {
 // hàm này sẽ kiểm tra lần lượt từng số của mảng xem có nguyên tố hay không
 // nếu có sẽ in ra chỉ số cùng với giá trị của nó
 // nếu không muốn in ra bạn có thể chỉnh sửa theo ý mình
     int i, x, y, t, ok;
     for (i = 0; i < N; i++) {
         if (a[i] < 2) continue;
         if (a[i] == 2 | a[i] == 3)
             printf("Phan tu thu %d bang %d la so nguyen to\n", i, a[i]);
         else if (a[i] % 2 > 0 & a[i] % 3 > 0) {
             x = 5; y = 2;
             t = (int)sqrt((double)a[i]);
             ok = 1;
             while (x <= t) {
                 if (a[i] % x == 0) {
                     ok = 0;
                     break;
                 }
                 x += y;
                 y = 6 - y;
             }
             if (ok) printf("Phan tu thu %d bang %d la so nguyen to\n", i,
 a[i]);
         }
     }
 }

Bài 2

Chú ý rằng nếu có nhiều phần tử có cùng số lần xuất hiện nhiều nhất thì ta in ra phần tử
đứng trước.

Code:
 #include <stdio.h>
 #include <conio.h>

 int a[100], mark[100], N, max, val;

 void readinput() {
     printf("Nhap N = ");
     scanf("%d", &N);
     for (int i = 0; i < N; i++) {
         printf("Nhap a[%d] = ", i);
         scanf("%d", &a[i]);
     }
 }

 void solve() {
     max = 0;
     int i, j, count;
     for (i = 0; i < N; i++) mark[i] = 1;
     for (i = 0; i < N - 1; i++)
         if (mark[i]) {
              count = 1;
              mark[i] = 0;
              for (j = i + 1; j < N; j++)
                  if (a[j] == a[i]) {
                         count++;
                         mark[j] = 0;
                   }
               if (count > max) {
                   max = count;
                   val = a[i];
               }
           }
 }

 void writeoutput() {
     printf("Phan tu xuat hien nhieu nhat la %d", val);
     printf("\nSo lan xuat hien la %d", max);
     getch();
 }

 void main() {
     clrscr();
     readinput();
     solve();
     writeoutput();
 }




Bài toán: liệt kê các số nguyên tố không bé hơn n theo thuật toán SÀNG SỐ NGUYÊN
TỐ

Phân tích: theo đúng tinh thần của thuật toán, ta sẽ dùng 1 mảng n phần tử, đầu tiên điền vào
phần tử thứ i giá trị 1 (tương đương giá trị ĐÚNG)
phần tử đầu tiên chưa xoá sẽ là snt, sau đok' xoá bội của nó

Code:
 #include <iostream.h>
 void main(){
   int i, n, s[100];
   cout<<"nhap n = "; cin>>n;
   for(i=2; i<=n; i++)s[i]=i; //điền lưới ban đầu
   for(i=2; i<=n; i++){
        if(s[i])cout<<s[i]<<' ';   //lấy phần tử đầu tiên chưa bị loại
        for(int k=i; k<=n; k+=i) s[k]=0; //sau khi lấy đc 1 phần tử i thì
 loại bỏ mọi bội của i
   }
 }
Viết chương trình nhập vào một xâu từ bàn phím:

   1. Viết hàm loại bỏ các khoảng trắng bên trái
   2. Viết hàm loại bỏ các khoảng trẳng bên phải
   3. Viết hàm loại bỏ khoảng trắng bên trái và bên phải

Code:
 #include<iostream.h>
 #include<stdio.h>
 #include<string.h>
 //Xoa khoang trang hai ben
 char *trim(const char *ss)
 {
       char *s=new char[strlen(ss)];

        strcpy(s,ss);
        int i=0;
        //Left Trim
        while(s[i]==' ') i++;
        for(int k=0;k<=strlen(s);k++)
        {
                s[k]=s[k+i];
        }
        //Right Trim
        i=strlen(s)-1;
        while(s[i]==' '&&i>0) i--;
        s[i+1]=0;

       return s;
 }
 //Xoa khoang trang ben phai
 char *rtrim(const char *ss)
 {
       char *s=new char[strlen(ss)];
       strcpy(s,ss);

        int i=strlen(s)-1;

        while(s[i]==' '&&i>0) i--;
        s[i+1]=0;
        return s;
 }
 //Xoa khoang trang ben trai
 char *ltrim(const char *ss)
 {
       char *s=new char[strlen(ss)];
       strcpy(s,ss);
       int i=0;
       while(s[i]==' ') i++;
       int length=strlen(s);
       for(int k=0;k<=length;k++)
               s[k]=s[k+i];
       return s;
 }
 //Xoa cac khoang trang thua trong xau
 char *ctrim(const char *ss)
 {
       char *s=new char[strlen(ss)];
       strcpy(s,ss);
       int i=0;
       while(i<strlen(s)-1)
       {
               if(s[i]==' ' && s[i+1]==' '){
                       int k=i;
                       do
                               s[k]=s[k+1];
                       while(s[++k]!=0);
               }else
                       i++;
       }
       return s;
 }
 void main()
 {
       char s[100];
       cout<<"Nhap xau";
       gets(s);
       cout<<"ALL_TRIM !"<<trim(s)<<"!"<<endl;
       cout<<"R_TRIM !"<<rtrim(s)<<"!"<<endl;
       cout<<"L_TRIM !"<<ltrim(s)<<"!"<<endl;
       cout<<"C_TRIM !"<<trim(ctrim(s))<<"!"<<endl;
 }




Một số bài tập về xử lý xâu ký tự


Ngó qua lý thuyết về xâu 1 tí nha:

1.Trong C++ không có kiểu dữ liệu cơ bản để lưu các xâu kí tự

2.Xâu là một mảng kí tự (mảng có kiểu char)
Ví dụ:
char str[20];
Biến str có thể lưu một xâu kí tự với độ dài cực đại là 20 kí tự
Chú ý: kiểu char chỉ lưu 1 kí tự đơn

3.Mảng kí tự có thể lưu các xâu kí tự dài không quá dài khai báo của nó
ví dụ: Str có thể lưu "Hello" hay “Thai Nguyen"

4.Các kí tự trong xâu có địa chỉ liền kề nhau trong bộ nhớ (tính chất của mảng)
5.C++ quy ước để kết thúc một nội dung của một xâu kí tự bằng một kí tự null(null là kí
tự có mã 0 trong bảng mã ASCII)

Khai báo biến xâu kí tự (giống như khai báo cho mảng)

1.
Code:
 char s[100]; //khai báo s không có khởi tạo

2.
Code:
 char str[20]={'h','a','n','o','i','\0'};

Xâu str có 20 phần tử, có 6 phần tử đầu được khởi tạo
'\0' là kí tự null, dùng kí tự đặc biệt \ kết hợp với 0 để biểu diễn

3. char st[]={‘S',‘V','\0'};
Xâu st có đúng 3 phần tử, và đã khởi tạo

4.Khai báo hợp lệ:
Code:
  char mystring [] = { 'H', 'e', 'l', 'l', 'o', '\0' };
  char mystring [] = "Hello";

Hai cách khai báo trên là tương đương

5. Các lệnh sau là không hợp lệ cho biến mảng mystring
Code:
 mystring = "Hello";
 mystring[] = "Hello";
 mystring = { 'H', 'e', 'l', 'l', 'o', '\0' };

6.Biến con trỏ kiểu char được hiểu như là biến xâu kí tự

6.1. Khai báo hợp lệ:
Code:
 char* mystring = { 'H', 'e', 'l', 'l', 'o', '\0' };
 char* mystring = "Hello";

Hai cách khai báo trên là tương đương

6.2. Con trỏ kiểu xâu được phép:
char *p;
p = "Hello Hanoi";


Thao tác với xâu kí tự
1.Gán giá trị cho xâu
ví dụ:
Code:
  mystring[0]    =   'H';
  mystring[1]    =   'e';
  mystring[2]    =   'l';
  mystring[3]    =   'l';
  mystring[4]    =   'o';
  mystring[5]    =   '\0';

rõ ràng cách này hợp lệ nhưng không khả thi

2.Gán giá trị cho xâu sử dụng hàm strcpy của thư viện string.h
Cú pháp:
nguyên mẫu của hàm: char *strcpy(char *dest, const char *src);
Tác dụng:
Copy xâu src (nguồn) sang dest (xâu đích)
Xâu src (nguồn) không bị biến đổi (const char *src)
Hàm này cũng trả về địa chỉ của đầu của dest
ví dụ:
Code:
 #include <iostream.h>
 #include <string.h>
 void main(){
       char myName [20];
       strcpy (myName, "Nguyen Van A");
       cout<<myName; //sẽ in ra: Nguyen Van A
 }

3. Nhập xâu kí tự từ bàn phím dùng lệnh cin.getline của thư viện iostream.h

Cú pháp:
Khai báo thư viện iostream.h
nguyên mẫu của hàm: istream& getline(char*str , int len, char d= '\n');
Tác dụng:
Gán chuỗi kí tự nhập từ bàn phím (với độ dài tối đa là len) vào biến xâu str
Chú ý: Không nên dùng cin>>str để nhập xâu
Ví dụ:
Code:
 #include <iostream.h>
 void main(){
       char s [100];
       cin.getline(s,100);
       cout<<s;
 }

4. Nhập xâu từ bàn phím dùng lệnh gets của thư viện stdio.h
Cú pháp:
Khai báo thư viện stdio.h
nguyên mẫu của hàm: char *gets(char *str);
Tác dụng:
Gán chuỗi kí tự nhập từ bàn phím vào biến xâu str, và trả về địa chỉ đầu của str
Ví dụ
Code:
 #include <iostream.h>
 #include <stdio.h>
 void main(){
       char str[100];
       gets(str);
       cout<<str;
 }

In xâu kí tự ra màn hình

Khi in biến xâu kí tự ra màn hình, ta phải truyền vào mảng kiểu char, hoặc con trỏ kiểu
char, C++ sẽ in liên tiếp các kí tự của xâu(từ địa chỉ nhận được) cho đến khi gặp kí tự
null
Ví dụ:
char s[100]="Nguyen Van A";
cout<<s; //lệnh này sẽ in ra Nguyen Van A chứ không in ra 100 ký tự
Chú ý: khi khởi tạo, thao tác về xâu phải có kí tự null đánh dấu kết thúc xâu




Bài tập đầu tiên: viết hàm trả về độ dài xâu

- Tên hàm là : ? là gì mà chả được, miễn là theo quy tắc đặt tên, vậy ta đặt là length
- Để trả về độ dài ->Kiểu trả về là? là kiểu số nguyên, ta chọn kiểu int
- Đối số (đầu vào của hàm) là? tất nhiên là kiểu mảng của kí tự hoặc là con trỏ kí tự

Phân tích: Dễ thấy chỉ số của vị trí kết thúc chính là độ dài của xâu
vậy ta cho biến chỉ số ban đầu nhận giá trị 0, trong khi mà chỉ số đó chưa phải là vị trí cuối
xâu thì ta tăng chỉ số và kiểm tra lại, cứ lặp như vậy biến chỉ số sẽ tiến đến vị trí cuối xâu,
khi đó dừng lại, và trả về cho hàm giá trị của biến chỉ số , giá trị đó cũng chính là độ dài xâu

Ta có code bằng C++ như sau:
Code:
 int length(char s[]){
   int d=0;
   while(s[d]!='\0')d++;
   return d;
 }

Hoặc
Code:
 int length(char *s){
   int d=0;
   while(s[d]!='\0')d++;
   return d;
 }

Ứng dụng hàm tính độ dài trên để giải bài toán:
Nhập vào xâu ký tự từ bàn phím, in ra màn hình độ dài của xâu đó?

code bằng C++ sẽ như sau
Code:
 #include <iostream.h>
 int length(char s[]){
   int d=0;
   while(s[d]!='\0')d++;
   return d;
 }
 void main(){
       char st[100];
       cout<<"Nhap xau: ";
       cin.getline(st,100);
       cout<<"Do dai xau: "<< length(st);
 }




Bài số 2: Viết chương trình đếm xem trong xâu có bao nhiêu kí tự 'a'

Phân tích: Bài này giải như bài về mảng, chúng ta coi như xâu là 1 mảng, chú ý giá trị null ở
cuối xâu. Ta duyệt mọi chỉ số từ đầu đến hết xâu, tại vị trí đang xét nếu kí tự tại vị trí đó có
giá trị bằng kí tự 'a' thì ta tăng biến đếm.

Vậy hàm đếm sẽ như sau:
Code:
 int dem_ki_tu(char *s){
   int dem=0;
   int do_dai=lenth(s); //sử dụng hàm length ở bài post trước, hoặc dùng hàm
 strlen của thư viện string.h
   for(int i=0; i < do_dai; i++)
     if(s[i]=='a')dem++;
   return dem;
 }

Hoặc không cần sử dụng hàm tính độ dài xâu:
Code:
 int dem_ki_tu(char *s){
   int i=0, dem=0;
   while(s[i]!='\0'){
     if(s[i]=='a')dem++;
     i++;
   }
   return dem;
 }

Dựa vào hàm trên ta có thể làm 1 hàm tổng quát để đếm kí tự bất kỳ như sau:
Code:
 int dem_ki_tu(char *s, char ki_tu_can_dem){
   int i=0, dem=0;
   while(s[i]!='\0'){
     if(s[i]== ki_tu_can_dem)dem++;
     i++;
   }
   return dem;
 }

Với hàm này khi cần đếm kí tự 'a' thì sẽ gọi hàm dem_ki_tu(s, 'a')

Sử dụng hàm này ta viết chương trình hoàn chỉnh như sau:
Code:
 #include <iostream.h>
 int dem_ki_tu(char *s, char ki_tu_can_dem){
   int i=0, dem=0;
   while(s[i]!='\0'){
     if(s[i]== ki_tu_can_dem)dem++;
     i++;
   }
   return dem;
 }
 void main(){
       char st[100];
       cout<<"Nhap xau: ";
       cin.getline(st, 100);
       cout<<"So luong ki tu 'a' trong xau = "<< dem_ki_tu(st, 'a');
 }




Bài số 3: Cắt các dấu cách thừa bên phải xâu
ví dụ xâu là " tra thai " sau khi cắt các dấu cách thừa bên phải sẽ là " tra thai"
Phân tích: Ta biết cuối mỗi xâu là kí tự null (kí tự có mã 0). nên nếu xâu có các dấu cách thừa
bên phải, ta làm sao để đặt kí tự null vào đúng chỗ là xong. Vậy cần tìm vị trí ngoài cùng
không phải là dấu cách, khi đó gán cho giá trị null cho phần tử tiếp theo là xong.

Ta viết hàm rtrim, sẽ thay đổi tham số truyền vào, làm cho nó mất đi các dấu cách thừa như
sau:
Code:
 int length(const char *s){
   int dem=0;
   while(s[dem]!='\0')dem++;
   return dem;
 }

 void rtrim(char *s){
   int i=length(s)-1;
   while(s[i]==' ') {i--;}
   s[i+1]=0;
 }

Hoặc tương đương (nhưng hàm rtrim gọn hơn 1 tý):
Code:
 int length(const char *s){
   int dem=0;
   while(s[dem]!='\0')dem++;
   return dem;
 }

 void rtrim(char *s){
   int i=length(s);
   while(s[--i]==' ');
   s[i+1]=0;
 }

Ứng dụng hàm trên ta viết chương trình hoàn chỉnh như sau:
Code:
 #include <iostream.h>
 int length(const char *s){
   int dem=0;
   while(s[d]!='\0')dem++;
   return dem;
 }

 void rtrim(char *s){
   int i=length(s);
   while(s[--i]==' ');
   s[i+1]=0;
 }

 void main(){
   char st[100];
   cout<<"Nhap xau: ";
   cin.getline(st, 100);
   cout<<"Ban đầu là:"<<st<<'!'<<endl; //in dấu ! vào cuối xâu để nhìn thấy
 các dấu cách thừa bên phải
   rtrim(st);
   cout<<"Sau RTRIM :"<<st<<'!'<<endl;
 }




Bài số 4: Viết hàm cắt các dấu cách thừa bên trái

Phân tích: Bỏ qua những dấu cách thừa bên trái, đẩy các phần tử phía sau lên đầu
Code:
 void ltrim(char *s){
   int i=0;
   while(s[i]==' ')i++;
   if(i>0)
        for(int k=0; t[i];)s[k++]=s[i++];
 }




Bài 5: Viết hàm loại bỏ những dấu cách thừa ở giữa xâu, làm cho các từ cách nhau đúng
1 ký tự
Phân tích: Ta duyệt từ đầu đến cuối xâu, nếu có 2 dấu cách đứng cạnh nhau thì ta dồn phía
sau lên 1 kí tự

code như sau, code này còn cắt cả dấu cách thừa bên trái và bên phải (nếu còn thì chỉ còn 1)
Code:
 void trim(char *s){
   for(int i=0; s[i]!='\0'; )
     if(s[i]==' ' && s[i+1]==' ')
       for(int k=i; s[k]!='\0'; k++) s[k] = s[k+1];
     else
       i++;
   if(s[i-1]==' ') //cắt đi kí tự trắng bên phải (nếu còn)
     s[i-1] = 0;
   if(s[0]==' ') //cắt đi kí tự trắng bên trái (nếu còn)
     for(i=0; s[i]!='\0'; i++) s[i] = s[i+1];
 }

Ứng dụng hàm trên viết chương trình hoàn chỉnh như sau:
Code:
 #include <iostream.h>
 void trim(char *s){
   for(int i=0; s[i]!='\0'; )
     if(s[i]==' ' && s[i+1]==' ')
       for(int k=i; s[k]!='\0'; k++) s[k] = s[k+1];
     else
       i++;
   if(s[i-1]==' ') //cắt đi kí tự trắng bên phải (nếu còn)
     s[i-1] = 0;
   if(s[0]==' ') //cắt đi kí tự trắng bên trái (nếu còn)
     for(i=0; s[i]!='\0'; i++) s[i] = s[i+1];
 }
 void main(){
   char s[80];
   cout<<"Moi ngai nhap xau ky tu: ";
   cin.getline(s,80);
   trim(s);
   cout<<s<<'!'; //in dấu chấm than ! ngay sau xâu s để nhìn thấy hàm cắt
 được cả dấu cách thừa bên phải
 }




Mai đi công tác play roài, hok còn thời gian post bài, nên đưa ra vài đầu bài, các bạn phân tích
và cùng thảo luận cách giải nhé, ai giải đúng khi về malyfo sẽ tuyên dương (và cho kẹo nữa,
hehe)

Bài 6: Viết hàm đếm số từ xuất hiện trong xâu. Ứng dụng hàm đó viết chương trình hoàn
chỉnh nhập xâu ký tự từ bàn phím, in ra màn hình số từ có trong xâu

Bài 7: Viết hàm đếm số từ bắt đầu bằng 'tr' có trong xâu. Ứng dụng hàm đó viết chương trình
hoàn chỉnh nhập xâu ký tự từ bàn phím, in ra màn hình số từ bắt đầu bằng 'tr' có trong xâu.

Bài 8: Viết hàm đếm số kết thúc bằng 'ng' có trong xâu. Ứng dụng hàm đó viết chương trình
hoàn chỉnh nhập xâu ký tự từ bàn phím, in ra màn hình số từ kết thúc bằng 'ng' có trong xâu.

Bài 9: Viết hàm in các từ trong xâu, mỗi từ trên 1 dòng. Ứng dụng hàm đó viết chương trình
hoàn chỉnh nhập xâu ký tự từ bàn phím, in ra màn hình các từ trong xâu, mỗi từ trên 1 dòng

Bài 10: Viết hàm kiểm tra xem 1 chuỗi có phải chứa toàn ký tự số hay không? Ứng dụng hàm
trên và hàm trong bài 9 viết chương trình hoàn chỉnh nhập xâu ký tự từ bàn phím để đếm xem
trong xâu có bao nhiêu từ toàn là số?

Bài 11: Viết hàm kiểm tra xem 1 chuỗi có phải chứa toàn ký tự số hay không? Nếu toàn là số
thì tính giá trị của số tương ứng với chuỗi đó? Ứng dụng hàm trên và hàm trong bài 9 viết
chương trình hoàn chỉnh nhập xâu ký tự từ bàn phím để tính tổng các từ là số trong xâu?

Bài 12: chưa nghĩ ra, hehe, thế cái đã, các bạn thử sức nhé, quan trọng là chỗ phân tích để
người khác hiểu. hì, nếu các bài trên có ai không hiểu thì cho ý kiến nhé

								
To top