Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Задание с массивом(простое)


Автор: inflex 11.10.2011, 14:46
Препод задал следующую задачу для С++ (Turbo C). Вроде сказал что простоя, но я в этом не шарю smile ...Поэтому вот обращаюсь к вам -профессионалам программирования и заклинателям кода...

Задача следующая: 
1. Объявляется одномерный массив целого типа не менее 15.Этот Массив необходимо заполнить с помощью генератора случайных чисел.Информация в массиве сортируется методом пузырька. (Желательно не пользоваться дополнительными массивами)

Вот и всё как бэ задание. Заранее благодарю столь доброго человека кто поможет решить сие чудо...Если можно, скиньте кто решит программу и код.  smile 

Желательно до завтрашнего утра помогите

Автор: Al47 11.10.2011, 14:56
Так турбо си или си плюс плюс?

Автор: Al47 11.10.2011, 15:44
Вот пример на VC++: http://sourceforce.ru/programmirovanie/c-c-c-java/c-metod-puzyrka/
В зависимости от среды что-то может быть другому, но суть одна.

Автор: inflex 11.10.2011, 16:15
Наверно всё-таки Turbo C, а какое различие между ними?

Автор: Al47 11.10.2011, 16:24
Если именно без плюсов, то это разные языки программирования, примирительно к моему примеру необходимо переделать вывод информации на экран, справитесь?

Добавлено через 1 минуту и 51 секунду
Да и ещё переменные в for() нельзя определять, придется где-то выше определять i и j. Если дадите ссылку на Вашу среду могу переделать пример для неё.

Автор: inflex 11.10.2011, 16:29
Вставил след. код [code=nocolor]
Код

#include <iostream>
#include <conio.h>
#include <time.h>

using namespace std;

int main()
{
    time_t t;
    srand((unsigned) time(&t));
    setlocale(LC_ALL,"Russian");
    double arr[15];
    for(int i = 0; i < 15; i++)
        arr[i] = 0+rand()%100;
    cout<<"Èñõîäíûé ìàññèâ:"<<endl;
    for(int i = 0; i < 15; i++)
        cout<<arr[i]<<endl;
    double tmp;
    for(int i = 0; i < 15; i++)
    {
        for(int j = 0; j < 14 - i; j++)
        {
            if(arr[j] > arr[j+1])
            {
                tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
    }
    cout<<"Âûõîäíîé ìàññèâ:"<<endl;
    for(int i = 0; i < 15; i++)
        cout<<arr[i]<<endl;
    getch();
}


Выдало вот это:
http://s1.ipicture.ru/Gallery/Viewfull/6292081.html

Это является правильным решением подскажите?

Автор: Al47 11.10.2011, 16:35
Собственно говоря - да, был сгенирирован массив из случайных чисел и отсортирован по возрастанию.

Автор: inflex 11.10.2011, 16:36
Спасибо за помощь) smile 

Автор: Al47 11.10.2011, 16:40
inflex, пожалуйста, обращайтесь.

Автор: inflex 23.10.2011, 19:11
Извиняюсь, но забыл упомянуть следующий нюанс задания который забыл, нечётные числа отсортировать по возрастанию, а чётные по убыванию...а тут в программе по возрастанию вроде сортирует все только...Помогите ещё разок

Автор: Al47 23.10.2011, 21:41
inflex, тут можно небольшую хитрость применить, сначала четные числа умножим на -1, а после сортировки умножим снова. smile


Код

#include <iostream>
#include <conio.h>
#include <time.h>
#include <math.h>

using namespace std;

void main()
{
    time_t t;
    srand((unsigned) time(&t));
    setlocale(LC_ALL,"Russian");
    double arr[15];
    for(int i = 0; i < 15; i++)
        arr[i] = 0+rand()%100;
    cout<<"Исходный массив:"<<endl;
    for(int i = 0; i < 15; i++)
        cout<<arr[i]<<endl;
    for(int i = 0; i < 15; i++)
    {
        if(fmod(arr[i],2) == 0)
            arr[i] *= -1;
    }
    double tmp;
    for(int i = 0; i < 15; i++)
    {
        for(int j = 0; j < 14 - i; j++)
        {
            if(arr[j] > arr[j+1])
            {
                tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
    }
    for(int i = 0; i < 15; i++)
    {
        if(fmod(arr[i],2) == 0)
            arr[i] *= -1;
    }
    cout<<"Выходной массив:"<<endl;
    for(int i = 0; i < 15; i++)
        cout<<arr[i]<<endl;
    getch();
}

Автор: Dov 23.10.2011, 23:50
Цитата(Al47 @  23.10.2011,  20:41 Найти цитируемый пост)
сначала четные числа умножим на -1, а после сортировки умножим снова

а если они (или некоторые из них) изначально будут отрицательными, тогда что?   smile 

Автор: Al47 24.10.2011, 09:14
Цитата(Dov @ 23.10.2011,  23:50)
Цитата(Al47 @  23.10.2011,  20:41 Найти цитируемый пост)
сначала четные числа умножим на -1, а после сортировки умножим снова

а если они (или некоторые из них) изначально будут отрицательными, тогда что?   smile

Если посмотреть на генерацию чисел, то можно увидеть, что отрицательные там не получатся. Но пусть придет TC и скажет нужны ли ему отрицательные числа. smile 

Автор: Dov 24.10.2011, 14:13
Al47, дело в том, что алгоритм не должен зависеть от прихоти пользователя. Он должен работать с любыми числами. А пользователь потом будет генерировать числа в зависимости от своих нужд и потребностей. Это к алгоритму не должно относится. 
       Возможно, что завтра кому-то понадабятся и отрицательные числа в массиве, так ты будешь всё переделывать?  smile 

Автор: Al47 24.10.2011, 15:32
Dov, переделывать не много, и в общем есть же такая вещь как оптимизация алгоритма для конкретного случая. Я рассмотрел одних из возможных путей развития событий, если задача TC не входит в эти условия, помогу переделать по-другому. smile

Автор: inflex 24.10.2011, 16:20
Спасибо за решение таким путём, думаю что решение подходит(т.к. взяты положительные числа). 

Если не составит труда, покажите ещё как можно составить алгоритм сортировки не зависящий от положительных/отрицательных значений в массиве. smile 

Автор: Al47 24.10.2011, 18:57
inflex, полностью писать и проверять не стану, если в данный момент нет нужны, но можно использовать конструкцию, на подобии этой:

Код

for (int i = 0; i< 15; i++)
{
      bool = fmod(a[i],2);
      for (int j = i + 1; j <= 15; j++)
         if ((fmod(a[i],2) == bool) && (a[j] < a[i] == bool) 
         {
            tmp = a[i]; 
            a[i] = a[j]; 
            a[j] = tmp;
         }
}


Меняя условия и знаки в зависимости от условий, правда результат будет несколько иным нежели в предыдущем примере... Что бы отсортировать так же как там, на вскидку приходить решение только с дополнительными массивами.

Автор: inflex 26.10.2011, 11:06
Добрый день.

Теперь препод задал такой вопрос: а для чего мы домножаем на -1???
Как я не пытался на него ответить не получилось.Подскажите как правильно сформулировать ответ и что в нём сказать.


Автор: Al47 27.10.2011, 15:31
inflex, для того что бы они сортировались в обратном порядке, например имея последовательность 4 6 2, наш алгоритм отсортировал бы их по возрастанию 2 4 6, если же умножить на -1: -4 -6 -2, тогда тот же алгоритм отсортирует следующим -6 -4 -2 (то же по возрастанию), но умножив обратно мы получим нашу первоначальную последовательно отсортированную по убыванию 6 4 2.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)