Thứ Hai, 2 tháng 1, 2017

Bài tập 236 * Cho 2 mảng a,b. Hãy cho biết số lần xuất hiện của mảng a trong mảng b

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
#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

// 236 * Cho 2 mảng a,b. Hãy cho biết số lần xuất hiện của mảng a trong mảng b
// VD :
// A : 1 2
// B : 1 2 1 2 3
//==> 2
int Dem_Xuat_Hien(int A[], int B[], int Na, int Nb)
{
 int i = 0, j = 0, dem = 0, flag = 0, vt = 0;
 for (i = 0; i < Nb; i++)
 {
  if (B[i] == A[0] && Nb - i >= Na)
  {
   vt = i;
   for (j = 0, flag = 1; j < Na; j++, vt++)
   {
    if (A[j] != B[vt])
    {
     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 Nb = 0;
 NhapN(Nb);

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

 int kq = Dem_Xuat_Hien(A, B, Na, Nb);
 cout << "Bai tap 236 la " << kq;

 cout << "\n";
 return 0;
}

Bài tập 320-321-322-323-324: Tính Tổng các số dương trong ma trận

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#include <iostream>
using namespace std;

#define MAX 100
//MẢNG 2 CHIỀU - MA TRẬN VUÔNG

// 1. NHẬP SỐ PHẦN TỬ CỦA MA TRẬN
void NhapN(int &N)
{
 do
 {
  cout << "Nhap N = ";
  cin >> N;
  if (N <= 0 || N > MAX)
   cout << "Nhap sai xin vui long nhap lai!!!\n";
 } while (N <= 0 || N > MAX);
}

// 2. NHẬP MA TRẬN
void Nhap_MaTran(int A[][MAX], int N)
{
 for (int i = 0; i < N; i++)
 {
  for (int j = 0; j < N; j++)
  {
   cout << "A["<<i<<"]["<<j<<"] = ";
   cin>>A[i][j];
  }
 }
}
// 3. XUẤT MA TRẬN
void Xuat_MaTran(int A[][MAX], int N)
{
 for (int i = 0; i < N; i++)
 {
  for (int j = 0; j < N; j++)
  {
   cout << A[i][j] << "\t";
  }
  cout << "\n";
 }
}


// TÍNH TOÁN
// 1. Khai báo biến Tổng
// 2.Duyệt bởi 2 vòng lặp
//  2.1 Nếu
//   Tăng tổng
// 3. Trả về tổng

//320 Tổng các số dương trong ma trận thực
int Tong_Duong(int A[][MAX], int N)
{
 int S = 0;
 for (int i = 0; i < N; i++)
 {
  for (int j = 0; j < N; j++)
  {
   if (A[i][j] > 0)
    S += A[i][j];
  }
 }
 return S;
}

//321 Tích các số lẻ trong ma trận nguyên
int Tich_Le(int A[][MAX], int N)
{
 int P = 1;
 for (int i = 0; i < N; i++)
 {
  for (int j = 0; j < N; j++)
  {
   if (A[i][j] % 2 != 0)
    P *= A[i][j];
  }
 }
 return P;
}

//322 Tổng giá trị trên 1 dòng ma trận thực
// VD: 
// 1 3 4 ==> 8 
// 4 5 1 ==> 10
// 1 4 2 ==> 7
int Tong_Dong_BK(int A[][MAX], int N, int dong)
{
 int S = 0;
 for (int j = 0; j < N; j++)
 {
  S += A[dong][j];
 }
 return S;
}

void Xuat_Tong_Dong(int A[][MAX], int N)
{
 for (int i = 0; i < N; i++)
 {
  int kq = Tong_Dong_BK(A, N, i);
  cout << "Tong dong thu " << i << " la " << kq<<"\n";
 }
}

//323 Tích giá trị dương trên 1 cột ma trận thực
int Tich_Cot_Duong_BK(int A[][MAX], int N, int cot)
{
 int P = 1;
 for (int i = 0; i < N; i++)
 {
  if (A[i][cot] > 0)
   P *= A[i][cot];
 }
 return P;
}

void Xuat_Tich_Cot_Duong(int A[][MAX], int N)
{
 for (int j = 0; j < N; j++)
 {
  int kq = Tich_Cot_Duong_BK(A, N, j);
  cout << "Tich cot duong thu " << j << " la " << kq << "\n";
 }
}


//324 Tổng giá trị dương trên 1 dòng ma trận thực
int Tong_Dong_Duong_BK(int A[][MAX], int N, int dong)
{
 int S = 0;
 for (int j = 0; j < N; j++)
 {
  if (A[dong][j]> 0)
   S += A[dong][j];
 }
 return S;
}

void Xuat_Tong_Dong_Duong(int A[][MAX], int N)
{
 for (int i = 0; i < N; i++)
 {
  int kq = Tong_Dong_Duong_BK(A, N, i);
  cout << "Tong dong thu " << i << " la " << kq << "\n";
 }
}

void main()
{
 int A[MAX][MAX], N = 0;
 // Nhập số phần tử của ma trận
 NhapN(N);
 // Nhập ma trận
 Nhap_MaTran(A, N);
 // Xuất ma trận
 cout << "Ma tran ban dau gom : \n";
 Xuat_MaTran(A, N);
 cout << "\n";

 int kq_Tongduong = Tong_Duong(A, N);
 cout << "BAI TAP 320 : Tong duong la " << kq_Tongduong;
 cout << "\n";

 int kq_Tichle = Tich_Le(A, N);
 cout << "BAI TAP 321 : Tich le la " << kq_Tichle;
 cout << "\n";

 cout << "BAI TAP 322 tong dong la \n";
 Xuat_Tong_Dong(A, N);
 cout << "\n";

 cout << "BAI TAP 323 Tich cot duong la \n";
 Xuat_Tich_Cot_Duong(A, N);
 cout << "\n";

 cout << "BAI TAP 324 Tong dong duong la \n";
 Xuat_Tong_Dong_Duong(A, N);
 cout << "\n";
 
}

Thuật toán sắp xếp QuickSort

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#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";
 }
}

// Hoán vị 2 số
void Swap(int &a, int &b)
{
 int t = a; a = b; b = t;
}


void QuickSort(int a[], int left, int right)
{
 int i = 0, j = 0, x = 0;
 x = a[(left + right) / 2];
 i = left; j = right;
 do
 {
  while (a[i] < x) i++;
  while (a[j] > x) j--;
  if (i <= j)
  {
   Swap(a[i], a[j]);
   i++; j--;
  }
 } while (i <= j);

 if (left<j)
  QuickSort(a, left, j);
 if (i<right)
  QuickSort(a, i, right);
}


int main()
{

 int N = 0;
 NhapN(N);

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

 QuickSort(A, 0, N - 1);
 cout << "Mang sau khi sap xep : \n";
 XuatMang(A, N);
 cout << "\n";

 return 0;
}

Thuật toán sắp xếp Chọn trực tiếp - Thuật toán sắp xếp Selection Sort

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#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";
 }
}

// Hoán vị 2 số
void Swap(int &a, int &b)
{
 int t = a; a = b; b = t;
}

void SelectionSort(int A[], int N)
{
 int VTmin = 0, i = 0, j = 0; // chỉ số phần tử nhỏ nhất trong dãy hiện hành 
 for (i = 0; i < N - 1; i++)//chỉ số đầu tiên của dãy hiện hành
 {
  VTmin = i;
  for (j = i + 1; j < N; j++)
   if (A[VTmin] > A[j])
    VTmin = j; // lưu vtrí phần tử hiện nhỏ nhất 
  Swap(A[VTmin], A[i]);
 }
}

int main()
{

 int N = 0;
 NhapN(N);

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

 SelectionSort(A, N);
 cout << "Mang sau khi sap xep : \n";
 XuatMang(A, N);
 cout << "\n";

 return 0;
}

Thuật toán sắp xếp Nỗi Bọt - Thuật toán sắp xếp Bubble Sort

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#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";
 }
}

// Hoán vị 2 số
void Swap(int &a, int &b)
{
 int t = a; a = b; b = t;
}

void BubbleSort(int A[], int N)
{
 int i = 0, j = 0;
 for (i = 0; i < N - 1; i++)
  for (j = N - 1; j > i; j--)
   if (A[j] < A[j - 1])// nếu sai vị trí thì đổi chỗ     
    Swap(A[j], A[j - 1]);
}


int main()
{

 int N = 0;
 NhapN(N);

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

 BubbleSort(A, N);
 cout << "Mang sau khi sap xep : \n";
 XuatMang(A, N);
 cout << "\n";

 return 0;
}

Thuật toán sắp xếp chèn trực tiếp - Thuật toán sắp xếp Insertion Sort

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#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";
 }
}

// Hoán vị 2 số
void Swap(int &a, int &b)
{
 int t = a; a = b; b = t;
}

void InsertionSort(int A[], int N)
{
 int pos = 0, i = 0; // Khởi tạo giá trị
 int x = 0;//lưu giá trị a[i] tránh bị ghi đè khi dời chỗ các phần tử.  
 for (i = 1; i < N; i++) //đoạn a[0] đã sắp xếp 
 {
  x = A[i];
  pos = i - 1;   
  // tìm vị trí chèn x
  while ((pos >= 0) && (A[pos] > x))
  {
   //kết hợp dời chỗ các phần tử sẽ đứng sau x trong dãy mới
   A[pos + 1] = A[pos];
   pos--;
  }
  A[pos + 1] = x; // chèn x vào dãy  
 }
}


int main()
{

 int N = 0;
 NhapN(N);

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

 InsertionSort(A, N);
 cout << "Mang sau khi sap xep : \n";
 XuatMang(A, N);
 cout << "\n";

 return 0;
}

Thuật toán sắp xếp: Interchange Sort (đổi chỗ trực tiếp)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#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";
 }
}

// Hoán vị 2 số
void Swap(int &a, int &b)
{
 int t = a; a = b; b = t;
}

void InterChangeSort(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(A[i], A[j]);
  }
 }
}

int main()
{

 int N = 0;
 NhapN(N);

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

 InterChangeSort(A, N);
 cout << "Mang sau khi sap xep \n";
 XuatMang(A, N);
 cout << "\n";

 return 0;
}