Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

сортировка массива

35K
27 февраля 2011 года
life4fun
64 / / 15.11.2010
Доброго вечера. Пожалуйста помогите разобраться с некоторыми нюансами в программе:

1) как сделать более проще кейсы в свитче, без повторений?, никак не получается((
2) почему не работает сортировка шелла?, выводит просто массив так как он был введен(

код:

Код:
#include <iostream.h>
#include <windows.h>

const int color=system("color 3F");

int menu();
int vyborom (int *arr, int n);
int vstavkoi (int *arr,int n);
int obmenom (int *arr,int n);
int shella (int *arr,int n);
void print(int *arr, int n);

//--------------------------------------------------

int main()
{
    int i;
    bool ex=true;
    int posmas[100]; //posle sort
    int domas[100]; //do sort
    int n=0;
    while(ex)
    {
        switch(menu())
        {
        case 1:
            if(n==0)
                cout<<"Massiv ne vveden!";
            else
            {
            cout<<"\nKol-vo perest: \n"<<vyborom(posmas,n)<<"\n";
            print(posmas,n);
            cout<<"\n Ishodniy massiv: \n";
            print(domas,n);
            }
            break;

        case 2:
            if(n==0)
                cout<<"Massiv ne vveden!";
            else
            {
            cout<<"\nKol-vo perest: \n"<<vstavkoi(posmas,n)<<"\n";
            print(posmas,n);
            cout<<"\n Ishodniy massiv: \n";
            print(domas,n);
            }
            break;

        case 3:
            if(n==0)
                cout<<"Massiv ne vveden!";
            else
            {
            cout<<"\nKol-vo perest: \n"<<obmenom(posmas,n)<<"\n";
            print(posmas,n);
            cout<<"\n Ishodniy massiv: \n";
            print(domas,n);
            }
            break;

        case 4:
            if(n==0)
                cout<<"Massiv ne vveden!";
            else
            {
            cout<<"\nKol-vo perest: \n"<<shella(posmas,n)<<"\n";
            print(posmas,n);
            cout<<"\n Ishodniy massiv: \n";
            print(domas,n);
            }
            break;

        case 5:
            if(n==0)
                cout<<"Massiv ne vveden!";
            else
                print(domas,n);
            break;

        case 6:
            cout<<"Vvedite kolichestvo elementov do 100: \n";
            cin>>n;
            for(i=0;i<n;i++)
            {
                posmas=rand()%89+0;
                domas=posmas;
            }
            break;

        case 7:
            cout<<"Vvedite kolichestvo elementov do 100: \n";
            cin>>n;
            cout<<"Vvedite "<<n<<" chisel v massiv: \n";
            for(i=0;i<n;i++)
            {
                cin>>posmas;
                domas=posmas;
            }
            break;

        case 0:
            ex=false;
            break;
        }
            for(i=0;i<n;i++)
            {
                posmas=domas;
            }
    }
    return 0;
}

//--------------------------------------------------

int menu()
{
    int sort;
    cout<<"\n Kakoy sposob sortirovki?: \n";
    cout<<" 1 - Vyborom\n";
    cout<<" 2 - Vstavkoi\n";
    cout<<" 3 - Obmenom\n";
    cout<<" 4 - Shella\n";
    cout<<" 5 - Vyvesti ishodnyi massiv\n";
    cout<<" 6 - Zapolnenie massiva - random\n";
    cout<<" 7 - Zapolnenie massiva - s klaviatury\n";
    cout<<" 0 - Exit\n";
    cin>>sort;
    return sort;
}

//--------------------------------------------------

int vyborom (int *arr,int n)
{   int s;
    int per=0;
    int i,min,imin;
    for (s=0;s<n-1;s++)
    {
        min = arr;
        imin =s;
        for(i=s+1;i<n;i++)
        {
            if(arr<min)
            {
                min=arr;
                imin =i;
                per++;
            }
        }
            arr[imin]=arr;
            arr=min;
    }
    return per;
}

//--------------------------------------------------

int vstavkoi (int *arr,int n)
{
    int per=0;
    int i,j,k,t;
    for(i=0;i<n;i++)
    {
        t=arr;
        j=0;
        while(t>arr[j])
            j=j+1;
        for(k=i-1;k>j-1;k--)
        {  
            arr[k+1]=arr[k];
            per++;
        }
        arr[j]=t;
    }
    return per;
}

//--------------------------------------------------

int obmenom (int *arr,int n)
{
    int per=0;
    int i,k,t;
    for(i=n-1;i>0;i--)
    {
        for(k=0;k<i;k++)
        {
            if(arr[k]>arr[k+1])
            {
                t=arr[k];
                arr[k]=arr[k+1];
                arr[k+1]=t;
                per++;
            }
        }
    }
    return per;
}

//--------------------------------------------------

int shella (int *arr, int n)
{
    int incr,b;
    int per=0;
    incr=n/2;
    do
    {
        for(int i=0;n-incr;n--)
        {
            if(arr>arr[i+incr])
            {
                b=arr;
                arr=arr[i+incr];
                arr[i+incr]=b;
            }
        }
            incr=incr/2;
    }
        while (incr>=1);
    return per;
}

//--------------------------------------------------

void print(int *arr, int n)
{
    for (int i=0;i<n;i++)
        cout<<arr<<" ";
}
35K
27 февраля 2011 года
life4fun
64 / / 15.11.2010
и еще очень интересует как очищать консоль после ввода, или перехода к другому пункту меню?
55K
27 февраля 2011 года
g00dv1n
22 / / 28.11.2010
Очистка консоли system("cls");
7
27 февраля 2011 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: g00dv1n
Очистка консоли system("cls");

Вам делать нечего–каждый раз командный интерпретатор вызывать?
clrscr();

278
27 февраля 2011 года
Alexander92
1.1K / / 04.08.2008
Вот рабочий вариант для шелла, писал когда-то:

Код:
long increment(long inc[], long size) {
    long p1, p2, p3, s;

    p1 = p2 = p3 = 1;
    s = -1;
    do {
        if (++s % 2) {
            inc = 8*p1 - 6*p2 + 1;
        } else {
            inc = 9*p1 - 9*p3 + 1;
            p2 *= 2;
            p3 *= 2;
        }
        p1 *= 2;
    } while(3*inc < size);  

    return s > 0 ? --s : 0;
}

// ------------------------------------------------------------------------

void sort_by_shell(const long input[], long output[], long size) {
    long inc, i, j, seq[40];
    long s;

    // Copy input array to output array
    for (long i = 0; i < size; i++)
        output = input;


    s = increment(seq, size);
    long temp = 0;
    while (s >= 0) {
        inc = seq[s--];

        for (i = inc; i < size; i++) {
            temp = output;
            for (j = i-inc; (j >= 0) && (output[j] > temp); j -= inc)
                output[j+inc] = output[j];
            output[j+inc] = temp;
        }
    }
}
35K
01 марта 2011 года
life4fun
64 / / 15.11.2010
спасибо! очень интересует:

Цитата:
1) как сделать более проще кейсы в свитче, без повторений?, никак не получается((

2.1K
01 марта 2011 года
Norgat
452 / / 12.08.2009
Цитата: life4fun
1) как сделать более проще кейсы в свитче, без повторений?, никак не получается((



У тебя там повторяющийся код есть - вытащи его в функции (там четыре первых блока кода идентичны же) или goto заюзай.
А вообще оно на С++ лаконичнее не будет, таков уж язык.

277
01 марта 2011 года
arrjj
1.7K / / 26.01.2011
Без свича:
Код:
int main()
{
    int i;
    int posmas[100]; //posle sort
    int domas[100]; //do sort
    int n=0;
    while(true)
    {

    int choise=menu();
    if(choise>0&&choise<4)
    if(n==0)
        cout<<"Massiv ne vveden!";
    else
    {
        cout<<"\nKol-vo perest: \n";
        switch(choise)
        {
            case 1:
                cout<<vyborom(posmas,n);
            case 2:
                cout<<vstavkoi(posmas,n);
            case 3:
                cout<<obmenom(posmas,n);
            case 4:
                cout<<shella(posmas,n);
        }
        cout<<"\n";
        print(posmas,n);
        cout<<"\n Ishodniy massiv: \n";
        print(domas,n);
    }
    if(choise==6 || choise==7)
    {
        cout<<"Vvedite kolichestvo elementov do 100: \n";
        cin>>n;
        for(i=0;i<n;i++)
        {
            choise==6?posmas=rand()%89+0:cin>>posmas;
            domas=posmas;
        }
    }
    if(choise==5)
    {
    n==0?cout<<"Massiv ne vveden!":print(domas,n);
    }
    if(choise==0)
    {
    cout<<"Good bye!\n";
    return 0
    }
    for(i=0;i<n;i++)
    {
        posmas=domas;
    }
   
    }
return 0;
}
1.8K
02 марта 2011 года
LM(AL/M)
332 / / 20.12.2005
совсем без свитча будет
 
Код:
int fn_index = menu();
cout << "Number of transpositions " << sort_functions[fn_index](posmas, n);
35K
03 марта 2011 года
life4fun
64 / / 15.11.2010
Цитата:
Без свича:


спасибо большое, только вот ошибку пишет((

C:\Documents and Settings\1nteger\Рабочий стол\DIIT\evm\Lab1_my.cpp(49) : error C2446: ':' : no conversion from 'class std::basic_istream<char,struct std::char_traits<char> >' to 'int'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

35K
03 марта 2011 года
life4fun
64 / / 15.11.2010
не получилось прикрутить сортировку шелла(, может у кого-то есть более простые коды(?
35K
03 марта 2011 года
life4fun
64 / / 15.11.2010
спасибо большое, только вот ошибку пишет((

C:\Documents and Settings\1nteger\Рабочий стол\DIIT\evm\Lab1_my.cpp(49) : error C2446: ':' : no conversion from 'class std::basic_istream<char,struct std::char_traits<char> >' to 'int'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1.8K
03 марта 2011 года
LM(AL/M)
332 / / 20.12.2005
код давай
35K
03 марта 2011 года
life4fun
64 / / 15.11.2010
вот, с той ошибкой разобрался, а вот сортировка Шелла почему-то не работает, помогите понять в чем причина(

Код:
#include <iostream>
#include <windows.h>
using namespace std;

const int color=system("color 3F");

int menu();
int vyborom (int *arr, int n);
int vstavkoi (int *arr,int n);
int obmenom (int *arr,int n);
int shella (int *arr,int n);
void print(int *arr, int n);

//--------------------------------------------------

int main()
    {
    int i;
    int posmas[100]; //posle sort
    int domas[100]; //do sort
    int n=0;
    while(true)
        {
        int choise=menu();
        if(choise>0&&choise<4)
        if(n==0)
        cout<<"Massiv ne vveden!";
        else
            {
            cout<<"\nKol-vo perest: \n";
            switch(choise)
                {
                case 1: cout<<vyborom(posmas,n);
                case 2: cout<<vstavkoi(posmas,n);
                case 3: cout<<obmenom(posmas,n);
                case 4: cout<<shella(posmas,n);
                }
            cout<<"\n";
            print(posmas,n);
            cout<<"\n Ishodniy massiv: \n";
            print(domas,n);
            }
      if(choise==6 || choise==7)
      {
        cout<<"Vvedite kolichestvo elementov do 100: \n";
        cin>>n;
        for(i=0;i<n;i++)
            {
            if(choise==6)
            {
              posmas=rand()%89+0;
            }
            else
            {
               cin>>posmas;
            }
            domas=posmas;
            }
      }
      if(choise==5)
        { n==0?cout<<"Massiv ne vveden!":print(domas,n); }
      if(choise==0)
        {
      cout<<"Good bye!\n";
      return 0;
        }
      for(i=0;i<n;i++)
        {
      posmas=domas;
        }
      }
   return 0;
}

//--------------------------------------------------

int menu()
{
    int sort;
    cout<<"\n\tVyberite sposob sortirovki?: \n";
    cout<<"\t--------------------------\n";
    cout<<"\t1 - Vyborom\n";
    cout<<"\t2 - Vstavkoi\n";
    cout<<"\t3 - Obmenom\n";
    cout<<"\t4 - Shella\n";
    cout<<"\t5 - Vyvesti ishodnyi massiv\n";
    cout<<"\t6 - Zapolnenie massiva - random\n";
    cout<<"\t7 - Zapolnenie massiva - s klaviatury\n";
    cout<<"\t0 - Exit\n";
    cin>>sort;
    return sort;
}

//--------------------------------------------------

int vyborom (int *arr,int n)
{   int s;
    int per=0;
    int i,min,imin;
    for (s=0;s<n-1;s++)
    {
        min = arr;
        imin =s;
        for(i=s+1;i<n;i++)
        {
            if(arr<min)
            {
                min=arr;
                imin =i;
                per++;
            }
        }
            arr[imin]=arr;
            arr=min;
    }
    return per;
}

//--------------------------------------------------

int vstavkoi (int *arr,int n)
{
    int per=0;
    int i,j,k,t;
    for(i=0;i<n;i++)
    {
        t=arr;
        j=0;
        while(t>arr[j])
            j=j+1;
        for(k=i-1;k>j-1;k--)
        {  
            arr[k+1]=arr[k];
            per++;
        }
        arr[j]=t;
    }
    return per;
}

//--------------------------------------------------

int obmenom (int *arr,int n)
{
    int per=0;
    int i,k,t;
    for(i=n-1;i>0;i--)
    {
        for(k=0;k<i;k++)
        {
            if(arr[k]>arr[k+1])
            {
                t=arr[k];
                arr[k]=arr[k+1];
                arr[k+1]=t;
                per++;
            }
        }
    }
    return per;
}

//--------------------------------------------------

int shella (int *arr, int n)
{
    int per=0;
    long d=n,i,j;
    int c;
    do
    {
        d=d/2;
        i=0;
        while ((j=i+d)<n)
        {
            if (arr>arr[j])
            {
                c=arr;
                arr=arr[j];
                arr[j]=c;
            };
            i++;
        };
    }
    while (d>1);
    return per;
};

//--------------------------------------------------

void print(int *arr, int n)
{
    for (int i=0;i<n;i++)
        cout<<arr<<" ";
}
1.8K
04 марта 2011 года
LM(AL/M)
332 / / 20.12.2005
а до этого работала?
35K
04 марта 2011 года
life4fun
64 / / 15.11.2010
Цитата:
а до этого работала?



до этого выводила на экран, но не сортировала, я проверял много раз и не могу найти ошибку( а компилятор ее тоже не пишет, просто компилирует без ошибок(

35K
05 марта 2011 года
life4fun
64 / / 15.11.2010
..........ап
392
06 марта 2011 года
cronya
421 / / 03.01.2009
алгоритмы проверьте в них ошибка значит
35K
07 марта 2011 года
life4fun
64 / / 15.11.2010
уже проверял((
препод. дал нам такие алгоритмы, сто раз пересматривал, переделывал, а результат только такой=(
помогите пожалуйста!
35K
07 марта 2011 года
life4fun
64 / / 15.11.2010
забыл поставить break; после кейсов. но все-равно на экран не выводит сортировку шелла(, уже не могу никак понять почему( сто раз проверил.

Код:
#include <iostream>
#include <windows.h>
using namespace std;
const int color=system("color 3F");
int menu();
int vyborom (int *arr, int n);
int vstavkoi (int *arr,int n);
int obmenom (int *arr,int n);
int shella (int *arr,int n);
void print(int *arr, int n);
//--------------------------------------------------
int main()
    {
    int i;
    int posmas[100]; //posle sort
    int domas[100]; //do sort
    int n=0;
    while(true)
        {
        int choise=menu();
        if(choise>0&&choise<4)
        if(n==0)
        cout<<"Massiv ne vveden!";
        else
            {
            cout<<"\nKol-vo perest: \n";
            switch(choise)
                {
                case 1:    cout<<vyborom(posmas,n); break;
                case 2: cout<<vstavkoi(posmas,n); break;
                case 3: cout<<obmenom(posmas,n); break;
                case 4: cout<<shella(posmas,n); break;
                }
            cout<<"\n";
            print(posmas,n);
            cout<<"\n Ishodniy massiv: \n";
            print(domas,n);
            }
      if(choise==6 || choise==7)
      {
        cout<<"Vvedite kolichestvo elementov do 100: \n";
        cin>>n;
        for(i=0;i<n;i++)
            {
            if(choise==6)
            {
              posmas=rand()%89+0;
            }
            else
            {
               cin>>posmas;
            }
            domas=posmas;
            }
      }
      if(choise==5)
        { n==0?cout<<"Massiv ne vveden!":print(domas,n); }
      if(choise==0)
        {
      cout<<"Good bye!\n";
      return 0;
        }
      for(i=0;i<n;i++)
        {
      posmas=domas;
        }
      }
   return 0;
}
//--------------------------------------------------
int menu()
{
    int sort;
    cout<<"\n\tVyberite sposob sortirovki?: \n";
    cout<<"\t--------------------------\n";
    cout<<"\t1 - Vyborom\n";
    cout<<"\t2 - Vstavkoi\n";
    cout<<"\t3 - Obmenom\n";
    cout<<"\t4 - Shella\n";
    cout<<"\t5 - Vyvesti ishodnyi massiv\n";
    cout<<"\t6 - Zapolnenie massiva - random\n";
    cout<<"\t7 - Zapolnenie massiva - s klaviatury\n";
    cout<<"\t0 - Exit\n";
    cin>>sort;
    return sort;
}
//--------------------------------------------------
int vyborom (int *arr,int n)
{   int s;
    int per=0;
    int i,min,imin;
    for (s=0;s<n-1;s++)
    {
        min = arr;
        imin =s;
        for(i=s+1;i<n;i++)
        {
            if(arr<min)
            {
                min=arr;
                imin =i;
                per++;
            }
        }
            arr[imin]=arr;
            arr=min;
    }
    return per;
}
//--------------------------------------------------
int vstavkoi (int *arr,int n)
{
    int per=0;
    int i,j,k,t;
    for(i=0;i<n;i++)
    {
        t=arr;
        j=0;
        while(t>arr[j])
            j=j+1;
        for(k=i-1;k>j-1;k--)
        {    
            arr[k+1]=arr[k];
            per++;
        }
        arr[j]=t;
    }
    return per;
}
//--------------------------------------------------
int obmenom (int *arr,int n)
{
    int per=0;
    int i,k,t;
    for(i=n-1;i>0;i--)
    {
        for(k=0;k<i;k++)
        {
            if(arr[k]>arr[k+1])
            {
                t=arr[k];
                arr[k]=arr[k+1];
                arr[k+1]=t;
                per++;
            }
        }
    }
    return per;
}
//--------------------------------------------------
int shella (int *arr, int n)
{
    int per=0;
    long d=n,i,j;
    int c;
    do
    {
        d=d/2;
        i=0;
        while ((j=i+d)<n)
        {
            if (arr>arr[j])
            {
                c=arr;
                arr=arr[j];
                arr[j]=c;
            };
            i++;
        };
    }
    while (d>1);
    return per;
};
//--------------------------------------------------
void print(int *arr, int n)
{
    for (int i=0;i<n;i++)
        cout<<arr<<" ";
}
297
07 марта 2011 года
koodeer
1.2K / / 02.05.2009
Цитата: life4fun
но все-равно на экран не выводит сортировку шелла(, уже не могу никак понять почему( сто раз проверил.

 
Код:
if(choise>0&&choise<4)


 
Код:
if(choise>0&&choise<=4)



Цитата: life4fun
 
Код:
if(choise==5)
{ n==0?cout<<"Massiv ne vveden!":print(domas,n); }


Это компилируется? Кстати, какой компилятор?

35K
07 марта 2011 года
life4fun
64 / / 15.11.2010
koodeer, спасибо большое! заработало!

только вот теперь кол-во перестановок почему-то пишет 0(, тоже не понимаю чего так?(
35K
07 марта 2011 года
life4fun
64 / / 15.11.2010
Цитата:
Это компилируется? Кстати, какой компилятор?



MVS 6.0

35K
08 марта 2011 года
life4fun
64 / / 15.11.2010
с сортировкой разобрался..
еще маленький вопросик, как сделать очистку экрана после выполнения каждого пункта, когда заново появляется меню?
297
08 марта 2011 года
koodeer
1.2K / / 02.05.2009
Объясню, почему спросил про компилятор. В CodeBlocks (mingw32) при компилировании этого кода выдаёт ошибку на указанной выше строке:
Цитата:
error: third operand to the conditional operator is of type 'void', but the second operand is neither a throw-expression nor of type 'void'

То есть cout<<"Massiv ne vveden!" и print(domas,n); имеют разный тип. Чтобы это компилировалось везде, тернарный оператор можно заменить оператором if - else.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог