сортировка массива
1) как сделать более проще кейсы в свитче, без повторений?, никак не получается((
2) почему не работает сортировка шелла?, выводит просто массив так как он был введен(
код:
#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<<" ";
}
Вам делать нечего–каждый раз командный интерпретатор вызывать?
clrscr();
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;
}
}
}
У тебя там повторяющийся код есть - вытащи его в функции (там четыре первых блока кода идентичны же) или goto заюзай.
А вообще оно на С++ лаконичнее не будет, таков уж язык.
{
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;
}
cout << "Number of transpositions " << sort_functions[fn_index](posmas, n);
спасибо большое, только вот ошибку пишет((
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
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
#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<<" ";
}
до этого выводила на экран, но не сортировала, я проверял много раз и не могу найти ошибку( а компилятор ее тоже не пишет, просто компилирует без ошибок(
препод. дал нам такие алгоритмы, сто раз пересматривал, переделывал, а результат только такой=(
помогите пожалуйста!
#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<<" ";
}
{ n==0?cout<<"Massiv ne vveden!":print(domas,n); }
Это компилируется? Кстати, какой компилятор?
только вот теперь кол-во перестановок почему-то пишет 0(, тоже не понимаю чего так?(
MVS 6.0
еще маленький вопросик, как сделать очистку экрана после выполнения каждого пункта, когда заново появляется меню?
То есть cout<<"Massiv ne vveden!" и print(domas,n); имеют разный тип. Чтобы это компилировалось везде, тернарный оператор можно заменить оператором if - else.