Тема: Обработка одномерных массивов
Задание
Заполнить два массива, размером 20 и 30 элементов, соответственно, случайными целыми числами в диапазоне от –50 до 50. Из полученных двух массивов создайте два массива отдельно отрицательных и положительных чисел. Проведите сортировку полученных массивов по возрастанию. Для контроля результата сделайте распечатку массивов, в том числе исходного.
Сортировки проведите тремя методами. При использовании каждого из методов желательно использовать свой массив. Если количество массивов меньше трех, то один из массивов перед сортировкой надо скопировать в дополнительный массив и провести его сортировку.
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <time.h>
#define Nx 20
#define Ny 30
#define Nres 50
inline void rus() // Русификация вывода в консольное окно
{
setlocale( LC_CTYPE, ".1251" );
setlocale( LC_MONETARY, ".1251" );
}
void randomize()
{
srand(time(0));
}
unsigned int random(int range)
{
return (rand() % range);
}
int main()
{
int i, j, range;
rus();
randomize();
int x[Nx];
int y[Ny];
int pol[Nres];
int otr[Nres];
int pol2[Nres];
range=100;
for (i=0;i<Nx;i++) { /* i - is a namber of row */
*(x+i) = -50+random(range);
}
// Вывод одномерного массива
printf("Распечатка массива \n");
for (i=0; i<Nx; i++) //заметьте еще раз, проверяется условие i<N
printf("%d ",(*(x+i)));
for (i=0;i<Ny;i++) { /* i - is a namber of row */
*(y+i) = -50+random(range);
}
// Вывод одномерного массива
printf("\n Распечатка массива \n");
for (i=0; i<Ny; i++) //заметьте еще раз, проверяется условие i<N
printf("%d ",(*(y+i)));
for (i=0;i<Nres;i++) { /* i - is a namber of row */
*(pol+i) = 1000;
*(otr+i) = -1000;
}
// раскидываем массив х
int jpol=0, jotr=0;
for (i=0;i<Nx;i++) { /* i - is a namber of row */
if (*(x+i)>0) {*(pol+jpol)=*(x+i);jpol++;}
if (*(x+i)<0) {*(otr+jotr)=*(x+i);jotr++;}
}
// раскидываем массив y
for (i=0;i<Ny;i++) { /* i - is a namber of row */
if (*(y+i)>0) {*(pol+jpol)=*(y+i);jpol++;}
if (*(y+i)<0) {*(otr+jotr)=*(y+i);jotr++;}
}
// Создаем доп массив для сортировки (по заданию)
for (i=0; i<jpol; i++) //
*(pol2+i+1)=*(pol+i);
//сортировка массива pol
if (jpol>=1) {
for (int j=0; j<jpol-1;j++)
{
for (int i=0; i<jpol-1;i++)
{
if (*(pol+i)>*(pol+i+1))
{
int temp = *(pol+i);
*(pol+i) = *(pol+i+1);
*(pol+i+1)=temp;
}
}
}
}
//сортировка массива otr
if (jotr>=1) {
int m,min;
/* Сортировка методом прямого поиска */
for (i=0;i<jotr-1;i++) /* в переменной i - индекс первого элемента
массива, то есть массив от d[i] до d[N] */
{ /* Найти минимум в массиве от i-того до N-ного */
m=i; min=(*otr+i); /* m-индекс минимума, min-значение минимума */
for (j=i+1;j<jotr; j++) /* Поиск в оставшейся части массива */
{
if (*(otr+j)<min) /* Найдено новое значение минимума? */
{ min=*(otr+j); m=j; } /* Запомнить минимум и его индекс */
}
/* Обменять первый (i-ый) и минимум (m-ый) местами */
*(otr+m)=*(otr+i); *(otr+i)=min;
}
}
//сортировка массива pol2
if (jpol>=1) {
int m=0;
/* Сортировка методом прямого включения */
for (i=2; i<=jpol; i++) /* в переменной i - индекс включаемого элемента */
{ /* включение i-того элемента */
m=i; // Начальное значение индекса цикла включения
*pol2=*(pol2+i); // Установка барьера
while (*(pol2+m)<*(pol2+m-1)) // включение
{ // Обмен с предыдущим элементом местами
int tmp = *(pol2+m); *(pol2+m) = *(pol2+m-1); *(pol2+m-1)= tmp;
m--; // включение идет к началу массива
};
}; }
// Вывод одномерного массива
printf("\n Распечатка массива otr \n");
for (i=0; i<jotr; i++) //
printf("%d ",(*(otr+i)));
printf("\n Распечатка массива pol \n");
for (i=0; i<jpol; i++) //
printf("%d ",(*(pol+i)));
printf("\n Распечатка массива pol2 \n");
for (i=1; i<=jpol; i++) //
printf("%d ",(*(pol2+i)));
return 0;
}