Viết một hàm tính tổng các chữ số của một số nguyên...7 8.. Viết một hàm đảo ngược thứ tự các phần tử của một mảng số nguyên...17 3.. Viết một hàm tính tổng các chữ số của một số nguyên.
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP TP.HỒ CHÍ MINH
Khoa Khoa Học & Kỹ Thuật Máy Tính
LAB REPORT
C & Data Structures
Nhóm: 5 Lớp: CDTH11K GVHD:Châu Thị Bảo Hà
TP.Biên Hòa 11/2010
Trang 2Mục Lục
Module 1: 2
1 Viết hàm tính tổng S=1+1/2+1/3…+ 1/N 2
2 Nhập 2 số a và n Tính S =a^1 + a^2 + a^3 + …+ a^n 3
3 Viết chương trình tính tổng sau: S= 1 + 1/1! +1/2! + 1/3! + … + 1/n! 4
6 Viết chương trình tính tổng sau: S= 1 - x + x^2 - x^3 + … (-1)x^n 6
7 Viết một hàm tính tổng các chữ số của một số nguyên 7
8 Bài toán tính tiền lãi gửi ngân hàng 8
9 Trở lại bài toán tính tiền gửi ngân hàng 9
Module 2: 11
1 Nhập 2 số n và k nguyên Tính tổ hợp chập k của n 11
2 Tìm các số Fibonaci 12
4 Viết hàm nhập số giây và đổi thành giờ : phút : giây 13
5 Viết hàm kiểm tra 1 số có phải là số nguyên tố hay không 14
6 Tìm số n bé nhất thoã s =1 + 2 + 3 +… + n >10000 16
Module 3: 17
2 Viết một hàm đảo ngược thứ tự các phần tử của một mảng số nguyên 17
3 Viết chương trình nhập vào một mảng số tự nhiên Hãy xuất ra màn hình: 19
4 Viết chương trình nhập vào một mảng, hãy xuất ra màn hình: 21
Module 4: 26
1 Tổ chức và xây dựng 2 hàm : GiảiPT_bac1 và GiảiPT_bac2 26
2 Tổ chức hàm với các tham số hợp lý dùng để tính: 27
3 Viết chương trình tính lương cho các công nhân tại xưởng may 30
4 Viết chương trình xây dựng và quản lý danh sách liên kết đơn 32
Module 5 38
2 Viết chương trình xây dựng và quản lý danh sách liên kết đôi 38
Module 6 47
2 Viết chương trình xây dựng và quản lý danh sách liên kết đôi 48
Module 7 58
1 Sử dụng danh sách liên kết đơn tạo stack 58
2 Sử dụng danh sách liên kết đôi để quản lý khách hàng cho một nhà ga 62
Module 8 70
1 Viết chương trình xây dựng và quản lý cây nhị phân tìm kiếm 70
2 Sử dụng bài tập ở câu trên tiếp tục phát triển rộng các menu như sau 74
3 Viết chương trình xây dựng và quản lý danh sách sinh viên 82
Module 9 87
1 Viết chương trình xây dựng và quản lý cây nhị phân tìm kiếm 87
2 Sử dụng bài tập ở câu trên tiếp tục phát triển rộng các menu như sau 92
Trang 3Ý tưởng: Dùng vòng lặp for để chạy i từ 1 đến N, trong for dùng biến sum để tính tổng của
thương 1/i, mỗi lần tăng biến sum sẽ cộng dồn giá trị 1/i, rồi trả về giá trị sum
}
Kết quả:
Trang 42 Nhập 2 số a và n Tính S =a^1 + a^2 + a^3 + …+ a^n.
Nhập: a, n;
Xuất: S(Tổng);
Ý tưởng: Dùng vòng lặp for để chạy i từ 1 đến N, trong for dùng biến sum để tính tổng
của a mũ i, mỗi lần vòng lặp lặp lại thì biến sum sẽ cộng dồn giá trị a mũ i, dùng hàm
}
Kết quả:
Trang 53 Viết chương trình tính tổng sau: S= 1 + 1/1! +1/2! + 1/3! + … + 1/n!.
giaithua() thì thì ta dùng vỏng lặp i chạy từ 1 -> n để nhân dồn giá trị vào 1 biến t.
Rồi trong hàm tinhtong() ta gọi hàm giaithua() để tính đươc già trị 1/i!.
}
Trang 6float ham1(int x,int n)
Trang 77 Viết một hàm tính tổng các chữ số của một số nguyên Viết chương trình
nhập vào một số nguyên, dùng hàm trên kiểm tra xem số đó có chia hết cho
3 không (Một số chia hết cho 3 khi tổng các chữ số của nó chia hết cho 3).
Nhập: 1 số nguyên n;
Xuất: Số nguyên nhập vào có chia hết cho 3 hay không?
Kiểm tra tính chia hết cho 3.
Trang 8cout<<n<<" chia het cho 3"<<endl;
8 Bài toán tính tiền lãi gửi ngân hàng: Nhập tiền vốn ban đầu, số tháng
gửi N và lãi suất hàng tháng Tính số tiền nhận được sau mỗi tháng gửi biết rằng tiền lãi hàng tháng được gộp vào tiền vốn Số tiền nhận được sau mỗi tháng sẽ hiển thị trên màn hình dạng:
Tháng 1: 100 Tháng 2: 102
…
Ví dụ: tiền vốn là 100, lãi suất thán là 2% Sau 1 tháng gửi sẽ có số tiền là:
Số tiền =100 + 100*0.02 = 102 Sau 2 tháng gửi sẽ có số tiền là: Số tiền=102 + 102*0.02 = 104.04 Công thức tính tiền thu được sau mỗi tháng gửi là:
Số tiền := Tiền vốn + Tiền vốn * Lãi suất
Số tiền này trở thành tiền vốn của tháng sau, tức là Tiền vốn = Số tiền Qúa trình cứ lặp đi lặp lại từ tháng 1 đến tháng N.
Nhập: Tiền vốn, lãi suất, số tháng gửi.
Xuất: tổng số tiền.
Ý tưởng:
Dùng vòng lặp for để tính tổng tiền với công thức trong for là
Trang 9Số tiền = Tiền vốn + Tiền vốn * Lãi suất
Kết quả:
9 Trở lại bài toán tính tiền gửi ngân hàng có tiền lãi hàng tháng gộp vào
vốn (bài tập trên) Câu hỏi bây giờ là: cần gửi tối thiểu là bao nhiêu tháng để có được số tiền > S cho trước.
Trang 10Nhập: Tiền vốn, lãi suất, tổng số tiền S.
Xuất: Tổng số tháng gửi cần thiết để tiền vốn> S
Kiểm tra khi tổng số tiền > số tiền nhập vào thì xuất i(tháng) ra.
Ý tưởng:
Làm như bài 8, trong for thì không có điều kiện dừng vòng lặp, vòng lặp chỉ dừng khi sum>S, thêm vào if, nếu tổng số tiền sum tăng lên lớn hơn S cho trước thì xuất tháng i ra.
double cau9(float tv, float ls,double s)
return i;
}}
return i;
Trang 11}}
Trang 122 Tìm các số Fibonaci Dãy số Fibonaci { 1, 1, 2, 3, 5, 8, 13, 21,… } được
là dãy được nhắc nhiều trong khối kỹ thuật, nó được xây dựng như sau: U0=1, U1=1 , Uk=Uk-1 + Uk-2 với mọi k= 2, 3, 4,
a Viết chương trình xuất ra màn hình số Fibonaci ở vị trí thứ n (sử dụng đệ quy)
b Viết chương trình xuất ra màn hình số Fibonaci ở vị trí thứ n (KHÔNG sử dụng đệ quy)
c Viết chương trình nhập số nguyên n và xuất ra n số Fibonaci đầu tiên
Trang 133 a Nhập 2 số nguyên dương m và n Tính Ước số chung nhỏ nhất và
bội số chung lớn nhất của m và n (sử dụng đệ quy)
b Nhập 2 số nguyên dương m và n Tính Ước số chung nhỏ nhất và bội số chung lớn nhất của m và n (không sử dụng đệ quy)
4 Viết hàm nhập số giây và đổi thành giờ : phút : giây.
Ví dụ: nhập 3665 giây -> 1 giờ 1 phút 5 giây
Nhập: n (giây).
Xuất dạng giờ: phút: giây.
Ý tưởng :
Dùng hàm gọi đệ quy và cấu trúc if /else để đổi giây thành giờ, phút và giây.
Nếu số giây (n)<60 thì gán giây = n, ngược lại nếu số giây n/3600 mà lớn hơn 0 thì gán kết quả n/3600 vào giờ, sau đó gọi đệ quy hàm doigio() với tham số n%3600 là
số giây dư của phép chia
Trang 14void doigio(int n, int &g,int &p, int &gi);
Trang 15cout<<"KHONG PHAI SO NGUYEN TO"<<endl;
}cout<<"Day so nguyen to la: ";xuatsntb(n);
}if(sum==2)
Trang 16cout<<i<<" ";
dem++;
}if(dem==19)
{cout<<endl;
dem=0;
}}
cout<<i<<" ";
dem++;
}if(dem==n){
6 Tìm số n bé nhất thoã s =1 + 2 + 3 +… + n >10000 vã hãy cho biết khi đó
s có giá trị là bao nhiêu ?
Kiểm tra n bé nhất thỏa s =1 + 2 + 3 +… + n >10000 và tính s=?
Xuất n là số bé nhất thỏa điều kiện trên, và xuất s tổng.
Trang 17cout<<"n = "<<i<<endl;
cout<<"S = "<<sum;
break;
}}
1 VCT nhập vào 2 phân số a/b và c/d Hãy tính tổng của phân số này, yêu
cầu là phân số kết quả phải ở dạng tối giản ví dụ :1/6+1/3=1/2.
2 Viết một hàm đảo ngược thứ tự các phần tử của một mảng số nguyên.
Ví dụ: mảng nhập vào 1 2 3 4 5 7 9 10
Sau khi đảo mảng thành 10 9 7 5 4 3 2 1
Nhập vào 1 mảng số nguyên a[];
Xuất mảng đả đảo ngược;
Ý tưởng:
Khi đảo mảng ta dùng 2 vòng lặp for(), vòng for thứ nhất thì chạy từ vị trí i=0 đến n,
để đảo vị trí 2 số cho nhau ta sử dụng giải thuật:
a[i]=a[i]+a[j];
a[j]=a[i]-a[j];
Trang 18Chương trình:
#include <iostream.h>
#include <math.h>
void nhapmang(int a[],int m);
void xuatmang(int a[],int m);
void daonguocmang(int a[],int m);
}
Kết quả:
Trang 193 Viết chương trình nhập vào một mảng số tự nhiên Hãy xuất ra màn
void nhapmang(int a[],int m);
void sole(int a[],int m);
void sochan(int a[],int m);
void songuyento(int a[],int m);
void ktsonguyento(int a[],int m);
Trang 20void sole(int a[],int m)
dem++;
cout<<a[i]<<" ";
}cout<<" - So luong so le la: "<<dem<<endl;}
void sochan(int a[],int m)
{
int dem=0;
cout<<"Cac so chan la: ";
for (int i=0;i<m;i++)
if (a[i]%2==0){
dem++;
cout<<a[i]<<" ";
}cout<<" - So luong so chan la: "<<dem<<endl;}
void songuyento(int a[],int m)
}
}
Kết quả:
Trang 214 Viết chương trình nhập vào một mảng, hãy xuất ra màn hình:
- Phần tử lớn nhất của mảng.
- Phần tử nhỏ nhất của mảng.
- Tính tổng của các phần tử trong mảng
- Tính trung bình cộng
- Tính tổng của các phần tử là số nguyên tố trong mảng
- Tính số lượng phần tử là số nguyên tố trong mảng
- Kiểm tra tính đối xứng cũa mảng
- Tìm phân tử là số nguyên tố đầu tiên trong mảng
- Tìm 2 phân tử là 2 số nguyên tố đầu tiên trong mảng
Tính trung bình cộng lấy tổng các phần tử chia cho số lượng phần tử nhập vào Tổng và số lượng cac phần tử là số nguyên tố trong mảng dùng hai vòng lặp for để tính nếu a[i]%2=0 thì tăng đếm lên nếu đếm =2 th2 cộng dồn a[i].
Xuất số lẻ dùng vòng lặp for nếu a[i]%2!=0 thì cộng dồn [i] tăng biến đếm lên Xuất số chẵn dùng vòng lặp for nếu a[i]%2==0 thì cộng dồn [i] tăng biến đếm lên Xuất số nguyên tố đầu tiên và hai số nguyên tố đầu tiên.
Hàm trên có thể được viết như sau:
Chương trình:
void nhapmang(int a[],int m);
void maxmin(int a[],int m);
void tongcacphantu(int a[],int m);
void trungbinhcong(int a[],int m);
Trang 22void tongcacsonguyento(int a[],int m);
void soamlonnhat(int a[],int m);
void soduongnhonhat(int a[],int m);
void tongsocannguyen(int a[],int m);
void sole(int a[],int m);
void sochan(int a[],int m);
void ktdoixung(int a[],int m);
void songuyentodautien(int a[],int m);
void haisntdautien(int a[],int m);
void maxmin(int a[],int m)
cout<<"Phan tu lon nhat cua mang = "<<max<<endl;
cout<<"Phan tu nho nhat cua mang = "<<min<<endl;
sum+=a[i];
t++;
}}
cout<<"\nTong cac phan tu la so nguyen to = "<<sum;cout<<"\nSo luong phan tu la so nguyen to = "<<t<<endl;
Trang 23void soamlonnhat(int a[],int m)
{
int min, flag=0, maxam;
for (int i=0;i<m;i++)
{
if (a[i]<0){
int flag=0, minduong;
for (int i=0;i<m;i++)
{
if (a[i]>0){
Trang 24cout<<"Tong phan tu co can ban hai nguyen la "<<tong<<endl;}
void sole(int a[],int m)
dem++;
cout<<a[i]<<" ";
}cout<<"\nSo luong so le la "<<dem<<endl;
dem++;
cout<<a[i]<<" ";
}cout<<" - So luong so chan : "<<dem<<endl;
flag=0;
i=m;
}j ;
cout<<"Phan tu la so nguyen to dau tien : ";
for (int i=0;i<m;i++)
{
int dem=0;
for (int j=1;j<=a[i];j++){
Trang 25if (a[i]%j==0)
dem++;
}
if (dem==2){
kt++;
cout<<a[i]<<" ";
i=m;
}}
Trang 26PT bậc 1: nếu a=0 thì pt vô nghiệm, nếu a,b=0 thì pt vô số nghiệm.
Nếu a=0 thì giải phương trình bậc 2 như giải pt bậc 1 Ngược lại thì tính delta Delta=b2 – 4ac Nếu delta=0 thì pt có 1 nghiệm kép x1, delta<0 thì pt vô nghiệm, ngược lại thì có 2 nghiệm x1,x2.
Chương trình :
#include <iostream.h>
#include <math.h>
void GiaiPT_bac1(float a, float b);
void GiaiPT_bac2(float a1, float b1, float c1);
Trang 27cout<<"Phuong trinh co 2 nghiem: x1= "<<x1;
cout<<" || x2= "<<x2;
}}
dài-• Một hàm dùng để tính MAXMIN của 2 số integer.
• Một hàm dùng để tính bội số chung nhỏ nhất – USC lớn nhất của 2 số nguyên dương.
Nhập bán kính, chiều dài, rộng của hcn, 2 số a,b;
Xuất Chu vi, diện tích của hình tròn và hcn Tìm max và min cùa 2 số a, b.
Ý tưởng:
Hàm tìm ước chung lớn nhất dùng đệ quy giải Nhập 2 giá trị c, d, nếu c<d thì gọi lại hàm đó với tham số đảo ngược d,c Đặt 1 biến x = c%d; nếu x=0 nghĩ trả lại d, không thì gọi lại hàm đó với 2 tham số là d và x.
Hàm tìm bội chung nhỏ nhất thì ta có 3 trường hợp: thứ nhất là c chia hết cho d thì c
là bcnn ngược lại là trường hợp thứ hai thì d là bcnn, thứ ba thì cho vòng lặp chạy
từ i=c đến i<=c*d nếu i chia hết cho c và cho d thì xuất i ra thoát vòng lặp.
Trang 28float cv, dt;
cv=2*3.14*r;
dt=3.14*r*r;
cout<<"Chu vi hinh tron: "<<cv<<endl;
cout<<"Dien tich hinh tron: "<<dt;
Trang 29cout<<"\t\t\t|.2.CHU VI DIEN TICH HCN TU CD, CR |\n";cout<<"\t\t\t|.3.TIM MAX MIN CUA 2 SO INTERGER |\n";cout<<"\t\t\t|.4.BCNN & UCLN CUA 2 SO NGUYEN DUONG|\n";cout<<"\t\t\t~~~~~~~~~~~~~NGO~QUOC~HUNG~~~~~~~~~~~\n";
Trang 30Kết quả:
3 Viết chương trình tính lương cho các công nhân tại xưởng may Mỗi
công nhân sẽ có giờ vào và giờ ra trong một ngày Tiền lương được tính như sau:
Nhập giờ vào, giờ ra.
Xuất ra lương tính theo giờ.
Ý tưởng :
Nếu giờ vào <= 24 thì xét tiếp điều kiện nếu giờ vào > =17 thì lương=(giờ ra – giờ vào)* 40000 Ngược lại thì lương =(giờ ra – 17) * 40 và gán lại số giờ ra dư ra, và còn lại sau khi nhân với 40 Lấy chính số dư đó làm giờ ra, tiếp tục xét tiếp những điều kiện còn lại.
if(giovao>=17)
sum+=(giora-giovao)*40;
else{
sum+=(giora-17)*40;
giora=giora-(giora-17);
Trang 31if(giora<18){
if(giovao>=14)
sum+=(giora-giovao)*22;
else{
sum+=(giora-14)*22;
giora=giora-(giora-14);
}}
if(giora<15){
if(giovao>=11)
sum+=(giora-giovao)*30;
else{
sum+=(giora-11)*30;
giora=giora-(giora-11);
}}
if(giora<12){
if(giovao>=8)
sum+=(giora-giovao)*15;
else{
sum+=(giora-8)*15;
giora=giora-(giora-8);
}}
if(giora<9){
if(giovao>=5)
sum+=(giora-giovao)*20;
else{
sum+=(giora-5)*20;
giora=giora-(giora-5);
}}
cout<<"TONG TIEN LUONG: "<<sum;
}
void main()
{
float giovao, giora;
cout<<"NHAP GIO VAO: ";
Trang 32cout<<"NHAP SAI DU LIEU";
}
Kết quả :
4 Viết chương trình xây dựng và quản lý danh sách liên kết đơn Thành
phần quản lý gồm con trỏ pHead và pTail (đầu và cuối xâu) Hiển thị menu thực hiện các chức năng sau (mỗi chức năng thực hiện bằng hàm) Thành phần dữ liệu trong mỗi Node là giá trị kiểu integer.
• Thêm một node vào đầu danh sách
• Thêm một node vào cuối danh sách
• Thêm nhiều node vào đầu danh sách
• Thêm nhiều node vào cuối danh sách
• Hiển thị giá trị node thứ n
• Tìm một node dựa theo giá trị nhập vào
• Thêm một node vào sau một node nào đó (nhập giá trị để tìm)
• Đếm số lượng node trong xâu
• Hiển thị danh sách các node trong xâu
• Hủy một node (nhập giá trị cần tìm)
• Hủy tòan bộ danh sách
• Tính tổng giá trị tòan bộ danh sách
• Tìm giá trị lớn nhất và nhỏ nhất trong danh sách
• Sắp xếp danh sách với giá trị tăng dần (tự chọn thuật tóan)
Nhập danh sách liên kết đon l.
Thực hiện yêu cầu đề.
Ý tưởng :
Khai báo cấu trúc 1 DSLK đơn chứa số nguyên
// kiểu của một phần tử trong danh sách
//khởi tạo danh sách rỗng
void Init(List &l)
Trang 33// -prototype -void init(list &l);
void output(list l);
void outputsearch(list l, int n);
void addhead(list &l, node* p);
void addtail(list &l, node* p);
void searchfixed (list l, int x);
node* search (list l, int x);
void addafter (list &l, node *q, node* new_node);
int demnode(list l);
void removelist(list &l);
void sum(list l);
int removehead(list &l);
int removeafter(list &l, node *q);
int removenode(list &l, int k);
Trang 34node *n=search(ds,k);
if(n!=NULL){
cout<<"Nhap gia tri cho node moi: ";cin>>k2;
node* nm=getnode(k2);
if(nm!=NULL)
addafter(ds,n,nm);
}}
cout<<p->data<<"\t";
flag=1;
break;
Trang 35cout<<i<<"\t";
flag=1;
Trang 36}p=p->pnext;
Trang 37int removehead(list &l)
Trang 381 Viết chương trình xây dựng và quản lý danh sách liên kết vòng đơn
Thành phần quản lý gồm con trỏ pHead Hiển thị menu thực hiện các chức năng sau (mỗi chức năng thực hiện bằng hàm) Thành phần dữ liệu trong mỗi Node là giá trị kiểu integer.
• Hiển thị toàn bộ danh sách.
• Thêm một node vào danh sách.
• Tìm một node trong danh sách (giá trị nhập vào).
• Hiển thị các node là số nguyên tố.
• Hủy một node trong danh sách (giá trị nhập vào đầu tiên tìm thấy).
• Hủy tất cả các node là số nguyên tố.
• Tăng giá trị mỗi node lên 2.
• Tính tổng giá trị tòan bộ danh sách.
• Tìm giá trị lớn nhất và nhỏ nhất trong danh sách.
• Sắp xếp danh sách tăng dần.
• Hủy tòan bộ danh sách.
2 Viết chương trình xây dựng và quản lý danh sách liên kết đôi Thành phần
quản lý gồm con trỏ pHead và pTail Hiển thị menu thực hiện các chức
Trang 39năng sau (mỗi chức năng thực hiện bằng hàm) Thành phần dữ liệu trong mỗi Node là giá trị kiểu integer.
•Hiển thị giá trị toàn bộ danh sách theo thứ tự từ đầu đến cuối
•Hiển thị giá trị toàn bộ danh sách theo thứ tự từ cuối đến đầu
•Thêm một node vào đầu danh sách
•Thêm một node vào cuối danh sách
•Thêm một node vào sau một phần tử (giá trị nhập vào)
•Tìm một node trong danh sách.
•Đếm số lần xuất hiện của một node trong danh sách
•Hủy phần tử đầu danh sách
•Hủy phần tử cuối danh sách
•Hủy phần tử trong danh sách (giá trị nhập vào)
•Hiển thị các node là số nguyên tố
•Hủy một node trong danh sách (giá trị nhập vào đầu tiên tìm thấy)
•Hủy tất cả các node là số nguyên tố
•Tăng giá trị mỗi node lên 2
•Tính tổng giá trị tòan bộ danh sách
•Tìm giá trị lớn nhất và nhỏ nhất trong danh sách
•Sắp xếp danh sách tăng dần
•Hủy tòan bộ danh sách
Nhập danh sách liên kết đôi với 2 con trỏ phead và ptail.
Thực hiện yêu cầu đề.
Trang 40case 1:
{
outputdaucuoi(ds);break;
}case 2:
{
outputcuoidau(ds);break;
}case 3:
cout<<"Nhap gia tri cho node moi: ";cin>>k2;
dnode* nm=getnode(k2);
if(nm!=NULL)
addafter(ds,n,nm);
}