Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 08.10.2021
Сообщений: 2
1

Почему не инициализируются переменные

08.10.2021, 12:27. Показов 1699. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
по учебе пишу небольшие коды, не могу допетрить почему не инициализируются переменные: D, x2, g
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>
#include <math.h>
using namespace std;
#define pi 3.14159
int main ( )
{
float a, b, c, d, r, s, t, p, q, D, ro, fi, x1, x2, x3, u, v, h, g;
cout<<" a = "; cin >>a;
cout<<" b = "; cin >>b;
cout<<" c = "; cin >>c;
cout<<" d = "; cin >>d;
r=b/a; s=c/a; t=d/a;
p=(3*s -r * r ) / 3; q=2* r* r * r /27 - r * s/3+t;
D=(p /3) * ( p /3) * ( p /3) +(q /2) * ( q /2);
if (D<0)
{
ro=sqrt ( ( float )( -p* p* p/27) );
fi= acos(-q /(2 * ro ));
fi=pi/2 - atan ( fi / sqrt (1 - fi * fi ) );
x1=2*pow( ro, ( float ) 1/3) * cos ( fi /3)- r /3;
x2=2*pow( ro, ( float ) 1/3) * cos ( fi /3+2* pi /3)- r /3;
x3=2*pow( ro, ( float ) 1/3) * cos ( fi /3+4* pi /3)- r /3;
cout<<" \n x1 = "<<x1<<" \t x2 = "<<x2;
cout<<" \t x3 = "<<x3<<" \n ";
}
else
{
if ( -q/2+sqrt (D) >0) u=pow(( - q/2+sqrt (D) ),( float )
1/3);
else
if ( -q/2+sqrt (D) <0) u=-pow( fabs( -q/2+sqrt (D) ),( float )
1/3);
else u=0;
if (-q/2 - sqrt (D) >0) v=pow(( -q/2 - sqrt (D) ),( float )
1/3);
else
if ( -q/2 - sqrt (D) <0) v=-pow( fabs( -q/2 - sqrt (D) ),(
float ) 1/3);
else v=0;
x1=u+v-r /3;
h= -(u+v)/2 - r /3;
g=(u-v) /2 -sqrt (( float ) 3);
cout<<" n x1 = "<<x1;
if (x2>=0)
{
cout<<x1<<" + "<<x2<<" i \t ";
cout<<x1<<" -"<<x2<<" i \n ";
}
else
{
    cout<<x1<<" -"<<fabs ( x2 )<<" i \t ";
    cout<<x1<<" + "<<fabs ( x2 )<<" i \n ";
    }
    }
    if (g>=0)
    {
    cout<<" \t x2 = "<<h<<" + "<<g<<" i ";
    cout<<" \t x3 = "<<h<<" -"<<g<<" i \n ";
    }
    else
    {
    cout<<" \t x2 = "<<h<<" -"<<fabs (g)<<" i ";
    cout<<" \t x2 = "<<h<<" + "<<fabs (g)<<" i ";
    }
    return 0;
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.10.2021, 12:27
Ответы с готовыми решениями:

Только начал изучать с++, подскажите, почему не Инициализируются переменные?
#include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; using std::...

Переменные класса не инициализируются
Input: 1 2 3 Ожидаемый output: 3 2 А в реале: 4.94066e-324...

Не инициализируются две переменные
Написал калькулятор для подсчёта стоимости крафта предметов в одной игрухе, но если я нажимаю после...

Зачем переменные инициализируются нулем?
#include &lt;math.h&gt; #include &lt;iostream&gt; using namespace std; int gcf(int a,int b); int main () {...

Не инициализируются переменные в констукторе класса
Не хотят инициализироватся данные после двоеточия, в следствие чего нельзя создать объект данного...

19
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,718
08.10.2021, 13:10 2
Не инициализирована только одна переменная x2 в 44 строке
Цитата Сообщение от NooB_C Посмотреть сообщение
if (x2>=0)
а вот написания типа
Цитата Сообщение от NooB_C Посмотреть сообщение
( float ) 1/3
вызывают вопросы.
Почему это не 1./3. ????
И в целом, у Вас все выражения должны выполняться с действительными числами.
Зачем Вы в них пишете целочисленные константы, а не действительные?

И почему float, а не double?
1
0 / 0 / 0
Регистрация: 08.10.2021
Сообщений: 2
08.10.2021, 16:02  [ТС] 3
дискриминант помечен как не инициализированная переменная, и g - аналогично
а вот написания типа
Цитата Сообщение от NooB_C Посмотреть сообщение
( float ) 1/3
вызывают вопросы.
пишу по образцу который дан в лекции вуза.
0
фрилансер
5503 / 5098 / 1048
Регистрация: 11.10.2019
Сообщений: 13,358
08.10.2021, 17:04 4
NooB_C, так инициализируй же их )

C++
1
float D{}, x2{}, g{};
Добавлено через 1 минуту
Цитата Сообщение от NooB_C Посмотреть сообщение
float a, b, c, d, r, s, t, p, q, D, ro, fi, x1, x2, x3, u, v, h, g;
для чего вообще такую колбасу делать? Переменные нужно определять поближе к месту первого использования
1
из племени тумба-юбма
2467 / 1790 / 417
Регистрация: 29.11.2015
Сообщений: 8,690
Записей в блоге: 15
08.10.2021, 17:09 5
Цитата Сообщение от Алексей1153 Посмотреть сообщение
для чего вообще такую колбасу делать? Переменные нужно определять поближе к месту первого использования
На счет колбасы верно. А вот объявлять переменные предпочитаю по старинке(в начале).
0
1709 / 1109 / 337
Регистрация: 25.01.2019
Сообщений: 2,910
08.10.2021, 17:18 6
Цитата Сообщение от мама Стифлера Посмотреть сообщение
А вот объявлять переменные предпочитаю по старинке(в начале).
Раньше тож так делал, но как-то быстро переучился. Потому что реально удобнее (субъективно, конечно). Вроде как так Сам(!) Страуструп завещал(вообще точно не помню, мож и не он, но источник был авторитетный ).
0
3272 / 1491 / 469
Регистрация: 01.06.2021
Сообщений: 5,038
08.10.2021, 17:24 7
Цитата Сообщение от zss Посмотреть сообщение
Почему это не 1./3. ????
тогда уже нужно советовать 1.f / 3.f, ибо ТС хотел получить float, а не double
NooB_C, в вашем коде очень много кастингов (float). Если вы не хотите отказаться от float в коде (переход на double, как вам советуют выше, было бы разумным решением), то тогда хотя бы используйте static_cast<float>.
0
фрилансер
5503 / 5098 / 1048
Регистрация: 11.10.2019
Сообщений: 13,358
08.10.2021, 17:27 8
мама Стифлера, простейшее форматирование кода делает его красивше, а ещё выявляет аж три ошибки:

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
77
78
#include <iostream>
#include <cmath>
 
const float pi=3.14159;
int main ( )
{
    float a{}; std::cout<<" a = "; std::cin >>a;
    float b{}; std::cout<<" b = "; std::cin >>b;
    float c{}; std::cout<<" c = "; std::cin >>c;
    float d{}; std::cout<<" d = "; std::cin >>d;
 
    
    const float r=b/a;
    const float s=c/a;
    const float t=d/a;
    const float p=(3*s -r * r ) / 3;
    const float q=2* r* r * r /27 - r * s/3+t;
    const float D=p*p*p/3 +q*q/2;
    
    if (D<0)
    {
        const float ro=sqrt(-p* p* p/27);
        
        float fi= acos(-q /(2 * ro ));
        fi=pi/2 - atan ( fi / sqrt (1 - fi * fi ) );
        
        const float x1=2*cbrt(ro) * cos ( fi /3 + 0       )- r /3;
        const float x2=2*cbrt(ro) * cos ( fi /3 + 2* pi /3)- r /3;
        const float x3=2*cbrt(ro) * cos ( fi /3 + 4* pi /3)- r /3;
       
        std::cout
        <<" \n x1 = "<<x1
        <<" \t x2 = "<<x2
        <<" \t x3 = "<<x3
        <<" \n ";
    }
    else
    {
        float  u{};
        if      ( -q/2+sqrt (D) >0){ u=+cbrt(     (-q/2+sqrt(D) ) );}
        else if ( -q/2+sqrt (D) <0){ u=-cbrt( fabs(-q/2+sqrt(D) ) );}
        else {u=0;}
 
        float v{};
        if      (-q/2 - sqrt (D) >0){ v=+cbrt(     (-q/2 - sqrt (D) ) );}
        else if (-q/2 - sqrt (D) <0){ v=-cbrt( fabs(-q/2 - sqrt (D) ) );}
        else {v =0;}
        
        const float x1=u+v-r /3;
        const float h=-(u+v)/2 - r /3;
        const float g=(u-v) /2 -sqrt (3.);
        std::cout<<" n x1 = "<<x1;
        
        if (x2>=0)
        {
            std::cout<<x1<<" + "<<x2<<" i \t ";
            std::cout<<x1<<" - "<<x2<<" i \n ";
        }
        else
        {
            std::cout<<x1<<" - "<<fabs ( x2 )<<" i \t ";
            std::cout<<x1<<" + "<<fabs ( x2 )<<" i \n ";
        }
    }
        
    if (g>=0)
    {
        std::cout<<" \t x2 = "<<h<<" + "<<g<<" i ";
        std::cout<<" \t x3 = "<<h<<" - "<<g<<" i \n ";
    }
    else
    {
        std::cout<<" \t x2 = "<<h<<" - "<<fabs (g)<<" i ";
        std::cout<<" \t x2 = "<<h<<" + "<<fabs (g)<<" i ";
    }
    
    return 0;
}

main.cpp:54:13: error: ‘x2’ was not declared in this scope
if (x2>=0)

main.cpp:66:9: error: ‘g’ was not declared in this scope
if (g>=0)

main.cpp:68:33: error: ‘h’ was not declared in this scope
std::cout<<" \t x2 = "<<h<<" + "<<g<<" i ";

main.cpp:73:33: error: ‘h’ was not declared in this scope
std::cout<<" \t x2 = "<<h<<" - "<<fabs (g)<<" i ";


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

Добавлено через 1 минуту
+ ещё cbrt заюзал вместо pow(x,1./3)
0
3272 / 1491 / 469
Регистрация: 01.06.2021
Сообщений: 5,038
08.10.2021, 17:36 9
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Переменные нужно определять поближе к месту первого использования
я тоже так делаю, хотя не так категорично отношусь к тем, кто объявляет колбасой в начале (их код - их правила).
Например, бывает так, что убирается кусок из кода, но забываешь удалить неиспользуемую переменную из колбасы. А если код длинный, то очень сложно понять область видимости переменных, если они колбасками торчат на разных уровнях.

Добавлено через 4 минуты
Цитата Сообщение от Алексей1153 Посмотреть сообщение
+ ещё cbrt заюзал вместо pow(x,1./3)
добавлю, что алгоритмы sqrt и cbrt быстрее, чем pow(x, 1./2) и pow(x, 1./3)
0
фрилансер
5503 / 5098 / 1048
Регистрация: 11.10.2019
Сообщений: 13,358
08.10.2021, 17:37 10
Цитата Сообщение от Royal_X Посмотреть сообщение
но забываешь удалить неиспользуемую переменную
компилятор/анализатор расскажут, если переменная не используется. Также они расскажут, какие переменные не были инициализированы
0
3272 / 1491 / 469
Регистрация: 01.06.2021
Сообщений: 5,038
08.10.2021, 17:38 11
Цитата Сообщение от Алексей1153 Посмотреть сообщение
компилятор/анализатор расскажут, если переменная не используется
мой компилятор ничего не говорит, какой флаг нужно прописать?
0
фрилансер
5503 / 5098 / 1048
Регистрация: 11.10.2019
Сообщений: 13,358
08.10.2021, 17:46 12
Royal_X, я не знаю, какой у тебя компилятор, да и флаги к ним я не знаю

студийный компилятор и mingw (использую в QtCreator) - пишут в выводе (с дефолтными настройками) про неиспользуемые переменные.

в студии можно запустить анализатор, в QtCreator тоже можно запустить анализатор - вот они уже поинтереснее грабли отыскивают, включая и отсутствие инициализации

Добавлено через 1 минуту

Не по теме:

я принёс из студии 2008 старый большой проект в 2019 и попробовал натравить на него анализатор - мы с анализатором оба были в шоке :D

0
3272 / 1491 / 469
Регистрация: 01.06.2021
Сообщений: 5,038
08.10.2021, 17:49 13
Алексей1153, тогда может быть это не компилятор, а просто IDE предупреждает о неиспользуемых переменных? Вот для Java использую Eclipse, который подчеркивает неиспользуемые переменные. Но для C++ использую редактор MS Visual Code, который молчит.
0
из племени тумба-юбма
2467 / 1790 / 417
Регистрация: 29.11.2015
Сообщений: 8,690
Записей в блоге: 15
08.10.2021, 17:52 14
Royal_X, у меня вот такие флаги стоят -static-libgcc -Wfloat-equal -Werror=vla -std=c11 -Wall -Wextra -pedantic -s
Можете загуглить каждый и глянуть назначение
0
фрилансер
5503 / 5098 / 1048
Регистрация: 11.10.2019
Сообщений: 13,358
08.10.2021, 17:52 15
Royal_X, IDE ничего не знает о коде, предупреждать может компилятор или анализатор. IDE может запускать анализатор в фоне, вот и появляются подчёркивания

Цитата Сообщение от Royal_X Посмотреть сообщение
Но для C++ использую редактор MS Visual Code
если не создавать проект, а использовать только как редактор, то компилятор и анализатор вряд ли что-то покажут
0
из племени тумба-юбма
2467 / 1790 / 417
Регистрация: 29.11.2015
Сообщений: 8,690
Записей в блоге: 15
08.10.2021, 17:53 16
Цитата Сообщение от Royal_X Посмотреть сообщение
тогда может быть это не компилятор
Это все флаги компилятора GCC, не IDE
0
3272 / 1491 / 469
Регистрация: 01.06.2021
Сообщений: 5,038
08.10.2021, 18:02 17
Цитата Сообщение от Алексей1153 Посмотреть сообщение
если не создавать проект
как это делается? У меня, в Visual Code выбирается папка проекта, в которой находятся *.cpp файлы и автоматически создается папка .vscode с файлами *.json. Компилятор и отладчик настроены. Я не знаю, что тут еще можно делать.

Добавлено через 1 минуту
Цитата Сообщение от мама Стифлера Посмотреть сообщение
Это все флаги компилятора GCC
какие флаги, если не секрет? возможно, просто Visual Studio по-дефолту ставит какие-то флаги, а вот в Visual Studio Code все флаги прописываются вручную.

Добавлено через 3 минуты
мама Стифлера, ладно, методом тыка нашел, что это -Wall предупреждает
0
фрилансер
5503 / 5098 / 1048
Регистрация: 11.10.2019
Сообщений: 13,358
08.10.2021, 18:04 18
Цитата Сообщение от Royal_X Посмотреть сообщение
как это делается
если получается скомпилировать, то, значит, проект уже создан. Либо создать проект можно так (а потом добавить в него файлы)
Почему не инициализируются переменные


анализатор можно запустить через верхнее меню -
Почему не инициализируются переменные
0
3272 / 1491 / 469
Регистрация: 01.06.2021
Сообщений: 5,038
08.10.2021, 18:27 19
оказывается, что -Wall прописан дефолтно и в Code::Blocks)

Добавлено через 4 минуты
Цитата Сообщение от Алексей1153 Посмотреть сообщение
если получается скомпилировать, то, значит, проект уже создан
код компилируется, отладка тоже работает. Наверное, в Code просто нет фонового анализатора. За проверку кода при написании (не компиляции) отвечает только расширение "C/C++ IntelliSense, debugging, and code browsing.".

Добавлено через 6 минут
кстати, Code подчеркивает неиспользуемую переменную только уже после компиляции с опцией -Wall и получения предупреждения от компилятора. Видимо, это для того, чтобы оперативно найти в коде указанную переменную.
А вот Studio наверное умеет это показывать в ходе написания благодаря фоновому анализу.

Добавлено через 9 минут
Алексей1153, в Visual Studio по-умолчанию в новом проекте стоит -Wextra (это типа доп. предупреждения) или только -Wall? Настраиваю сейчас tasks.json проекта в Code, хочу сделать как в Studio.
0
фрилансер
5503 / 5098 / 1048
Регистрация: 11.10.2019
Сообщений: 13,358
08.10.2021, 18:48 20
Royal_X, я не в курсе, какая там полная строка настроек, потому что вручную никогда этим не занимался. В студии окно настроек, там все эти ключи в виде таблицы.
Я думаю, вот этот ключ нужен
Миниатюры
Почему не инициализируются переменные  
0
08.10.2021, 18:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.10.2021, 18:48
Помогаю со студенческими работами здесь

Почему не инициализируются массивы
Здравствуйте, пытаюсь решить задачу и хочу записать для этого числа из одного массива в три других...

Указатели. Почему именно так инициализируются в даном случае?
Не могу понять, почему при инициализации *p мы берем по ссылке, а при *p2 просто присваивание?...

Одномерные массивы, функции не инициализируются переменные
Задача такая: нужно найти макс/мин/ср среди разностей соответствующих элементов массивов. (время...

Почему не инициализируются переменные в шаблоне?
Подскажите пожалуйста, допустим имеется файл tpl, в котором содержится код формы обратной связи....

Почему глобальные переменные сразу инициализируются "в ноль"?
Доброго времени суток, уважаемые форумчане! Мучает меня один вопрос: Почему глобальные...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru