Изменить порядок следования элементов массива на обратный - C (СИ)
Формулировка задачи:
Массив заданного размера N (от 3 до 10) ввести произвольные числа (вещественные по значению). Изменить порядок следования элементов массива на обратный, отдельно до и после R-го элемента (R вводится, по значению, больше 0). Напечатать модифицированный массив. При вводе данных осуществить проверку.
Решение задачи: «Изменить порядок следования элементов массива на обратный»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
//-----------------------------------------------------------------------------
size_t AskSizeOfArray()
{
size_t nArray = 0;
while ((nArray < 3) || (10 < nArray))
{
printf("count elements [3..10]: ");
scanf("%d", &nArray);
}
return nArray;
}
//-----------------------------------------------------------------------------
float* AskElementsOfArray(float array[], size_t nArray)
{
float* head = array;
printf("%d elements: ", nArray);
while (nArray--)
{
scanf("%f", array++);
}
return head;
}
//-----------------------------------------------------------------------------
void PrintArray(float array[], size_t nArray)
{
while (nArray--)
{
printf("%.3f", *array++);
if (nArray)
{
printf(", ");
}
}
printf("\n");
}
//-----------------------------------------------------------------------------
float* FindElement(float array[], size_t nArray, float value)
{
for (; nArray && (*array != value); --nArray, ++array) { ; }
return (*array == value) ? array : NULL;
}
//-----------------------------------------------------------------------------
void Swap(float* a, float* b)
{
float tmp = *a;
*a = *b;
*b = tmp;
}
//-----------------------------------------------------------------------------
void Reverse(float begin[], float end[])
{
for (; begin < end; ++begin, --end)
{
Swap(begin, end);
}
}
//-----------------------------------------------------------------------------
int main()
{
float array[10];
size_t nArray = AskSizeOfArray();
AskElementsOfArray(array, nArray);
printf("source: ");
PrintArray(array, nArray);
printf("separator: ");
float separator;
scanf("%f", &separator);
float* finded = FindElement(array, nArray, separator);
if (finded)
{
Reverse(array, finded - 1);
Reverse(finded + 1, array + nArray - 1);
printf("result = ");
PrintArray(array, nArray);
}
else
{
printf("value %f not found ...\n", separator);
}
system("pause");
return 0;
}
Объяснение кода листинга программы
- Функция AskSizeOfArray() запрашивает у пользователя размер массива в элементах, используя цикл while, который выполняется до тех пор, пока пользователь не введет значение в диапазоне от 3 до 10.
- Функция AskElementsOfArray() запрашивает у пользователя значения элементов массива, используя цикл while, который выполняется столько раз, сколько указано в переменной nArray.
- Функция PrintArray() выводит значения элементов массива на экран, используя цикл while, который выполняется столько раз, сколько указано в переменной nArray.
- Функция FindElement() ищет в массиве элемент, равный переданному значению, используя цикл for и оператор сравнения.
- Функция Swap() меняет местами два указателя на float.
- Функция Reverse() меняет порядок следования элементов массива, используя два вложенных цикла for и функцию Swap().
- В функции main() создается массив array[10], и его размер определяется с помощью функции AskSizeOfArray().
- Вводится значение элемента массива, которое будет использоваться в качестве разделителя.
- Используя функцию FindElement(), в массиве array[] находится элемент, равный переданному значению.
- Если такой элемент найден, с помощью функции Reverse() изменяется порядок следования элементов массива до и после найденного элемента.
- Результат выводится на экран с помощью функции PrintArray().
- Если элемент не найден, выводится сообщение об ошибке.