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

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

  1. prettynetty

    prettynetty Гость

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

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

    Код (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;
    }
    }
    }
     
  3. prettynetty

    prettynetty Гость

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

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

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

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

    prettynetty Гость

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

    prettynetty Гость

    исправленный вариант
    <!--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.577
  2. Edip
    Ответов:
    1
    Просмотров:
    1.042
  3. late
    Ответов:
    0
    Просмотров:
    1.327
  4. Whatka
    Ответов:
    2
    Просмотров:
    1.369
  5. lmike
    Ответов:
    0
    Просмотров:
    1.397

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