Консультация № 180850
18.11.2010, 21:56
52.69 руб.
0 1 1
Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:
Написать нужно на Си.Среда разработки-Dev-C++.Каждую строку прокомментируйте пожалуйста.
В одномерном массиве,состоящем из n вещественных элементов,вычислить:
1)номер минимального по модулю элемента массива;
2)cумму модулей элементов массива,расположенных после первого отрицательного элемента.
Сжать массив,удалив из него все элементы,величина которых находится на интервале[a,b].Освободившиеся в конце массива элементы заполнить нулями.
Спасибо.

Обсуждение

Неизвестный
18.11.2010, 23:17
общий
это ответ
Здравствуйте, Olgaa!
Программа. Компилировал GCC.
Код:
/* 
* File: main.c
* Author: Micren
*
* Created on 18 Ноябрь 2010 г., 21:21
*/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <conio.h>
#include <locale.h>

// Размерность массива
#define DIM 10
// Диапазон элементов для генерации массива
#define MIN -10
#define MAX 10
// Диапазон [A..B] для упаковки массива согласно условия
#define A 0
#define B 5

// Выводит массив на stdout
void printArray(const char* const msg, const double* array, size_t size)
{
if (msg)
{
printf("%s\n", msg);
}
while (size--)
{
printf("%f ", *array++);
}
printf("\n");
}

// Заполняет массив случайными значениями из диапазона MIN..MAX
void genArray(double* array, size_t size)
{
srand(time(0));
while (size--)
{
*array++ = ((double) rand()) / RAND_MAX * (MAX - MIN) + MIN;
}
}

// Ищет минимальный по модулю элемент
size_t findAbsMin(const double* const array, size_t size)
{
size_t res = 0, i;
for (i = 1; i < size; ++i)
{
if (fabs(array[i]) < fabs(array[res]))
{
res = i;
}
}
return res;
}

// Вычисляет сумму элементов после 1го отрицательного
double calcSum(const double* array, size_t size)
{
double res = 0.0;
const double* const end = array + size;
// Пропускаем до 1го отрицательного
while (array != end && *array++ >= 0);
// Суммируем оставшиеся
while (array != end)
{
res += fabs(*array++);
}
return res;
}

// Упаковка массива, согласно условия, удалением элементов из диапазона [A..B]
void packArray(double* array, size_t* size)
{
double *from = array, *to = array;
const double* const end = array + *size;
while (from != end)
{
if (*from < A || *from > B)
{
*to++ = *from;
}
++from;
}
// Новая длина массива
*size = to - array;
// Остаток заполним нулями
while (to != end)
{
*to++ = 0.0;
}
}

/*
*
*/
int main(int argc, char** argv)
{
// Массив
double array[DIM];
// Размер массива
size_t size = DIM;

setlocale(LC_ALL,"russian");

// Заполним его случайными числами
genArray(array, size);
printArray("Исходный массив:", array, size);
printf("Минимальный по модулю элемент имеет индекс: %u\n", findAbsMin(array, size));
printf("Сумма элементов по модулю после 1го отрицательного: %f\n", calcSum(array, size));
packArray(array, &size);
printArray("Сжатый массив:", array, size);

getch();

return EXIT_SUCCESS;
}

Пример работы:
Код:
Исходный массив:
-5.019155 9.512544 8.988736 4.083037 -1.332236 -8.373878 9.150914 -4.652075 -6.816634 -4.926991
Минимальный по модулю элемент имеет индекс: 4
Сумма элементов по модулю после 1го отрицательного: 57.837045
Сжатый массив:
-5.019155 9.512544 8.988736 -1.332236 -8.373878 9.150914 -4.652075 -6.816634 -4.926991
5
Форма ответа