You are on page 1of 15

Bài thực hành 2: Đệ Quy Bài 7.

Viết hàm đệ qui tính tổng các chữ số


Bài 2. Viết hàm đệ qui tính giai thừa của chẵn/lẻ của một số nguyên không âm.
một số nguyên không âm. int tongchan(int n) {
int k = (n % 10) % 2;
double giaithua(int n)
if (n < 10 && k == 0)
{
return n;
if (n <= 1)
else if (k == 0)
return 1;
return n % 10 + tongchan(n / 10);
else
else
return n * giaithua(n - 1);
return tongchan(n / 10);
}
}
Bài 3. Viết hàm đệ qui tính giá trị Fibonacci int tongle(int n) {
của một số nguyên không âm. int k = (n % 10) % 2;
int Fibonacci(int n) if (n < 10 && k != 0)
{ return n;
if (n == 1 || n == 2) else if (k != 0)
return 1; return n % 10 + tongle(n / 10);
return Fibonacci(n - 1) + Fibonacci(n - 2); else return tongle(n / 10);
} }

Bài 4. Viết hàm đệ qui tính giá trị của xn ; Bài 8. Viết hàm đệ qui chuyển một số
với x, n là số nguyên. nguyên dương từ hệ thập phân sang nhị
int luythua(int x, int n) phân.
{ int cdTP(int n)
if (n == 0) {
return 1; if (n == 1)
if (n == 1) return 1;
return x; else
else {
return x * luythua(x, n - 1); return ( n % 2 + 10 *cdTP( n/2));
}
Bài 5. Viết hàm đệ qui đếm số chữ số của }

một số nguyên không âm. }


int dem(int n)
{
Bài 9. Viết hàm đệ qui chuyển một số
if (n < 10) nguyên ở dạng nhị phân sang hệ thập phân.
return 1; int cdNP(int n, int s )
else return 1 + dem(n / 10); {
} int tmp = 0;
Bài 6. Viết hàm đệ qui tính số đảo ngược của if (n == 0)
return 0;
một số nguyên không âm. else
int SoDaoNguoc(int n, int s = 0) {
{ s = n % 10;
if (n == 0) return ((n % 10) + 2 * cdNP(n / 10, s));
return s; }
else }
{
s = s * 10 + n % 10; return SoDaoNguoc(n / 10,
Bài 10. Viết hàm đệ qui tìm ước số chung
s); lớn nhất của hai số nguyên.
} int uocchung(int a, int b)
} {
Bài 11. Viết hàm đệ qui tính tổng các giá trị if (b == 0) return a;
else
của một mảng 1 chiều lưu trữ số nguyên. return uocchung(b, a % b);
int tongMang(int a[], int n) }
{
if (n == 1)
return a[0];
else
return a[n - 1] + tongMang(a, n - 1);
}

Bài 13. Viết hàm đệ qui để xuất ra 1 tam


giác Pascal. Bài 12. Viết hàm đệ qui tìm giá trị nhỏ nhất
int C(int k, int n) { của một mảng 1 chiều lưu trữ số nguyên. S
if (k == 0 || k == n) return 1; int min(int a, int b)
if (k == 1) return n; {
return C(k - 1, n - 1) + C(k, n - 1); if (a < b)
} return a;
int main() { else
int n; return b;
do { }
cout << " Nhap chieu cao tam giac pascal: "; int gtnn(int a[], int n)
cin >> n; {
if (n <= 0) if (n == 1)
cout << " Nhap lai!\n"; return a[0];
} while (n <= 0); else
return min(a[n -1],gtnn( a, n-1));
cout << "---------PASCAl---------" << endl; }
for (int i = 0; i < n; i++) {

for (int j = 0; j <= i; j++) {


Bài 14: Chuyển đổi: Tháp Hà Nội
void chuyendia(unsigned n, char a, char b, char c)
cout << C(j, i) << " ";
{
}
if (n > 0)
cout << endl;
{
}
chuyendia(n - 1, a, b, c);
system("pause");
cout << " Chuyen dia " << n << " tu " << a << " ->
return 0;
" << b << endl;
}
chuyendia(n - 1, c, b, a);
}
}
int main()
{
chuyendia(3, 'A', 'B', 'C');
}

Bài thực hành 3:Con trỏ void xuat(int* a, int n)


{
Bài 6. Dùng con trỏ viết hàm đảo ngược 1
mảng 1 chiều lưu trữ số nguyên. for (int i = 0; i < n; i++)
#include <iostream> cout<< a[i] << "\t";
using namespace std; }
int main()
void nhap(int* a, int n) {
{ int n;
cout << " Nhap " << n << " gia tri nguyen cho mang : "; do {
for (int i = 0; i < n; i++) cout << " Nhap so phan tu trong mang ";
cin >> a[i]; cin >> n;
} } while (n <= 0);
void daonguoc(int* a, int n) int* a;
{ a = new int[n];
for (int i = 0; i < n / 2; i++) nhap(a, n);
{ cout << " Mang vua nhap la: ";
int tmp = a[0]; xuat(a, n);
*(a + i) = *(a + n - 1 - i); daonguoc(a, n);
*(a + n - 1 - i) = tmp; cout << " \nMang sau khi dao nguoc la: ";
} xuat(a, n);
} }
Bài 7: Dùng con trỏ viết hàm tìm kiếm 1 số Bài 8. Viết chương trình dùng cấp phát
nguyên có tồn tại trong mảng 1 chiều lưu động, cho phép:
trữ số nguyên hay không? Nếu có thì trả về - Khai báo mảng 2 chiều là một ma trận
vị trí đầu tiên xuất hiện số nguyên đó. Nếu vuông cấp h (h >0).
không thì trả con trỏ về NULL. - Lưu trữ giá trị của một tam giác Pascal với
int *VTDauTien(int* a, int n, int x) chiều cao h.
{ - Xuất lại tam giác Pascal ra màn hình.
int* VT;
for (int i = 0; i < n; i++) #include <iostream>
using namespace std;
if (a[i] == x) int main()
{
return &a[i]; int h;
return NULL; do
} {
cout << "Nhap chieu cao tam giac Pascal: ";
int main() cin >> h;
{
int n; } while (h <= 0);
do { int** a = new int* [h];
for (int i = 0; i < h; i++)
cout << " Nhap so phan tu trong mang {
"; a[i] = new int[i + 1];
cin >> n; a[i][0] = a[i][i] = 1;
} while (n <= 0); for (int j = 1; j < i; j++) {
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
int* a; }
a = new int[n]; }
nhap(a, n); cout << "_____Tam giac PASCAL-----\n";
cout << " Mang vua nhap la: "; for (int i = 0; i < h; i++)
{
xuat(a, n); for (int j = 0; j <= i; j++)
cout << endl; {
int x; cout << a[i][j] << " \t";
cout << " Nhap so nguyen muon tim kiem }
cout << endl;
trong mang la "; }
cin >> x;
int* kq = VTDauTien(a, n, x); for (int i = 0; i < h; i++)
if (kq == NULL) delete[] a[i];
delete[] a;
cout << x << " khong xuat hien!" <<
endl; system("pause");
else return 0;
}
cout << x << " xuat hien tai vi tri "
<<kq - a << endl;
delete[] a;
a = nullptr;
system(" pause");
return 0;

}
Bài : Số đảo ngược con trỏ Bài 5. Dùng con trỏ viết hàm xuất n
#include <iostream> giá trị của dãy số Fibonacci (n do
using namespace std;
người dùng nhập, là số nguyên > 1).
void reverse(int& num) { #include <iostream>
int rev_num = 0; using namespace std;
while (num > 0) { void Fibonacci(int* a, int n)
int digit = num % 10; {
rev_num = (rev_num * 10) + digit; for (int i = 0; i < n; i++)
num = num / 10; {
} if (i < 2)
num = rev_num; *(a + i) = 1;
} else
*(a + i) = *(a + i - 1) + *(a + i - 2);
int main() { }
int x = 12345;
int* ptr = &x; }
cout << "Number before reversing: " << *ptr << endl; void xuat(int* a, int n)
reverse(*ptr); {
cout << "Number after reversing: " << *ptr << endl;
return 0; for (int i = 0; i < n; i++)
} cout << *(a + i) << " \t";
}
Bài: Fibonaci con trỏ int main()
#include <iostream> {
using namespace std; int n;
do {
void fibonacci(int* arr, int n) { cout << "Nhap so gia tri Fibonacci muon xuat: ";
*arr = 0; cin >> n;
*(arr + 1) = 1; } while (n <= 1);
for (int i = 2; i < n; i++) { int* a;
*(arr + i) = *(arr + i - 1) + *(arr + i - 2); a = new int[n];
} Fibonacci(a, n);
} cout << endl<< n << " so Fibonacci la: ";
xuat(a, n);
int main() { delete[] a;
int n = 10; return 0;
int fib_arr[n];
int* fib_ptr = fib_arr; }
fibonacci(fib_ptr, n);
cout << "The Fibonacci sequence is: ";
for (int i = 0; i < n; i++) {
cout << *(fib_ptr + i) << " ";
}
return 0;
}
Bài 9. Viết chương trình dùng cấp phát động của con trỏ để viết: - Hàm nhập 1 mảng số
nguyên r hàng và c cột. - Hàm xuất 1 mảng số nguyên r hàng c cột. - Hàm dùng con trỏ để
tính tổng các phần tử nào là số nguyên tố trong mảng 2 chiều. - Hàm dùng để trả về các số
nguyên tố trong mảng 2 chiều. - Hàm main để kiểm chứng.
#include <iostream>
#include <math.h>
#include <conio.h>
using namespace std;
const int maxrow = 10, maxcol = 20;
void nhap(int** a, int r, int c)
{
for (int i = 0; i < r; i++)
{
cout << " Nhap " << c << " phan tu cho hang " << i + 1 << " : ";
for (int j = 0; j < c; j++)
cin >> a[i][j];
}
}
void xuat(int** a, int r, int c)
{
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
cout << a[i][j] << " \t ";
cout << endl;
}
}
bool SNT(int n)
{
if (n < 2)
return false;
else {
for (int i = 2; i <= sqrt(n * 1.0); i++)
{
if (n % i == 0)
return false;
}

return true;
}
int TongSNT(int** a, int r, int c)
{
int tong = 0;
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
if (SNT(a[i][j]))
tong += a[i][j];
}
return tong;
}
void XuatSNT(int** a, int r, int c, int* &p, int &size)
{
size = 0; p = new int(r * c);
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
if (SNT(a[i][j]))
{
p[size] = a[i][j];
size++;
}
}
}
}
int main()
{
int r,c;
do {
cout << " Nhap so hang: ";
cin >> r ;
if (r <= 0 || r > maxrow)
cout << " Nhap lai! \n";
} while (r <= 0 || r > maxrow );
do {
cout << " Nhap so cot: ";
cin >> c;
if (c <= 0 || c > maxcol)
cout << " Nhap lai! \n";
} while (c <= 0 || c > maxcol);
int** a;
a = new int* [r];
for (int i = 0;i < r; i++)
a[i] = new int[c];
nhap(a, r, c);
int chon;
do
{
system("pause");
cout << " _____MENU_____\n"
<< " 1. Nhap mang\n"
<< " 2. Xuat mang\n"
<< " 3. Tinh tong cac so nguyen to trong mang\n"
<< " 4. Xuat cac so nguyen to co trong mang\n"
<< " 5. Thoat\n"
<< " Ban chon: ";
cin >> chon;

switch (chon)
{
case 1:
cout << " ___Chuc nang: Nhap mang~\n";
break;
case 2:
cout << " ___Chuc nang: Xuat mang~\n";
{
cout << " Mang vua nhap la: \n";
xuat(a, r, c);
}
break;
case 3:
cout << " ___Chuc nang: Tinh tong cac so nguyen to trong mang~\n";
{
cout << " Tong cac so nguyen to trong mang vua nhap la: " << TongSNT(a, r, c)
<< endl;
}
break;
case 4:
cout << "___ Chuc nang: Xuat cac so nguyen to co trong mang~\n";
{
int* p = NULL;
int size = r * c;
XuatSNT(a, r, c, p, size);
for (int i = 0; i < size; i++)
cout << p[i] << "\t ";
}
break;
case 5:
cout << " Cam on ban da su dung chuong trinh\n";
return 0;
default:
cout << " Nhap lai!";
break;

}
system("pause");
} while (true);
//huycapphatdong
for (int i = 0; i < r; i++)
delete [] a[i];
delete [] a;
a = nullptr;
system("pause");
return 0;
}

Bài 10.Viết chương trình dùng cấp phát mt1 = new int* [r1];
for (int i = 0; i < r1; i++)
động để khởi tạo ngẫu nhiên giá trị của 2 mt1[i] = new int[c1];
mảng số nguyên theo dạng thức ma trận. mt2 = new int* [r2];
for (int i = 0; i < r2; i++)
Sau đó tính tổng và tích của 2 ma trận đó. mt2[i] = new int[c2];
#include <iostream> srand(time(0));
#include <cstdlib> nhap(mt1, r1, c1);
#include <ctime> nhap(mt2, r2, c2);
#include <conio.h> // xuat mang
using namespace std; cout << " Mang thu nhat la:\n ";
xuat(mt1, r1, c1);
void nhap(int** a, int r, int c) { cout << " Mang thu hai la:\n ";
for (int i = 0; i < r; i++) { xuat(mt2, r2, c2);
for (int j = 0; j < c; j++) system("pause");
a[i][j] = rand() % 100; int chon;
} do
} {
void xuat(int** a, int r, int c) { system("cls");
for (int i = 0; i < r; i++) { cout << " _____MENU_____\n"
for (int j = 0; j < c; j++) << " 1.Tinh tong 2 ma tran \n"
cout << a[i][j] << " \t "; << " 2.Tinh tich 2 ma tran \n"
cout << endl; << " 3.Thoat\n"
} << " Ban chon: ";
} cin >> chon;
switch (chon)
void tinhtong(int** a, int** b, int** tong, int r, int c) { {
for (int i = 0; i < r; i++) { case 1:
for (int j = 0; j < c; j++) {
tong[i][j] = a[i][j] + b[i][j];
} cout << "+++ Chuc nang: Tinh tong 2 ma
} tran \n";
int** tong = new int* [r1];
void tinhtich(int** a, int** b, int** tich, int r1, int c, int c2) { for (int i = 0; i < r1; i++)
for (int i = 0; i < r1; i++) { tong[i] = new int[c1];
for (int j = 0; j < c2; j++) { if (r1 == r2 && c1 == c2)
tich[i][j] = 0; {
for (int k = 0; k < c; k++) { tinhtong(mt1, mt2, tong, r1, c1);
tich[i][j] += a[i][k] * b[k][j]; cout << " Tong cua 2 mang la: \
} n";
} xuat(tong, r1, c1);
} }
} else
cout << " Khong the tinh tong cua
int main() { 2 mang ";
int r1, c1, r2, c2; for (int i = 0; i < r1; i++)
int** mt1, ** mt2; delete[] tong[i];
do { delete[] tong;
cout << " Nhap so hang va so cot cho mang thu tong = nullptr;
nhat : "; break;
cin >> r1 >> c1; }
} while (r1 <= 0 || c1 <= 0);
do {
cout << " Nhap so hang va so cot cho mang thu
hai : ";
cin >> r2 >> c2;
} while (r2 <= 0 || c2 <= 0);

Bài 10:
case 2:
{
cout << "+++ Chuc nang: Tinh tich 2
ma tran \n";
int** tich;
1. Viết chương trình gồm các hàm: -
tich = new int* [r1]; Nhập giá trị hệ số cho phương trình bậc
for (int i = 0; i < r1; i++) 2 - Tính nghiệm phương trình bậc 2 -
tich[i] = new int[c2];
if (c1 == r2) Hàm main kiểm chứng.
{ #include <iostream>
#include <cmath>
tinhtich(mt1, mt2, tich, r1, using namespace std;
c1, c2); void solve_equation(double a, double b, double c, double* x1, double*
cout << " Tich cua 2 mang x2) {
la:\n"; double delta = b * b - 4 * a * c;
xuat(tich, r1, c2); if (delta < 0) {
} *x1 = *x2 = NAN;
else }
cout << " Khong the tinh tich else if (delta == 0) {
cua 2 mang "; *x1 = *x2 = -b / (2 * a);
for (int i = 0; i < r1; i++) }
delete[] tich[i]; else {
delete[] tich; *x1 = (-b + sqrt(delta)) / (2 * a);
tich = nullptr; *x2 = (-b - sqrt(delta)) / (2 * a);
break; }
} }
case 3:
cout << "Cam on ban da su dung int main() {
chuong trinh\n"; double a, b, c, x1, x2;
return 0; do {
default: cout << "Nhap he so a( a khac 0): ";
cout << " Nhap lai!\n"; cin >> a;
} } while (a == 0);
system("pause");
} while (true); cout << "Nhap he so b: ";
for (int i = 0; i < r1; i++) cin >> b;
delete[] mt1[i]; cout << "Nhap he so c: ";
delete[] mt1; cin >> c;
mt1 = nullptr; solve_equation(a, b, c, &x1, &x2);
for (int i = 0; i < r2; i++) if (isnan(x1)) {
delete[] mt2[i]; cout << "Phuong trinh vo nghiem" << endl;
delete[] mt2; }
mt2 = nullptr; else if (x1 == x2) {
return 0; cout << "Phuong trinh co nghiem kep x = " << x1 << endl;
} }
else {
cout << "Phuong trinh co hai nghiem phan biet x1 = " << x1 << "
va x2 = " << x2 << endl;
}
return 0;
}

Bài thực hành 1: Mảng 2 chiều Bài 9: Zizag


Bài 10: Xoắn ốc 1 8 9 16
1 2 3 4 2 7 10 15
12 13 14 5 3 6 11 14
11 16 15 6 4 5 12 13
#include<iostream>
10 9 8 7 using namespace std;
#include<iostream>
const int maxn = 10;
using namespace std;
int main()
const int maxn = 10;
{
int main()
int a[maxn][maxn];
{
int value = 1;
int a[maxn][maxn];
int n;
int value = 1;
do {
int n;
cout << " Nhap hang cua ma tran vuong: ";
do{
cin >> n;
cout << " Nhap hang cua ma tran vuong: ";
} while (n < 2 || n > maxn);
cin >> n;
} while (n < 2 || n > maxn);
for (int j = 0; j < n; j++)
int minr = 0, minc = 0, maxr = n - 1, maxc = n - 1;
{
while (value <= n * n)
if (j % 2 == 0)
{
for (int i = 0; i < n; i++)
// huong1
a[i][j] = value++;
for (int i = minc; i <= maxc; i++)
a[minr][i] = value++;
else
minr++;
for(int i = n - 1;i >= 0; i--)
// huong2
a[i][j] = value++;
for (int i = minr; i <= maxr; i++)
}
a[i][maxc] = value++;
maxc--;
for (int i = 0; i < n; i++)
// huong3
{
for (int i = maxc; i >= minc; i--)
for (int j = 0; j < n; j++)
a[maxr][i] = value++;
cout << a[i][j] << "\t";
maxr--;
cout << endl;
// huong4
}
for (int i = maxr; i >= minr; i--)
a[i][minc] = value ++;
return 0;
minc++;
}
}
-----------------------------------------------------------------------------------------
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
cout << a[i][j] << "\t";
cout << endl;
}

return 0;
}

Đề thi thử gk - Hàm đệ quy tìm số lượng bán ra lớn nhất trong các mặt hàng
đã bán ở 1 ngày nào đó (ngày do người dùng nhập). - Hàm đệ
- Nhập số lượng bán ra của nhiều sản phẩm trong nhiều
quy tìm tổng số lượng bán ra của 1 mặt hàng (do người dùng
ngày.
nhập) trong toàn bộ các ngày lưu trữ.
- Xuất số lượng bán ra của nhiều sản phẩm trong nhiều
- Hàm nhận vào số thứ tự sản phẩm thứ mấy trong danh sách
ngày.
lưu trữ( chẵn giảm lẻ tăng).
- Hàm trả về giá trị bán ra thấp nhất của mỗi sản phẩm
- Hàm trả về con trỏ chứa giá trị địa chỉ mặt hàng bán ra
trong suốt toàn bộ số ngày đã ghi nhận.
được nhiều nhất trong tất cả các ngày đã lưu trữ
- Hàm trả về thứ tự của mặt hàng nào có số lượng bán ra
thấp nhất trong tất cả các mặt hàng trong kết quả đã trả về
ở câu trên.
.
#include <iostream>
#include <conio.h>
using namespace std;
const int maxrow = 30, maxcol = 10;
void nhap(int** a, int r, int c);
void xuat(int** a, int r, int c);
int* minvaluePro(int** a, int r, int c);
int ordinal(int** a, int r, int c);
int max1day(int** a, int rn, int c);
int tongSP(int** a, int r, int cn);
void arrange(int** a, int r, int stt);
int* MaxValue(int** a, int r, int c);
void menu();
int main()
{
int r = 0, c = 0;
int** a = NULL;
int chon;
while (true)
{
system("cls");
menu();
cin >> chon;
switch (chon)
{
case 1:
{
cout << "***Nhap san pham, so ngay, so luong ban ra cua nhieu san pham trong nhieu ngay\n";
do
{
cout << " Nhap so ngay muon luu tru: ";
cin >> r;
} while (r <= 0 || r > maxrow);
do
{
cout << " Nhap so loai san pham: ";
cin >> c;
} while (c <= 0 || c > maxcol);
a = new int* [r];
for (int i = 0; i < r; i++)
a[i] = new int[c];
cout << "____Nhap du lieu____\n";
nhap(a, r, c);
break;
}
case 2:
{
if (r == 0)
{
cout << " Chua nhap du lieu. Hay chon 1\n";
}
else
{
cout << "***Xuat so luong ban ra cua nhieu san pham trong nhieu ngay\n";
cout << "___ Du lieu vua nhap la:\n";
xuat(a, r, c);
}

break;
}
case 3:
{
if (r == 0)
cout << " Chua nhap du lieu. Hay chon 1\n";
else
{
cout << "***Gia tri ban ra thap nhat cua moi san pham trong suot " << r << " ngay da ghi\n";
cout << "___Table:\n";
xuat(a, r, c);
int* p = minvaluePro(a, r, c);
cout << "Gia tri ban ra thap nhat cua moi san pham lan luot la: " ;
for (int i = 0; i < c; i++)
{
cout << p[i] << "\t";
}
cout << endl;
}
break;
}
case 4:
{
if (r == 0)
cout << " Chua nhap du lieu. Hay chon 1\n";
else
{
cout << " *** Thu tu cua mat hang co so luong ban ra thap nhat trong tat ca cac mat hang\n";
cout << "___ Table:\n";
xuat(a, r, c);
cout << " Thu tu mat hang co so luong ban ra thap nhat trong suot " << r << " ngay la: " <<
ordinal(a, r, c) << endl;
}
break;
}
case 5:
{
if (r == 0)
cout << " Chua nhap du lieu. Hay chon 1\n";
else
{
cout << " ***So luong ban ra lon nhat trong cac mat hang da ban o 1 ngay\n";
cout << "___ Table:\n";
xuat(a, r, c);
int rn;
do
{
cout << " Nhap ngay muon tim ra so luong ban lon nhat ";
cin >> rn;
if (rn <= 0 || rn > r)
cout << "Nhap sai. Nhap lai!\n ";
} while (rn <= 0 || rn > r);
cout << " Gia tri lon nhat trong ngay " << rn << " la: ";
cout << max1day(a, rn - 1, c) << endl;
}
break;
}
case 6:
{
if (r == 0)
cout << " Chua nhap du lieu. Hay chon 1\n";
else
{
cout << " ***Tong so luong ban ra cua 1 mat hang trong toan bo cac ngay luu tru\n";
cout << "___ Table:\n";
xuat(a, r, c);
int cn;
do
{
cout << " \nNhap thu tu san pham muon tinh tong so luong ban ra: ";
cin >> cn;
if (cn <= 0 || cn > c)
cout << "Nhap sai. Nhap lai!\n ";
} while (cn <= 0 || cn > c);
cout << " Tong so luong ban ra cua san pham thu " << cn << " la " << tongSP(a, r, cn - 1) <<
endl;
}
break;
}
case 7:
{
if (r == 0)
cout << " Chua nhap du lieu. Hay chon 1\n";
else
{
cout << " ***Sap xep so luong ban cua san pham \n";
cout << "___ Table:\n";
xuat(a, r, c);
int stt;
do
{
cout << " \nNhap so thu tu san pham muon sap xep trong danh sach luu tru: ";
cin >> stt;
if (stt <= 0 || stt > c)
cout << "Nhap sai. Nhap lai!\n ";
} while (stt <= 0 || stt > c);
cout << " San pham thu " << stt << " duoc sap xep lai la: \n";
arrange(a, r, stt - 1);
for (int i = 0; i < r; i++)
cout << a[i][stt - 1] << endl;
}
break;
}
case 8:
{
if (r == 0)
cout << " Chua nhap du lieu. Hay chon 1\n";
else
{
cout << " ***Vi tri cua phan tu co so luong ban duoc lon nhat trong bang\n";
cout << "___ Table:\n";
xuat(a, r, c);
int* p = MaxValue(a, r, c);
for (int i = 0; i < r; i++)
{
int VT = abs(int(p) - int(&a[i][0])) / sizeof(a[0][0]);
if (VT < c)
{
cout << "So luong ban duoc lon nhat trong bang la: " << endl
<< "ngay thu " << i + 1 << " san pham thu "
<< VT + 1 << endl;
}
}
}
break;
}
case 9:
{
cout << " ***Cam on ban da su dung chuong trinh\n";
for (int i = 0; i < r; i++)
delete[] a[i];
delete[] a;
a = nullptr;
return 0;

}
default:
cout << " Vui long chon lai!\n";
break;
}
system("pause");
}
}
void menu()
{
cout << "_______________________________MENU____________________________\n"
<< "1. Nhap san pham, so ngay, so luong ban ra cua nhieu san pham trong nhieu ngay\n"
<< "2. Xuat so luong ban ra cua nhieu san pham trong nhieu ngay\n"
<< "3. Gia tri ban ra thap nhat cua moi san pham trong suot toan bo so ngay da ghi\n"
<< "4. Thu tu cua mat hang co so luong ban ra thap nhat trong tat ca cac mat hang\n"
<< "5. So luong ban ra lon nhat trong cac mat hang da ban o 1 ngay\n"
<< "6. Tong so luong ban ra cua 1 mat hang trong toan bo cac ngay luu tru\n"
<< "7. Sap xep so luong ban cua san pham (do nguoi dung nhap) trong toan bo cac ngay luu tru\n"
<< " (gia tri giam dan theo ngay chan va tang dan theo ngay le)\n"
<< "8. Vi tri cua phan tu co so luong ban duoc lon nhat trong bang\n"
<< "9. Thoat\n"
<< " Ban chon: ";
}
void nhap(int** a, int r, int c)
{
for (int i = 0; i < r; i++)
{
cout << "*****Nhap so luong ban ra cua ngay thu " << i + 1 << " :\n ";
for (int j = 0; j < c; j++)
{
do
{
cout << "+ Nhap so luong ban ra cua san pham " << j + 1 << " ngay " << i + 1 << " : ";
cin >> a[i][j];
if (a[i][j] <= 0)
cout << " Nhap sai. Nhap lai!\n";
} while (a[i][j] <= 0);
}

}
void xuat(int** a, int r, int c)
{
for (int i = 0; i < r; i++)
{
cout << " Ngay " << i + 1 << ";
for (int j = 0; j < c; j++)
cout << a[i][j] << " \t ";
cout << endl;
}

}
int* minvaluePro(int** a, int r, int c)
{
int* b = new int[c];
for (int i = 0; i < c; i++) {
int min = a[0][i];
for (int j = 1; j < r; j++) {
if (a[j][i] < min)
{
min = a[j][i];
}
}
b[i] = min;
}
return b;
}
int ordinal(int** a, int r, int c)
{
int* p = minvaluePro(a, r, c);
float min = p[0];
int sp = 1;
for (int i = 1; i < c; i++) {
if (p[i] < min)
{
min = p[i];
sp = i + 1;
}
}
delete[] p;
return sp;
}
int max(int a, int b)
{
if (a > b)
return a;
else
return b;
}
int max1day(int** a, int rn, int c)
{
if (c == 1)
return a[rn][0];
else
return max(a[rn][c - 1], max1day(a,rn, c - 1));
Hàm chính phương và hoàn thiện
// Hàm đếm số lượng số chính phương trong mảng
int countPerfectSquares(int* arr, int size) {
int count = 0;
} for (int i = 0; i < size; i++) {
int tongSP(int** a, int r, int cn) if (sqrt(*(arr + i)) == floor(sqrt(*(arr + i)))) {
{ count++;
if (r == 1) }
return a[0][cn]; }
else return count;
return a[r - 1][cn] + tongSP(a, r - 1,cn); }
}
void swapInt(int a, int b) // Hàm kiểm tra mảng có số hoàn thiện hay không
{ bool hasPerfectNumber(int* arr, int size) {
int tmp = a; for (int i = 0; i < size; i++) {
a = b; int sum = 0;
b = tmp; for (int j = 1; j <= *(arr + i) / 2; j++) {
} if (*(arr + i) % j == 0) {
void arrange(int** a, int r, int stt) sum += j;
{ }
for (int i = 0; i < r; i++) }
{ if (sum == *(arr + i)) {
if (i % 2 != 0) return true;
{ }
for (int j = i + 2; j < r; j += 2) }
{ return false;
if (a[i][stt] < a[j][stt]) }
swap(a[i][stt], a[j][stt]);
} // Hàm kiểm tra mảng có số âm hay không
} bool hasNegativeNumber(int* arr, int size) {
else for (int i = 0; i < size; i++) {
{ if (*(arr + i) < 0) {
for (int j = i + 2; j < r; j += 2) return true;
{ }
if (a[i][stt] > a[j][stt]) }
swap(a[i][stt], a[j][stt]); return false;
} }
} // Hàm trả về địa chỉ số chính phương đầu tiên trong mảng. Nếu
} không có trả về NULL
int* getFirstPerfectSquare(int* arr, int size) {
} for (int i = 0; i < size; i++) {
int* MaxValue(int** a, int r, int c) { if (sqrt(*(arr + i)) == floor(sqrt(*(arr + i)))) {
int* maxVal = &a[0][0]; return (arr + i);
for (int i = 0; i < r; i++) }
{ }
for (int j = 0; j < c; j++) return NULL;
{ }
if (a[i][j] > *maxVal) // Hàm trả về địa chỉ số nhỏ nhất xuất hiện đầu tiên trong mảng
{ int* getFirstMinNumber(int* arr, int size) {
maxVal = &a[i][j]; int* result = arr;
} for (int i = 1; i < size; i++) {
} if (*(arr + i) < *result) {
} result = (arr + i);
return maxVal; }
} }
return result;
}

You might also like