Практические / Отчеты студентов 2011-2012 / ВТ-11 Лр / Тумор / Лабораторная №11
.docxМосковский Государственный Университет Леса
ФЭСТ ВТ-11
Лабораторная работа №11.
Программирование на языках высокого уровня
Тема: “ Динамическая память”
Выполнил студент Тумор С.В.
Проверил Ларионов Н.В.
Москва 2012.
// filles.cpp : Defines the entry point for the console application.
//
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
const int n = 20; // Именованая константа для размера масива
float* array;
float bound_up,bound_down;
void generate_elements(); // Генерация
void print_elements(); // Вывод
int find_less_c(float C); // Подсчет элементов меньших C
int find_last_neg(); // Получсение индекса последнего отрицательного элемента
float find_summ(); // Нахождение суммы элементов расположенных после последнего
// отрицательно
int find_max(); // Нахождение индекса максимального элемента
void find_bound(); // Нахождение границы +-20%
void sort(); // Собственно сама сортировка
int main()
{
float c,summ;
int less_c;
array = new float[n];
generate_elements(); // Генерация массива чисел
print_elements(); // Вывод массива на экран
printf("Enter C: "); // Ввоод C
scanf("%f",&c);
less_c = find_less_c(c);
printf("Elements less than C: %d\n",less_c);
summ = find_summ();
printf("Summ of elements after last negative element: %f\n",summ);
sort();
printf("===================SORTED===================\n");
print_elements(); // Печатаем отсортированные массив
delete array;
getch(); // Ожидаем нажатия any key :-)
return 0;
}
void generate_elements()
{
time_t t;
srand(time(&t));
for (int i = 0;i < n;i++)
{
array[i] = rand() % 100;
if ((rand() % 2) == 0) // Добавляем знак, если rand() генерирует четное число
array[i] *= 1; // то плюс
else
array[i] *= -1; // если нечётное то минус
}
}
void print_elements()
{
for(int i = 0;i < n;i++)
printf("%f\t",array[i]);
}
int find_less_c(float C)
{
int t = 0;
for(int i = 0;i < n;i++)
if (array[i] < C)
t++;
return t;
}
int find_last_neg()
{
int last_neg_index = 0;
for(int i = n-1;i >= 0;i--)
{
if (array[i] < 0)
{
last_neg_index = i;
return last_neg_index;
}
}
return -1;
}
float find_summ()
{
float summ = 0;
printf("index of last negative element is %d\n",find_last_neg());
for(int i = find_last_neg() + 1;i < n;i++)
summ += array[i];
return summ;
}
int find_max()
{
int imax = 0;
for(int i = 0;i < n;i++)
if (array[i] > array[imax])
imax = i;
printf("max element is %f\n",array[imax]); // Для отладки
return imax;
}
void find_bound()
{
int imax = find_max();
float x;
x = (array[imax] * 20) / 100;
bound_up = array[imax] + x; // Находим верхнюю границу
bound_down = array[imax] - x; // Находим нижнюю границу
printf("up bound is %f\ndown bound is %f\n",bound_up,bound_down); // Отладочная информация
}
void sort()
{
/* Сначала должны распологаться элементы отличающиеся от максимального не более чем на 20% */
int t = 0;
float x;
find_bound(); // Находим границы
for(int i = 0;i < n;i++)
{
if (!(array[i] > bound_up) && !(array[i] < bound_down))
{
x = array[t];
array[t] = array[i];
array[i] = x;
t++;
}
}
}