Найти произведение (ненулевых) элементов массива, находящихся на позициях, кратных числу 3 - C (СИ)
Формулировка задачи:
Программа запускается но выводит не то, что нужно.
Задание:
Дан массив из 18 вещественных чисел, все элементы которого различны.
1) Найти произведение (ненулевых) элементов массива, находящихся на позициях, кратных числу 3.
2) Найти квадраты всех чисел, расположенных между минимальным и максимальным значениями.
3) Упорядочить по возрастанию элементы, находящиеся на местах, не кратных числу 3.
#include <stdio.h>
#define SIZE 18
void search(int [], int);
void MaxMin(int [], int);
void increase(int [], int);
int main()
{
int arr[SIZE] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17};
search(arr, SIZE);
MaxMin(arr, SIZE);
increase(arr, SIZE);
return 0;
}
void search(int a[], int size) //произведение на позициях кратных трем
{
int f1 = 1;
int i;
for (i = 0; i < size; i++)
{
if (i % 3 == 0)
{
f1 *= a[i];
}
}
for(i = 0; i < size; i++)
printf("% d", a[i]);
}
void MaxMin(int a[], int size) //нахождение квадратов
{
int max = a[0], min = a[0];
int A[size]; //в этом массиве будут храниться все квадраты нужных нам чисел
int i;
for (i = 0; i < size; i++)
{
if (max < a[i])
{
max = i;
}
if (min > a[i])
{
min = i;
}
}
int begin = min < max ? min : max;
int end = min > max ? min : max;
for (i = 0; begin <= end; begin++)
{
A[i] = a[begin] * a[begin];
i++;
}
for(i = 0; i < size; i++)
printf("% d", A[i]);
}
void increase(int a[], int size) //сортировка по возрастанию всех элементов не кратных трем
{
int hold;
int i, j;
for (i = 0; i < size; i++)
for (j = 0; j < size; j++)
if (i % 3 != 0 && a[i] > a[i + 1])
{
hold = a[i];
a[i] = a[i + 1];
a[i + 1] = hold;
}
for( i = 0; i < size; i++)
printf("% d", a[i]);
}Решение задачи: «Найти произведение (ненулевых) элементов массива, находящихся на позициях, кратных числу 3»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 18
void MaxMin(float[], int);
void increase(float[], int);
float mul(float a[], int size);
void print(float a[], int size) {
int i = 0;
for (i = 0; i < size; ++i)
printf("%6.0f", a[i]);
}
void swap(float *a, float *b) {
float t = *a;
*a = *b;
*b = t;
}
void swap_i(int *a, int *b) {
int t = *a;
*a = *b;
*b = t;
}
void seed_arr(float *a, int sz){
srand(time(0));
int i = 0;
for (i = 0; i < SIZE; ++i)
swap(&a[i], &a[rand() % 18]);
}
int main() {
float arr[SIZE] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17 };
seed_arr(arr, SIZE);
puts("Massiv:");
print(arr, SIZE);
MaxMin(arr, SIZE);
increase(arr, SIZE);
printf("\nAfter mul %6.0f\n", mul(arr, SIZE));
return 0;
}
// Найти произведение (ненулевых) элементов массива,
// находящихся на позициях, кратных числу 3.
float mul(float a[], int size) //произведение на позициях кратных трем
{
float f1 = 1;
int i;
for (i = 0; i < size; i++) {
if (i != 0 && (i % 3 == 0 && a[i] > 0)) {
//printf("%4.0f ", a[i]);
f1 *= a[i];
}
}
return f1;
}
// Найти квадраты всех чисел, расположенных между минимальным и
// максимальным значениями.
void MaxMin(float a[], int size) //нахождение квадратов
{
int max = 0, min = 0;
int i;
for (i = 1; i < size; i++) {
if (a[max] < a[i])
max = i;
if (a[min] > a[i])
min = i;
}
if (min > max)
swap_i(&min, &max);
printf("\nmin=%d max=%d\n", min, max);
puts("\nKvadraty");
for (i = 0; i < size; i++)
if (i > min && i < max)
printf("% 6.0f", a[i] * a[i]);
else
printf("% 6.0f", a[i]);
puts("");
}
//сортировка по возрастанию всех элементов на местах, не кратных числу 3.
void increase(float a[], int size) {
float hold;
int i, j;
for (i = 0; i < size - 1; ++i) // i - номер прохода
{
for (j = 0; j < size - 1; ++j) // внутренний цикл прохода
{
int k = j + 1;
if (j != 0 && (j % 3 == 0))
continue;
if (k % 3 == 0)
k = k + 1;
if ((a[j]> a[k])) {
swap(&a[j], &a[k]);
}
}
}
puts("After sort");
print(a, SIZE);
puts("");
}
Объяснение кода листинга программы
Код выполняет следующие действия:
- Задает размер массива 18 и инициализирует его нулями.
- Выводит на экран начальное значение массива.
- Находит минимальное и максимальное значение в массиве и выводит их на экран.
- Вычисляет произведение ненулевых элементов, находящихся на позициях, кратных 3.
- Выполняет сортировку по возрастанию всех элементов на местах, не кратных числу 3.
- Выводит на экран отсортированный массив. Список действий:
- Задать размер массива и инициализировать его нулями.
- Вывести на экран начальное значение массива.
- Найти минимальное и максимальное значение в массиве и вывести их на экран.
- Вычислить произведение ненулевых элементов, находящихся на позициях, кратных 3.
- Выполнить сортировку по возрастанию всех элементов на местах, не кратных числу 3.
- Вывести на экран отсортированный массив.
Пояснение к коду:
- Функция
MaxMinнаходит минимальное и максимальное значение в массиве и выводит их на экран. - Функция
increaseвыполняет сортировку по возрастанию всех элементов на местах, не кратных числу 3. - Функция
mulвычисляет произведение ненулевых элементов, находящихся на позициях, кратных 3. - Функция
printвыводит на экран значения массива в заданном формате. - Функция
swapменяет местами значения двух переменных. - Функция
swap_iменяет местами значения двух переменных, используя указатели. - Функция
seed_arrслучайным образом меняет значения элементов массива. - В функции
mainсоздается массив, инициализируется значениями от 0 до 17, затем в него вносятся случайные изменения. - После этого на экран выводится текущее значение массива, затем находятся минимальное и максимальное значение, вычисляется произведение ненулевых элементов на позициях, кратных 3, и выполняется сортировка по возрастанию всех элементов на местах, не кратных числу 3.
- Наконец, на экран выводится отсортированный массив.
- Функция