Форум программистов, компьютерный форум CyberForum.ru

namespace - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.56
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.11.2010, 04:39     namespace #1
Адекватно-ли использовать в таком случае пространство имен?
Лучший-ли это выход из ситуации?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
#include <string>
 
namespace consts
{
    const std::string cm="cm";
    const std::string in="in";
    const std::string ft="ft";
    const std::string m="m";
 
    const int cmtom=100;
    const double cmtoin=2.54;
    const int intoft=12;
}
 
bool isCorrVal(const std::string& s)
{
    if(s==consts::cm || s==consts::in || s==consts::ft || s==consts::m)
        return true;
    return false;
}
 
double valtom(std::string& s, double val)
{
    using namespace consts;
 
    if(s==cm)
        val/=cmtom;
    else if(s==in)
        val*=cmtoin/cmtom;
    else if(s==ft)
        val*=intoft*cmtoin/cmtom;
    else
        ;
    s=m;
    return val;
}
 
int main()
{
    std::locale().global(std::locale(""));
    double d=0, min=100500, max=0;
    std::string str;
    double sum=0;
    while(std::cin>>d)
    {
        std::cin>>str;
        std::cout<<d;
        if(isCorrVal(str))
            std::cout<<str<<'\n';
        else
        {
            std::cout<<"Ошибка. Нет такой длины "<< str <<'\n';
            continue;
        }
        
        d=valtom(str, d);
        sum+=d;
        std::cout<<"Now "<< d << str <<'\n';
        if(d<min)
        {
            min=d;
            std::cout<<"Наименьшее среди ранее введенных\n";
        }
        else if(d>max)
        {
            max=d;
            std::cout<<"Наибольшее среди ранее введенных\n";
        }
    }
    sum-=(min+max);
    std::cout<<"Сумма в метрах: "<< sum <<'\n';
    std::cout<<"Наименьшее в метрах: "<< min 
        <<'\n'<<"Наибольшее в метрах: "<< max <<'\n';
    return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2010, 04:39     namespace
Посмотрите здесь:

вопрос по using namespace C++
using namespace std; C++
C++ Namespace
namespace C++
using namespace std C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
14.11.2010, 06:08     namespace #2
Я бы использовал enum
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.11.2010, 06:12  [ТС]     namespace #3
Nameless One, enum хотел сначала использовать. Но не совсем дошло как совместить строки с перечислением в данном случае.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
14.11.2010, 07:14     namespace #4
Цитата Сообщение от ForEveR Посмотреть сообщение
Но не совсем дошло как совместить строки с перечислением в данном случае.
Ну хотя бы так, к примеру (на оптимальность не претендую, тут уж каждый делает так, как ему нравится):
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
enum units
{
    cm, in, ft, m
};
 
const double u_in_meter[4] =
{
    .01, .0254, .3048, 1
};
 
enum units strtounit(const char* str)
{
    if(strcmp(str, "cm") == 0)
        return cm;
    if(strcmp(str, "in") == 0)
        return in;
    if(strcmp(str, "ft") == 0)
        return ft;
    if(strcmp(str, "m") == 0)
        return m;
    fprintf(stderr, "Ошибка - неизвестная единица \"%s\"\n", str);
    exit(EXIT_FAILURE);
}
 
double tometers(enum units unit, double val)
{
    return val * u_in_meter[unit];
}
    
int main()
{
    enum units unit;
    char str[3];
    double val;
    printf("Введите длину с указанием единицы измерения\n");
    printf("Формат: ЧИСЛО cm | in | ft | m\n");
    scanf("%lf %s", &val, str);
    printf("%.2f %s = %.2f m\n", val, str, tometers(strtounit(str), val));
    return EXIT_SUCCESS;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.11.2010, 07:21  [ТС]     namespace #5
Nameless One, Красиво.
NightmareZ
 Аватар для NightmareZ
1336 / 559 / 37
Регистрация: 31.03.2009
Сообщений: 1,907
14.11.2010, 08:45     namespace #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от ForEveR Посмотреть сообщение
Лучший-ли это выход из ситуации?
Я бы как-нить так сделал:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <exception>
 
typedef std::map<std::string, float> MAP;
 
class Units
{
private:
    MAP _units;
 
    Units() 
    { 
        _units["cm"] = 0.01f;
        _units["in"] = 0.0254f;
        _units["ft"] = 0.3048f;
        _units["m"] = 1.0f;
    }
public:
    static Units& getInstance()
    {
        static Units instance;
        return instance;
    }
 
    float convertToMeters(std::string units, float value)
    {
        MAP::iterator it = _units.find(units);
        if (it == _units.end())
            throw std::exception("Unknown units");
        return value * (*it).second;
    }
};
 
class Length
{
private:
    float _value;
public:
    friend std::istream& operator>>(std::istream& is, Length& length)
    {
        std::string units;
        float x;
        is >> x >> units;
        length._value = Units::getInstance().convertToMeters(units, x);
        return is;
    }
 
    friend std::ostream& operator<<(std::ostream& os, Length& length)
    {
        os << std::setiosflags(std::ios::fixed) << std::setprecision(2)
           << length._value << " m" << std::endl;
        return os;
    }
};
 
int main()
{
    Length length;
    std::cin >> length;
    std::cout << length;
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2010, 23:33     namespace
Еще ссылки по теме:

namespace C++
namespace C++
namespace std C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.11.2010, 23:33  [ТС]     namespace #7
NightmareZ, Силен. Интересный вариант
Yandex
Объявления
14.11.2010, 23:33     namespace
Ответ Создать тему
Опции темы

Текущее время: 15:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru