Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
50 / 31 / 11
Регистрация: 10.06.2012
Сообщений: 395
1

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

21.07.2015, 08:33. Просмотров 1682. Ответов 15
Метки нет (Все метки)


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <math.h>
#include <iostream>
using namespace std;
int gcf(int a,int b);
int main () {
    int a=0, b=0;
    while(1){
        cout<<"введите число кроме 0\n";
        cin>>a;
        if(a==0)
        break;
        cout<<"введите второе число\n";
        cin>>b;
        cout<<"наибольший общий делитель="<<gcf(a,b)<<endl;
    }
    return 0;
}
    int gcf(int a,int b){
        if (a%b==0)
        return b;
        else
        return gcf(b, a%b );
    }
Вопрос такой . Почему в коде при объявлении переменных a и b int a=0, b=0; ? Почему их поставили равными 0 ?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.07.2015, 08:33
Ответы с готовыми решениями:

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

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

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

Зачем в определении функции заново задаются переменные
Есть программа для перевода из Цельсия в фарингейты На грамматические ошибки не обращайте...

__________________
Помогаю в написании курсовых работ и дипломов здесь.
Записывайтесь на профессиональные курсы C++ разработчиков
15
67 / 67 / 72
Регистрация: 10.04.2015
Сообщений: 281
21.07.2015, 08:49 2
А ошибка где?)

Конкретно в данном случае можно было и не присваивать значения переменным, т.к. оба числа вводятся с клавиатуры.
Просто
C++
1
int a,b;
Но, вот у меня свежий пример есть. Так как условие if(что-то там) вообще может не сработать ни разу, соответ.
tt_left(не ициализированная -1) останется равным 20854345( что-то в этом роде). И проверку на tt_left != -1 оно успешно пройдёт. А там вывалится за пределы массива, т.к. pole[top][20854345] само собой не существует.
Я пытался объяснить, надеюсь понятно)
C++
1
2
3
4
5
6
7
8
int tt_left;
for()//условия цикла опущены, не играют роли.
if(что-то там) tt_left = left;
else tt_left = -1;
================================
if(tt_left != -1){
//код
}
0
50 / 31 / 11
Регистрация: 10.06.2012
Сообщений: 395
21.07.2015, 08:51  [ТС] 3
Это работающий код из книги Брайэн с++ без страха. В этом месте написано: Функция main начинается с объявления двух переменных, a и b . Так получилось ,что переменные используют такие же имена,что и аргументы функции gcf. Здесь не требуется повтоное использование имен (например ,могут быть использованы имена n и m ),но в любом случае это не вызовет конфликта.Каждый вызов функции gcf будет получать свою собственную копию переменных a и b ,которые ,(как аргументы ) работают как локальные переменные. int a=o, b=0;
0
Эксперт С++
3206 / 1733 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
21.07.2015, 11:25 4
Цитата Сообщение от sergei60 Посмотреть сообщение
Почему в коде при объявлении переменных a и b int a=0, b=0; ? Почему их поставили равными 0 ?
Специалисты рекомендуют инициализировать каждую переменную при ее объявлении. Логичнее всего это делать значением по умолчанию.
0
50 / 31 / 11
Регистрация: 10.06.2012
Сообщений: 395
21.07.2015, 13:09  [ТС] 5
А можно ли модифицировать функцию gcf ,таким образом ,чтобы она вычисляла выражение a%b только один раз за вызов
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
#include <math.h>
#include <iostream>
using namespace std;
int gcf(int a,int b);
int main () {
    int a=0, b=0;
    while(1){
        cout<<"введите число кроме 0\n";
        cin>>a;
        if(a==0)
        break;
        cout<<"введите второе число\n";
        cin>>b;
        gcf(a,b);
    }
    return 0;
}
    int gcf(int a,int b){
    cout<<"GCF("<<a<<","<<b<<")"<<endl;
    
        if (a%b==0)
        return b;
        else
        cout<<"наибольший общий делитель="<< a%b ;
        return 0;
    }
? вот ,то что я сварганил ,но вывод идет неверный..

Добавлено через 13 минут
C++
1
2
3
4
5
6
7
8
9
    int gcf(int a,int b)
    cout<<"GCF("<<a<<","<<b<<")"<<endl;
    
        if (a%b==0){
            return b;
                else
            cout<<"наибольший общий делитель="<< gcf(b,a%b) ;
    return 0;
    }
Вот последний вариант переделанной функции. Ответ уже ближе ,но ,что то не так. вот вывод:
введите число кроме 0
35
введите второе число
25
GCF(35,25)
GCF(25,10)
GCF(10,5)
наибольший общий делитель=5наибольший общий делитель=0введите число кроме 0
0
1354 / 992 / 314
Регистрация: 28.07.2012
Сообщений: 2,750
21.07.2015, 13:19 6
В строке 7 функции gcf вместо cout поставь return, а сам cout перемести в main.
0
50 / 31 / 11
Регистрация: 10.06.2012
Сообщений: 395
21.07.2015, 14:46  [ТС] 7
nonedark2008, и я вернусь к тому коду с которого начинался пост. А мне надо модифицировать функцию gcf ,таким образом ,чтобы она вычисляла выражение a%b только один раз за вызов. В задании спрашивается ,можно ли это сделать. Вот я и хотел в мейне только вызывать функцию gcf и все.
0
Котовчанин
940 / 480 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 37
21.07.2015, 14:53 8
Цитата Сообщение от sergei60 Посмотреть сообщение
А можно ли модифицировать функцию gcf ,таким образом ,чтобы она вычисляла выражение a%b только один раз за вызов
Вынести в отдельную переменную, посчитать в начале и всё.
0
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 166
21.07.2015, 15:10 9
Если я правильно помню, нод вычисляется след. макаром: из большего вычитается меньшее, пока они не будут равны. И делается это в цикле без рекурсии.
1
50 / 31 / 11
Регистрация: 10.06.2012
Сообщений: 395
21.07.2015, 15:21  [ТС] 10
Eraston, да такой метод есть ,но в книжке тема рекурсии и задачи для самостоятельного решения я так понял относятся именно к функции gcf с рекурсией.Вот что получилось у меня ,можно ли считать ,что gcf вычисляет выражение a%b только один раз за вызов ?
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
#include <math.h>
#include <iostream>
using namespace std;
int gcf(int a,int b);
int main () {
    int a=0, b=0;
    while(1){
        cout<<"введите число кроме 0\n";
        cin>>a;
        if(a==0)
        break;
        cout<<"введите второе число\n";
        cin>>b;
    gcf( a,b);
        
    }
    return 0;
}
    int gcf(int a,int b){
    cout<<"GCF("<<a<<","<<b<<")"<<endl;
    
        if (a%b==0)
            cout<<"наибольший делитель="<<b<<endl;
                else
            return gcf(b,a%b);
}
Добавлено через 48 секунд
Тамика, Твое предложение пока не понял ,но ..думаю ,спасибо за вариант.
0
Котовчанин
940 / 480 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 37
21.07.2015, 15:24 11
Цитата Сообщение от sergei60 Посмотреть сообщение
Тамика, Твое предложение пока не понял ,но ..думаю ,спасибо за вариант.
Я не поняла особо что Вам нужно сделать. Просто вычислить найбольший делитель? Или есть какие-то условия решения задачи?
0
50 / 31 / 11
Регистрация: 10.06.2012
Сообщений: 395
21.07.2015, 15:28  [ТС] 12
Тамика, Тема рекурсии рассматривается на примере нахождения нод. После рассмотрения кода (он вначале поста) ,даются задачи. и вот одной из этих задач такая : А можно ли модифицировать функцию gcf ,таким образом ,чтобы она вычисляла выражение a%b только один раз за вызов ?
0
Котовчанин
940 / 480 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 37
21.07.2015, 15:35 13
sergei60, хм. Вопросец. Надо подумать. Пока могу предложить способ вообще без деления а на б.
C++
1
2
3
4
5
6
7
8
9
10
11
12
int gcf(int a, int b)
{
    for (int i = a - 1; i > 0; --i)
        if (a % i == 0)
            if (b % i == 0 && i != b && i != 1)
                return i;
}
 
int main()
{
    std::cout << gcf(50, 6000);
}
1
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 166
21.07.2015, 17:51 14
Лучший ответ Сообщение было отмечено sergei60 как решение

Решение

Цитата Сообщение от sergei60 Посмотреть сообщение
А можно ли модифицировать функцию gcf ,таким образом ,чтобы она вычисляла выражение a%b только один раз за вызов ?
C++
1
2
3
4
5
6
7
8
int gcf(int a,int b){
    cout<<"GCF("<<a<<","<<b<<")"<<endl;
    a %= b;
        if (a==0)
            return b;
                else
            return gcf(b,a);
}
Как-то так, если модифицировать.
1
50 / 31 / 11
Регистрация: 10.06.2012
Сообщений: 395
21.07.2015, 18:00  [ТС] 15
Eraston, да похоже ,что это то. только не понятно a %= b;
0
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 166
21.07.2015, 18:05 16
Сокращенная форма записи a = a % b; То же самое с a += b, a/=b и т.д.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.07.2015, 18:05

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

Зачем оставлять переменные-члены класса закрытыми?
Вот пишут,что нужно переменные - члены класса оставлять закрытыми, используя для их установки...

Зачем нужны массивы, если есть обычные переменные?
Здравствуйте. У меня есть вопрос. Зачем нужны массивы, если есть обычные переменные? Можно ведь...

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

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

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

С помощью чего инициализируются переменные?
подскажите с помощью чего инициализируются переменные ?


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

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

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