Приклади програм
Приклад 1. Дано натуральне число n і масив з n цілих чисел (). Чи правда, що вміст масиву однаково читається в прямому і зворотному напрямках?
Розв’язок.
#include <iostream> #include <conio.h> using namespace std; int main() { int n; // Кількість елементів масиву int a[20]; // Масив cout << "n = "; cin >> n; for (int i = 0; i < n; i++) { cout << "a[" << i << "] = "; cin >> *(a + i); // Доступ до окремих елементів масиву // здійснюється додаванням до вказівника цілого } // числа і розіменуванням bool flag = true; // Вказівники pt1 і pt2 встановлюються на початок for (int *pt1 = a, *pt2 = a + n - 1; // і кінець масиву pt1 < pt2; pt1++, pt2--) // і зсуваються назустріч // один одному, поки виконується умова pt1 < pt2 if (*pt1!= *pt2) // Порівняння двох елементів масиву { flag = false; break; } if (flag) cout << "Yes"; else cout << "No"; cout << "\nPress any key"; _getch(); return 0; }
Приклад 2. Дано натуральне число () і дійсні числа , , …, , , , …, . Обчислити .
Розв’язок.
#include <iostream> #include <conio.h> using namespace std; int main() { int n; // Кількість елементів кожного з масивів double v[100], w[100]; // Масиви cout << "n = "; cin >> n; for (double *pt = v; pt < v + n; pt++) // Цикл зсуву { // вказівника pt від першого елемента масиву v cout << "v[" << pt - v << "] = "; // до останнього cin >> *pt; // з доступом до окремих елементів масиву } // розіменуванням вказівника pt for (double *pt = w; pt < w + n; pt++) // Аналогічний { // цикл для масиву w cout << "w[" << pt - w << "] = "; cin >> *pt; } double d = 1; // Вказівник ptv - на перший елемент масиву v, // а вказівник ptw - на останній елемент масиву w for (double *ptv = v, *ptw = w + n - 1; ptv < v + n; // Поки ptv усередині масиву v ptv++, ptw--) // Зсуваємо вказівники d *= *ptv + *ptw; // Доступ за адресами cout << "Result = " << d; cout << "\nPress any key"; _getch(); return 0; }
Приклад 3. Дано натуральне число n () і масив з n дійсних чисел. Вивести його вміст, починаючи з першого додатного елемента і закінчуючи останнім від’ємним (з урахуванням напряму перегляду при виведенні).
Розв’язок.
#include <iostream> using namespace std; int main() { int n; double a[20], *Pt1 = NULL, *Pt2 = NULL; cout << "n = "; cin >> n; for (int i = 0; i < n; i++) // Звичайне введення масиву { cout << "a[" << i << "] = "; cin >> a[i]; } for (int i = 0; i < n; i++) if (a[i] > 0) { Pt1 = &a[i]; // Pt1 отримує адресу першого break; // додатного елемента; завершуємо цикл } if (Pt1) // Перевірка умови Pt1!= NULL { // Якщо додатні елементи є, шукаємо останній з них for (int i = n - 1; i >= 0; i--) if (a[i] > 0) { Pt2 = &a[i]; // Pt2 отримує адресу останнього break; // додатного елемента; завершуємо цикл } if (Pt2) { cout << "Result\n"; if (Pt2 > Pt1) // Нижче Pt1 сприймається як ім'я масиву, // що містить Pt2 - Pt1 + 1 елементів // зі звичайним індексуванням (від 0), // тобто ілюструється операція // індексування вказівника for (int i = 0; i < Pt2 - Pt1 + 1; i++) cout << Pt1[i] << '\t'; else // Тут вже Pt2 сприймається як ім'я // масиву, що містить Pt1 – Pt2 + 1 елементів for (int i = Pt1 - Pt2; i >= 0; i--) cout << Pt2[i] << '\t'; cout << endl; } else cout << "There are no negative numbers \n"; } else cout << "There are no positive numbers\n"; system("pause"); return 0; }
Приклад 4. Дано натуральне число n () і послідовність дійсних чисел , , …, . Упорядкувати члени послідовності за незростанням методом «занурення» («камінчика»). Сутність методу полягає в наступному: для будь-якого значення k з ряду 1, 2,..., n – 1 послідовно розглядаються всі члени , j = 1, 2,..., k, і при виконанні умови члени і міняються місцями з переходом до нового значення j незалежно від того, переставлялися числа чи ні.
Розв’язок.
#include <iostream>
using namespace std; int main() { int n; double a[100], *Pt; cout << "n = "; cin >> n; for (int j = 0; j < n; j++) // Звичайне введення масиву { cout << "a[" << j + 1 << "] = "; cin >> a[j]; } for (int k = 0; k < n - 1; k++) { // На кожному кроці вказівник Pt = a; // встановлюємо на початок масиву for (int j = 0; j < n - 1 - k; j++) { if (*Pt > *(Pt + 1)) { double d = *(Pt + 1); *(Pt + 1) = *Pt; *Pt = d; } Pt++; // Зсув вказівника на один елемент } } cout << "Result\n"; for (int j = 0; j < n; j++) // Виведення масиву cout << "a[" << j + 1 << "] = " << a[j] << '\n'; system("pause"); return 0;
}
Приклад 5. Дано натуральні числа m, n () і два впорядкованих за неубуванням дійсних масиви, які містять відповідно m і n елементів. Переписати вміст цих масивів у третій масив, забезпечивши неубування вмісту результуючого масиву.
Розв’язок.
#include <iostream>
using namespace std; int main() { int m, n; double a[100], b[100], c[200]; cout << "Count of array a: "; cin >> m; for (int j = 0; j < m; j++) // Звичайне введення масиву a { cout << "a[" << j << "] = "; cin >> a[j]; } cout << "Count of array b: "; cin >> n; for (int j = 0; j < n; j++) // Звичайне введення масиву b { cout << "b[" << j << "] = "; cin >> b[j]; } double *p_a = a, *p_b = b, *p_c = c; for (int j = 0; j < m + n; j++) { if (p_a == a + m) // Чи досягнутий кінець масиву a? { *p_c = *p_b; // Нижче тричі замість трьох опе- p_b++; // раторів, подібних тим, що записані тут, p_c++; // використовується один оператор } else if (p_b == b + n) // Чи вичерпався масив b? *p_c++ = *p_a++; else // Обидва масиви ще не вичерпалися if (*p_a < *p_b) *p_c++ = *p_a++; else *p_c++ = *p_b++; } cout << "Result\n"; for (int j = 0; j < m + n; j++) // Виведення масиву c cout << "c[" << j << "] = " << c[j] << '\n'; system("pause"); return 0; }
Приклад 6. Дано натуральне число () і послідовність з n дійсних чисел. Знайти в ній найдовшу підпослідовність, що містить тільки додатні числа.
Розв’язок.
#include <iostream> using namespace std; int main() { int n; double a[100]; cout << "Count of array a: "; cin >> n; for (int j = 0; j < n; j++) // Звичайне введення масиву a { cout << "a[" << j << "] = "; cin >> a[j]; } double *p_max = NULL, *p = a, *p1; int Len = 0; // Початкова довжина підпослідовності while (true) { while (p < a + n && *p <= 0) // Пропускаємо недодатні p++; // числа p1 = p; // Запам’ятовуємо адресу першого додатного while (p < a + n && *p > 0) // Йдемо по додатним p++; if (p - p1 > Len) { Len = p - p1; p_max = p1; } if (p == a + n) // Якщо вказівник вийшов за масив, break; // закінчуємо обробку масиву } cout << "Result:\n"; if (p_max) for (int j = 0; j < Len; j++) cout << p_max[j] << '\t'; // Індексування від 0 else cout << "There are no positive numbers"; cout << '\n'; system("pause"); return 0; }
Приклад 7. Дано натуральне число n (), дійсне число w і масив з n дійсних чисел. Видалити з масиву елемент, що є найближчим до числа w.
#include <iostream>
using namespace std; int main() { int n; double a[100], w; cout << "Count of array a: "; cin >> n; for (int j = 0; j < n; j++) // Звичайне введення масиву a { cout << "a[" << j << "] = "; cin >> a[j]; } cout << "w = "; cin >> w; double *p_res = &a[0]; double Len = fabs(w - *p_res); for (double *p = a + 1; p < a + n; p++) if (fabs(w - *p) < Len) { Len = fabs(w - *p); p_res = p; } for (double *p = p_res + 1; p < a + n; p++) *(p - 1) = *p; n--; cout << "Result:\n"; if (n!= 0) for (double *p = a; p < a + n; p++) cout << *p << '\t'; else // У масиві був всього один елемент. Він видалений cout << "Empty"; cout << '\n'; system("pause"); } 1 | 2 | 3 | 4 | Поиск по сайту:
|