Шаблоны Функций, Обработка Массивов

  • Автор темы prettynetty
  • Дата начала
P

prettynetty

#1
Здравствуйте, заранее извиняюсь, если что то неправильно оформила.

Дано несколько массивов чисел (типы массивов различны). Длины массивов вводятся пользователем. Требуется для каждого массива выполнить заданные действия.
Ввести и обработать два одномерных массива, содержащие соответственно n целых и m вещественных компонентов. Вычислить:
1) произведение положительных элементов массива;
2) сумму элементов массива, расположенных до минимального элемента.
3) Упорядочить по возрастанию отдельно элементы, стоящие на четных местах, и элементы, стоящие на нечетных местах.

Если в пункте 1 и 2 я более ли менее уверена, то с 3-им пунктом возникают проблемы

<!--shcode--><pre><code class='"[code'>[/code]"]
#include<windows.h>
#include<stdio.h>
#include<math.h>
template <class Type> void VVOD(Type *mas1, int m);
template <class Type> void VYVOD(Type mas1, int m);
template <class Type> Type PR(Type *mas1, int m, bool &x);
template <class Type> Type SUM(Type *mas1, int m);
template <class Type> void OBR(Type *mas1, int m);
main()
{
SetConsoleOutputCP(1251);
int mas1[25],m,n,pr1;
float pr2;
bool x;
printf("Введите размерности m и n:\n");
scanf("%d%d",&m,&n);
float *mas2=new float[n];
printf("Для массива типа int:\n");
VVOD(mas1,m);
printf("Для массива типа float:\n");
VVOD(mas2,n);
printf("Массив типа int:\n");
VYVOD(mas1,m);
printf("Массив типа float:\n");
VYVOD(mas2,n);
pr1=PR(mas1,m,x);
if(x==true)
{
printf("Произведение положительных элементов массива типа int равно: %d\n", pr1);
}
else printf("Положительных элементов нет\n");
pr2=PR(mas2,n,x);
if(x==true)
{
printf("Произведение положительных элементов массива типа float равно:%f\n", pr2);
}
else printf("Положительных элементов нет:\n");
printf("Произведение положительных элементов массива типа float равно:%f\n", pr2);
printf("Сумма положительных элементов, расположенных до минимального равна:\n");
printf("для массива типа int - %d\n",SUM(mas1,m));
printf("для массива типа float -%f\n\n ",SUM(mas2,n));

printf("Преобразованные массивы:\n");
OBR(mas1,m);
OBR(mas2,n);
printf("\n");
VYVOD(mas1,m);
printf("\n");
VYVOD(mas2,n);
return 0;
}
template <class Type> void VVOD(Type *mas1, int m)
{
int i;
for(i=0;i<m;i++)
{
printf("Введите -ый элемент массива:\n");
scanf("%d", &mas1);
}
return;
}
template <class Type> void VYVOD(Type mas1, int m)
{
int i;
for(i=0;i<m;i++)
printf("%d",mas1);
printf("\n");
return;
}
template <class Type> Type PR(Type *mas1, int m, bool &x)
{
x=false;
int i;
Type pr=1;
for(i=0;i<m;i++)
if(mas1>0)
{
pr*=mas1;
x=true;
}
return pr;
}
template <class Type> Type SUM(Type *mas1, int m)
{
Type sum=0;
int i,min=0;
for(i=1;i<m;i++)
if(mas1<mas1[min])
min=i;
for(i=0;i<min;i++)
sum+=mas1;
return sum;
}
template <class Type> void OBR(Type *mas1, int m)
{
Type temp;
int i, min;
bool flag=true;
while(flag)
{
flag=false;

for(i=0;i<m-1;i++)
{

if(a>a[i+2] && mod(i,2)==0)
{
temp=a;
a=a[i+2];
a[i+2]=temp;
flag=true;
}
else if(a>a[i+2] && mod(i,2)==1)
{
temp=a;
a=a[i+2];
a[i+2]=temp;
flag=true;
}
}
}
}
return;
}[/CODE]
 
G

Guest

#2
C++:
template <class Type> void OBR(Type *mas1, int m)
{
bool change = true;
while(change)
{
change = false;
for(int i = 0; i < (m - 1) / 2 * 2; i += 2)
if (mas1[i] > mas1[i + 2])
{	
Type temp;
temp=mas1[i];
mas1[i]=mas1[i+2];
mas1[i+2]=temp;
change = true;
}
}

change = true;
while(change)
{
change = false;
for(int i = 1; i < (m - 2) / 2 * 2; i += 2)
if (mas1[i] > mas1[i + 2])
{	
Type temp;
temp=mas1[i];
mas1[i]=mas1[i+2];
mas1[i+2]=temp;
change = true;
}
}
}
 
P

prettynetty

#3
программа считает без ошибок все для целочисленного массива, НО для вещественного даже не дает ввести элементы.

теперь код имеет след.вид:

<!--shcode--><pre><code class='"[i'>[/i]"]
#include<windows.h>
#include<stdio.h>
#include<math.h>
template <class Type> void VVOD(Type *mas1, int m);
template <class Type> void VYVOD(Type mas1, int m);
template <class Type> Type PR(Type *mas1, int m, bool &x);
template <class Type> Type SUM(Type *mas1, int m);
template <class Type> void OBR(Type *mas1, int m);
main()
{
SetConsoleOutputCP(1251);
int mas1[25],m,n,pr1;
float pr2;
bool x;
printf("Введите размерности m и n:\n");
scanf("%d%d",&m,&n);
float *mas2=new float[n];
printf("Для массива типа int:\n");
VVOD(mas1,m);
printf("Для массива типа float:\n");
VVOD(mas2,n);
printf("Массив типа int:\n");
VYVOD(mas1,m);
printf("Массив типа float:\n");
VYVOD(mas2,n);
pr1=PR(mas1,m,x);
if(x==true)
{
printf("Произведение положительных элементов массива типа int равно: %d\n", pr1);
}
else printf("Положительных элементов нет\n");
pr2=PR(mas2,n,x);
if(x==true)
{
printf("Произведение положительных элементов массива типа float равно:%f\n", pr2);
}
else printf("Положительных элементов нет:\n");
printf("Произведение положительных элементов массива типа float равно:%f\n", pr2);
printf("Сумма положительных элементов, расположенных до минимального равна:\n");
printf("для массива типа int: %d\n",SUM(mas1,m));
printf("для массива типа float: %f\n\n ",SUM(mas2,n));

printf("Преобразованные массивы:\n");
OBR(mas1,m);
OBR(mas2,n);
printf("\n");
VYVOD(mas1,m);
printf("\n");
VYVOD(mas2,n);
return 0;
}
template <class Type> void VVOD(Type *mas1, int m)
{
int i;
for(i=0;i<m;i++)
{
printf("Введите %d-ый элемент массива:\n",i);
scanf("%d", &mas1);
}
return;
}
template <class Type> void VYVOD(Type mas1, int m)
{
int i;
for(i=0;i<m;i++)
printf("%d\t",mas1);
printf("\n");
return;
}
template <class Type> Type PR(Type *mas1, int m, bool &x)
{
x=false;
int i;
Type pr=1;
for(i=0;i<m;i++)
if(mas1>0)
{
pr*=mas1;
x=true;
}
return pr;
}
template <class Type> Type SUM(Type *mas1, int m)
{
Type sum=0;
int i,min=0;
for(i=1;i<m;i++)
if(mas1<mas1[min])
min=i;
for(i=0;i<min;i++)
if(mas1>0)
sum+=mas1;
return sum;
}
template <class Type> void OBR(Type *mas1, int m)
{
bool change = true;
while(change)
{
change = false;
for(int i = 0; i < (m - 1) / 2 * 2; i += 2)
if (mas1 > mas1[i + 2])
{
Type temp;
temp=mas1;
mas1=mas1[i+2];
mas1[i+2]=temp;
change = true;
}
}

change = true;
while(change)
{
change = false;
for(int i = 1; i < (m - 2) / 2 * 2; i += 2)
if (mas1 > mas1[i + 2])
{
Type temp;
temp=mas1;
mas1=mas1[i+2];
mas1[i+2]=temp;
change = true;
}
}
}[/CODE]
 
G

Guest

#4
У тебя в функции ввода используется scanf и указывается что он должен принимать целочисленный тип. Соответственно компилятор не может создать шаблонную функцию для типа double, так как ожидается только целочисленный тип. Перепиши код используя потоки ввода-вывода( cin и cout), у них функции вводи и вывода в поток перегружены для всех встроенных типов.
 
P

prettynetty

#5
У тебя в функции ввода используется scanf и указывается что он должен принимать целочисленный тип. Соответственно компилятор не может создать шаблонную функцию для типа double, так как ожидается только целочисленный тип. Перепиши код используя потоки ввода-вывода( cin и cout), у них функции вводи и вывода в поток перегружены для всех встроенных типов.
блин, у меня первоначально была через cin и cout. только зря мучилась с переводом.
Радамант, большое вам спасибо
 
P

prettynetty

#6
исправленный вариант
<!--shcode--><pre><code class='"[code'>[/code]"]#include<iostream.h>
#include<windows.h>
#include<math.h>

template <class Type> void VVOD(Type *mas1, int m);
template <class Type> void VYVOD(Type mas1, int m);
template <class Type> Type PR(Type *mas1, int m, bool &x);
template <class Type> Type SUM(Type *mas1, int m);
template <class Type> void OBR(Type *mas1, int m);

main()
{
SetConsoleOutputCP(1251);
int mas1[25],m,n,pr1;
float pr2;
bool x;
cout<<"Введите размерности m и n:"<<endl;
cin>>m>>n;
float *mas2=new float[n];
cout<<"Для массива типа int:"<<endl;
VVOD(mas1,m);
cout<<"Для массива типа float:"<<endl;
VVOD(mas2,n);
cout<<"Массив типа int:"<<endl;
VYVOD(mas1,m);
cout<<"Массив типа float:"<<endl;
VYVOD(mas2,n);
pr1=PR(mas1,m,x);
if(x==true)
{
cout<<"Произведение положительных элементов массива типа int равно:";
cout<<pr1;
cout<<endl;
}
else cout<<"Положительных элементов нет"<<endl;
pr2=PR(mas2,n,x);
if(x==true)
{
cout<<"Произведение положительных элементов массива типа float равно:";
cout<<pr2;
cout<<endl;
}
else cout<<"Положительных элементов нет:"<<endl;
cout<<endl;
cout<<"Произведение положительных элементов массива типа float равно:"<<endl;
cout<<pr2;
cout<<endl;
cout<<"Сумма положительных элементов, расположенных до минимального равна:";cout<<endl<<endl;
cout<<"для массива типа int:"<<SUM(mas1,m);
cout<<endl;
cout<<"для массива типа float:"<<SUM(mas2,n);
cout<<endl<<endl;
cout<<"Преобразованные массивы:"<<endl;
OBR(mas1,m);
OBR(mas2,n);
cout<<endl;
VYVOD(mas1,m);
cout<<endl;
VYVOD(mas2,n);
return 0;
}
template <class Type> void VVOD(Type *mas1, int m)
{
int i;
for(i=0;i<m;i++)
{
cout<<endl<<"Введите ";
cout<<i+1<<"-ый элемент массива:";
cout<<endl;
cin>>mas1;
}
return;
}
template <class Type> void VYVOD(Type mas1, int m)
{
int i;
for(i=0;i<m;i++)
cout<<mas1<<" ";
cout<<endl;

return;
}
template <class Type> Type PR(Type *mas1, int m, bool &x)
{
x=false;
int i;
Type pr=1;
for(i=0;i<m;i++)
if(mas1>0)
{
pr*=mas1;
x=true;
}
return pr;
}
template <class Type> Type SUM(Type *mas1, int m)
{
Type sum=0;
int i,min=0;
for(i=1;i<m;i++)
if(mas1<mas1[min])
min=i;
for(i=0;i<min;i++)
if(mas1>0)
sum+=mas1;
return sum;
}
template <class Type> void OBR(Type *mas1, int m)
{
bool change = true;
while(change)
{
change = false;
for(int i = 0; i < (m - 1) / 2 * 2; i += 2)
if (mas1 > mas1[i + 2])
{
Type temp;
temp=mas1;
mas1=mas1[i+2];
mas1[i+2]=temp;
change = true;
}
}

change = true;
while(change)
{
change = false;
for(int i = 1; i < (m - 2) / 2 * 2; i += 2)
if (mas1 > mas1[i + 2])
{
Type temp;
temp=mas1;
mas1=mas1[i+2];
mas1[i+2]=temp;
change = true;
}
}
}[/CODE]