Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2014, 22:34   #1
vvmcpp
Форумчанин
 
Аватар для vvmcpp
 
Регистрация: 11.12.2010
Сообщений: 116
Вопрос Можно ли как то упростить программу?

Написал такую программу.
Она находит первое вхождение элемента вектора в заданном интервале x,y
Можно ли её упростить, чтобы не делать две проверки вхождения в интервал?

Код:

#include <cstdlib>
#include <iostream>
#include <vector>

// c++ по мотивам книги "Эффективное использование STL" Скотта Меерса 
// найти первый элемент вектора в заданном диапазоне x,y
// способ предложен был Скоттом Меерсом  вот он: if(*itv>x&&*itv<y)
// и я(vvmCpp на  форуме) написал такую программу 
// вопрос: можно ли её упростить, не делать две проверки?

using namespace std;

int main(int argc, char *argv[])
{
     int a[4]={10,0,25,40};
     
     //инициализируем наш вектор массивом
    vector<int> v(a,a+4);
    
    // задаем диапазон 
    int x=2,y=11;

    
     // итератор  itv на начало вектора
    vector<int>::iterator itv=v.begin();
    
    // вывод вектора  
  cout<<" our vector v ";
  
  // после for, наш итератор указывает на последний элемент
     for(itv=v.begin();itv!=v.end();++itv)
       cout<<*itv<<" ";
     
     
     itv=v.begin();
    // перебирать элементы с v.begin() до нужного
    // или достижения v.end()
    
    cout<<endl;
    
    // после завершения цикла наш итератор itv указывает на искомый элемент или совпадает 
    // с v.end();, концом вектора

    for(;itv!=v.end();++itv)
        {
                        if(*itv>x&&*itv<y) break;
          
          // тут может указывать просто на конец вектора
          // и нужно еще раз проверить                  
        }
    
    
   // проверка что последний элемент  в заданном диапазоне
    if(*itv>x&&*itv<y) 
    // выводим значение вектора   
    cout<<*itv<<" ";
    
    
    
    else 
    // если такого элемента не нашлось
    cout<<"not in interval"<<endl;
    
    
    
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

Последний раз редактировалось vvmcpp; 14.02.2014 в 10:58. Причина: дополнение
vvmcpp вне форума Ответить с цитированием
Старый 13.02.2014, 22:44   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,219
По умолчанию

Код:
if(abs(*itv-x)+abs(*itv-y)<abs(y-x)) break;
Arigato вне форума Ответить с цитированием
Старый 14.02.2014, 06:22   #3
009
Пользователь
 
Регистрация: 09.02.2014
Сообщений: 33
По умолчанию

Цитата:
if(abs(*itv-x)+abs(*itv-y)<abs(y-x)) break;
правильнее будет:
Код:
if(abs(*itv-x)+abs(*itv-y)==abs(y-x)) break;
но даже такое сравнение не совсем верное (будет выполняться когда (*itv>x&&*itv<y), а также когда *itv==x или *itv==y).

Код:
#include <cstdlib>
#include <iostream>
#include <vector>

// c++ по мотивам книги "Эффективное использование STL" Скотта Меерса 
// найти первый элемент вектора в заданном диапазоне x,y
// способ предложен был Скоттом Меерсом  вот он: if(*itv>x&&*itv<y)
// и я(vvmCpp на  форуме) написал такую программу 
// вопрос: можно ли её упростить, не делать две проверки?

using namespace std;

int main(int argc, char *argv[])
{
     int a[4]={10,0,25,40};
     
     //инициализируем наш вектор массивом
    vector<int> v(a,a+4);
    
    // задаем диапазон 
    int x=2,y=11;

    
     // итератор на начало вектора
    vector<int>::iterator itv;
    
    // вывод вектора  
  cout<<" our vector v ";
  
  // после for наш итератор указывает на последний элемент
     for(itv=v.begin();itv!=v.end();++itv)
       cout<<*itv<<" ";
     
     
     itv=v.begin();
    // перебирать элементы с v.begin() до нужного
    // или достижения v.end()
    
    cout<<endl;
    
    // после завершения цикла i указывает на искомый элемент или совпадает 
    // с v.end();
    for(;itv!=v.end();++itv)
        {
			if(*itv>x&&*itv<y){
				cout<<*itv<<" "; 
			system("PAUSE");
			return EXIT_SUCCESS;}
          
          // тут может указывать просто на конец вектора
          // и нужно еще раз проверить                  
        }
    
    
   // проверка что последний элемент  в заданном диапазоне
//    if(*itv>x&&*itv<y) 
    // выводим значение вектора      
    
  //  else 
    // если такого элемента не нашлось
    cout<<"not in interval"<<endl;
    
    
    
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
009 вне форума Ответить с цитированием
Старый 14.02.2014, 11:36   #4
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,219
По умолчанию

Цитата:
Сообщение от 009 Посмотреть сообщение
правильнее будет:
Код:
if(abs(*itv-x)+abs(*itv-y)==abs(y-x)) break;
но даже такое сравнение не совсем верное (будет выполняться когда (*itv>x&&*itv<y), а также когда *itv==x или *itv==y).
Согласен. Тогда такое условие:

Код:
if((x-*itv)*(y-*itv)<0) break;
Arigato вне форума Ответить с цитированием
Старый 14.02.2014, 11:47   #5
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

Код:
#include <cstdlib>
#include <iostream>
#include <vector>
#include "algorithm"
#include <functional>

using namespace std;

struct diff
{
  int x;
  int y;
};

bool is_eq(int i, diff d)
{ 
  return i > d.x && i < d.y; 
}

int main(int argc, char *argv[])
{
     typedef std::vector<int> int_vector;

     int a[4] = {0,10,25,40};     
     vector<int> v(a,a+4);             
     int_vector::iterator itv = v.begin();    
     cout<<"our vector v"<<endl;
    
     for(itv=v.begin();itv!=v.end();++itv)
        cout << *itv << " ";          
     cout<<endl;
     itv = v.begin();    
     diff d = {2, 11};
     cout<<endl;
     int_vector::iterator itf = std::find_if(v.begin(), v.end() , std::bind2nd(std::ptr_fun(&is_eq), d));               
     if(itf != v.end())         
        cout<< *itf << " ";            
     else     
        cout<<"not in interval"<<endl;
    
           
    system("PAUSE");
    return EXIT_SUCCESS;
}
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 14.02.2014, 12:08   #6
009
Пользователь
 
Регистрация: 09.02.2014
Сообщений: 33
По умолчанию

Цитата:
Тогда такое условие:

Код:
if((x-*itv)*(y-*itv)<0) break;
Это условие будет работать, но только при положительных числах )
009 вне форума Ответить с цитированием
Старый 14.02.2014, 13:24   #7
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,219
По умолчанию

Работает при любых числах
Arigato вне форума Ответить с цитированием
Старый 14.02.2014, 13:42   #8
009
Пользователь
 
Регистрация: 09.02.2014
Сообщений: 33
По умолчанию

Цитата:
Работает при любых числах
я ошибся, признаюсь )
009 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как переделать программу на TASM? подскОжите как упростить данную программу а то билеберда какая-то datileo Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 25.02.2013 11:56
Как можно упростить код. Predator199 PHP 14 05.12.2012 13:39
Как можно упростить программу? sullen Общие вопросы C/C++ 2 08.06.2012 18:54
День добрый!Как можно упростить просмотр таблиц? bize Microsoft Office Excel 4 10.01.2012 02:29
Как можно упростить программу? Евгений92 Общие вопросы C/C++ 0 07.11.2010 17:50