Thứ Sáu, 23 tháng 12, 2016

Bài tập 255-256: Sắp xếp mảng tăng dần | sắp xếp mảng giảm dần

#include <iostream>
using namespace std;

#define MAX 100

// MẢNG 1 CHIỀU 
// 1. HÀM NHẬP SỐ PHẦN TỬ
void NhapN(int &N)
{
 do
 {
  cout << "Moi ban nhap so phan tu cua mang N = ";
  cin >> N;

  // 0 < N <= MAX
  // Điều kiện phải ngược lại 
  if (N <= 0 || N > MAX)
   cout << "Nhap sai vui long nhap la 0 < N <= " << MAX << "\n";

 } while (N <= 0 || N > MAX);
}

// 2. HÀM NHẬP MẢNG
void NhapMang(int A[], int N)
{
 for (int i = 0; i < N; i++)
 {
  cout << "A[" << i << "]= ";
  cin >> A[i];
 }
}

// 3. HÀM XUẤT MẢNG
void XuatMang(int A[], int N)
{
 for (int i = 0; i < N; i++)
 {
  cout << A[i] << "\t";
 }
}

void Swap_HoanVi(int &a, int &b)
{
 int t = a; a = b; b = t;
}

//255 Sắp xếp mảng tăng dần
void SapXep_Tang(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])
    Swap_HoanVi(A[i], A[j]);
  }
 }
}
//256 sắp xếp mảng giảm dần
void SapXep_Giam(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])
    Swap_HoanVi(A[i], A[j]);
  }
 }
}

void SapXep_Tang_ChiTiet(int A[], int N)
{
 for (int i = 0; i < N - 1; i++)
 {
  cout << "\n====================================================\n";
  cout << "\nStep i " << i + 1 << "\n";
  XuatMang(A, N);

  for (int j = i + 1; j < N; j++)
  {
   if (A[i] > A[j])
   {
    Swap_HoanVi(A[i], A[j]);
    cout << "\nStep j " << j << " : ";
    XuatMang(A, N);
   }
  }
  cout << "\n====================================================\n";
 }
}

int main()
{
 int Na = 0;
 NhapN(Na);

 int A[MAX];
 NhapMang(A, Na);
 cout << "MANG A BAN DAU\n";
 XuatMang(A, Na);
 cout << "\n";

 SapXep_Tang(A, Na);
 XuatMang(A, Na);
 cout << "\n";

 SapXep_Giam(A, Na);
 XuatMang(A, Na);
 cout << "\n";
 return 0;
}

Bài tập 252-253-254 : Hãy viết hàm ktra mảng có sóng hay ko?

#include <iostream>
using namespace std;

#define MAX 100

// MẢNG 1 CHIỀU 
// 1. HÀM NHẬP SỐ PHẦN TỬ
void NhapN(int &N)
{
 do
 {
  cout << "Moi ban nhap so phan tu cua mang N = ";
  cin >> N;

  // 0 < N <= MAX
  // Điều kiện phải ngược lại 
  if (N <= 0 || N > MAX)
   cout << "Nhap sai vui long nhap la 0 < N <= " << MAX << "\n";

 } while (N <= 0 || N > MAX);
}

// 2. HÀM NHẬP MẢNG
void NhapMang(int A[], int N)
{
 for (int i = 0; i < N; i++)
 {
  cout << "A[" << i << "]= ";
  cin >> A[i];
 }
}

// 3. HÀM XUẤT MẢNG
void XuatMang(int A[], int N)
{
 for (int i = 0; i < N; i++)
 {
  cout << A[i] << "\t";
 }
}

//Kĩ thuật đặt cờ hiệu
// KIỂM TRA HOÀN TOÀN - chỉ cần 1 phần tử sai là ==> sai


// KIỂM TRA TỒN TẠI - Chỉ cần 1 phần tử đúng là ==> đúng
// flag = 0 ==> flag = 1 ==> flag

//
//252 Ta định nghĩa 1 mảng đc gọi là dạng sóng, 
//khi ptử có trị số I lớn hơn hoặc nhỏ hơn 2 ptử xung quanh.
//Hãy viết hàm ktra mảng có sóng hay ko ?
// KIỂM TRA HOÀN TOÀN - chỉ cần 1 phần tử sai là ==> sai
int KiemTra_DangSong(int A[], int N)
{
 int flag = 1; // Thỏa mản dạng sóng
 for (int i = 1; i < N - 1; i++)
 {
  if ((A[i - 1] > A[i] && A[i] > A[i + 1]) || (A[i - 1] < A[i] && A[i] < A[i + 1]))
  {
   flag = 0; // ko thỏa dạng sóng
   break;
  }
 }
 return flag;
}

//253 Hãy cho biết tất cả ptử trong mảng a có nằm trong mảng b ko ?
// VD : 
// A : 1 3 5 
// B : 4 5 1 3 2
int KT_MangA_In_MangB(int A[], int B[], int Na, int Nb)
{
 int flag = 0; // Chưa có thỏa
 int dem = 0;
 for (int i = 0; i < Na; i++)
 {
  for (int j = 0; j < Nb; j++)
  {
   if (A[i] == B[j])
    dem++;
  }
 }
 if (dem == Na)
  flag = 1; //Thỏa mản
 return flag;
}

//254 hãy đếm giá trị trong mảng thỏa : lớn hơn tất cả các giá trị đứng đằng trước nó
// VD : 1 4 6 1 3 5 10
int Dem_GiaTri_Max_Truoc_Do(int A[], int N)
{
 int dem = 0;
 for (int i = 1; i < N; i++)
 {
  int flag = 1;
  for (int j = 0; j < i; j++)
  {
   if (A[i] <= A[j]) // điều điện sai
   {
    flag = 0;
    break;
   }
  }
  if (flag == 1)
   dem++;
 }
 return dem;
}

int main()
{
 int Na = 0;
 NhapN(Na);

 int A[MAX];
 NhapMang(A, Na);
 cout << "MANG A BAN DAU\n";
 XuatMang(A, Na);
 cout << "\n";

 int kq_252 = KiemTra_DangSong(A, Na);
 if (kq_252 == 1)
  cout << "Bai Tap 252 : la dang SONG";
 else
  cout << "Bai Tap 252 : KO la dang SONG";
 cout << "\n";

 int kq_254 = Dem_GiaTri_Max_Truoc_Do(A, Na);
 cout << "Bai Tap 254 : Dem lon hon truoc do la " << kq_254;
 cout << "\n";

 
 int Nb = 0;
 NhapN(Nb);

 int B[MAX];
 NhapMang(B, Nb);
 cout << "MANG B BAN DAU\n";
 XuatMang(B, Nb);
 cout << "\n";

 int kq_253 = KT_MangA_In_MangB(A, B, Na, Nb);
 if (kq_253 == 1)
  cout << "Bai Tap 253 : Mang A trong Mang B";
 else
  cout << "Bai Tap 252 : KO phai";
 cout << "\n";
 
 return 0;
}

Bài tập 248-249-250-251:Ktra mảng có tăng dần hay ko?

#include <iostream>
using namespace std;

#define MAX 100

// MẢNG 1 CHIỀU 
// 1. HÀM NHẬP SỐ PHẦN TỬ
void NhapN(int &N)
{
 do
 {
  cout << "Moi ban nhap so phan tu cua mang N = ";
  cin >> N;

  // 0 < N <= MAX
  // Điều kiện phải ngược lại 
  if (N <= 0 || N > MAX)
   cout << "Nhap sai vui long nhap la 0 < N <= " << MAX << "\n";

 } while (N <= 0 || N > MAX);
}

// 2. HÀM NHẬP MẢNG
void NhapMang(int A[], int N)
{
 for (int i = 0; i < N; i++)
 {
  cout << "A[" << i << "]= ";
  cin >> A[i];
 }
}

// 3. HÀM XUẤT MẢNG
void XuatMang(int A[], int N)
{
 for (int i = 0; i < N; i++)
 {
  cout << A[i] << "\t";
 }
}

//Kĩ thuật đặt cờ hiệu
// KIỂM TRA HOÀN TOÀN - chỉ cần 1 phần tử sai là ==> sai


// KIỂM TRA TỒN TẠI - Chỉ cần 1 phần tử đúng là ==> đúng
// flag = 0 ==> flag = 1 ==> flag

//248 Ktra mảng có tăng dần hay ko ?
// flag = 1 ==> flag = 0 ==> flag
int KiemTra_Tang(int A[], int N)
{
 int flag = 1; // Hoàn toàn tăng
 for (int i = 0; i < N - 1; i++)
 {
  if (A[i] > A[i + 1]) // điều kiện sai
  {
   flag = 0; // ko phải tăng
   break;
  }
 }
 return flag;
}
//249 Ktra mảng có giảm dần hay ko ?
// flag = 1 ==> flag = 0 ==> flag
int KiemTra_Giam(int A[], int N)
{
 int flag = 1;// Hoàn toàn giảm
 for (int i = 0; i < N - 1; i++)
 {
  if (A[i] < A[i + 1]) // điều kiện sai
  {
   flag = 0; // không phải giảm
   break;
  }
 }
 return flag;
}

//250 Hãy cho biết các ptử trong mảng có lập thành cấp số cộng ko ? Nếu có chỉ ra công sai d.
// VD1 : 1 3 5 7 9
// VD2 : 2 4 6 8 10
// VD3 : 5 10 15 20
int KiemTra_CapSoCong(int A[], int N, int &d)
{
 d = A[1] - A[0];
 int flag = 1; // Luôn có cấp số cộng
 for (int i = 2; i < N - 1; i++)
 {
  if ((A[i] - A[i - 1]) != d) // điều kiện sai
  {
   flag = 0; // không tồn tại cấp số cộng
   break;
  }
 }
 return flag;
}

//251 Hãy cho biết các ptử trong mảng có bằng nhau ko ?
int KiemTra_MangBangNhau(int A[], int N)
{
 int flag = 1; // hoàn toàn bằng nhau
 for (int i = 0; i < N - 1; i++)
 {
  if (A[i] != A[i + 1]) // điều kiện sai
  {
   flag = 0;  // không bằng nhau
   break;
  }
 }
 return flag;
}


int main()
{
 int Na = 0;
 NhapN(Na);

 int A[MAX];
 NhapMang(A, Na);
 cout << "MANG A BAN DAU\n";
 XuatMang(A, Na);
 cout << "\n";

 int kq_248 = KiemTra_Tang(A, Na);
 if (kq_248 == 1)
  cout << "BAI TAP 248 : Tang dan";
 else
  cout << "BAI TAP 248 : Khong tang dan";

 cout << "\n";

 int kq_249 = KiemTra_Giam(A, Na);
 if (kq_249 == 1)
  cout << "BAI TAP 249 : Giam dan";
 else
  cout << "BAI TAP 249 : Khong giam dan";

 cout << "\n";

 int d = 0;
 int kq_250 = KiemTra_CapSoCong(A, Na, d);
 if (kq_250 == 1)
  cout << "BAI TAP 250 : la cap so cong voi cong sai d = "<<d;
 else
  cout << "BAI TAP 250 : Khong phai la cap so cong";

 cout << "\n";

 int kq_251 = KiemTra_MangBangNhau(A, Na);
 if (kq_251 == 1)
  cout << "BAI TAP 251 : Bang nhau";
 else
  cout << "BAI TAP 251 : Khong bang nhau";
 
 cout << "\n";
 return 0;
}

Bài tập 207-208-209 : Tính tổng các phần tử cực trị

#include <iostream>
using namespace std;

#define MAX 100

// MẢNG 1 CHIỀU 
// 1. HÀM NHẬP SỐ PHẦN TỬ
void NhapN(int &N)
{
 do
 {
  cout << "Moi ban nhap so phan tu cua mang N = ";
  cin >> N;

  // 0 < N <= MAX
  // Điều kiện phải ngược lại 
  if (N <= 0 || N > MAX)
   cout << "Nhap sai vui long nhap la 0 < N <= " << MAX << "\n";

 } while (N <= 0 || N > MAX);
}

// 2. HÀM NHẬP MẢNG
void NhapMang(int A[], int N)
{
 for (int i = 0; i < N; i++)
 {
  cout << "A[" << i << "]= ";
  cin >> A[i];
 }
}

// 3. HÀM XUẤT MẢNG
void XuatMang(int A[], int N)
{
 for (int i = 0; i < N; i++)
 {
  cout << A[i] << "\t";
 }
}


// Hàm Tính Tổng
// 1 Khai báo biến Tổng S = 0
// 2. Duyệt
//  2.1 Nếu
//   Tính tổng
// 3 Trả về tổng

//207 Tổng các ptử cực trị – Cực trị là ptử khi nó lớn hoặc nhỏ hơn ptử xung quanh
// VD : 2 4 6 3 4 1 6 
// ==>  2   6 3 4 1 6 
int Tong_CucTri(int A[], int N)
{
 int S = 0;
 for (int i = 1; i < N - 1; i++)
 {
  // Xét phần tử thứ i
  if ((A[i] > A[i - 1] && A[i] > A[i + 1]) || (A[i] < A[i - 1] && A[i] < A[i + 1]))
   S = S + A[i];
 }

 // Xét phần tử đầu tiên
 if (A[0] > A[1] || A[0] < A[1])
  S += A[0];

 // Xét phần tử cuối cùng
 if (A[N - 1] > A[N - 2] || A[N - 1] < A[N - 2])
  S += A[N - 1];

 return S;
}
//208 Tổng các ptử chính phương
bool KiemTra_SCP(int N)
{
 for (int i = 1; i <= N / 2; i++)
 {
  if (i * i == N)
   return true; // Là số chính phương
 }
 return false;  // Không là số chính phương
}

int Tong_SCP(int A[], int N)
{
 int S = 0;
 for (int i = 0; i < N; i++)
 {
  // Gọi hàm kiểm tra SCP
  bool kq = KiemTra_SCP(A[i]);
  if (kq)
   S += A[i];
 }
 return S;
}

//209 Tổng các ptử đối xứng
// VD : 123 
// ==> 3 ==> 0  * 10 + 3    = 3
// ==> 2 ==> 3  * 10 + 2 = 32
// ==> 1 ==> 32 * 10 + 1 = 321
int SoDaoNguoc(int N)
{
 int sdn = 0;
 while (N > 0)
 {
  int dv = N % 10;
  sdn = sdn * 10 + dv;
  N = N / 10;
 }
 return sdn;
}

// VD :  1 12 121 321 454 
int Tong_SDX(int A[], int N)
{
 int S = 0;
 for (int i = 0; i < N; i++)
 {
  int sdn = SoDaoNguoc(A[i]);
  if (sdn == A[i])
  {
   S += A[i];
  }
 }
 return S;
}


int main()
{

 int N = 0;
 NhapN(N);

 int A[MAX];
 NhapMang(A, N);
 cout << "MANG BAN DAU\n";
 XuatMang(A, N);
 cout << "\n";

 int kq_207 = Tong_CucTri(A, N);
 cout << "BAI TAP 207 : tong cuc tri = " << kq_207;
 cout << "\n";

 int kq_208 = Tong_SCP(A, N);
 cout << "BAI TAP 208 : tong so chinh phuong = " << kq_208;
 cout << "\n";

 
 int kq_209 = Tong_SDX(A, N);
 cout << "BAI TAP 209 : tong so doi xung = " << kq_209;
 cout << "\n";
 
 cout << "\n";
 return 0;
}

Bài tập 234-235 : Cho 2 mảng a, b.Đếm ptử chỉ xuất hiện 1 trong 2 mảng

#include <iostream>
using namespace std;

#define MAX 100

// MẢNG 1 CHIỀU 
// 1. HÀM NHẬP SỐ PHẦN TỬ
void NhapN(int &N)
{
 do
 {
  cout << "Moi ban nhap so phan tu cua mang N = ";
  cin >> N;

  // 0 < N <= MAX
  // Điều kiện phải ngược lại 
  if (N <= 0 || N > MAX)
   cout << "Nhap sai vui long nhap la 0 < N <= " << MAX << "\n";

 } while (N <= 0 || N > MAX);
}

// 2. HÀM NHẬP MẢNG
void NhapMang(int A[], int N)
{
 for (int i = 0; i < N; i++)
 {
  cout << "A[" << i << "]= ";
  cin >> A[i];
 }
}

// 3. HÀM XUẤT MẢNG
void XuatMang(int A[], int N)
{
 for (int i = 0; i < N; i++)
 {
  cout << A[i] << "\t";
 }
}

// DẠNG ĐẾM
// 1. Khai báo biến đếm
// 2. Duyệt
//  2.1 Nếu
//   tăng đếm
// 3. Trả về kết quả đếm


//234 Cho 2 mảng a, b.Đếm ptử chỉ xuất hiện 1 trong 2 mảng
// VD : 
// A : 1 4 6
// B : 1 4 7 9 8
//==> 6 7 9 8
int Dem_Xuat_Hien_Trong_2_Mang(int A[], int B[], int Na, int Nb)
{
 int i, j, dem = 0, flag;
 for (i = 0; i < Na; i++)
 {
  flag = 1;
  for (j = 0; j < Nb; j++)
  {
   if (A[i] == B[j])
   {
    flag = 0;
    break;
   }
  }
  if (flag == 1)
   dem++;
 }

 for (i = 0; i < Nb; i++)
 {
  flag = 1;
  for (j = 0; j < Na; j++)
  {
   if (B[i] == A[j])
   {
    flag = 0;
    break;
   }
  }
  if (flag == 1)
   dem++;
 }

 return dem;
}
//235 Cho 2 mảng a, b.Liệt kê ptử xuất hiện trong 2 mảng
void LietKe_Xuat_Hien_Trong_2_Mang(int A[], int B[], int Na, int Nb)
{
 int i, j;
 for (i = 0; i < Na; i++)
 {
  for (j = 0; j < Nb; j++)
  {
   if (A[i] == B[j])
   {
    cout << A[i]<<"\t";
    break;
   }
  }
 }
}

int main()
{
 int Na = 0;
 NhapN(Na);

 int A[MAX];
 NhapMang(A, Na);
 cout << "MANG A BAN DAU\n";
 XuatMang(A, Na);
 cout << "\n";
 
 int Nb = 0;
 NhapN(Nb);

 int B[MAX];
 NhapMang(B, Nb);
 cout << "MANG B BAN DAU\n";
 XuatMang(B, Nb);
 cout << "\n";

 int dem = Dem_Xuat_Hien_Trong_2_Mang(A, B, Na, Nb);
 cout << "Bai Tap 234 : " << dem;
 
 cout << "\n";
 cout << "Bai Tap 235 : Xuat hien trong ca 2 mang A & B  gom\n";
 LietKe_Xuat_Hien_Trong_2_Mang(A, B, Na, Nb);
 return 0;
}