Цель работы: изучение приёмов обработки одномерных массивов данных, выработка умений алгоритмизации и программирования задач с массивами, отладки и тестирования программ с массивами.
/* Программа 9. Программа демонстрирует типовые процедуры обработки массивов: ввод, вывод, анализ и обработка данных массива.*/
#include <stdio.h>
#include <math.h>
void in_arr(float *arr, int n); // ввод с клавиатуры n элементов массива
void out_arr(float *arr, int n); // вывод на экран n элементов массива
int array_processing(double *arr, int n, double *p sum, double *p prod);
/* Определение суммы s, произведения p и количества k " + "-ых элементов массива, расположенных после первого “ – “-го элемента. Размер массива n <= 50.
ТЕСТ: x = { 1, 2, -1, 2, -2, 3, -3 }, n=7. Результаты: s=5, p=6, k=2.
p sum, p prod, – переменные-указатели. C указателями связаны две специальные операции: & и *. Оператор & x означает "взять адрес" переменной x, оператор *p x – "значение, расположенное по адресу p x".
*/
float max2(float *arr, int n); // поиск в массиве максимальной по модулю
// разности двух чисел. ТЕСТ: x = { 1, 5, 3, 0, -1, 2, 4}, n = 7, результат: = 6.
int max_eqw(float *arr, int n); // определение максимального числа равных
// соседних чисел. ТЕСТ: x = { 3, 1, 3, 0, 1, 1, 1, 1, 2}, n = 9, результат: 4.
main()
{ float x[50], p, s;
int i, k, n;
printf("\n Введите размер массива n: ");
scanf("%d", &n);
in_arr(x, n);
printf(" \n Исходный массив размером %d: \n", n);
out_arr(x, n);
k = array_processing(x, n, &s, &p);
printf("\n В массиве после первого \”-\“-го числа %d чисел x[i]>0, \
их сумма = %.3f, произведение = %.3f ", k, s, p);
printf("\n Макс-я по модулю разность двух чисел = %.3f ", max2(x, n));
printf("\n Макс-е число равных соседних чисел = %.3f ", max_eqw (x, n));
} // Конец main()
/* В комментариях функций in_arr() и out_arr() записаны операторы с элементами массива, обращение к которым выполняется по указателю без операции индексации arr [ i ] */.
void in_arr(float *arr, int n)
{ printf("\n Введите %d элементов массива: ", n);
for (int i = 0; i < n; i++)
scanf("%e", &arr[i]); // scanf("%e", arr++);
}
void out_arr(float *arr, int n)
{ for (int i = 0; i < n; i++)
{ printf(" %.3f ", x[i]); // printf(" %.3f ", *x++);
if ((i+1) % 8 == 0) // вывод массива по 8 чисел в строке:
printf("\n");
}
}
int array_processing(double *arr, int n, double *psum, double *pprod)
{ int i;
*psum = 0; *pprod = 1; k = 0, m = -1; // инициализация
for (m = 0; m < n; m++)
if (arr[m] < 0) break;
for (i = m+1; i < n; i++)
if (arr[i] > 0)
{ *psum += arr[i];
*pprod *= arr[i];
k += 1;
}
return k;
}
float max2(float *arr, int n)
{ float k; int k, m = 0;
for(int i = 0; i < n-1; i++)
for(k = i+1; k < n; k++)
if(fabs(x[i]-x[k]) > m) m = fabs(x[i] - x[k]);
return m;
}
int max_eqw(float *arr, int n)
{ int i, k=0, m=0;
for(i=0; i<n-1; i++)
if(x[i] == x[i+1]) m++;
else if(m > k) k = m, m = 0;
return k+1;
}
Вопросы и упражнения
1. Как организован одномерный массив в программе: тип элементов массива, их расположение в памяти компьютера?
2. Как объявить массив в программе?
3. Какое значение имеет объект программы имя массива? Можно ли изменить это значение?
4. Как обратиться по указателю к элементу arr[i] массива?
5. Есть ли ошибка в списке инициализации массива: int х[3] = {1, 2, 3, 4};?
6. Напишите операторы вывода элементов одномерного массива по заданному условию: а) каждого k-го элемента, б) m последних элементов, в) только отрицательных или только положительных элементов.
7. Напишите функции: а) поиск минимального (максимального) элемента массива, б) поиск двух наибольших (наименьших) чисел в массиве.
8. Выполните упражнение 6 c выбором элементов массива по указателямю.
9. Определите значение m как результат операторов:
int m = 0, n = 10; // x[10] = { 1, 2, 2, 3, 4, 4, 5, 6, 6, 7 }
for(int i = 0; i < n - i; i++)
if(x[i]!= x[i+1]) m++; else m - -;