SlideShare a Scribd company logo
Kỹ thuật lập trình 501127 – HK2/2011-2012 1 
Ỹ UẬ LẬ Ì 
ài p 5 – ầ 14 
ệ q , ấp p độ g và kiể rỏ 
ài p bắ b ộ : 
Bài 1. Viết hàm đệ quy để tính tổng các số từ 1 đến n, với n được cho bởi user. 
//return the sum 1+ 2+ 3+ ...+ n 
int sum(int n) 
int sum(int n){ 
if (n<=0){ 
return 0; 
}else{ 
return n+sum(n-1); 
} 
} 
Bài 2. Viết hàm đệ quy để viết chương trình tìm giá trị lớn nhất của một mảng số nguyên. 
//return the maximum element in a[] 
int findmin(int a[], int n) 
int findmax(int a[],int n){ 
if (n==1){ 
return a[0]; 
}else{ 
return (a[n-1]>findmax(a,n-1))?a[n]:findmax(a,n-1); 
} 
} 
Bài 3. 
#include<iostream.h> 
#include <stdlib.h> 
#include<time.h> 
void output(int** c, int m, int n) { 
for (int i = 0; i < m; i++) { 
for (int j = 0; j < n; j++) { 
cout<<c[i][j]<<" "; 
} 
cout<<endl; 
} 
} 
void deleteMatrix(int** d, int m) { 
for (int i = 0; i < m; i++) { 
delete [] d[i]; 
}
Kỹ thuật lập trình 501127 – HK2/2011-2012 2 
delete []d; 
} 
void main() { 
int m, n; 
int** a; 
int** b; 
cout<<"Input the dimensions of the Matrix : "; 
cin>>m>>n; 
if (m <= 0 || n <= 0) { 
cout<<"Invalid Input !"<<endl; 
} else { 
init(a, m, n); 
cout<<"The random matrix : "<<endl; 
output(a, m, n); 
transposeMatrix(a, m, n, b); 
cout<<"The transposing matrix : "<<endl; 
output(b, n, m); 
deleteMatrix(a, m); 
deleteMatrix(b, n); 
} 
} 
Hãy hiện thực hàm init() và hàm transposeMatrix() thỏa mãn các yêu cầu sau: 
• init(): tạo ra ma trận a (m hàng , n cột) chứa các số nguyên bằng cách cấp phát động 
cho biến con trỏ a. Sau đó khởi tạo ma trận a chứa các số nguyên ngẫu nhiên từ 0..9 ( Gợi 
ý : sử dụng hàm rand() trong thư viện stdlib.h đã được include sẵn). 
• transposeMatrix() : tạo ma trận b (n hàng, m cột) chứa các số nguyên bằng cách 
cấp phát động cho biến con trỏ b. Sau đó, tạo ra ma trận chuyển vị của ma trận a và chứa 
vào ma trận b. 
void init(int**&a, int m, int n){ 
srand(time(NULL)); 
a=new int*[m]; 
for(int i=0;i<m;i++){ 
a[i]=new int[n]; 
for(int j=0;j<n;j++){ 
a[i][j]=rand()%10; 
} 
} 
} 
void transposeMatrix(int **a, int m,int n, int **&b){ 
b=new int*[n]; 
for(int i=0;i<n;i++){ 
b[i]=new int[m]; 
for(int j=0;j<m;j++){
Kỹ thuật lập trình 501127 – HK2/2011-2012 3 
b[i][j]=a[j][i]; 
} 
} 
} 
Bài 4. Sử dụng hàm đệ quy để viết chương trình đảo ngược một số nguyên. 
// with the parameter 12345, it would return 54321 
int reverseDigits(int n) 
int reverseDigits(int n){ 
static int s=0; 
if((n/10)==0){ 
return s+n%10; 
}else{ 
s=(n%10+s)*10; 
return reverseDigits(n/10); 
} 
} 
Bài p làm thêm 
Bài 5. Viết hàm đệ quy sumEvenDigit(int n) thực hiện chức năng sau: 
• Trả về -1 nếu n < 0. 
• Trả về tổng của các chữ số chẵn của số n nếu n >= 0. 
Ví dụ : n = 1468952 thì kết quả là : 4 + 6 + 8 + 2 = 20. 
int sumEvenDigit(int n){ 
if (n < 0){ 
return -1; 
}else if(n==0){ 
return 0; 
}else{ 
return ((n%10)%2==0?n%10:0)+sumEvenDigit(n/10); 
} 
} 
Bài 6. Cho đoạn chương trình : 
#include <iostream.h> 
void printCombinations(int m, int n) { 
//Coding here 
} 
void main() { 
int m,n; 
cout<<"Input two positive integer : "; 
cin>>m>>n; 
if (m <=0 || n <= 0 || m > n) { 
cout<<"Invalid input !"<<endl;
Kỹ thuật lập trình 501127 – HK2/2011-2012 4 
} else { 
cout<<"The result is : "<<endl; 
printCombinations(m,n); 
} 
} 
Hãy hiện thực hàm printCombinations() để sinh ra tất cả các tổ hợp chập m của n 
phần tử từ 1..n. Yêu cầu trong hàm printCombinations() phải gọi 1 hàm đệ qui để 
thực hiện việc sinh ra tất cả các tổ hợp này. 
Ví dụ : m = 2 , n = 4. Kết quả xuất ra màn hình sẽ là: 
1 2 
1 3 
1 4 
2 3 
2 4 
3 4 
void generate(int a[], int m, int n, int k){ 
for(int j=a[k-1]+1;j<=n-m+k;j++){ 
a[k]=j; 
if(k==m){ 
for (int i=1;i<=m;i++) cout<<a[i]<<" "; 
cout<<endl; 
}else 
generate(a,m,n,k+1); 
} 
} 
void printCombinations(int m, int n) { 
int k=1; 
int a[m+1]; 
a[0]=0; 
generate(a,m,n,k); 
} 
Bài 7. Viết chương trình xuất tam giác Pascal ra màn hình. Cụ thể như sau: 
• Nhập một số nguyên dương từ bàn phím (lưu vào biến n). 
• Tính toán tam giác Pascal đến mức n và lưu vào 1 mảng 2 chiều (Yêu cầu: mảng 2 
chiều này phải được cấp phát động vừa đủ với kích thước của tam giác Pascal). 
• Xuất mảng 2 chiều này ra màn hình. 
Định nghĩa: Tam giác Pascal chứa các hệ số khi khai triển nhị thức Newton (x + 1)n. 
Ví dụ: n = 4. Kết quả xuất ra màn hình sẽ là: 
1 
1 1 
1 2 1 
1 3 3 1 
1 4 6 4 1
Kỹ thuật lập trình 501127 – HK2/2011-2012 5 
#include<iostream> 
using namespace std; 
void initpascal(int**&a, int n){ 
a=new int*[n+1]; 
for(int i=0;i<n+1;i++){ 
a[i]=new int[i+1]; 
for(int j=0;j<i+1;j++){ 
a[i][j]=0; 
} 
} 
} 
void tamgiacpascal(int **&a, int n){ 
for(int i=0;i<n+1;i++){ 
a[i][0]=a[i][i]=1; 
for(int j=1;j<i;j++){ 
a[i][j]=a[i-1][j-1]+a[i-1][j]; 
} 
} 
} 
void output(int** c, int n) { 
for (int i = 0; i < n+1; i++) { 
for (int j = 0; j < i+1; j++) { 
cout<<c[i][j]<<"t"; 
} 
cout<<endl; 
} 
} 
void deleteMatrix(int** d, int n) { 
for (int i = 0; i < n+1; i++) { 
delete [] d[i]; 
} 
delete []d; 
} 
int main() { 
int n; 
int** a; 
cout<<"Nhap n: "; 
cin>>n; 
if (n <= 0) { 
cout<<"Invalid Input !"<<endl; 
} else { 
initpascal(a,n); 
tamgiacpascal(a,n); 
cout<<"Tam giac pascal: "<<endl; 
output(a, n);
Kỹ thuật lập trình 501127 – HK2/2011-2012 6 
deleteMatrix(a, n); 
} 
return 0; 
} 
Bài 8. Viết chương trình xuất ra ma trận xoắn ốc. Cụ thể như sau: 
• Nhập kích thước của ma trận từ bàn phím (lưu vào 2 biến m, n). 
• Tính toán ma trận xoắn ốc và lưu vào 1 mảng 2 chiều ( Yêu cầu : mảng 2 chiều này 
được cấp phát động). 
• Xuất ma trận xoắn ốc ra màn hình. 
Định nghĩa: Ma trận xoắn ốc là ma trận chứa đựng các số từ 1..(m x n) được sắp xếp có 
thứ tự tăng dần theo hình xoắn ốc. 
Ví dụ : 
m = 3, n = 5. Kết quả xuất ra màn hinh sẽ là: 
1 2 3 4 5 
12 13 14 15 6 
11 10 9 8 7 
m = 4, n = 4. Kết quả xuất ra màn hình sẽ là: 
1 2 3 4 
12 13 14 5 
11 16 15 6 
10 9 8 7 
#include<iostream> 
using namespace std; 
void init(int**&a, int m, int n){ 
a=new int*[m]; 
for(int i=0;i<m;i++){ 
a[i]=new int[n]; 
for(int j=0;j<n;j++){ 
a[i][j]=0; 
} 
} 
} 
void mtxoanoc(int **&a, int m, int n){ 
int i,j,istart,jstart,inccol,incrow,max; 
i=j=istart=jstart=0; 
inccol=1; 
incrow=0; 
max=m*n; 
for(int key=1;key<=max;key++){ 
a[i][j]=key; 
i+=incrow; 
j+=inccol; 
if(i==istart&&j==jstart){
Kỹ thuật lập trình 501127 – HK2/2011-2012 7 
incrow=0; 
inccol=1; 
i=j=++istart; 
n--; 
m--; 
}else if(i==istart&&j==n-1){ 
incrow=1; 
inccol=0; 
}else if(i==m-1&&j==n-1){ 
incrow=0; 
inccol=-1; 
}else if(i==m-1&&j==jstart){ 
incrow=-1; 
inccol=0; 
}else; 
} 
} 
void output(int** c, int m, int n) { 
for (int i = 0; i < m; i++) { 
for (int j = 0; j < n; j++) { 
cout<<c[i][j]<<"t"; 
} 
cout<<endl; 
} 
} 
void deleteMatrix(int** d, int m) { 
for (int i = 0; i < m; i++) { 
delete [] d[i]; 
} 
delete []d; 
} 
int main() { 
int m, n; 
int** a; 
cout<<"Input the dimensions of the Matrix : "; 
cin>>m>>n; 
if (m <= 0 || n <= 0) { 
cout<<"Invalid Input !"<<endl; 
} else { 
init(a, m, n); 
cout<<"Ma tran zero: "<<endl; 
output(a, m, n); 
mtxoanoc(a, m, n); 
cout<<"Ma tran xoan oc: "<<endl; 
output(a, m, n);
Kỹ thuật lập trình 501127 – HK2/2011-2012 8 
deleteMatrix(a, m); 
} 
return 0; 
} 
Bài 9. Bằng cách sử dụng kỹ thuật hàm đệ quy để viết chương trình kiểm tra xem đảo 
ngược một chuỗi có phải là chính nó hay không. 
//returns 1 if a[] is a palindrome, 0 otherwise 
int ispalindrome(char a[], int n) 
int ispalindrome(char a[], int n){ 
static int pos=0; 
if(pos>n/2){ 
return 1; 
}else if(a[pos]==a[n-1-pos]){ 
pos++; 
return 1*ispalindrome(a, n); 
}else { 
return -1; 
} 
} 
Bài 10. Dùng đệ quy để viết chương trình xuất ra một chuỗi mới được tạo thành bởi sao 
chép n chuỗi con s. 
// with the parameters “Hello” and 2 would return the 
string “HelloHello”. 
// if n equals zero, the method should return the empty 
string. 
char* repeat(char* s, int n) 
char* repeat(char* s, int n){ 
static char *s1=new char; 
if(n<=0){ 
s1=""; 
return s1; 
}else if(n==1){ 
strcat(s1,s); 
return s1; 
}else{ 
strcat(s1,s); 
return repeat(s,n-1); 
} 
} 
Bài 11. Hiện thực thuật giải tìm ước số chung lớn nhất bằng kỹ thuật đệ quy. 
int UCLN(int a, int b){
Kỹ thuật lập trình 501127 – HK2/2011-2012 9 
if (a==b){ 
return a; 
}else if (a>b){ 
return UCLN(a-b,b); 
}else{ 
return UCLN(b,b-a); 
} 
} 
Bài 12. Viết chương trình giải bài toán tháp Hà Nội. 
#include<iostream> 
using namespace std; 
void thapHN(int n, int i, int j){ 
int k; 
if(n==1) 
cout<<i<<" --> "<<j<<endl; 
else { 
k = 6-i-j; 
thapHN(n-1,i,k); 
thapHN(1,i,j); 
thapHN(n-1,k,j); 
} 
} 
int main() 
{ 
int sotang ; 
cout << "So tang = " ; 
cin >> sotang; 
thapHN(sotang, 1, 2); 
return 0; 
} 
-- ế -

More Related Content

PDF
Stl string
PDF
Tut6 solution
PDF
Local sakainame 501127 ktl_trình hlmt1 a01 fall 2013 _ modules
PDF
Ktlt lab full
PDF
Tut4 solution
DOCX
Hướng dẫn làm bt về chuỗi.doc
PDF
Stl string
Tut6 solution
Local sakainame 501127 ktl_trình hlmt1 a01 fall 2013 _ modules
Ktlt lab full
Tut4 solution
Hướng dẫn làm bt về chuỗi.doc

What's hot (19)

DOCX
Bai de quy
PPT
Nmlt c05 cau_lenhlap
PDF
C đến C++ phần 1
DOC
Lap trinh c++ có lời giải 3
PPT
Ctdl C05
PPT
giao trinh c++ Chuong1
DOC
Lap trinh c++ có lời giải 1
PPT
Nmlt c11 con_trocoban-
PPT
Ctdl C01
PPT
Nmlt c06 ham
DOC
Lập trình c++ có lời giải 2
PPT
Lap trinh huong_doi_tuong_cpp_dhct_lesson08
PPT
Nmlt c09 chuoi_kytu
PPT
Nmlt c04 cau_lenhdieukienvarenhanh
PDF
Basic C programming
PPT
Lesson08
PDF
Control structure in C
DOCX
Stl vector nguyen_trihai_11520094_khmt06
Bai de quy
Nmlt c05 cau_lenhlap
C đến C++ phần 1
Lap trinh c++ có lời giải 3
Ctdl C05
giao trinh c++ Chuong1
Lap trinh c++ có lời giải 1
Nmlt c11 con_trocoban-
Ctdl C01
Nmlt c06 ham
Lập trình c++ có lời giải 2
Lap trinh huong_doi_tuong_cpp_dhct_lesson08
Nmlt c09 chuoi_kytu
Nmlt c04 cau_lenhdieukienvarenhanh
Basic C programming
Lesson08
Control structure in C
Stl vector nguyen_trihai_11520094_khmt06
Ad

Similar to Tut5 solution (20)

PDF
Baitap ktlt
DOC
Baitap ktlt
DOCX
Data Structures and Algorithms Gụidance
DOCX
08 long gagd_t3+t5
DOC
Bai tapktlt phan3
DOCX
Bài 11 Kiểu mảng(tt)
DOC
Bài tập ôn lập trình
DOC
Bai tapep ctunglop
DOC
Bài tập CTDL và GT 4
DOC
Bai tap lam quen java
DOC
Bai tap lam quen java (1)
PPTX
Kiểu mảng(tt)_Võ Tâm Long_Copyright 2015
PDF
Baitapjava
PDF
Session 4
PPT
DOCX
Chuyen doi he so
DOC
TinHoc_tuyentapde_nk
PDF
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
PDF
DOC
Bai tap thuc hanh nhap mon tin hoc
Baitap ktlt
Baitap ktlt
Data Structures and Algorithms Gụidance
08 long gagd_t3+t5
Bai tapktlt phan3
Bài 11 Kiểu mảng(tt)
Bài tập ôn lập trình
Bai tapep ctunglop
Bài tập CTDL và GT 4
Bai tap lam quen java
Bai tap lam quen java (1)
Kiểu mảng(tt)_Võ Tâm Long_Copyright 2015
Baitapjava
Session 4
Chuyen doi he so
TinHoc_tuyentapde_nk
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
Bai tap thuc hanh nhap mon tin hoc
Ad

More from Trần Văn Nam (19)

PDF
PDF
Phan 2 chuong 8 (chuoi ky tu)
PDF
Phan 2 chuong 9 (cau truc)
PDF
Phan 2 chuong 10 (tap tin)
PDF
Lect09 string
PDF
Lect05 array
PDF
Huong dan thao_tac_file
DOCX
Cam bien gia toc
PDF
Bai tap c
PDF
Giáo trình cấu trúc dữ liệu và giải thuật phần 1 tài liệu, ebook, giáo trình
PDF
PDF
Chuong 05
PPT
Bg chuong trinh dich chuong 3
PPT
Chapter07 io
PDF
C++ 2011 april_draft
PDF
Bài giảng ngôn ngữ lập trình c++ chương 7 ra vào dữ liệu tài liệu, ebook, ...
PDF
Tailieuvkt hk3
DOC
Lenh tat auto_cad hk3
DOCX
Nhung ad
Phan 2 chuong 8 (chuoi ky tu)
Phan 2 chuong 9 (cau truc)
Phan 2 chuong 10 (tap tin)
Lect09 string
Lect05 array
Huong dan thao_tac_file
Cam bien gia toc
Bai tap c
Giáo trình cấu trúc dữ liệu và giải thuật phần 1 tài liệu, ebook, giáo trình
Chuong 05
Bg chuong trinh dich chuong 3
Chapter07 io
C++ 2011 april_draft
Bài giảng ngôn ngữ lập trình c++ chương 7 ra vào dữ liệu tài liệu, ebook, ...
Tailieuvkt hk3
Lenh tat auto_cad hk3
Nhung ad

Tut5 solution

  • 1. Kỹ thuật lập trình 501127 – HK2/2011-2012 1 Ỹ UẬ LẬ Ì ài p 5 – ầ 14 ệ q , ấp p độ g và kiể rỏ ài p bắ b ộ : Bài 1. Viết hàm đệ quy để tính tổng các số từ 1 đến n, với n được cho bởi user. //return the sum 1+ 2+ 3+ ...+ n int sum(int n) int sum(int n){ if (n<=0){ return 0; }else{ return n+sum(n-1); } } Bài 2. Viết hàm đệ quy để viết chương trình tìm giá trị lớn nhất của một mảng số nguyên. //return the maximum element in a[] int findmin(int a[], int n) int findmax(int a[],int n){ if (n==1){ return a[0]; }else{ return (a[n-1]>findmax(a,n-1))?a[n]:findmax(a,n-1); } } Bài 3. #include<iostream.h> #include <stdlib.h> #include<time.h> void output(int** c, int m, int n) { for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cout<<c[i][j]<<" "; } cout<<endl; } } void deleteMatrix(int** d, int m) { for (int i = 0; i < m; i++) { delete [] d[i]; }
  • 2. Kỹ thuật lập trình 501127 – HK2/2011-2012 2 delete []d; } void main() { int m, n; int** a; int** b; cout<<"Input the dimensions of the Matrix : "; cin>>m>>n; if (m <= 0 || n <= 0) { cout<<"Invalid Input !"<<endl; } else { init(a, m, n); cout<<"The random matrix : "<<endl; output(a, m, n); transposeMatrix(a, m, n, b); cout<<"The transposing matrix : "<<endl; output(b, n, m); deleteMatrix(a, m); deleteMatrix(b, n); } } Hãy hiện thực hàm init() và hàm transposeMatrix() thỏa mãn các yêu cầu sau: • init(): tạo ra ma trận a (m hàng , n cột) chứa các số nguyên bằng cách cấp phát động cho biến con trỏ a. Sau đó khởi tạo ma trận a chứa các số nguyên ngẫu nhiên từ 0..9 ( Gợi ý : sử dụng hàm rand() trong thư viện stdlib.h đã được include sẵn). • transposeMatrix() : tạo ma trận b (n hàng, m cột) chứa các số nguyên bằng cách cấp phát động cho biến con trỏ b. Sau đó, tạo ra ma trận chuyển vị của ma trận a và chứa vào ma trận b. void init(int**&a, int m, int n){ srand(time(NULL)); a=new int*[m]; for(int i=0;i<m;i++){ a[i]=new int[n]; for(int j=0;j<n;j++){ a[i][j]=rand()%10; } } } void transposeMatrix(int **a, int m,int n, int **&b){ b=new int*[n]; for(int i=0;i<n;i++){ b[i]=new int[m]; for(int j=0;j<m;j++){
  • 3. Kỹ thuật lập trình 501127 – HK2/2011-2012 3 b[i][j]=a[j][i]; } } } Bài 4. Sử dụng hàm đệ quy để viết chương trình đảo ngược một số nguyên. // with the parameter 12345, it would return 54321 int reverseDigits(int n) int reverseDigits(int n){ static int s=0; if((n/10)==0){ return s+n%10; }else{ s=(n%10+s)*10; return reverseDigits(n/10); } } Bài p làm thêm Bài 5. Viết hàm đệ quy sumEvenDigit(int n) thực hiện chức năng sau: • Trả về -1 nếu n < 0. • Trả về tổng của các chữ số chẵn của số n nếu n >= 0. Ví dụ : n = 1468952 thì kết quả là : 4 + 6 + 8 + 2 = 20. int sumEvenDigit(int n){ if (n < 0){ return -1; }else if(n==0){ return 0; }else{ return ((n%10)%2==0?n%10:0)+sumEvenDigit(n/10); } } Bài 6. Cho đoạn chương trình : #include <iostream.h> void printCombinations(int m, int n) { //Coding here } void main() { int m,n; cout<<"Input two positive integer : "; cin>>m>>n; if (m <=0 || n <= 0 || m > n) { cout<<"Invalid input !"<<endl;
  • 4. Kỹ thuật lập trình 501127 – HK2/2011-2012 4 } else { cout<<"The result is : "<<endl; printCombinations(m,n); } } Hãy hiện thực hàm printCombinations() để sinh ra tất cả các tổ hợp chập m của n phần tử từ 1..n. Yêu cầu trong hàm printCombinations() phải gọi 1 hàm đệ qui để thực hiện việc sinh ra tất cả các tổ hợp này. Ví dụ : m = 2 , n = 4. Kết quả xuất ra màn hình sẽ là: 1 2 1 3 1 4 2 3 2 4 3 4 void generate(int a[], int m, int n, int k){ for(int j=a[k-1]+1;j<=n-m+k;j++){ a[k]=j; if(k==m){ for (int i=1;i<=m;i++) cout<<a[i]<<" "; cout<<endl; }else generate(a,m,n,k+1); } } void printCombinations(int m, int n) { int k=1; int a[m+1]; a[0]=0; generate(a,m,n,k); } Bài 7. Viết chương trình xuất tam giác Pascal ra màn hình. Cụ thể như sau: • Nhập một số nguyên dương từ bàn phím (lưu vào biến n). • Tính toán tam giác Pascal đến mức n và lưu vào 1 mảng 2 chiều (Yêu cầu: mảng 2 chiều này phải được cấp phát động vừa đủ với kích thước của tam giác Pascal). • Xuất mảng 2 chiều này ra màn hình. Định nghĩa: Tam giác Pascal chứa các hệ số khi khai triển nhị thức Newton (x + 1)n. Ví dụ: n = 4. Kết quả xuất ra màn hình sẽ là: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1
  • 5. Kỹ thuật lập trình 501127 – HK2/2011-2012 5 #include<iostream> using namespace std; void initpascal(int**&a, int n){ a=new int*[n+1]; for(int i=0;i<n+1;i++){ a[i]=new int[i+1]; for(int j=0;j<i+1;j++){ a[i][j]=0; } } } void tamgiacpascal(int **&a, int n){ for(int i=0;i<n+1;i++){ a[i][0]=a[i][i]=1; for(int j=1;j<i;j++){ a[i][j]=a[i-1][j-1]+a[i-1][j]; } } } void output(int** c, int n) { for (int i = 0; i < n+1; i++) { for (int j = 0; j < i+1; j++) { cout<<c[i][j]<<"t"; } cout<<endl; } } void deleteMatrix(int** d, int n) { for (int i = 0; i < n+1; i++) { delete [] d[i]; } delete []d; } int main() { int n; int** a; cout<<"Nhap n: "; cin>>n; if (n <= 0) { cout<<"Invalid Input !"<<endl; } else { initpascal(a,n); tamgiacpascal(a,n); cout<<"Tam giac pascal: "<<endl; output(a, n);
  • 6. Kỹ thuật lập trình 501127 – HK2/2011-2012 6 deleteMatrix(a, n); } return 0; } Bài 8. Viết chương trình xuất ra ma trận xoắn ốc. Cụ thể như sau: • Nhập kích thước của ma trận từ bàn phím (lưu vào 2 biến m, n). • Tính toán ma trận xoắn ốc và lưu vào 1 mảng 2 chiều ( Yêu cầu : mảng 2 chiều này được cấp phát động). • Xuất ma trận xoắn ốc ra màn hình. Định nghĩa: Ma trận xoắn ốc là ma trận chứa đựng các số từ 1..(m x n) được sắp xếp có thứ tự tăng dần theo hình xoắn ốc. Ví dụ : m = 3, n = 5. Kết quả xuất ra màn hinh sẽ là: 1 2 3 4 5 12 13 14 15 6 11 10 9 8 7 m = 4, n = 4. Kết quả xuất ra màn hình sẽ là: 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 #include<iostream> using namespace std; void init(int**&a, int m, int n){ a=new int*[m]; for(int i=0;i<m;i++){ a[i]=new int[n]; for(int j=0;j<n;j++){ a[i][j]=0; } } } void mtxoanoc(int **&a, int m, int n){ int i,j,istart,jstart,inccol,incrow,max; i=j=istart=jstart=0; inccol=1; incrow=0; max=m*n; for(int key=1;key<=max;key++){ a[i][j]=key; i+=incrow; j+=inccol; if(i==istart&&j==jstart){
  • 7. Kỹ thuật lập trình 501127 – HK2/2011-2012 7 incrow=0; inccol=1; i=j=++istart; n--; m--; }else if(i==istart&&j==n-1){ incrow=1; inccol=0; }else if(i==m-1&&j==n-1){ incrow=0; inccol=-1; }else if(i==m-1&&j==jstart){ incrow=-1; inccol=0; }else; } } void output(int** c, int m, int n) { for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cout<<c[i][j]<<"t"; } cout<<endl; } } void deleteMatrix(int** d, int m) { for (int i = 0; i < m; i++) { delete [] d[i]; } delete []d; } int main() { int m, n; int** a; cout<<"Input the dimensions of the Matrix : "; cin>>m>>n; if (m <= 0 || n <= 0) { cout<<"Invalid Input !"<<endl; } else { init(a, m, n); cout<<"Ma tran zero: "<<endl; output(a, m, n); mtxoanoc(a, m, n); cout<<"Ma tran xoan oc: "<<endl; output(a, m, n);
  • 8. Kỹ thuật lập trình 501127 – HK2/2011-2012 8 deleteMatrix(a, m); } return 0; } Bài 9. Bằng cách sử dụng kỹ thuật hàm đệ quy để viết chương trình kiểm tra xem đảo ngược một chuỗi có phải là chính nó hay không. //returns 1 if a[] is a palindrome, 0 otherwise int ispalindrome(char a[], int n) int ispalindrome(char a[], int n){ static int pos=0; if(pos>n/2){ return 1; }else if(a[pos]==a[n-1-pos]){ pos++; return 1*ispalindrome(a, n); }else { return -1; } } Bài 10. Dùng đệ quy để viết chương trình xuất ra một chuỗi mới được tạo thành bởi sao chép n chuỗi con s. // with the parameters “Hello” and 2 would return the string “HelloHello”. // if n equals zero, the method should return the empty string. char* repeat(char* s, int n) char* repeat(char* s, int n){ static char *s1=new char; if(n<=0){ s1=""; return s1; }else if(n==1){ strcat(s1,s); return s1; }else{ strcat(s1,s); return repeat(s,n-1); } } Bài 11. Hiện thực thuật giải tìm ước số chung lớn nhất bằng kỹ thuật đệ quy. int UCLN(int a, int b){
  • 9. Kỹ thuật lập trình 501127 – HK2/2011-2012 9 if (a==b){ return a; }else if (a>b){ return UCLN(a-b,b); }else{ return UCLN(b,b-a); } } Bài 12. Viết chương trình giải bài toán tháp Hà Nội. #include<iostream> using namespace std; void thapHN(int n, int i, int j){ int k; if(n==1) cout<<i<<" --> "<<j<<endl; else { k = 6-i-j; thapHN(n-1,i,k); thapHN(1,i,j); thapHN(n-1,k,j); } } int main() { int sotang ; cout << "So tang = " ; cin >> sotang; thapHN(sotang, 1, 2); return 0; } -- ế -