0 / -1 / 1
Регистрация: 10.09.2016
Сообщений: 115
1

Неожиданное поведение программы: почему не работает цикл do while?

24.09.2016, 20:38. Показов 4438. Ответов 23
Метки нет (Все метки)

Здравствуйте,подскажите,пожалуйста,почему не работает цикл ... Условие корявое?
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
//Напишите программу, которая по начальной сумме денег у крестьянина определит оптимальное число проходов 
//для получения наибольшей конечной суммы
 
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
 
int _tmain()
{
    unsigned int rub = 0, kop = 0, rub1 = 0, kop1 = 0, kol_vo = 0, monet = 7699, summa = 0;
    rub = monet / 100; //кол-во рублей в монетах
    kop = (monet - 29) % 100; // кол-во копеек в монетах
    do 
    {   
        rub1 = kop; //количество рублей в оставшейся сумме денег превращаются  в новой сумме в количество копеек
        kop1 = rub; //копейки – в рубли
        summa = rub1 * 100 + kop1; //считаем новую сумму денег 
        rub = summa / 100; //считаем новое кол-во рублей
        kop = (summa - 29) % 100; // считаем новое количество копеек
        kol_vo++ ; //считаем кол-во проходов
             
    } while (summa >= monet); //Пока сумма больше кол-во монет ,цикл повторяется 
    
    cout << monet << summa << kol_vo << endl; 
    
 
 return 0;
}
Добавлено через 6 минут
Комментарии в 17 и 18 строчках перепутаны.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.09.2016, 20:38
Ответы с готовыми решениями:

Неожиданное поведение программы: почему не работает цикл while?
Проблема: Цикл While при != является бесконечным ,а при == не выполняется ни разу Ожидаемое...

Неожиданное поведение программы: почему программа внезапно завершает работу?
Писал в codeblocks с компилятором gnu gcc. После запуска и ввода данных завершается работа...

Неожиданное поведение программы: почему на консоль не выводятся крайние значения заданного диапазона?
Помогите, пожалуйста, наити ошибку!? Не выводится крайнее значение, то есть если брать от -2 до 3х,...

Неожиданное поведение программы: почему при делени с остатком, в условии if получается true?
Ребят не могу понять #define N 64 int length=12; if ((N - 1) % matrix != 0) В переменной...

23
10 / 10 / 5
Регистрация: 28.09.2015
Сообщений: 139
24.09.2016, 20:40 2
Sh_a_man, вот так должно работать:

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 <iostream>
 
using namespace std;
 
 
int main()
{
    unsigned int rub = 0, kop = 0, rub1 = 0, kop1 = 0, kol_vo = 0, monet = 7699, summa = 0;
    rub = monet / 100; //кол-во рублей в монетах
    kop = (monet - 29) % 100; // кол-во копеек в монетах
    do
    {
        rub1 = kop; //количество рублей в оставшейся сумме денег превращаются  в новой сумме в количество копеек
        kop1 = rub; //копейки – в рубли
        summa = rub1 * 100 + kop1; //считаем новую сумму денег 
        rub = summa / 100; //считаем новое кол-во рублей
        kop = (summa - 29) % 100; // считаем новое количество копеек
        kol_vo++; //считаем кол-во проходов
 
    } while (summa >= monet); //Пока сумма больше кол-во монет ,цикл повторяется 
 
    cout << monet << endl << summa << endl << kol_vo << endl;
 
 
    return 0;
}
0
0 / -1 / 1
Регистрация: 10.09.2016
Сообщений: 115
24.09.2016, 20:47  [ТС] 3
Цитата Сообщение от Glitch Посмотреть сообщение
вот так должно работать:
У меня Microsoft visual studio 2013
Без #include "stdafx.h" и int _tmain () не работает.
0
10 / 10 / 5
Регистрация: 28.09.2015
Сообщений: 139
24.09.2016, 20:50 4
Sh_a_man, в чем тогда проблема? Прога не компилируется?
0
0 / -1 / 1
Регистрация: 10.09.2016
Сообщений: 115
24.09.2016, 20:50  [ТС] 5
Цитата Сообщение от Glitch Посмотреть сообщение
проблема
Цикл повторяется только 1 раз и выходит, не выполнив условие .
0
Эксперт CЭксперт С++
5087 / 2272 / 332
Регистрация: 20.02.2013
Сообщений: 5,598
Записей в блоге: 19
24.09.2016, 20:52 6
Sh_a_man, может потому, что summa всегда меньше, чем monet и прога в цикл не входит ни разу, просто единожды выполняя блок do?
0
0 / -1 / 1
Регистрация: 10.09.2016
Сообщений: 115
24.09.2016, 20:53  [ТС] 7
Цитата Сообщение от Glitch Посмотреть сообщение
Прога не компилируется
Вот
Миниатюры
Неожиданное поведение программы: почему не работает цикл do while?  
0
10 / 10 / 5
Регистрация: 28.09.2015
Сообщений: 139
24.09.2016, 20:56 8
Sh_a_man, у тебя изначально монет больше чем сумма....
0
Эксперт CЭксперт С++
5087 / 2272 / 332
Регистрация: 20.02.2013
Сообщений: 5,598
Записей в блоге: 19
24.09.2016, 20:57 9
Цитата Сообщение от Glitch Посмотреть сообщение
Sh_a_man, у тебя сумма изначально больше чем кол-во монет...
Glitch, меньше (скрин смотри). Потому и цикл не выполняется ни разу.
0
10 / 10 / 5
Регистрация: 28.09.2015
Сообщений: 139
24.09.2016, 20:58 10
gru74ik, оговорился
0
Эксперт CЭксперт С++
5087 / 2272 / 332
Регистрация: 20.02.2013
Сообщений: 5,598
Записей в блоге: 19
24.09.2016, 20:59 11
Sh_a_man, что значит выражение while (summa >= monet) ? А значит оно вот что:

До тех пор, пока верно условие, что summa >= monet, выполнять цикл.

А оно даже один раз верно не будет. С перого же раза false, потому как summa < monet, что и на Вашем скрине видно.
Поэтому у Вас цикл не выполняется ни разу. Один раз - это выполнение блока do.
1
0 / -1 / 1
Регистрация: 10.09.2016
Сообщений: 115
24.09.2016, 21:00  [ТС] 12
Цитата Сообщение от gru74ik Посмотреть сообщение
меньше
А как по другому сделать? Чтобы больше было?
Контрольные примеры:
Начальная сумма-конечная сумма-количество проходов
7699–9904–81
1136–9902–63
3563–8916–10
6287–6287–0
7069–9998–196
3599–9964–197
7038–9967–196
0
Эксперт CЭксперт С++
5087 / 2272 / 332
Регистрация: 20.02.2013
Сообщений: 5,598
Записей в блоге: 19
24.09.2016, 21:03 13
Sh_a_man, а по-другому вот как.

Добавлено через 52 секунды
Sh_a_man, условие задачи-то как звучит?
1
0 / -1 / 1
Регистрация: 10.09.2016
Сообщений: 115
24.09.2016, 21:05  [ТС] 14
Цитата Сообщение от gru74ik Посмотреть сообщение
условие задачи-то как звучит?
Крестьянин, возвращаясь с ярмарки, увидел на мосту странную картину. Какой-то человек сна-чала считал деньги в кошельке, затем бросал в реку несколько монеток, бежал на другой конец моста, снова считал деньги в кошельке, и опять бросал несколько монеток и шел на другой конец моста. Наконец, пересчитав свои деньги, он явно обрадовался и отправился в дальнейший путь.
– Что ты делал? Зачем ты бросал деньги в воду? – спросил крестьянин, догнав странного чело-века.
Видя, что свой секрет скрыть не удастся, человек рассказал, что мост волшебный, что, если бросить с моста ровно 29 копеек, то, как только перейдешь мост, количество рублей в оставшейся сумме денег превращаются в новой сумме в количество копеек, а копейки – в рубли, что, перейдя мост несколько раз, можно получить сумму, намного большую первоначальной.
– Самое важное – вовремя остановиться, – сказал человек и ушёл.
Крестьянин задумался, достал кошелек и пересчитал свои деньги. У него было 46 рублей 47 копеек. «29 копеек – не деньги, дай-ка попробую». После первого прохода у него получилось 18р.46к., после второго прохода – 17р.18к., а после третьего – 89р.16к. «Ух-ты! А еще больше можно получить?» – обрадовался крестьянин. После четвертого прохода у него стало 87р.88к., после пятого – 59р.87к., после шестого – 58р.59к., после седьмого – 30р.58к., после восьмого – 29р.30к., после девятого – 1р.29к., а после десятого осталась 1 копейка.
«Эх, дурачина, надо было после третьего раза остановиться!» – расстроился крестьянин.
Напишите программу, которая по начальной сумме денег у крестьянина определит оптималь-ное число проходов по мосту для получения наибольшей конечной суммы.
Контрольные примеры:
7699–9904–81
1136–9902–63
3563–8916–10
6287–6287–0
7069–9998–196
3599–9964–197
7038–9967–196
0
Модератор
Эксперт по электронике
8729 / 6522 / 884
Регистрация: 14.02.2011
Сообщений: 22,827
24.09.2016, 21:52 15
Цитата Сообщение от Sh_a_man Посмотреть сообщение
Напишите программу, которая по начальной сумме денег у крестьянина определит оптималь-ное число проходов по мосту для получения наибольшей конечной суммы.
я думаю программа решена в корне не верно
нужно гнать программу до 29 копеек, или ограничение по количеству проходов
записывая суммы в массив а потом поиском по массиву найти максимум
с текущим же подходом
вылетим на первом же цикле
Цитата Сообщение от Sh_a_man Посмотреть сообщение
У него было 46 рублей 47 копеек. «29 копеек – не деньги, дай-ка попробую». После первого прохода у него получилось 18р.46к.,
0
Эксперт CЭксперт С++
5087 / 2272 / 332
Регистрация: 20.02.2013
Сообщений: 5,598
Записей в блоге: 19
24.09.2016, 22:11 16
Sh_a_man, ValeryS, сейчас сделаю, погодьте.
0
0 / -1 / 1
Регистрация: 10.09.2016
Сообщений: 115
24.09.2016, 22:21  [ТС] 17
Цитата Сообщение от ValeryS Посмотреть сообщение
записывая суммы в массив
Нас этому еще не учили (
0
Эксперт CЭксперт С++
5087 / 2272 / 332
Регистрация: 20.02.2013
Сообщений: 5,598
Записей в блоге: 19
24.09.2016, 23:37 18
Sh_a_man, ValeryS, написал вот такого монстрика:

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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <iostream>
#include <vector>
#include <algorithm>
 
typedef unsigned int uint;
 
class Purse
{
    uint rubles_;
    uint kopeks_;
    uint total_;
 
public:
    Purse( uint r = 0, uint k = 0) : rubles_(r), kopeks_(k)
    {
        total_ = rubles_ * 100 + kopeks_;
    }
 
    void set_rubles( const uint r )
    {
        rubles_ = r;
        total_ += rubles_ * 100;
    }
 
    void set_kopeks( const uint k )
    {
        kopeks_ = k;
        total_ += kopeks_;
    }
 
    void set_total( const uint t )
    {
        total_ = t;
        rubles_ = total_ / 100;
        kopeks_ = total_ % 100;
    }
 
    uint rubles() const // getter
    {
        return rubles_;
    }
 
    uint kopeks() const // getter
    {
        return kopeks_;
    }
 
    uint total() const // getter
    {
        return total_;
    }
 
    void throw_money_into_the_river( const uint magic_amount )
    {
        set_total( total_ - magic_amount );
        std::swap(rubles_, kopeks_);
        total_ = rubles_ * 100 + kopeks_;
    }
};
 
int main()
{
    const uint magic_amount = 29; // amount of money that have to be thrown into the river
 
    Purse p(46, 47);
    std::vector<uint> current_amount;
 
    uint debug_num_of_step = 0; //DEBUG VARIABLE
    do
    {
        //DEBUG INFO BEGIN
        ++debug_num_of_step;
        std::cout
            << "\ndebug_num_of_step: "
            << debug_num_of_step
            << "\ncurrent_rubles is: "
            << p.rubles()
            << "\ncurrent_kopeks is: "
            << p.kopeks()
            << "\ncurrent_total_amount is: "
            << p.total()
            << "\n\n";
        //DEBUG INFO END
 
        p.throw_money_into_the_river( magic_amount );
        current_amount.push_back( p.total() );
    }
    while ( p.total() > magic_amount );
 
    Purse best_balance;
 
    best_balance.set_total
        (
            *std::max_element
                (
                    current_amount.begin(),
                    current_amount.end()
                )
        );
 
    std::cout
        << "The best balance is: "
        << best_balance.rubles()
        << " rubles and "
        << best_balance.kopeks()
        << " kopeks.\n\n";
 
    uint optimal_number_of_passes = 0;
    size_t current_amount_size = current_amount.size();
 
    for ( size_t i = 0; i < current_amount_size; ++i)
    {
        if ( best_balance.total() == current_amount[i] )
            optimal_number_of_passes = i;
    }
 
    std::cout
        << "Optimal number of passes is: "
        << optimal_number_of_passes + 1
        << "\n\n";
 
    return 0;
}
1
Модератор
Эксперт по электронике
8729 / 6522 / 884
Регистрация: 14.02.2011
Сообщений: 22,827
24.09.2016, 23:46 19
gru74ik, а зачем ты в рублях и копейках считаешь?
работай в копейках
а обмен между рублями/копейками можно сделать как то так
C++
1
2
3
4
5
int swap(int sum)
{
return sum/100+(sum%100)*100;
 
}
0
Эксперт CЭксперт С++
5087 / 2272 / 332
Регистрация: 20.02.2013
Сообщений: 5,598
Записей в блоге: 19
25.09.2016, 00:00 20
Без дебажной инфы вот так будет выглядеть:
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <iostream>
#include <vector>
#include <algorithm>
 
typedef unsigned int uint;
 
class Purse
{
    uint rubles_;
    uint kopeks_;
    uint total_;
 
public:
    Purse( uint r = 0, uint k = 0) : rubles_(r), kopeks_(k)
    {
        total_ = rubles_ * 100 + kopeks_;
    }
 
    void set_rubles( const uint r )
    {
        rubles_ = r;
        total_ += rubles_ * 100;
    }
 
    void set_kopeks( const uint k )
    {
        kopeks_ = k;
        total_ += kopeks_;
    }
 
    void set_total( const uint t )
    {
        total_ = t;
        rubles_ = total_ / 100;
        kopeks_ = total_ % 100;
    }
 
    uint rubles() const // getter
    {
        return rubles_;
    }
 
    uint kopeks() const // getter
    {
        return kopeks_;
    }
 
    uint total() const // getter
    {
        return total_;
    }
 
    void throw_money_into_the_river( const uint magic_amount )
    {
        set_total( total_ - magic_amount );
        std::swap( rubles_, kopeks_ );
        total_ = rubles_ * 100 + kopeks_;
    }
};
 
int main()
{
    const uint magic_amount = 29; // amount of money that have to be thrown into the river
 
    Purse p( 46, 47 );
    std::vector<uint> current_amount;
 
    do
    {
        p.throw_money_into_the_river( magic_amount );
        current_amount.push_back( p.total() );
    }
    while ( p.total() > magic_amount );
 
    Purse best_balance;
 
    best_balance.set_total
        (
            *std::max_element
                (
                    current_amount.begin(),
                    current_amount.end()
                )
        );
 
    std::cout
        << "The best balance is: "
        << best_balance.rubles()
        << " rubles and "
        << best_balance.kopeks()
        << " kopeks.\n\n";
 
    uint optimal_number_of_passes = 0;
    size_t current_amount_size = current_amount.size();
 
    for ( size_t i = 0; i < current_amount_size; ++i )
    {
        if ( best_balance.total() == current_amount[i] )
            optimal_number_of_passes = i;
    }
 
    std::cout
        << "Optimal number of passes is: "
        << optimal_number_of_passes + 1
        << "\n\n";
 
    return 0;
}
Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
gru74ik, а зачем ты в рублях и копейках считаешь?
работай в копейках
ValeryS, если хочешь, сделай сам. Я уже не могу, спать хочу.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.09.2016, 00:00
Помогаю со студенческими работами здесь

Неожиданное поведение программы: вместо вывода суммы чисел, на консоль всё время выводится ноль (цикл while)
Программа запрашивает ввод числа. После каждого введенного значения программа должна выдавать...

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

Неожиданное поведение программы: найти ошибку в коде
Программа запрашивает у пользователя «Сколько Вам лет?» . Вы вводите положительное число до 100....

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru