Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Срезы...не компилируется программа 
:(
    Опции темы
weirdo
Дата 21.3.2008, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 16.1.2007

Репутация: нет
Всего: нет



Задача...
В одномерном массиве, состоящем из п вещественных элементов, вычислить:
3)    сумму элементов массива с нечетными номерами;
4)    сумму элементов массива, расположенных между первым и последним отрицательными элементами.    
Сжать массив, удалив из него все элементы, модуль которых не превышает 1. Ос¬вободившиеся в конце массива элементы заполнить нулями.
Код

//файл main.cpp


#include <iostream>
#include <valarray>

using namespace std;

#include "in.h" // реализация функции in
#include "sum1.h" // реализация функции sum1
#include "sum.h" // реализация функции sum
#include "sort.h" // реализация функции sort_valarray

int main()
{
    // создание экземпляра класса valarray для хранения чисел с плавающей запятой
    valarray<double> v = in(); 

    sum1(v); // вызов функции sum1
    sum(v); // вызов функции sum
    sort_valarray(v); // вызов функции sort_valarray

    return 0;
}

//файл in.h

/* функция:
- запрашивает размер массива;
- создает экземпляр класса valarray для хранения чисел с плавающей запятой указанного размера;
- заполняет массив числами, введенными с клавиатуры;
- возвращает массив в функцию main */
valarray<double> in()
{
    int i = 0;
    int count; // размер массива

    cout << "Enter count of array: "; // приглашение (введте размер массива)
    cin >> count; // ввод размера массива в переменную count

    /* создание экземпляра класса valarray для хранения чисел с плавающей запятой указанного размера */
    valarray<double> v(count);

    for (; i < v.size(); i++) // цикл по каждому элементу v
    {
        cout << "v[" << i+1 << "] = "; // приглашение (v[индекс] = )
        cin >> v[i]; // ввод значения в v по индексу i
    }

    return v; // возвращение экземпляра класса valarray (v) в функцию main
}

//файл sum1.h

/* функция нахождения суммы нечетных элементов массива */
void sum1(valarray<double> v)
{
    int i;
    double summa=0;
    
    for (i = 0; i < v.size(); i+2) // цикл по каждому элементу v
    {
        summa+= v[i];
        
    }

cout << "Sum of uneven numbers: " << summa << endl; 
       }
    


//файл sum.h

/* функция нахождения суммы элементов массива, расположенных между первым и последним отрицательными элементами */
void sum(valarray<double> v)
{
    int i;
    int beg = -1; // номер первого отрицательного элемента массива
    int end = -1; // номер последнего отрицательного элемента массива

    for (i = 0; i < v.size(); i++) // цикл по каждому элементу v
            // является ли элемент первым отрицательным в массиве
        if (v[i] < 0) 
        {
            beg = i; /* сохранение в переменной beg номера первого отрицательного элемента массива */
        }
    for (i = v.size(); i >0; i--) // цикл по каждому элементу v
        {
        // является ли элемент последним отрицательным в массиве
        if (v[i] < 0) 
        {
            end = i; /* сохранение в переменной end номера последнего отрицательного элемента массива */
        }

// есть ли в массиве 2 отрицательных элемента, и есть ли между ними другие элементы
    if ((end - beg) > 1) 
    {
        slice s(beg + 1, end - beg - 1, 1); // создание экземпляра класса slice (срез)
        // выборка из массива v элементов с помощью среза s
        valarray<double> temp = v[s]; 
/* вывод суммы элементов массива temp, то есть элементов, расположенных между первым и последним отрицательными элементами */
cout << "Sum of numbers between 2 first negative numbers: " << temp.sum() << endl; 
    }
    else
/* вывод сообщения об отсутствии 2 отрицательных элементов или об отсутствии между ними других элементов */
cout << "Error.\n"; 
}

//файл sort.h

/* функция сортировки массива: сначала располагаются все элементы, модуль которых не превышает 1, а потом - все остальные */
void sort_valarray(valarray<double> v)
{
    int i = 0, index = 0;
    valarray<double> sort(v.size()); // для сохранения результата сортировки массива v

    for (; i < v.size(); i++) // цикл по каждому элементу v
        if (v[i] > -1 && v[i] < 1) // не превышает ли модуль i-го элемента единицу(1)
            sort[index++] = v[i]; /* если не превышает, то значение заносится в массив sort */
    for (i = 0; i < v.size(); i++) // цикл по каждому элементу v
        if (v[i] <= -1 || v[i] >= 1) // превышает ли модуль i-го элемента единицу(1)
            sort[index++] = 0; /* если превышает, то значение заносится в массив sort */

    // вывод элементов массива sort - результата сортировки массива v
    cout << "Sort valarray: ";
    for (i = 0; i < sort.size(); i++)
        cout << sort[i] << "\t";
    cout << "\n";
}


При компиляции выдает ошибки..
e:\учеба\dimon\oop\44\sort.h(3) : error C2601: 'sort_valarray' : local function definitions are illegal
E:\Учеба\DimOn\oop\44\main.cpp(12) : error C2601: 'main' : local function definitions are illegal
E:\Учеба\DimOn\oop\44\main.cpp(22) : fatal error C1004: unexpected end of file found

почему именно так???
PM MAIL   Вверх
baldina
Дата 21.3.2008, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



файл sum.h - не хватает закрывающей фигурной скобки.

Добавлено через 1 минуту и 19 секунд
Вообще так не делают. В заголовки помещают только описания, а определения - в соотв. .срр файлы. У тебя ведь не шаблонные функции.
PM MAIL   Вверх
Rififi
Дата 21.3.2008, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 3
Всего: 36



вариант без срезов.

Код

#include <numeric>
#include <functional>
#include <algorithm>
#include <limits>

/*
В одномерном массиве, состоящем из п вещественных элементов, вычислить:
3)    сумму элементов массива с нечетными номерами;
*/
float accumulate_odd(float* arr, size_t N)
{
    struct Op : public std::binary_function<float, float, float>
    {
        Op() : pos_(0) {}
        result_type operator()(const first_argument_type& res, const second_argument_type& val)
        { return res + ((pos_++ & 1) ? val : 0); }
        int pos_;
    };

    return std::accumulate(arr, arr + N, float(0), Op());
}

/*
4)    сумму элементов массива, расположенных между первым и последним отрицательными элементами.    
Сжать массив, удалив из него все элементы, модуль которых не превышает 1. Ос¬вободившиеся в конце массива элементы заполнить нулями.
*/
float sum_and_shrink(float* arr, size_t N)
{
    typedef float* iterator;

    // поиск первого и последнего отрицательного элемента
    std::binder2nd<std::less<float> > less0 = std::bind2nd(std::less<float>(), float(0));
    iterator first = std::find_if(arr, arr+N, less0);
    if (first == arr+N) // нет отрицательных элементов
        return std::numeric_limits<float>::quiet_NaN();
    iterator tmp = first+1, last = arr+N;
    while ((tmp = std::find_if(tmp, arr+N, less0)) != arr+N)
        last = tmp++;
    if (last == arr+N) // только один отрицательный элеммент
        return std::numeric_limits<float>::quiet_NaN();
    
    // вычисление суммы
    float sum = std::accumulate(first+1, last, float(0));

    struct less_fabs : public std::unary_function<float, bool>
    {
        less_fabs(float limit) : limit_(limit) {}
        result_type operator()(const argument_type& val) const
        { return std::fabs(val) <= limit_; }
        float limit_;
    };

    // Сжать массив
    last = std::remove_if(arr, arr+N, less_fabs(1));
    std::fill(last, arr+N, float(0));
    
    return (sum);
}

int main()
{
    float arr[] = {...};
    const size_t N = sizeof(arr) / sizeof(arr[0]);

    accumulate_odd(arr, N);
    sum_and_shrink(arr, N);

    return (0);
}



Это сообщение отредактировал(а) Rififi - 21.3.2008, 15:18
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0462 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.