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

Тема в разделе "C/C++/C#", создана пользователем prettynetty, 29 фев 2012.

  1. prettynetty

    prettynetty Гость

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

    Дано несколько массивов чисел (типы массивов различны). Длины массивов вводятся пользователем. Требуется для каждого массива выполнить заданные действия.
    Ввести и обработать два одномерных массива, содержащие соответственно 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]
     
  2. Гость

    Репутация:
    0
    Код:
    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;
    }
    }
    }
     
  3. prettynetty

    prettynetty Гость

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

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

    <!--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]
     
  4. Гость

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

    prettynetty Гость

    Репутация:
    0
    блин, у меня первоначально была через cin и cout. только зря мучилась с переводом.
    Радамант, большое вам спасибо
     
  6. prettynetty

    prettynetty Гость

    Репутация:
    0
    исправленный вариант
    <!--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]
     
Загрузка...
Похожие Темы - Шаблоны Функций Обработка
  1. dimanwv
    Ответов:
    2
    Просмотров:
    1.662
  2. Edip
    Ответов:
    1
    Просмотров:
    1.115
  3. late
    Ответов:
    0
    Просмотров:
    1.414
  4. Whatka
    Ответов:
    2
    Просмотров:
    1.473
  5. lmike
    Ответов:
    0
    Просмотров:
    1.454

Поделиться этой страницей