Тема: Обработка одномерных массивов ( с использованием функций)
Задание
Заполнить два массива, размером 20 и 30 элементов, соответственно, случайными целыми числами в диапазоне от –50 до 50. Из полученных двух массивов создайте два массива отдельно отрицательных и положительных чисел. Проведите сортировку полученных массивов по возрастанию. Для контроля результата сделайте распечатку массивов, в том числе исходного.
Сортировки проведите тремя методами. При использовании каждого из методов желательно использовать свой массив. Если количество массивов меньше трех, то один из массивов перед сортировкой надо скопировать в дополнительный массив и провести его сортировку.
Листинг 2 обработка массивов через функции.
#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);
}
void CreateMassiv(int *c, int n, int Range)
{
int i;
for (i=0;i<n;i++) { /* i - is a namber of row */
*(c+i) = -50+random(Range);
}
}
void PrintMassiv(int *c, int from, int n)
{
int i;
for (i=from;i<n;i++) { /* i - is a namber of row */
printf("%d ",(*(c+i)));
}
}
void MoveToMassiv(int *c,int *po, int *ot, int n, int *p, int *o)
{
int i;
for (i=0;i<n;i++) { /* i - is a namber of row */
if (*(c+i)>0) {*(po+(*p))=*(c+i);(*p)++;}
if (*(c+i)<0) {*(ot+(*o))=*(c+i);(*o)++;}
}
}
void CopyMassiv(int *from, int *to, int n)
{
int i;
for (i=0; i<n; i++)
*(to+i+1)=*(from+i);
}
void Sort1Massiv(int *c, int n)
{
int i,j;
for ( j=0; j<n-1;j++)
{
for ( i=0; i<n-1;i++)
{
if (*(c+i)>*(c+i+1))
{
int temp = *(c+i);
*(c+i) = *(c+i+1);
*(c+i+1)=temp;
}
}
}
}
/* Сортировка методом прямого поиска */
void Sort2Massiv(int *c, int n)
{
int i,j;
int m,min;
for (i=0;i<n-1;i++) /* в переменной i - индекс первого элемента
массива, то есть массив от c[i] до c[N] */
{ /* Найти минимум в массиве от i-того до N-ного */
m=i; min=(*c+i); /* m-индекс минимума, min-значение минимума */
for (j=i+1;j<n; j++) /* Поиск в оставшейся части массива */
{
if (*(c+j)<min) /* Найдено новое значение минимума? */
{ min=*(c+j); m=j; } /* Запомнить минимум и его индекс */
}
/* Обменять первый (i-ый) и минимум (m-ый) местами */
*(c+m)=*(c+i); *(c+i)=min;
}
}
void Sort3Massiv(int *c, int n)
{
int i,m=0;
/* Сортировка методом прямого включения */
for (i=2; i<=n; i++) /* в переменной i-индекс включаемого элемента */
{ /* включение i-того элемента */
m=i; // Начальное значение индекса цикла включения
*c=*(c+i); // Установка барьера
while (*(c+m)<*(c+m-1)) // включение
{ // Обмен с предыдущим элементом местами
int tmp = *(c+m); *(c+m) = *(c+m-1); *(c+m-1)= tmp;
m--; // включение идет к началу массива
};
};
}
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;
// Создаем одномерный массив
CreateMassiv(x, Nx, range);
// Вывод одномерного массива
printf("Распечатка массива \n");
PrintMassiv(x,0,Nx);
// Создаем одномерный массив
CreateMassiv(y, Ny, range);
// Вывод одномерного массива
printf("\n Распечатка массива \n");
PrintMassiv(y,0,Ny);
// раскидываем массив х и у
int jpol=0, jotr=0;
MoveToMassiv(x,pol,otr, Nx, &jpol, &jotr);
MoveToMassiv(y,pol,otr, Ny, &jpol, &jotr);
// Создаем доп массив для сортировки (по заданию)
CopyMassiv(pol, pol2, jpol);
//сортировка массива pol
if (jpol>=1) { //если в массиве больше 1 елемента
Sort1Massiv(pol, jpol);
}
//сортировка массива otr
if (jotr>=1) { //если в массиве больше 1 елемента
Sort2Massiv(otr,jotr);
}
//сортировка массива pol2
if (jpol>=1) {//если в массиве больше 1 елемента
Sort3Massiv(pol2, jpol);
}
// Вывод одномерных массивов
printf("\n Распечатка массива otr \n");
PrintMassiv(otr,0,jotr);
printf("\n Распечатка массива pol \n");
PrintMassiv(pol,0,jpol);
printf("\n Распечатка массива pol2 \n");
PrintMassiv(pol2,1,jpol+1);
return 0;
}