TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
·····
·
BÀI TẬP LỚN
MƠN HỌC:KỸ THUẬT LẬP TRÌNH
Giáo viên hướng dẫn : Ngơ Thị Thanh Hịa
NHĨM
: 15
Thành viên trong nhóm :
Lớp
: KTPM1-K13
HÀ NỘI-2019
CÂU 1: Có 4 loại giấy bạc 1000đ, 2000đ, 5000đ,10000đ. Viết chương trình in các
phương án kết hợp các loại giấy bạc trên cho ra 50000đ.
Ý tưởng:
- Kết hợp các loại giấy bạc sao cho mỗi loại phải xuất hiện ít nhất là 1 lần.
Cách làm:
- Kết hợp các loại giấy bạc � giấy bạc nào cũng phải xuất hiện ít nhất là 1 lần.
- Coi 4 tờ giấy bạc 10000đ, 5000đ, 2000đ, 1000đ lần lượt là a, b, c, d.
- Tính số lượng mà cần dùng của các loại tờ giấy bạc (ví dụ như tờ giấy bạc
10000đ cần dùng bao nhiêu tờ là nhiều nhất để ghép cùng với các loại tờ giấy bạc
khác cho ra 50000đ):
Cách tính:
- Tổng số tiền không dùng đến tờ giấy bạc 10000đ mà các loại tờ giấy bạc khác chỉ
xuất hiện đúng 1 lần là: 50000đ-1000đ-2000đ-5000đ=42000đ
Số lần xuất hiện tối đa của tờ giấy bạc 10000đ:
42000đ/10000đ=4,2
� Tờ giấy bạc 10000đ chỉ được xuất hiện tối đa là 4 lần.
- Tương tự tính với các loại tờ giấy bạc 5000đ, 2000đ, 1000đ số lần xuất hiện tối
đa lần lượt là: 7, 17, 33.
- Từ đó cho vịng for chạy lồng nhau bắt đầu từ tờ tiền 10000đ cho đến tờ tiền
1000đ và một câu lệnh if với số lượng nhân số giá trị của các loại tờ giấ bạc để cho
ra 50000đ. Từ đó cout ra số lượng mỗi tờ tiền.
Bài làm:
#include<iostream>
#include<conio.h>
using namespace std;
int main()
{
int a,b,c,d;
for (a=1; a<=4; a++)
for (b=1; b<=7; b++)
for (c=1; c<=17; c++)
for (d=1; d<=33; d++)
if ((d*1000+c*2000+b*5000+a*10000)==50000)
{
cout<<"\nCan so tien 1000d la: "<
cout<<"\nCan so tien 2000d la: "<
cout<<"\nCan so tien 5000d la: "<
cout<<"\nCan so tien 10000d la: "<
}
return 0;
}
CÂU 2: Viết hàm in ra phần tử thứ n của dãy Fn sau:
F1 = 1,F2 = 2
Fn = 5Fn+1 + 3Fn+2 (n>3)
Cách làm :
-Viết hàm nhập phần tử
- Xét điều kiện của hàm
+ Nếu n =1 thì trả về giá trị 1
+ Nếu n=2 thì trả về giá trị 2
+ Nếu n>3 tính giá trị biểu thức f(n)
- xét vịng lặp : sử dụng cơng thức tính giá trị f(n)
-In ra giá trị đã tính tốn của hàm lên màn hình
Bài Làm:
#include<iostream>
using namespace std;
void Nhap(int &n);
void Tinh(int n, float *a);
main()
{
int n;
float *a;
Nhap(n);
a = new float[n];
Tinh(n, a);
delete(a);
}
void Nhap(int &n)
{
cout<<"Nhap n: ";
cin>>n;
}
void Tinh(int n, float *a)
{
*(a+0) = 1;
*(a+1) = 2;
for(int i = 2; i <= n; i++)
{
*(a+i) = (float)(*(a+i-2) - 5*(*(a+i-1)))/3.0;
//cout<<"F"<
}
cout<<"F"<
}
CÂU 3: Viết chương trình có dùng hàm giải hệ phương trình bậc nhất sau:
Ý tưởng:
- Sử dụng phương pháp giải hệ phương trình Cramer đã học ở trong mơn Đại số
tyến tính để giải bài tốn.
Cách làm:
- Ta sẽ sử dụng phương pháp Cramer để giải hệ phương trình này:
- Phương pháp:
Tính các định thức:
D=
= a1b2-a2b1
Dx=
= c1b2-c2b1
Dy=
= a1c2-a2c1
Công thức Cramer:
x=
; y=
- Từ các công thức Cramer trên ta chỉ cần tính các định thức D, Dx, Dy:
Nếu định thức D=0 thì phương trình vơ nghiệm hoặc vơ số nghiệm. Nếu Dx=Dy=0
thì phương trình có vơ số nghiệm, ngược lại thì phương trình vơ nghiệm.
Nếu định thức D khác 0 thì hệ phương trình trên ln có nghiệm duy nhất
với x=
; y=
Bài làm:
#include<iostream>
#include<conio.h>
using namespace std;
int main()
{
float a1, b1, c1, a2, b2, c2, D, Dx, Dy, x, y;
cout<<"a1*x + b1*y = c1";
cout<<"\na2*x + b2*y = c2";
cout<<"\nNhap a1= ";
cin>>a1;
cout<<"\nNhap b1= ";
cin>>b1;
cout<<"\nNhap c1= ";
cin>>c1;
cout<<"\nNhap a2= ";
cin>>a2;
cout<<"\nNhap b2= ";
cin>>b2;
cout<<"\nNhap c2= ";
cin>>c2;
D= a1*b2-a2*b1;
Dx= c1*b2-c2*b1;
Dy= a1*c2-a2*c1;
if (D==0)
{
if (Dx+Dy==0)
cout<<"\nHe phuong trinh co vo so nghiem";
else
cout<<"\nHe phuong trinh vo nghiem";
}
else
{
x=Dx/D;
y=Dy/D;
cout<<"\nHe phuong trinh co nghiem la ";
cout<<"\nx= "<
cout<<"\ny= "<
}
return 0;
}
CÂU 4: Viết chương trình tính sin(x) với độ chính xác 0.0001 theo công thức:
sin(x) = x – x^3/3! + x^5/5! – …+(-1)^n.x^(2n+1)/(2n+1)!
Cách Làm:
-Xét giá trị của n :
+ Nếu n chẵn trả về giá trị 1
+ Nếu n lẻ trả về giá trị -1
- Xét vịng lặp tính giá trị mẫu
- Tính giá trị của tử, thực hiện tính biểu thức
+ Nếu giá trị khoảng 0.0001 thì in ra giá trị tính tốn của hàm lên màn hình
+ Nếu giá trị lớn hơn 0.0001 thì thực hiện lại vịng lặp
Bài làm:
#include <iostream>
#include<math.h>
using namespace std;
float F(float x,int n) {
int a;
if (n % 2 == 0)
a = 1;
else
a = -1;
float temp = 1;
for (int i = 1; i <= 2 * n + 1; i++)
temp = temp * x / i;
return a * temp;
}
int main()
{
float x, sin =0;
cout << "Nhap gia tri sin can tinh(radian): ";
cin >> x;
int n = 0;
while (abs(F(x, n)) > 0.00001) {
sin += F(x, n);
n++;
}
cout << "Gia tri can tinh: " << sin << endl;
return 0;
}
CÂU 5: Viết chương trình kiểm tra một số ngun dương có phải là số chính
phương hay khơng. Xuất tất cả các số chính phương trong khoảng A, B.
Cách làm:
- Số chính phương là bình phương đúng của một số ngun hay cịn là một số tự
nhiên có căn bậc hai cũng là một số tự nhiên.
- Để kiểm tra xem trong khoảng [a,b] có bao nhiêu số chính phương thì chúng ta sẽ
kiểm tra một dãy số nguyên từ a đến b sẽ có bao nhiêu số là số chính phương
- đầu tiên cho một vong for với biến i chạy từ a đến b, và trong vòng for gán một
biến k=0, đồng thời cho 1 vòng for chạy từ giá trị chạy từ 2 đến căn bậc hai của b
(không xét đến giá trị 1 bởi vì 1*1=1 nên khơng cần xét đến). Nếu giá trị j*j=i thì
k=1. Nếu k=1 thì cout ln ra biến i đó chính là phần tử nằm trong khoảng [a,b].
Bài làm:
#include<iostream>
#include<conio.h>
#include<math.h>
using namespace std;
int main()
{
int a,b;
cout<<"Nhap a= ";
cin>>a;
cout<<"\nNhap b= ";
cin>>b;
cout<<"\nCac so chinh phuong trong khoang [a,b] la: ";
for (int i=a; i<=b; i++)
{
int k=0;
for (int j=2; j<=sqrt(b); j++)
if (j*j == i) k=1;
if (k==1)
{
cout<
}
}
}
CÂU 6: Viết chương trình sử dụng hàm đệ quy. Hãy đếm số lượng chữ số lẻ của số
nguyên dương n.
Cách làm:
- Kiểm tra điều kiện của số nguyên dương n đã nhập:
+ Nếu n<0, yêu cầu nhập lại.
+ Nếu n=0, trả về giá trị 0.
+ Xét điều kiện của n, nếu n chia cho 2 dư 1, trả về giá trị 1 và cộng với giá trị trả
về của hàm đệ quy để xét điều kiện của chữ số hàng tiếp theo (n/10). Nếu các chữ
số hàng tiếp theo chia cho 2 dư 0, trả về giá trị 0 và cộng với giá trị trả về của hàm
đệ quy để xét điều kiện ở chữ số hàng sau (n/10).
+ In ra giá trị đã tính tốn của hàm lên màn hình.
Bài làm:
#include<iostream>
#include<math.h>
using namespace std;
float T(int n);
float Tong(int n);
main()
{
int n;
cout<<"Nhap n: ";
cin>>n;
cout<<"S("<
}
float T(int n)
{
if(n==0)
return 1;
return T(n-1)*2*n;
}
float Tong(int n)
{
if(n==0)
return 1;
return Tong(n-1)+1/T(n);
}
CÂU 7: Viết chương trình sử dụng đệ quy, tính và in ra màn hình giá trị của biểu
thức sau:
S(n)=1+1/2+1/(2.4)+1/(2.4.6)+…+1/(2.4.6.2n) với n là số nguyên dương nhập
từ bàn phím.
Cách làm:
- Kiểm tra điều kiện của số nguyên dương n đã nhập:
+ Nếu n<0, yêu cầu nhập lại.
- Xét điều kiện của mẫu
+ Nếu n=0 trả về giá trị 1.
+ Nếu n khác 0 tính mẫu số.
- Tính tổng S(n)
+ Nếu n=0 kết quả giá trị 1.
+ Nếu n khác 0 xuất kết quả S(n).
-In ra giá trị đã tính tốn của hàm lên màn hình.
Bài làm:
#include<iostream>
#include<math.h>
using namespace std;
float T(int n);
float Tong(int n);
main()
{
int n;
cout<<"Nhap n: ";
cin>>n;
cout<<"S("<
}
float T(int n)
{
if(n==0)
return 1;
return T(n-1)*2*n;
}
float Tong(int n)
{
if(n==0)
return 1;
return Tong(n-1)+1/T(n);
}
Bài tập 1:
1.
2.
3.
4.
5.
6.
7.
Nhập vào một mảng một chiều A, in mảng vừa nhập ra màn hình.
Tìm giá trị âm nhỏ nhất trong mảng. Nếu trong mảng khơng có giá trị âm trả
về 0.
Hãy tìm giá trị x sao cho đoạn [-x, x] chứa tất cả các giá trị trong mảng.
Xếp lại dãy theo nguyên tắc: A[1] đổi chỗ với A[n], A[2] đổi chỗ với A[n-1],
…In dãy sau khi đổi chỗ.
Tìm bội số chung nhỏ nhất của tất cả các phần tử trong mảng.
Tính tổng các phần tử đối xứng trong mảng
Thêm x vào mảng tăng nhưng vẫn giữ nguyên tính tăng của mảng
Cách Làm:
1.Nhập số phần tử của mảng n, sử dụng vòng lặp for để nhập và xuất các giá
trị trong mảng.
2. Dùng vòng lặp for xét từng phần tử của mảng:
+ Khai báo 1 biến min, nếu xuất hiện phần tử nhỏ hơn 0, gán cho biến min.
Sử dụng vòng lặp for để xét tiếp các phần tử trong mảng, nếu gặp phần tử nhỏ
hơn 0 và nhỏ hơn giá trị của biến min hiejn tại, gán phần tử đó cho min.
+ Nếu xét mảng k thấy phần tử âm, kết thúc hàm
3.Gán giá trị đầu của mảng cho biến x -Dùng vòng for để xét điều kiện:
+Nếu x>| a[i] |, gán x=x +Nếu x<| a[i] |, gán x=a[i] Nếu x < | a[i] |, gán x=|
a[i]
4.Sử dụng vòng for, gán giá trị ban đầu là n , điều kiện lặp là n>=0 và cho
giảm vòng for từ n->0
5. Tìm BCNN của 2 phần tử đầu trong mảng rồi gán cho 1 biến x, sau đó tìm
BCNN giữa x và phần tử tiếp theo rồi gán lại cho x, cứ tiếp tục nv trong vòng
for.
Bài Làm :
#include<iostream>
#include<math.h>
using namespace std;
//cau 1
void nhapMang(float a[], int &n){
cout<<"Nhap so luong phan tu cua mang: ";
do{
cin>>n;
}while(n<1);
cout<<"Nhap mang A co "<
for(int i=0; i
cout<<"\tA["<
cin>>a[i];
}
}
void xuatMang(float a[], int n){
for(int i=0; i
cout<<"\t"<
}
cout<
}
//cau 2
float am_max(float a[], int n){
float max=0;
for(int i=0; i
if(a[i]
}
return max;
}
//cau 3
float tim_x(float a[], int n){
float x=fabs(a[0]);
for(int i=1; i
if(fabs(a[i])>x) x=fabs(a[i]);
}
return x;
}
//cau 4
void doicho(float a[], int n){
for(int i=0; i
swap(a[i], a[n-1-i]);
}
}
//cau 5
float ucln(float a, float b){
if(a==b) return a;
if(a>b) return ucln(a-b,b);
else return ucln(a,b-a);
}
float bcnn(float a, float b){
return (a*b/ucln(a,b));
}
float bcnn_mang(float a[], int n){
float bc=bcnn(a[0],a[1]);
for(int i=2; i
bc=bcnn(bc,a[i]);
}
return bc;
}
//cau 6
void tong(float a[], int n){
for(int i=0; i
cout<<"\tTong cap a["<
}
}
//cau 7
void sxtang(float a[], int n){
for(int i=0; i
for(int j=i+1; j
if(a[i]>a[j]) swap(a[i],a[j]);
}
}
}
void chen_x(float a[], int &n, float x){
for(int i=0; i
if(x
n++;
for(int j=n-1; j>i; j--){
a[j]=a[j-1];
}
a[i]=x;
break;
}
}
}
int main(){
int n;
float a[100];
//cau 1
nhapMang(a,n);
cout<<"Mang vua nhap la:"<
xuatMang(a,n);
//cau 2
cout<<"Gia tri am nho nhat la: "<
//cau 3
cout<<"Gia tri x can tim la: "<
<<"["<<-tim_x(a,n)<<","<
mang."<
//cau 4
doicho(a,n);
cout<<"Mang sau khi sap xep lai la:"<
xuatMang(a,n);
//cau 5
cout<<"Boi chung nho nhat cua cac phan tu trong mang la:
"<
//cau 6
cout<<"Tong cac phan tu doi xung trong mang la: "<
tong(a,n);
//cau 7
float x;
cout<<"Nhap x= "; cin>>x;
sxtang(a,n);
chen_x(a,n,x);
cout<<"Mang sau khi chen x= "<
xuatMang(a,n);
return 0;
}
Bài tập 2:
1.
2.
3.
Nhập vào một chuỗi str1, in chuỗi vừa nhập ra màn hình.
Nhập giá trị n và vt. Hãy xây dựng chuỗi str2 bằng cách copy n ký tự bắt đầu
từ vị trí vt của str1. In chuỗi str2 ra màn hình.
Nhập vào ký tự ch. Xóa ký tự đứng trước ch trong chuỗi vừa nhập. In chuỗi
sau khi xóa.
Bài Làm:
#include<iostream>
#include<string.h>
using namespace std;
void Nhap(char str[30]);
void Xuat(char str[30]);
void XoaPT(char str[30], int vt);
void XoaPTNN(char str[30]);
void TrichChuoi(char str[30]);
main()
{
char str[30];
Nhap(str);
Xuat(str);
XoaPTNN(str);
Xuat(str);
TrichChuoi(str);
}
void Nhap(char str[30])
{
cout<<"Nhap chuoi: ";
fflush(stdin);
gets(str);
}
void Xuat(char str[30])
{
cout<<"Chuoi da nhap la: "<
}
void XoaPT(char str[30], int vt)
{
int n = strlen(str);
for(int i = vt; i < n; i++)
{
str[i] = str[i+1];
}
n--;
}
void XoaPTNN(char str[30])
{
char ch;
cout<<"\nNhap ki tu muon xoa: ";
cin>>ch;
int n = strlen(str);
for(int i = 0; i < n ; i++)
{
if(str[i] == ch)
{
XoaPT(str, (i-1));
i--;
}
}
}
void TrichChuoi(char str[30])
{
char str1[30];
int n, vt;
cout<<"\nNhap n: ";
cin>>n;
cout<<"Nhap vi tri: ";
cin>>vt;
for(int i = vt, j = 0; i < (vt + n); i++, j++)
{
str1[j] = str[i];
}
cout<
}