Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Blacit
1 / 1 / 0
Регистрация: 18.07.2016
Сообщений: 28
1

Самый простой компилятор

09.12.2018, 22:31. Просмотров 1219. Ответов 20

В чём ошибка? Компилятор выдаёт ошибку.

C++ (Qt)
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
#include <iostream>
 
using namespace std;
 
    using std:cout; using std::cin;
    float sm, E, tm, sv, tv;
    const int M = 100;
    const int CM = 1;
    const float F = 30.48;
    const float Inch = 2.54;
    
int main()
{
    setlocal(0, "russian");
    cout << "Выберите размер входной величины: ";
    cout << "1) CM" <<endl;
    cout << "2) Inch" <<endl;
    cout << "3) Feet" <<endl;
    cout << "4) Metr" <<endl;
    cin >> cin sm;
    cout << "Выберите размер выходной величины: ";
    cout << "1) CM" <<endl;
    cout << "2) Inch" <<endl;
    cout << "3) Feet" <<endl;
    cout << "4) Metr" <<endl;
    cin >> tm;
    
    cout << "Введите величину: "
    cin >> sv;
    
    E = (sm - 1) * 4 + (tm - 1);
    
    tv = (
    (E==0) * (sv) +
    (E==1) * (sv * 1) +
    (E==2) * (sv * 0.39f) +
    (E==3) * (sv * 0.001f) +
    (E==4) * (sv * 1/2.4f) +
    (E==5) * (sv * 2.54f) +
    (E==6) * (sv * 1) +
    (E==7) * (sv * 0.833f) +
    (E==8) * (sv * 0.0254f) +
    (E==9) * (sv * 30.48f) +
    (E==10) * (sv * 12f) +
    (E==11) * (sv * 1) +
    (E==12) * (sv * 0.3048f) +
    (E==13) * (sv * 100) +
    (E==14) * (sv * 39,37f) +
    (E==15) * (sv * 0.3048f) +
    (E==16) * (sv * 1) +
    )
    return 0;
}
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2018, 22:31
Ответы с готовыми решениями:

Самый самый самый простой пример рекурсии
приведите самый прост пример рекурсии)))void main(int k) { int n=10; k=n; k++; n=k; ...

Самый простой односвязный список
Здравствуйте. Найдите ошибки или помогите полностью написать самый простой односвязный список. Без...

Самый простой вопрос на сегодня.
Простейшая задача. Я думал справится за пару минут в купе с google, но что-то как-то не срослось =(...

Самый простой, примитивный морской бой
Достаточно много исходников уже искал но так и не нашел что нужно нужно как можно проще написать...

Самый большой простой делитель числа
#include &lt;iostream&gt; using namespace std; void main() { setlocale(LC_ALL, &quot;Russian&quot;); ...

20
Antikl
с++
367 / 346 / 167
Регистрация: 15.07.2015
Сообщений: 1,823
Завершенные тесты: 6
09.12.2018, 22:35 2
Цитата Сообщение от Blacit Посмотреть сообщение
tv = (
* * (E==0) * (sv) +
* * (E==1) * (sv * 1) +
* * (E==2) * (sv * 0.39f) +
* * (E==3) * (sv * 0.001f) +
* * (E==4) * (sv * 1/2.4f) +
* * (E==5) * (sv * 2.54f) +
* * (E==6) * (sv * 1) +
* * (E==7) * (sv * 0.833f) +
* * (E==8) * (sv * 0.0254f) +
* * (E==9) * (sv * 30.48f) +
* * (E==10) * (sv * 12f) +
* * (E==11) * (sv * 1) +
* * (E==12) * (sv * 0.3048f) +
* * (E==13) * (sv * 100) +
* * (E==14) * (sv * 39,37f) +
* * (E==15) * (sv * 0.3048f) +
* * (E==16) * (sv * 1) +
* * )
что ты тут высчитываешь?
0
Blacit
1 / 1 / 0
Регистрация: 18.07.2016
Сообщений: 28
09.12.2018, 23:06  [ТС] 3
Здесь идут сами расчёты. Конвертирование.
Точнее это я так представляю, что ту происходит)
Формулы перевода.

Добавлено через 24 минуты
Актуально. Немного переделал.

C++ (Qt)
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
#include <iostream>
 
using namespace std;
 
    using std::cout; using std::cin;
    float sm, E, tm, sv, tv;
    const int M = 100;
    const int CM = 1;
    const float F = 30.48;
    const float Inch = 2.54;
    
int main()
{
    cout << "Select size input size: ";
    cout << "1) CM" <<endl;
    cout << "2) Inch" <<endl;
    cout << "3) Feet" <<endl;
    cout << "4) Metr" <<endl;
    cin >> cin sm;
    cout << "Select the size of the output value: ";
    cout << "1) CM" <<endl;
    cout << "2) Inch" <<endl;
    cout << "3) Feet" <<endl;
    cout << "4) Metr" <<endl;
    cin >> tm;
    
    cout << "Enter a value:";
    cin >> sv;
    
    E = (sm - 1) * 4 + (tm - 1);
    
    tv = (
    (E==0) * (sv) +
    (E==1) * (sv * 1) +
    (E==2) * (sv * 0.39f) +
    (E==3) * (sv * 0.001f) +
    (E==4) * (sv * 1/2.4f) +
    (E==5) * (sv * 2.54f) +
    (E==6) * (sv * 1) +
    (E==7) * (sv * 0.833f) +
    (E==8) * (sv * 0.0254f) +
    (E==9) * (sv * 30.48f) +
    (E==10) * (sv * 12f) +
    (E==11) * (sv * 1) +
    (E==12) * (sv * 0.3048f) +
    (E==13) * (sv * 100) +
    (E==14) * (sv * 39.37f) +
    (E==15) * (sv * 0.3048f) +
    (E==16) * (sv * 1) +
    )
    return 0;
}
0
Antikl
с++
367 / 346 / 167
Регистрация: 15.07.2015
Сообщений: 1,823
Завершенные тесты: 6
09.12.2018, 23:14 4
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
#include <iostream>
 
using namespace std;
 
    float sm, E, tm, sv, tv;
    const int M = 100;
    const int CM = 1;
    const float F = 30.48;
    const float Inch = 2.54;
    
int main()
{
    cout << "Select size input size: ";
    cout << "1) CM" <<endl;
    cout << "2) Inch" <<endl;
    cout << "3) Feet" <<endl;
    cout << "4) Metr" <<endl;
    cin >>  sm;
    cout << "Select the size of the output value: ";
    cout << "1) CM" <<endl;
    cout << "2) Inch" <<endl;
    cout << "3) Feet" <<endl;
    cout << "4) Metr" <<endl;
    cin >> tm;
    
    cout << "Enter a value:";
    cin >> sv;
    
    E = (sm - 1) * 4 + (tm - 1);
    
    tv = (
    (E==0) * (sv) +
    (E==1) * (sv * 1) +
    (E==2) * (sv * 0.39f) +
    (E==3) * (sv * 0.001f) +
    (E==4) * (sv * 1/2.4f) +
    (E==5) * (sv * 2.54f) +
    (E==6) * (sv * 1) +
    (E==7) * (sv * 0.833f) +
    (E==8) * (sv * 0.0254f) +
    (E==9) * (sv * 30.48f) +
    (E==10) * (sv * 12.0f) +
    (E==11) * (sv * 1) +
    (E==12) * (sv * 0.3048f) +
    (E==13) * (sv * 100) +
    (E==14) * (sv * 39.37f) +
    (E==15) * (sv * 0.3048f) +
    (E==16) * (sv * 1)
    );
    return 0;
}
1
09.12.2018, 23:14
valen10
Параллельный Кот
1263 / 532 / 210
Регистрация: 25.03.2016
Сообщений: 1,186
Завершенные тесты: 1
09.12.2018, 23:18 5
Переменные sm, E, tm должны быть целыми, т.к. определяют номер варианта. Сравнение вещественных чисел на равенство очень плохая идея. Константы нигде не используются, они тут вообще нужны в таком случае?
0
Blacit
1 / 1 / 0
Регистрация: 18.07.2016
Сообщений: 28
09.12.2018, 23:55  [ТС] 6
Спасибо большое, Antikl.
Код работает. Но вот у меня только введённые числа почему-то не конвертируются. Не знаете причину?
0
valen10
Параллельный Кот
1263 / 532 / 210
Регистрация: 25.03.2016
Сообщений: 1,186
Завершенные тесты: 1
09.12.2018, 23:59 7
Blacit, вы забыли его вывести в конце.
C++
1
cout << "Result: " << tv << endl;
1
Blacit
1 / 1 / 0
Регистрация: 18.07.2016
Сообщений: 28
10.12.2018, 00:02  [ТС] 8
Спасибо, вывел результат (честно не знал про это)
Сама конвертация не происходит...
Извините за такое количество вопросов, стараюсь учиться.
Вы выше про константы говорили, предлагаете просто убрать эти 4 строчки?

const int M = 100;
const int CM = 1;
const float F = 30.48;
const float Inch = 2.54;


Сам код:


C++ (Qt)
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
#include <iostream>
 
using namespace std;
 
    float sm, E, tm, sv, tv;
    const int M = 100;
    const int CM = 1;
    const float F = 30.48;
    const float Inch = 2.54;
    
int main()
{
    cout << "Select size input size: " <<endl;;
    cout << "1) CM" <<endl;
    cout << "2) Inch" <<endl;
    cout << "3) Feet" <<endl;
    cout << "4) Metr" <<endl;
    cin >>  sm;
    cout << "Select the size of the output value: " <<endl;
    cout << "1) CM" <<endl;
    cout << "2) Inch" <<endl;
    cout << "3) Feet" <<endl;
    cout << "4) Metr" <<endl;
    cin >> tm;
    
    cout << "Enter a value:";
    cin >> sv;
    
    E = (sm - 1) * 4 + (tm - 1);
    
    tv = (
    (E==0) * (sv) +
    (E==1) * (sv * 1) +
    (E==2) * (sv * 0.39f) +
    (E==3) * (sv * 0.001f) +
    (E==4) * (sv * 1/2.4f) +
    (E==5) * (sv * 2.54f) +
    (E==6) * (sv * 1) +
    (E==7) * (sv * 0.833f) +
    (E==8) * (sv * 0.0254f) +
    (E==9) * (sv * 30.48f) +
    (E==10) * (sv * 12.0f) +
    (E==11) * (sv * 1) +
    (E==12) * (sv * 0.3048f) +
    (E==13) * (sv * 100) +
    (E==14) * (sv * 39.37f) +
    (E==15) * (sv * 0.3048f) +
    (E==16) * (sv * 1)
    );
    
    cout << "Result: " << tv << endl;
    return 0;
}
0
valen10
Параллельный Кот
1263 / 532 / 210
Регистрация: 25.03.2016
Сообщений: 1,186
Завершенные тесты: 1
10.12.2018, 00:16 9
Blacit, или убрать (правда они ни на что не влияют), либо использовать, не зря же вы их писали.
Для начала, научитесь верно выделять код тегами: найдите кнопку языка c++, поскольку у вас это не код для Qt. И сделайте переменные sm, E, tm целочисленными (unsigned int), полагаю дело именно в ошибке сравнения вещественных чисел на равенство. Расскажите о результатах.
0
Blacit
1 / 1 / 0
Регистрация: 18.07.2016
Сообщений: 28
10.12.2018, 00:36  [ТС] 10
Извините. Я сразу не заметил C++. Теперь через него.
Вот то, что я сделал:
1. переменные sm, E, tm целочисленными (unsigned int)
2. Удалил константы

Мои догадки: что-то не так с формулами. Именно в них уже подсчёты неправильные. Потому что конвертирование происходит, но неверное.

Код, который получился:

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
#include <iostream>
 
using namespace std;
 
    float sv, tv;
    unsigned int sm, E, tm;
    
int main()
{
    cout << "Select size input size: " <<endl;;
    cout << "1) CM" <<endl;
    cout << "2) Inch" <<endl;
    cout << "3) Feet" <<endl;
    cout << "4) Metr" <<endl;
    cin >>  sm;
    cout << "Select the size of the output value: " <<endl;
    cout << "1) CM" <<endl;
    cout << "2) Inch" <<endl;
    cout << "3) Feet" <<endl;
    cout << "4) Metr" <<endl;
    cin >> tm;
    
    cout << "Enter a value:";
    cin >> sv;
    
    E = (sm - 1) * 4 + (tm - 1);
    
    tv = (
    (E==0) * (sv) +
    (E==1) * (sv * 1) +
    (E==2) * (sv * 0.39f) +
    (E==3) * (sv * 0.001f) +
    (E==4) * (sv * 1/2.4f) +
    (E==5) * (sv * 2.54f) +
    (E==6) * (sv * 1) +
    (E==7) * (sv * 0.833f) +
    (E==8) * (sv * 0.0254f) +
    (E==9) * (sv * 30.48f) +
    (E==10) * (sv * 12) +
    (E==11) * (sv * 1) +
    (E==12) * (sv * 0.3048f) +
    (E==13) * (sv * 100) +
    (E==14) * (sv * 39.37f) +
    (E==15) * (sv * 0.3048f) +
    (E==16) * (sv * 1)
    );
    
    cout << "Result: " << tv << endl;
    return 0;
}
0
valen10
Параллельный Кот
1263 / 532 / 210
Регистрация: 25.03.2016
Сообщений: 1,186
Завершенные тесты: 1
10.12.2018, 00:45 11
Цитата Сообщение от Blacit Посмотреть сообщение
Мои догадки: что-то не так с формулами. Именно в них уже подсчёты неправильные. Потому что конвертирование происходит, но неверное.
Хорошо. Верные догадки. Чтобы уменьшить количество ошибок, пишите комментарии. Вот вам фрагмент с комментариями для всех формул. Заметно, что первая (под номером 0) лишняя и совпадает со второй, остальные поехали вниз, № 16 быть вообще не должно, т.к. всего 4 * 4 действий и нумерация с 0.

Кликните здесь для просмотра всего текста
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
    tv = (
    // CM -> CM
    (E==0) * (sv) +
    // CM -> Inch
    (E==1) * (sv * 1) +
    // CM -> Feet
    (E==2) * (sv * 0.39f) +
    // CM -> Metr
    (E==3) * (sv * 0.01f) +
    // Inch -> CM
    (E==4) * (sv * 1/2.4f) +
    // Inch -> CInch
    (E==5) * (sv * 2.54f) +
    // Inch -> Feet
    (E==6) * (sv * 1) +
    // Inch -> Metr
    (E==7) * (sv * 0.833f) +
    // Feet -> CM
    (E==8) * (sv * 0.0254f) +
    // Feet -> Inch
    (E==9) * (sv * 30.48f) +
    // Feet -> Feet
    (E==10) * (sv * 12.0f) +
    // Feet -> Metr
    (E==11) * (sv * 1) +
    // Metr -> CM
    (E==12) * (sv * 0.3048f) +
    // Metr -> Inch
    (E==13) * (sv * 100) +
    // Metr -> Feet
    (E==14) * (sv * 39.37f) +
    // Metr -> Metr
    (E==15) * (sv * 0.3048f) +
    // Что-то лишнее.
    (E==16) * (sv * 1)
    );


Еще совет: везде, где вам нужны целые числа, используйте именно целые числа, т.к. вычисление вещественных чисел происходит приблизительно. Связано с тем, что вещественные числа могут быть бесконечными дробями, а для их представления в памяти компьютера выделяется конечное количество памяти. Записать бесконечное число конечным количеством знаков без потерь точности невозможно.

Тип double имеет большую точность, нежели float, поэтому предпочтительнее использовать именно его. Тип float используется только в случаях, когда объем памяти критичен.
0
Blacit
1 / 1 / 0
Регистрация: 18.07.2016
Сообщений: 28
10.12.2018, 01:03  [ТС] 12
То, что сделал:
Удалил float вначале и приписку у всех чисел. Прислушался ко всем Вашим замечаниям.
Вставил вначале double. Не могли бы Вы объяснить, нужно у чисел в с плавающей точкой ставить на конце что-то?

Код, который работает:

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>
 
using namespace std;
 
    double sv, tv;
    unsigned int sm, E, tm;
    
int main()
{
    cout << "Select size input size: " <<endl;
    cout << "1) CM" <<endl;
    cout << "2) Inch" <<endl;
    cout << "3) Feet" <<endl;
    cout << "4) Metr" <<endl;
    cin >>  sm;
    cout << "Select the size of the output value: " <<endl;
    cout << "1) CM" <<endl;
    cout << "2) Inch" <<endl;
    cout << "3) Feet" <<endl;
    cout << "4) Metr" <<endl;
    cin >> tm;
    
    cout << "Enter a value:";
    cin >> sv;
    
    E = (sm - 1) * 4 + (tm - 1);
    
tv = (
    // CM -> CM
    (E==0) * (sv * 1) +
    // CM -> Inch
    (E==1) * (sv * 0.39) +
    // CM -> Feet
    (E==2) * (sv * 0.01) +
    // CM -> Metr
    (E==3) * (sv * 1/2.4) +
    // Inch -> CM
    (E==4) * (sv * 2.54) +
    // Inch -> CInch
    (E==5) * (sv * 1) +
    // Inch -> Feet
    (E==6) * (sv * 0.833) +
    // Inch -> Metr
    (E==7) * (sv * 0.0254) +
    // Feet -> CM
    (E==8) * (sv * 30.48) +
    // Feet -> Inch
    (E==9) * (sv * 12.0) +
    // Feet -> Feet
    (E==10) * (sv * 1) +
    // Feet -> Metr
    (E==11) * (sv * 0.3048) +
    // Metr -> CM
    (E==12) * (sv * 100) +
    // Metr -> Inch
    (E==13) * (sv * 39.37) +
    // Metr -> Feet
    (E==14) * (sv * 0.3048) +
    // Metr -> Metr
    (E==15) * (sv * 1)
    );
    
    cout << "Result: " << tv << endl;
    return 0;
}
0
valen10
Параллельный Кот
1263 / 532 / 210
Регистрация: 25.03.2016
Сообщений: 1,186
Завершенные тесты: 1
10.12.2018, 01:07 13
Лучший ответ Сообщение было отмечено Blacit как решение

Решение

Если избавиться от магических чисел в коде и вернуться к использованию констант, то можно воспользоваться переводом любой из величин в сантиметры, умножая на соответствующую константу. Перевод сантиметров в другую величину будет выполняться с помощью обратного действия - деления. Таким образом, достаточно 3 константы и правильные формулы.

Попробуйте сами разобраться. Если что-то будет непонятно, задавайте вопросы. Готовый код можно подсмотреть под спойлером. Надеюсь, не запутался во множестве строк с формулами, проверьте внимательно.

Кликните здесь для просмотра всего текста
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
#include <iostream>
using namespace std;
 
const double MetreToCm = 100;
const double FootToCm = 30.48;
const double InchToCm = 2.54;
 
int main() {
    double sv, tv;
    unsigned int sm, E, tm;
 
    cout << "Select size input size: " << endl;;
    cout << "1) CM" << endl;
    cout << "2) Inch" << endl;
    cout << "3) Foot" << endl;
    cout << "4) Metre" << endl;
    cin >>  sm;
 
    cout << "Select the size of the output value: " << endl;
    cout << "1) CM" << endl;
    cout << "2) Inch" << endl;
    cout << "3) Foot" << endl;
    cout << "4) Metre" << endl;
    cin >> tm;
 
    cout << "Enter a value:";
    cin >> sv;
 
    E = (sm - 1) * 4 + (tm - 1);
 
    tv = (
        // Cm -> Cm
        (E==0) * (sv) +
        // Cm -> Inch
        (E==1) * (sv / InchToCm) +
        // Cm -> Foot
        (E==2) * (sv / FootToCm) +
        // Cm -> Metre
        (E==3) * (sv / MetreToCm) +
        // Inch -> Cm
        (E==4) * (sv * InchToCm) +
        // Inch -> Inch
        (E==5) * (sv) +
        // Inch -> Cm -> Foot
        (E==6) * (sv * InchToCm / FootToCm) +
        // Inch -> Cm -> Metre
        (E==7) * (sv * InchToCm / MetreToCm) +
        // Foot -> Cm
        (E==8) * (sv * FootToCm) +
        // Foot -> Cm -> Inch
        (E==9) * (sv * FootToCm / InchToCm) +
        // Foot -> Foot
        (E==10) * (sv) +
        // Foot -> Cm -> Metre
        (E==11) * (sv * FootToCm / MetreToCm) +
        // Metre -> Cm
        (E==12) * (sv * MetreToCm) +
        // Metre -> Cm -> Inch
        (E==13) * (sv * MetreToCm / InchToCm) +
        // Metre -> Cm -> Foot
        (E==14) * (sv * MetreToCm / FootToCm) +
        // Metre -> Metre
        (E==15) * (sv)
    );
 
    cout << "Result: " << tv << endl;
    return 0;
}


Добавлено через 1 минуту
Цитата Сообщение от Blacit Посмотреть сообщение
Не могли бы Вы объяснить, нужно у чисел в с плавающей точкой ставить на конце что-то?
Не совсем понял, о чем вы. Объясните подробнее.
1
Blacit
1 / 1 / 0
Регистрация: 18.07.2016
Сообщений: 28
10.12.2018, 01:11  [ТС] 14
Можно вопрос как раз по поводу Double, который выше, он актуален.
Хотел бы повысить точность и округление чисел до 10, ну или сотой.
Как можно реализовать момент, чтобы пользователь , пытаясь вводить буквы, программа ему выдавала соответствующую ошибку и предлагала попробовать ввести цифры заново.

Вот, например, когда используешь тип float, то в конце у чисел должна стоять "f", пример: 12.25f
А у типа double такая же должна быть ситуация?
0
valen10
Параллельный Кот
1263 / 532 / 210
Регистрация: 25.03.2016
Сообщений: 1,186
Завершенные тесты: 1
10.12.2018, 01:40 15
Цитата Сообщение от Blacit Посмотреть сообщение
Вот, например, когда используешь тип float, то в конце у чисел должна стоять "f", пример: 12.25f
А у типа double такая же должна быть ситуация?
Понял, вы о записи чисел в программе. По умолчанию числа с плавающей точкой представляются как double. Суффикс f говорит о том, что вам нужен float, суффикс L у числа с плавающей точкой говорит о том, что нужен long double. Тип long double часто может быть реализован как double (зависит от компилятора и платформы), поэтому широкой популярностью не пользуется.

Небольшой пример для наглядности

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
#include <iostream>
#include <string>
#include <typeinfo>
using namespace std;
 
template<class T>
string getTypeName(T value) {
    return typeid(value).name();
}
 
int main() {
    // Для всех компиляторов и платформ должно быть одинаково, могут отличаться только имена.
    cout << getTypeName(100) << endl; // i = integer
    cout << getTypeName(100.0f) << endl; // f = float
    cout << getTypeName(100.0) << endl; // d = double
    cout << getTypeName(100.0L) << endl; // e = long double
 
    // Для разных компиляторов и платформ может отличаться.
    cout << "sizeof(float): " << sizeof(float) << endl;
    cout << "sizeof(double): " << sizeof(double) << endl;
    cout << "sizeof(long double): " << sizeof(long double) << endl;
 
    return 0;
}
Windows 7x64, MSVC 2017
Самый простой компилятор


Windows XP, MinGW 5.1
Самый простой компилятор


Linux x64, gcc 6.3
Самый простой компилятор

0
valen10
Параллельный Кот
1263 / 532 / 210
Регистрация: 25.03.2016
Сообщений: 1,186
Завершенные тесты: 1
10.12.2018, 02:16 16
Цитата Сообщение от Blacit Посмотреть сообщение
Как можно реализовать момент, чтобы пользователь , пытаясь вводить буквы, программа ему выдавала соответствующую ошибку и предлагала попробовать ввести цифры заново.
Проверить флаги ошибок, игнорировать ошибочно введенные данные, повторять до тех пор, пока не будет получен правильный ввод.

Пример проверки ввода с повторением
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
#include <iostream>
#include <limits>
using namespace std;
 
int main() {
    double x;
    do {
        // Проверить флаги ошибок (failbit или badbit).
        if (!cin) {
            // Сбросить флаги ошибок.
            cin.clear();
            // Пропустить ошибочные данные до конца строки.
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            // Предупредить пользователя об ошибке.
            cerr << "Error: input is incorrect. Repeate, please." << endl;
        }
 
        cout << "x = ";
        cin >> x;
    } while (!cin);
 
    cout << "You input: " << x << endl;
    return 0;
}


Цитата Сообщение от Blacit Посмотреть сообщение
Хотел бы повысить точность и округление чисел до 10, ну или сотой.
Можно подробнее (желательно на примере)?
0
Blacit
1 / 1 / 0
Регистрация: 18.07.2016
Сообщений: 28
10.12.2018, 09:58  [ТС] 17
Конечно, можно.
Например, 1 / 3 = 0.666666
А хотелось, чтобы он округлял до сотой.

Спасибо большое за примеры кодов. Обязательно разберусь в них и воспользуюсь.
0
valen10
Параллельный Кот
1263 / 532 / 210
Регистрация: 25.03.2016
Сообщений: 1,186
Завершенные тесты: 1
10.12.2018, 13:27 18
Blacit, полагаю, нужно округление при выводе. Для этого можно задать точность (количество знаков после запятой). Часть настроек форматирования можно посмотреть/изменить через унаследованные методы от класса ios_base, остальные - библиотека <iomanip>. Посмотрите, какие она предоставляет возможности.

C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
 
int main() {
    double x = 2 / 3.;
    cout << "std precision(" << cout.precision() << "): " << x << endl; // 0.666667
    
    cout.precision(2);
    cout << "set precision(2): " << x << endl; // 0.67
    return 0;
}
0
Blacit
1 / 1 / 0
Регистрация: 18.07.2016
Сообщений: 28
10.12.2018, 20:11  [ТС] 19
Большое спасибо. Пока что остановлюсь на округлении результата. Потому что с флагом ошибок пока что достаточно трудно)
Вот конечный результат. Формулу доделал, перепроверил.

У меня вопрос в этом моменте:
cout.precision(3);
cout << "set precision(3)

в скобках пишутся цифры для чего (понятно, что показывает число, до какого округляется), но , если , например, до 3 числа, то цифру "3" прописываем в двух строчках?
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
#include <iostream>
 
using namespace std;
 
double sv, tv;
unsigned int sm, E, tm;
 
int main()
{
    cout << "Select size input: " << endl;
    cout << "1) CM" << endl;
    cout << "2) Inch" << endl;
    cout << "3) Feet" << endl;
    cout << "4) Metr" << endl;
    cin >> sm;
    cout << "Select size input: " << endl;
    cout << "1) CM" << endl;
    cout << "2) Inch" << endl;
    cout << "3) Feet" << endl;
    cout << "4) Metr" << endl;
    cin >> tm;
    
    cout << "Enter a value: ";
    cin >> sv;
    
    E = (sm-1) * 4 + (tm - 1);
    
    tv = (
        // CM -> CM
        (E==0) * (sv * 1) +
        // CM -> Inch
        (E==1) * (sv * 0.39) +
        // CM -> Feet
        (E==2) * (sv * 0.032) +
        // CM -> Metr
        (E==3) * (sv * 0.01) +
        // Inch -> CM
        (E==4) * (sv * 2.54) +
        // Inch -> Inch
        (E==5) * (sv * 1) +
        // Inch -> Feet
        (E==6) * (sv * 0.833) +
        // Inch -> Metr
        (E==7) * (sv * 0.0254) +
        // Feet -> CM
        (E==8) * (sv * 30.48) +
        // Feet -> Inch
        (E==9) * (sv * 12) +
        // Feet -> Feet
        (E==10) * (sv * 1) +
        // Feet -> Metr
        (E==11) * (sv * 0.3048) +
        // Metr -> CM
        (E==12) * (sv * 100) +
        // Metr -> Inch
        (E==13) * (sv * 39.37) +
        // Metr -> Feet
        (E==14) * (sv * 3.28) +
        // Metr -> Metr
        (E==15) * (sv * 1)
        );
    cout.precision(3);
    cout << "set precision(3): " << tv << endl;
    cout << "Result: " << tv << endl;
    return 0;
}
0
valen10
Параллельный Кот
1263 / 532 / 210
Регистрация: 25.03.2016
Сообщений: 1,186
Завершенные тесты: 1
10.12.2018, 21:21 20
Цитата Сообщение от Blacit Посмотреть сообщение
если , например, до 3 числа, то цифру "3" прописываем в двух строчках
C++
1
2
3
4
5
6
// Установить точность вывода путем вызова соответствующего метода.
cout.precision(3);
 
// Здесь "set precision(3): " это всего лишь строка - любая последовательность символов, 
// заключенная в кавычки. Строки вы пишете на свое усмотрение. В примере она была для наглядности.
cout << "set precision(3): " << tv << endl;
Добавлено через 7 минут
Цитата Сообщение от Blacit Посмотреть сообщение
C++
1
2
3
4
5
double sv, tv;
unsigned int sm, E, tm;
 
int main()
{
Переменные лучше не делать глобальными без явной на то причины. Перенесите их внутрь main, так будет меньше вероятность нарваться на непредвиденные ошибки.
0
10.12.2018, 21:21
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2018, 21:21

Самый простой способ создать таблицу
подскажите пожалуйста как можно сделать таблицу, прошу привести пример, даже самый простой ...

Нужно создать самый простой класс (С++)
Самый обыкновенный класс, любой.

Написать простой компилятор языка C
Помогите с решением данного задания По заданию нужно сделать компилятор который будет решать...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru