Задачи и решения: Указатели C++
Тему Указатели в C++ мы рассмотрели в двух статьях:
– Часть 1: Указатели С++
– Часть 2: Указатели С++
Теперь вам придется много практиковаться, чтобы закрепить знания и до конца разобраться. Решим несколько задач для начала.
1. Задачка элементарная, но требует хорошего понимания что такое указатели. Дан указатель: double **p = 0; Выполните следующие задания (решения можно оформлять внутри функции main):
* создайте конструкцию, изображенную на рисунке;
* выведите число, указанное в квадратике, на экран;
* после этого удалите все динамические объекты.
Опять же – ищем самое короткое решение. Автор: Olej
#include
using namespace std;
int main( void ) {
double **p = 0;
*( *( p = new double* ) = new double ) = 2;
cout << **p << endl;
delete *p;
delete p;
}
Посмотреть код
2. Объявите указатель на массив типа double и предложите пользователю выбрать его размер. Далее напишите четыре функции: первая должна выделить память для массива, вторая – заполнить ячейки данными, третья – показать данные на экран, четвертая – освободить занимаемую память. Программа должна предлагать пользователю продолжать работу (создавать новые динамические массивы ) или выйти из программы.
#include
using namespace std;
double* giveMemoryToArr(double* startPtr, int sizeOfArr);
void fillArr(double* ptrArr, int sizeOfArr);
void showArr(double* ptrArr, int sizeOfArr);
double* freeMemory(double* ptrArr);
int main()
{
setlocale(LC_ALL, "rus");
double* pArrForFill = 0;
char userAnswer = 0;
do
{
int sizeOfArray = 0;
cout << "Размер массива: ";
cin >> sizeOfArray;
pArrForFill = giveMemoryToArr(pArrForFill, sizeOfArray);
fillArr(pArrForFill, sizeOfArray);
showArr(pArrForFill, sizeOfArray);
pArrForFill = freeMemory(pArrForFill);
cout << "\nПродолжить (1). Выйти (0): ";
cin >> userAnswer;
} while (userAnswer != '0');
return 0;
}
double* giveMemoryToArr(double* ptrArr, int sizeOfArr)
{
ptrArr = new double[sizeOfArr];
return ptrArr;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void fillArr(double* ptrArr, int sizeOfArr)
{
for (int i = 0; i < sizeOfArr; i++)
{
ptrArr[i] = (i + 1) * 0.2;
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void showArr(double* ptrArr, int sizeOfArr)
{
for (int i = 0; i < sizeOfArr; i++)
{
cout << ptrArr[i] << " ";
}
cout << endl;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
double* freeMemory(double* ptrArr)
{
delete[] ptrArr;
ptrArr = 0;
return ptrArr;
}
Посмотреть код
3. Объявите указатель на массив типа int и выделите память память для 12-ти элементов. Необходимо написать функцию, которая поменяет значения четных и нечетных ячеек массива. Например есть массив из 4-х элементов:
#include
using namespace std;
void fillArr(int* ptrArr, int sizeOfArr);
void showArr(int* ptrArr, int sizeOfArr);
void swapDataInCells(int* ptrArr, int sizeOfArr);
int main()
{
int sizeOfArray = 12;
int* pArrForSwap = new int[sizeOfArray];
fillArr(pArrForSwap, sizeOfArray);
showArr(pArrForSwap, sizeOfArray);
swapDataInCells(pArrForSwap, sizeOfArray);
showArr(pArrForSwap, sizeOfArray);
delete[] pArrForSwap;
return 0;
}
void fillArr(int* ptrArr, int sizeOfArr)
{
for (int i = 0; i < sizeOfArr; i++)
{
ptrArr[i] = i * 10;
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void showArr(int* ptrArr, int sizeOfArr)
{
for (int i = 0; i < sizeOfArr; i++)
{
cout << ptrArr[i] << " ";
}
cout << endl << endl;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void swapDataInCells(int* ptrArr, int sizeOfArr)
{
int bufferVar = 0; // переменная буфер
for (int i = 0; i < sizeOfArr; i++)
{
if (i % 2 == 0)
{
bufferVar = ptrArr[i];
ptrArr[i] = ptrArr[i + 1];
ptrArr[i + 1] = bufferVar;
}
}
}
Посмотреть код
4. Объявить и заполнить двумерный динамический массив случайными числами от 10 до 50. Показать его на экран. Для заполнения и показа на экран написать отдельные функции. (подсказка: функции должны принимать три параметра – указатель на динамический массив, количество строк, количество столбцов). Количество строк и столбцов выбирает пользователь.
#include
#include
using namespace std;
void show2Arr(int** ArrForChange, int strAmount, int colAmount);
void fill2Array(int** ArrForChange, int strAmount, int colAmount);
int main()
{
setlocale(LC_ALL, "rus");
int stringAmount = 0;
int columnAmount = 0;
cout << "Введите размерность двумерного массива!\n";
cout << "Строк: ";
cin >> stringAmount;
cout << "Столбцов: ";
cin >> columnAmount;
//создавая двумерный динамический массив используем указатель на указатель
int** ArrayForChange = new int*[stringAmount];
for (int i = 0; i < stringAmount; i++)
{
ArrayForChange[i] = new int[columnAmount];
}
fill2Array(ArrayForChange, stringAmount, columnAmount); // заполнение массива
show2Arr(ArrayForChange, stringAmount, columnAmount); // показ на экран
//Очистка памяти динамического двумерного массива
for (int i = 0; i < stringAmount; i++)
{
delete[] ArrayForChange[i];
}
delete[] ArrayForChange;
return 0;
}
void show2Arr(int** ArrForChange, int strAmount, int colAmount)
{
cout << endl << endl;
for (int i = 0; i < strAmount; i++)
{
cout << " | ";
for (int j = 0; j < colAmount; j++)
{
cout << ArrForChange[i][j] << " ";
}
cout << "|" << endl;
}
}
//заполнение элементов двумерного массива случайными значениями
void fill2Array(int** ArrForChange, int strAmount, int colAmount)
{
srand(time(0));
for (int i = 0; i < strAmount; i++)
{
for (int j = 0; j < colAmount; j++)
{
ArrForChange[i][j] = 10 + rand() % 41;
}
}
}
Посмотреть код
4.7
24
01.09.2014 | Posted in Задачи по программированию на C++. Практика программирования.
Do'stlaringiz bilan baham: |