С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 14.05.2020
Сообщений: 143

Как обновлять переменную в цикле

24.08.2021, 19:50. Показов 3101. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как можно обновлять переменные countPostion и countNumber в цикле в зависимости от введенного значения? Cуть задания угадать число, которое загадал компьютер, но при этом угадать еще сколько цифр мы угадали из заданного числа и стоят ли они на своих позициях. Например, загаданное число 123, вводим 203, программа говорит что угадано 2 числа(2 и 3), на своих позициях 1 число(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
int main() {
    setlocale(LC_ALL, "Russian");
    srand(time(NULL));
    int randomNum, ourNum, temp1, temp2, numDigits = 1;
    int* massPosition;
    int* ourMassPosition;
 
    cout << "Компьютер загадал число, необходимо его отгадать" << endl;
    randomNum = 123;
    printf("Компьютер загадал %d\n", randomNum); // для тестов выводим число
    cout << "Ваш вариант : ";
    cin >> ourNum;
    temp1 = randomNum; // копия числа компьютера
    temp2 = ourNum; // копия нашего числа
 
    if (randomNum == ourNum) {
        cout << "Число отгадано!" << endl;
        return 0;
    }
 
    // Cчитаем разрядность числа компьютера
    while (temp1 / 10 != 0) {
        numDigits++;
        temp1 /= 10;
    }
 
    massPosition = new int[numDigits];
    ourMassPosition = new int[numDigits];
    temp1 = randomNum;
 
 
    while (randomNum != ourNum) {
        cout << "Попробуйте еще раз: " << endl;
        cin >> ourNum;
        temp2 = ourNum;
        while (temp1 != 0 && temp2 != 0) {
            for (int i = numDigits - 1; i >= 0; i--) {
                massPosition[i] = temp1 % 10;
                ourMassPosition[i] = temp2 % 10;
                temp1 /= 10;
                temp2 /= 10;
            }
        }
        int countPosition = 0;
        for (int i = 0; i < numDigits; i++) {
            if (massPosition[i] == ourMassPosition[i]) {
                countPosition++;
            }
        }
        int countNumber = 0;
        for (int i = 0; i < numDigits; i++) {
            for (int j = 0; j < numDigits - 1; j++) {
                if (massPosition[i] == ourMassPosition[j]) {
                    countNumber++;
                    i++;
                }
            }
        }
        cout << "Угадано: " << countNumber << " На своих местах : " << countPosition << endl;
        if (randomNum == ourNum) {
            cout << "Число угадано!" << endl;
        }
    }
 
    delete massPosition;
    delete ourMassPosition;
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.08.2021, 19:50
Ответы с готовыми решениями:

Как обновлять textBrowser в цикле?
Подскажите, как обеспечить отображение вычисляемых в цикле значений в QtextBrowser сразу после вычисления, а не после завершения цикла?

Как обновлять переменную php без обновления страницы?
Была задача сделать проверку количества конкретного типа товара и выдавать предупреждение если данного товара количество меньше...

Как очистить переменную в цикле?
Суть такая: считаю автокорреляцию ряда при различных условиях. Для этого считаю корреляцию между значением ряда и его значением, сдвинутым...

6
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
24.08.2021, 19:55
Цитата Сообщение от Kilo Посмотреть сообщение
Как можно обновлять переменные countPostion и countNumber в цикле в зависимости от введенного значения
Обновление переменных в цикле ничем не отличается от обновления переменных вне цикла. Обновляйте на здоровье. О чем именно вопрос?

Цитата Сообщение от Kilo Посмотреть сообщение
C++
1
2
    delete massPosition;
    delete ourMassPosition;
C++
1
2
    delete[] massPosition;
    delete[] ourMassPosition;
0
1 / 1 / 0
Регистрация: 14.05.2020
Сообщений: 143
24.08.2021, 20:22  [ТС]
Программа работает только для первого ввода. То есть как ввели первый раз, показало что n угадано и m на своих позициях и все, дальше будет так же
0
Заблокирован
25.08.2021, 12:08
Цитата Сообщение от Kilo Посмотреть сообщение
Как обновлять переменную
Непонятно какую переменную? как обновлять ?
Вы же понимаете что Ваш код - сплошной фарш и ошибка.

Цитата Сообщение от Kilo Посмотреть сообщение
numDigits = 1;
Цитата Сообщение от Kilo Посмотреть сообщение
massPosition = new int[numDigits];
ourMassPosition = new int[numDigits];
и что это за массивы с одного элемента ?

Цитата Сообщение от Kilo Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
        while (temp1 != 0 && temp2 != 0) {
            for (int i = numDigits - 1; i >= 0; i--) {
                massPosition[i] = temp1 % 10;
                ourMassPosition[i] = temp2 % 10;
                temp1 /= 10;
                temp2 /= 10;
            }
        }
И что делает по Вашему этот участок кода ?
А я скажу: в единственный элемент массивов выше, переписывается остаток от деления чисел temp1 и temp2,
Затирая при этом предыдущее значение.

Вообщем, играйся :
https://onlinegdb.com/sPxNnWH53
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
25.08.2021, 18:32
Цитата Сообщение от SmallEvil Посмотреть сообщение
и что это за массивы с одного элемента ?
Я наверное не очень хорошо знаю русский язык. Что по-русски означает сочетание слов "массивы с одного элемента"?

И может надо внимательнее читать код:

C++
1
2
3
4
5
    // Cчитаем разрядность числа компьютера
    while (temp1 / 10 != 0) {
        numDigits++;
        temp1 /= 10;
    }
Ведь там даже комментарии приведены.
0
26.08.2021, 11:02

Не по теме:

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что по-русски означает сочетание слов "массивы с одного элемента"?
По-русски - ничего не означает. Это какая-то дурацкая современная мода. Заменять предлог "из" на предлог "с" просто повсюду. Это, конечно же, совершенно неправильно.

0
40 / 25 / 18
Регистрация: 05.05.2021
Сообщений: 49
26.08.2021, 15:58
Цитата Сообщение от Kilo Посмотреть сообщение
Программа работает только для первого ввода. То есть как ввели первый раз, показало что n угадано и m на своих позициях и все, дальше будет так же
Дело в том, что вы присваиваете значение переменной temp1 до цикла while, который начинается в 32 строке. Внутри него значение переменной обнуляется в цикле
Цитата Сообщение от Kilo Посмотреть сообщение
while (temp1 != 0 && temp2 != 0) {
for (int i = numDigits - 1; i >= 0; i--) {
massPosition[i] = temp1 % 10;
ourMassPosition[i] = temp2 % 10;
temp1 /= 10;
temp2 /= 10;
}
}
И после этого вход в него никогда не будет выполнен, так как в условии указано, что переменная temp1 должна быть не равна нулю, а она будет равна нулю, так как потом ей нигде не будет присвоено новое значение. По этой причине вам и выдает один и тот же ответ.

По поводу выбранного вами алгоритма решения задачи - вам не нужно хранить вводимое и угадываемое числа в int, вы же не выполняете с ними никаких арифметических действий. Было бы проще обрабатывать их как строки, это бы избавило вас от необходимости выполнения половины действий, написанных в вашем коде.

Вот мой вариант выполнения этого задания, возможно вам будет интересно разобраться в нем. Константа в начале программы отвечает за длину угадываемого числа.
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
#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>
#include <time.h>
 
const int COUNT_OF_DIGITS = 3; //Максимально допустимое значение - 10, иначе программа упадет
 
std::string makeRandomNumber() //Генерация числа с неповторяющимися цифрами
{
    size_t randomNumber = 0;
    std::vector<int> digits(10);
    std::iota(digits.begin(), digits.end(), 0);
    for(int i = 0; i < COUNT_OF_DIGITS; ++i)
    {
        int index = rand() % digits.size();
        if(randomNumber == 0 && digits[index] == 0)
        {
            --i;
            continue;
        }
        randomNumber += digits[index];
        if(i != COUNT_OF_DIGITS - 1)
            randomNumber *= 10;
        digits.erase(digits.begin() + index);
    }
    return std::to_string(randomNumber);
}
 
bool isNumbersMatching(const std::string randomNumber, const std::string myNumber)
{
    if(randomNumber == myNumber)
        return true;
    int countOfRightDigits = 0;
    int countOfRightPositionedDigits = 0;
    for(int i = 0; i < randomNumber.length(); ++i)
    {
        size_t index = randomNumber.find(myNumber[i]);
        if(index != std::string::npos)
        {
            if(index == i)
                ++countOfRightPositionedDigits;
            ++countOfRightDigits;
        }
    }
    std::cout << "Вы угадали " << countOfRightDigits << " из " << COUNT_OF_DIGITS << ".\n";
    std::cout << "На правильных позициях: " << countOfRightPositionedDigits << "\n\n";
    return false;
}
 
int checkInput(std::string myNumber)
{
    if(myNumber.length() != COUNT_OF_DIGITS)
        return 1;
    if(myNumber.find_first_not_of("1234567890") != std::string::npos)
        return 2;
    std::sort(myNumber.begin(), myNumber.end());
    if(std::unique(myNumber.begin(), myNumber.end()) != myNumber.end())
        return 3;
    return 0;
}
 
int main()
{
    srand(time(0));
    std::string randomNumber, myNumber;
    randomNumber = makeRandomNumber();
    std::cout << "Компьютер загадал число, состоящее из " << COUNT_OF_DIGITS << " цифр, попробуйте его угадать.\n\n";
    bool isAnswerRight = false;
    while(!isAnswerRight)
    {
        std::cout << "Введите ваш вариант числа: ";
        std::cin >> myNumber;
        if(int isInputCorrect = checkInput(myNumber))
        {
            std::cout << "При вводе числа произошла ошибка! ";
            switch(isInputCorrect)
            {
                case 1: std::cout << "Длина введенного числа не совпадает с длиной угадываемого. \n\n"; break;
                case 2: std::cout << "Введенная строка содержит символы кроме цифр. \n\n"; break;
                case 3: std::cout << "Введенное число содержит повторяющиеся цифры.\n\n"; break;
            }
        }
        else
            isAnswerRight = isNumbersMatching(randomNumber, myNumber);
    }
    std::cout << "Вы угадали загаданное число!\n";
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.08.2021, 15:58
Помогаю со студенческими работами здесь

Как раскрыть переменную в цикле?
Как в этом примере указать вместо &quot;6&quot; переменную n? Я пытался сделать как-то так: set %%n=6 for /L %%i in (1,1,%%n) do (...) ...

Как записать все значения в одну переменную в цикле
Нужна мини помощь по Visual Studio 2010 Есть цикл, надо записать в стринговую переменную все значения I, т.е на выходе должно быть...

Как использовать в проекте локальную переменную, измененную в цикле
Всем привет. Есть цикл foreach в нем формируется локальная переменная resalt, мне надо дальше работать с этой переменной но не...

как в цикле сопоставить переменной integer переменную string?
Возможно вопрос прозвучал по-дурацки. поясню на коде: for i := 1 to 6 do begin if i = 1 then s := 'ab'; if i = 2 then s...

Как создать переменную в цикле? В смысле, как создавать переменные с разными именами типа day_1, day_2 и т.д.
Очень прошу помочь:)


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru