Требуется while c ошибка

Ошибка компилятора C++ Решение и ответ на вопрос 1927831

crazymadman18

0 / 0 / 2

Регистрация: 04.12.2016

Сообщений: 144

1

Ошибка компилятора

26.02.2017, 21:05. Показов 1784. Ответов 4

Метки нет (Все метки)


Пишет на последнюю строчку, что требуется while и синтаксическая ошибка }

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
#include "stdafx.h"
#include <iostream>
using namespace std;
 
int F1(float ar1,float ar2)
{
    return(0);
}
 
int main(int argc, char* argv[])
{
    int N=1, i;
    while (N != 0) do
    {
        cout << "Введите размерность: ";
 
        cin >> N;
        float *ar1 = new float[N];
        float *ar2 = new float[N];
        cout << "Первый вектор: ";
        for (i = 0; i < N; i++)
        {
            cin >> ar1[i];
        }
        cout << "Второй вектор: ";
        for (i = 0; i < N; i++)
        {
            cin >> ar2[i];
        }
     return (0);
    }
    
}

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

26.02.2017, 21:05

Ответы с готовыми решениями:

Ошибка компилятора
Написал следующую программу. Компилятор ругается на строке с выводом. Что я делаю не так?
#include…

ошибка компилятора
Не могу понять в чём проблема.Там ведь не нужна скобка и точка с запятой
П.5.18.Правил
Запрещено…

Ошибка компилятора
#include &lt;iostream&gt;

using namespace std;

class ss
{
public:
static bool progress;

Ошибка компилятора
Всем привет. Начну с самого конца. Есть некий файл SpellItemEnchantment.dbc — это просто хранилище…

4

Standret

3 / 3 / 5

Регистрация: 29.01.2017

Сообщений: 8

26.02.2017, 21:08

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
#include "stdafx.h"
#include <iostream>
using namespace std;
 
int F1(float ar1,float ar2)
{
    return(0);
}
 
int main(int argc, char* argv[])
{
    int N=1, i;
    do{
        cout << "Введите размерность: ";
 
        cin >> N;
        float *ar1 = new float[N];
        float *ar2 = new float[N];
        cout << "Первый вектор: ";
        for (i = 0; i < N; i++)
        {
            cin >> ar1[i];
        }
        cout << "Второй вектор: ";
        for (i = 0; i < N; i++)
        {
            cin >> ar2[i];
        }
     return (0);
    }  while (N != 0); 
    
}

Запамятай!!

C++
1
2
3
4
5
do{
....
body
....
}while();



0



0 / 0 / 2

Регистрация: 04.12.2016

Сообщений: 144

26.02.2017, 21:10

 [ТС]

3

Standret, аа, точно, чертов делфи//



0



zss

Модератор

Эксперт С++

12644 / 10136 / 6104

Регистрация: 18.12.2011

Сообщений: 27,173

26.02.2017, 22:51

4

1.

Цитата
Сообщение от Standret
Посмотреть сообщение

return (0);

Это надо вынести из цикла.
2. Кто за Вас будет освобождать память?

C++
1
2
3
4
    delete[] ar1;
    delete[] ar2;
    return 0;
}

3. Где используются параметры argc argv?



0



nd2

3433 / 2812 / 1249

Регистрация: 29.01.2016

Сообщений: 9,426

26.02.2017, 23:58

5

Цитата
Сообщение от zss
Посмотреть сообщение

Кто за Вас будет освобождать память?

C++
1
2
3
    delete[] ar1;
    delete[] ar2;
    return 0;

ОС.

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

Цитата
Сообщение от zss
Посмотреть сообщение

Где используются параметры argc argv?

Цитата
Сообщение от zss
Посмотреть сообщение

C++
1
return 0;

Лишняя строка.



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

26.02.2017, 23:58

5

I’m having a problem with my function int getUserOption(). There is an error on the upper curly brace of the function (right under the function header) that says expected a ';' and one error on the lower curly brace that says expected a 'while'. I can’t seem to find anyone with similar problems and I know that functions don’t have a semicolon following them if you’re defining them. What am I doing wrong and how can I fix/avoid it with my next functions?

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int getUserOption();

int main()
{
int option;
cout << "hello worldn";
    do {
        option = getUserOption();
        switch(option) {
        case 0:
            break;
        case 1:
            cout << "You chose COPYn";
            break;
        case 2:
            cout << "You chose FACTORIALn";
            break;
        case 3:
            cout << "You chose COUNTn";
            break;
        case 4:
            cout << "You chose COUNT BYTESn";
            break;

return 0;
    }

    int getUserOption()
    {
string userSelection;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
cout << "Enter an option as it appears before the colon: n";
cout << "  QUIT: Exit the programn";
cout << "  1: Copy the contents of a filen";
cout << "  2: Calculate the factorial of an integer (between 1 and 12)n";
cout << "  3: Count the words in a filen";
cout << "  4: Count the bytes in a filen";

getline(cin,userSelection);

    if(userSelection[0] == '1') {
        return 1;
    } else if (userSelection[0] == '2') {
        return 2;
    } else if (userSelection[0] == '3') {
        return 3;
    } else if (userSelection[0] == '4') {
        return 4;
    } else if (userSelection == "QUIT") {
        return 0;
    } else {
        return -1;
    }
    return 0;
}

Barmar's user avatar

Barmar

718k53 gold badges481 silver badges598 bronze badges

asked Dec 27, 2013 at 23:41

user3140785's user avatar

1

you need to close out your do...while loop and your switch statement.

do {
    ...
    switch(option) {
        ...
    } // end of switch statement
}while(...); // end of do-while loop

return 0;

answered Dec 27, 2013 at 23:43

Sam I am says Reinstate Monica's user avatar

0

Добавлено 29 мая 2021 в 13:05

Введение в циклы

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

Например, предположим, что вы хотите вывести все числа от 1 до 10. Без циклов вы можете попробовать что-то вроде этого:

#include <iostream>
 
int main()
{
    std::cout << "1 2 3 4 5 6 7 8 9 10";
    std::cout << " done!";
    return 0;
}

Хотя это выполнимо, но всё усложняется, когда вы хотите напечатать больше чисел: что, если вы хотите напечатать все числа от 1 до 1000? А это совсем немного! Но такую программу возможно написать, потому что во время компиляции мы знаем, сколько чисел мы хотим напечатать.

Теперь давайте немного изменим требования. Что, если бы мы хотели попросить пользователя ввести число, а затем распечатать все числа от 1 до числа, введенного пользователем? Число, которое введет пользователь, неизвестно во время компиляции. Итак, как мы можем решить эту проблему?

Инструкция while (также называемая циклом while) является самым простым из трех типов циклов, предоставляемых C++, и имеет определение, очень похожее на определение оператора if:

while (условие)
    инструкция;

Инструкция while объявляется с помощью ключевого слова while. При выполнении инструкции while вычисляется условие. Если условие истинно, выполняется связанная инструкция.

Однако, в отличие от оператора if, после завершения выполнения инструкции управление возвращается в начало оператора while, и процесс повторяется. Это означает, что оператор while будет продолжать цикл до тех пор, пока условие будет истинным.

Давайте посмотрим на простой цикл while, который выводит все числа от 1 до 10:

#include <iostream>
 
int main()
{
    int count{ 1 };
    while (count <= 10)
    {
        std::cout << count << ' ';
        ++count;
    }
 
    std::cout << "done!";
 
    return 0;
}

Эта программа выводит:

1 2 3 4 5 6 7 8 9 10 done!

Давайте подробнее рассмотрим, что делает эта программа. Сначала счетчик count инициализируется значением 1, которое является первым числом, которое мы напечатаем. Условие count <= 10 истинно, поэтому инструкция выполняется. В этом случае наша инструкция – это блок, поэтому все инструкции в этом блоке будут выполнены. Первая инструкция в блоке печатает 1 и пробел, а вторая увеличивает count до 2. Теперь управление возвращается к началу оператора while, и снова вычисляется условие. 2 <= 10 вычисляется как true, поэтому блок кода выполняется снова. Цикл будет повторяться до тех пор, пока count не станет равен 11, после чего значение 11 <= 10 будет ложным, и инструкция, связанная с циклом, будет пропущена. На этом выполнение цикла заканчивается.

Хотя эта программа представляет собой немного больше кода, чем набор всех чисел от 1 до 10, подумайте, насколько легко было бы изменить эту программу для печати всех чисел от 1 до 1000: всё, что вам нужно сделать, это изменить count <= 10 на count <= 1000.

Инструкции while, которые изначально вычисляются как ложные

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

#include <iostream>
 
int main()
{
    int count{ 15 };
    while (count <= 10)
    {
        std::cout << count << ' ';
        ++count;
    }
 
    std::cout << "done!";
 
    return 0;
}

Условие 15 <= 10 вычисляется как false, поэтому связанная инструкция пропускается. Программа продолжается, и единственное, что будет напечатано – это «done!».

Бесконечные циклы

И наоборот, если условное выражение всегда истинно, цикл while будет выполняться вечно. Это называется бесконечным циклом. Вот пример бесконечного цикла:

#include <iostream>
 
int main()
{
    int count{ 1 };
    while (count <= 10) // это условие никогда не будет ложным
    {
        std::cout << count << ' '; // поэтому эта строка будет выполняться многократно
    }
 
    return 0; // эта строка никогда не будет выполнена
}

Поскольку в этой программе count никогда не увеличивается, условие count <= 10 всегда будет истинным. Следовательно, цикл никогда не завершится, и программа будет печатать «1 1 1 1 1» … всегда.

Преднамеренные бесконечные циклы

Мы можем намеренно объявить бесконечный цикл следующим образом:

while (true)
{
  // этот цикл будет выполняться вечно
}

Единственный способ выйти из бесконечного цикла – использовать инструкцию return, инструкцию break, инструкцию exit, инструкцию goto, сгенерировать исключение, или пользователю убить программу.

Вот глупый пример, демонстрирующий это:

#include <iostream>
 
int main()
{
 
    while (true) // бесконечный цикл
    {
        std::cout << "Loop again (y/n)? ";
        char c{};
        std::cin >> c;
 
        if (c == 'n')
            return 0;
    }
 
    return 0;
}

Эта программа будет непрерывно повторяться до тех пор, пока пользователь не введет n в качестве входных данных, после чего оператор if вычислит значение true,и связанный с ним return 0; вызовет выход из функции main(), завершив программу.

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

Лучшая практика


Для преднамеренных бесконечных циклов используйте while (true).

Переменные цикла

Часто нам нужно, чтобы цикл выполнялся определенное количество раз. Для этого обычно используется переменная цикла, часто называемая счетчиком. Переменная цикла – это целочисленное значение, которое используется для подсчета количества выполнений цикла. В приведенных выше примерах переменной цикла является переменная count.

Переменным цикла часто дают простые имена, такие как i, j или k. Однако если вы хотите знать, где в вашей программе используется переменная цикла, и вы используете функцию поиска по i, j или k, функция поиска вернет половину вашей программы! По этой причине некоторые разработчики предпочитают использовать такие имена переменных цикла, как iii, jjj или kkk. Поскольку эти имена более уникальны, это значительно упрощает поиск переменных цикла и помогает им выделяться как переменные цикла. Еще лучше – использовать «настоящие» имена переменных, такие как count, или имя, которое дает более подробную информацию о том, что вы подсчитываете (например, userCount).

Переменные цикла должны быть со знаком

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

#include <iostream>
 
int main()
{
    unsigned int count{ 10 };
 
    // счетчик от 10 до 0
    while (count >= 0)
    {
        if (count == 0)
        {
            std::cout << "blastoff!";
        }
        else
        {
            std::cout << count << ' ';
        }
        --count;
    }
 
    return 0;
}

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

Оказывается, эта программа представляет собой бесконечный цикл. Она начинается, как и предполагалось, с печати 10 9 8 7 6 5 4 3 2 1 blastoff!, но затем сходит с рельсов и начинает обратный отсчет с 4294967295. Почему? Потому что условие цикла count >= 0 никогда не будет ложным! Когда count равен 0, условие 0 >= 0 истинно. Затем выполняется --count, и count переходит к 4294967295 (предполагается, что int занимает 32 бита). И поскольку 4294967295 >= 0 истинно, программа продолжается. Поскольку count не имеет знака, он никогда не может быть отрицательным, а поскольку он никогда не может быть отрицательным, цикл не завершится.

Лучшая практика


Переменные цикла должны иметь тип (signed) int.

Выполнение чего-то при каждой N-ой итерации

Каждый раз, когда цикл выполняется, это называется итерацией.

Часто мы хотим делать что-то на каждой 2-й, 3-й или 4-й итерации, например, выводить символ новой строки. Это легко сделать с помощью оператора взятия остатка от деления для нашего счетчика:

#include <iostream>
 
// Перебираем все числа от 1 до 50
int main()
{
    int count{ 1 };
    while (count <= 50)
    {
        // выводим число (для форматирования добавляем 0 перед числами меньше 10)
        if (count < 10)
        {
            std::cout << '0';
        }
 
        std::cout << count << ' ';
 
        // если переменная цикла делится на 10, печатаем символ новой строки
        if (count % 10 == 0)
        {
            std::cout << 'n';
        }
            
        // увеличиваем счетчик цикла
        ++count;
    }
 
    return 0;
}

Эта программа дает следующий результат:

01 02 03 04 05 06 07 08 09 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>
 
// Цикл от 1 до 5
int main()
{
    int outer{ 1 };
    while (outer <= 5)
    {
        // цикл от 1 до outer
        int inner{ 1 };
        while (inner <= outer)
        {
            std::cout << inner << ' ';
            ++inner;
        }
 
        // выводим символ новой строки в конце каждой строки
        std::cout << 'n';
        ++outer;
    }
 
    return 0;
}

Эта программа печатает:

1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

Небольшой тест

Вопрос 1

Почему в приведенной выше программе переменная inner объявляется внутри блока while, а не сразу после объявления outer?

Ответ

Переменная inner объявляется внутри блока while, поэтому она создается (и повторно инициализируется значением 1) каждый раз при выполнении внешнего цикла. Если бы переменная inner была объявлена перед внешним циклом while, ее значение никогда не было бы сброшено до 1, или нам пришлось бы делать это с помощью оператора присваивания. Кроме того, поскольку переменная inner используется только внутри блока внешнего цикла while, имеет смысл объявить ее там. Помните, что мы объявляем переменные в минимально возможной области видимости!


Вопрос 2

Напишите программу, которая печатает буквы от a до z вместе с их кодами ASCII.

Подсказка

Чтобы напечатать символы как целые числа, вы должны использовать static_cast.

Ответ

#include <iostream>
 
int main()
{
    char myChar{ 'a' };
    while (myChar <= 'z')
    {
        std::cout << myChar << ' ' << static_cast<int>(myChar) << 'n';
        ++myChar;
    }
 
    return 0;
}

Вопрос 3

Инвертируйте пример вложенных циклов, чтобы он напечатал следующее:

5 4 3 2 1
4 3 2 1
3 2 1
2 1
1

Ответ

#include <iostream>
 
// Цикл от 5 до 1
int main()
{
	int outer{ 5 };
	while (outer >= 1)
	{
		// цикл от inner до 1
		int inner{ outer };
		while (inner >= 1)
        {
			std::cout << inner-- << ' ';
        }
 
		// выводим символ новой строки в конце каждой строки
		std::cout << 'n';
		--outer;
	}
 
	return 0;
}

Вопрос 4

Теперь напечатайте числа так:

        1
      2 1
    3 2 1
  4 3 2 1
5 4 3 2 1

Подсказка: сначала выясните, как печатать вот так:

X X X X 1
X X X 2 1
X X 3 2 1
X 4 3 2 1
5 4 3 2 1

Ответ

#include <iostream>
 
int main()
{
	// Есть 5 строк, мы можем выполнять цикл от 1 до 5
	int outer{ 1 };
 
	while (outer <= 5)
	{
		// Элементы строки отображаются в порядке убывания, поэтому начинаем с 5 и идем к 1
		int inner{ 5 };
 
		while (inner >= 1)
		{
			// Первое число в любой строке совпадает с номером строки
            // Значит, число должно быть напечатано, только если оно <= номеру строки,
            // в противном случае - пробел
			if (inner <= outer)
				std::cout << inner << ' ';
			else
				std::cout << "  "; // дополнительные пробелы исключительно для форматирования
 
			--inner;
		}
 
		// Строка напечатана, перейти к следующей строке
		std::cout << 'n';
 
		++outer;
	}
 
	return 0;
}

Теги

C++ / CppLearnCppwhileДля начинающихОбучениеПрограммированиеЦикл

I have a simple while loop i’m trying to implement but for the life of me can’t figure out what I’m missing. I have currentuser initialized at the top to -1

while(currentuser = -1){
    cout << "Enter user ID: ";
    cin >> id;
    currentuser = search(a, length, id);
}

My search function is this:

int search (User a[ ], int length, string userID){
    User u;
    string tempid;
    int templegnth; //I ignore length for now as I will use it later
    for(int i=0; i<50; i++){
        tempid = a[i].getID();
        templegnth = tempid.length();
        if((tempid == userID)){
            return i;
        }
    }
    return -1;


}

I know its something very simple but the answer escapes me right now.

asked Sep 25, 2011 at 14:09

Nick's user avatar

2

The = (assignment) operator is not the same as the == (equality) operator.

The line :

while(currentuser = -1){

first assigns -1 to currentuser, and then checks if currentuser has a non-zero value. This will always be the case (-1 != 0), so the loop will never end.

You likely meant this instead :

while(currentuser == -1){

which compares currentuser to -1, and continues the loop as long as that comparison is true.

answered Sep 25, 2011 at 14:11

Sander De Dycker's user avatar

Sander De DyckerSander De Dycker

15.9k1 gold badge33 silver badges39 bronze badges

You need to change:

while(currentuser = -1){

to be:

while(currentuser == -1){

Currently you are assigning currentuser to -1 every time your loop runs, rather than checking if it is still assigned to that value.

answered Sep 25, 2011 at 14:12

thomasfedb's user avatar

thomasfedbthomasfedb

5,9802 gold badges36 silver badges65 bronze badges

0

Try == -1 instead of = -1

answered Sep 25, 2011 at 14:11

Jean Logeart's user avatar

Jean LogeartJean Logeart

51.8k11 gold badges82 silver badges117 bronze badges

0

You’ve got the answers but here is a tip on how to avoid it in the future.
Always try to use

while(-1 == currentuser){
  std::cout << "Enter user ID: ";
  std::cin >> id;
  currentuser = search(a, length, id);
}

as this way

while(-1 = currentuser){
  ;
} 

will be thrown out by the compiler

answered Sep 26, 2011 at 10:26

Michael's user avatar

MichaelMichael

1461 silver badge9 bronze badges

1

Even with the = changed to ==, the loop still has problems.

while(currentuser == -1){
  std::cout << "Enter user ID: ";
  std::cin >> id;
  currentuser = search(a, length, id);
}

Typing an EOT (control-D on a Linux box, control-Z? on windows) will raise std::cin‘s end of file condition. The value of id won’t be changed, and the lookup will presumably keep on returning -1. The result is an infinite loop with lots of spew to std::cout.

One way to fix this is to break out of the loop when the std::cin >> id; fails. For example, if (! (std::cin >> id)) break;

answered Sep 25, 2011 at 15:17

David Hammen's user avatar

David HammenDavid Hammen

32k8 gold badges59 silver badges107 bronze badges

Whenever I use a while loop and a boolean, I try to make sure it only runs if it is above or is 50 but instead whenever I execute a cout with the while and int, the outcome is a literal mess, its like the while loop executes a lot more than it should. Eg.

int Buses;
int People;
cin >> People;
while(People >= 50){
Buses += 1;
People -= 50;
};
cout << Buses << endl;

and when I input 757, my result was 32782.

Even by subtracting the int value by 32767, the values sort of fix itself but not the higher numbers, 99 is 1, 101 is 2 but c++ says that 300 is 3 although it is meant to be 6.

(My solution I found: I had to declare the Person and Buses variable with a 0 because the value was different without the starting 0.)

This is the fixed code:

int Buses = 0;
int People = 0;
cin >> People;
while(People >= 50){
Buses += 1;
People -= 50;
};
cout << Buses << endl;

answered Nov 7, 2022 at 13:20

GmdGooodsoups's user avatar

I have a simple while loop i’m trying to implement but for the life of me can’t figure out what I’m missing. I have currentuser initialized at the top to -1

while(currentuser = -1){
    cout << "Enter user ID: ";
    cin >> id;
    currentuser = search(a, length, id);
}

My search function is this:

int search (User a[ ], int length, string userID){
    User u;
    string tempid;
    int templegnth; //I ignore length for now as I will use it later
    for(int i=0; i<50; i++){
        tempid = a[i].getID();
        templegnth = tempid.length();
        if((tempid == userID)){
            return i;
        }
    }
    return -1;


}

I know its something very simple but the answer escapes me right now.

asked Sep 25, 2011 at 14:09

Nick's user avatar

2

The = (assignment) operator is not the same as the == (equality) operator.

The line :

while(currentuser = -1){

first assigns -1 to currentuser, and then checks if currentuser has a non-zero value. This will always be the case (-1 != 0), so the loop will never end.

You likely meant this instead :

while(currentuser == -1){

which compares currentuser to -1, and continues the loop as long as that comparison is true.

answered Sep 25, 2011 at 14:11

Sander De Dycker's user avatar

Sander De DyckerSander De Dycker

15.9k1 gold badge33 silver badges39 bronze badges

You need to change:

while(currentuser = -1){

to be:

while(currentuser == -1){

Currently you are assigning currentuser to -1 every time your loop runs, rather than checking if it is still assigned to that value.

answered Sep 25, 2011 at 14:12

thomasfedb's user avatar

thomasfedbthomasfedb

5,9802 gold badges36 silver badges65 bronze badges

0

Try == -1 instead of = -1

answered Sep 25, 2011 at 14:11

Jean Logeart's user avatar

Jean LogeartJean Logeart

51.8k11 gold badges82 silver badges117 bronze badges

0

You’ve got the answers but here is a tip on how to avoid it in the future.
Always try to use

while(-1 == currentuser){
  std::cout << "Enter user ID: ";
  std::cin >> id;
  currentuser = search(a, length, id);
}

as this way

while(-1 = currentuser){
  ;
} 

will be thrown out by the compiler

answered Sep 26, 2011 at 10:26

Michael's user avatar

MichaelMichael

1461 silver badge9 bronze badges

1

Even with the = changed to ==, the loop still has problems.

while(currentuser == -1){
  std::cout << "Enter user ID: ";
  std::cin >> id;
  currentuser = search(a, length, id);
}

Typing an EOT (control-D on a Linux box, control-Z? on windows) will raise std::cin‘s end of file condition. The value of id won’t be changed, and the lookup will presumably keep on returning -1. The result is an infinite loop with lots of spew to std::cout.

One way to fix this is to break out of the loop when the std::cin >> id; fails. For example, if (! (std::cin >> id)) break;

answered Sep 25, 2011 at 15:17

David Hammen's user avatar

David HammenDavid Hammen

32k8 gold badges59 silver badges107 bronze badges

Whenever I use a while loop and a boolean, I try to make sure it only runs if it is above or is 50 but instead whenever I execute a cout with the while and int, the outcome is a literal mess, its like the while loop executes a lot more than it should. Eg.

int Buses;
int People;
cin >> People;
while(People >= 50){
Buses += 1;
People -= 50;
};
cout << Buses << endl;

and when I input 757, my result was 32782.

Even by subtracting the int value by 32767, the values sort of fix itself but not the higher numbers, 99 is 1, 101 is 2 but c++ says that 300 is 3 although it is meant to be 6.

(My solution I found: I had to declare the Person and Buses variable with a 0 because the value was different without the starting 0.)

This is the fixed code:

int Buses = 0;
int People = 0;
cin >> People;
while(People >= 50){
Buses += 1;
People -= 50;
};
cout << Buses << endl;

answered Nov 7, 2022 at 13:20

GmdGooodsoups's user avatar

Добавлено 29 мая 2021 в 13:05

Введение в циклы

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

Например, предположим, что вы хотите вывести все числа от 1 до 10. Без циклов вы можете попробовать что-то вроде этого:

#include <iostream>
 
int main()
{
    std::cout << "1 2 3 4 5 6 7 8 9 10";
    std::cout << " done!";
    return 0;
}

Хотя это выполнимо, но всё усложняется, когда вы хотите напечатать больше чисел: что, если вы хотите напечатать все числа от 1 до 1000? А это совсем немного! Но такую программу возможно написать, потому что во время компиляции мы знаем, сколько чисел мы хотим напечатать.

Теперь давайте немного изменим требования. Что, если бы мы хотели попросить пользователя ввести число, а затем распечатать все числа от 1 до числа, введенного пользователем? Число, которое введет пользователь, неизвестно во время компиляции. Итак, как мы можем решить эту проблему?

Инструкции while

Инструкция while (также называемая циклом while) является самым простым из трех типов циклов, предоставляемых C++, и имеет определение, очень похожее на определение оператора if:

while (условие)
    инструкция;

Инструкция while объявляется с помощью ключевого слова while. При выполнении инструкции while вычисляется условие. Если условие истинно, выполняется связанная инструкция.

Однако, в отличие от оператора if, после завершения выполнения инструкции управление возвращается в начало оператора while, и процесс повторяется. Это означает, что оператор while будет продолжать цикл до тех пор, пока условие будет истинным.

Давайте посмотрим на простой цикл while, который выводит все числа от 1 до 10:

#include <iostream>
 
int main()
{
    int count{ 1 };
    while (count <= 10)
    {
        std::cout << count << ' ';
        ++count;
    }
 
    std::cout << "done!";
 
    return 0;
}

Эта программа выводит:

1 2 3 4 5 6 7 8 9 10 done!

Давайте подробнее рассмотрим, что делает эта программа. Сначала счетчик count инициализируется значением 1, которое является первым числом, которое мы напечатаем. Условие count <= 10 истинно, поэтому инструкция выполняется. В этом случае наша инструкция – это блок, поэтому все инструкции в этом блоке будут выполнены. Первая инструкция в блоке печатает 1 и пробел, а вторая увеличивает count до 2. Теперь управление возвращается к началу оператора while, и снова вычисляется условие. 2 <= 10 вычисляется как true, поэтому блок кода выполняется снова. Цикл будет повторяться до тех пор, пока count не станет равен 11, после чего значение 11 <= 10 будет ложным, и инструкция, связанная с циклом, будет пропущена. На этом выполнение цикла заканчивается.

Хотя эта программа представляет собой немного больше кода, чем набор всех чисел от 1 до 10, подумайте, насколько легко было бы изменить эту программу для печати всех чисел от 1 до 1000: всё, что вам нужно сделать, это изменить count <= 10 на count <= 1000.

Инструкции while, которые изначально вычисляются как ложные

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

#include <iostream>
 
int main()
{
    int count{ 15 };
    while (count <= 10)
    {
        std::cout << count << ' ';
        ++count;
    }
 
    std::cout << "done!";
 
    return 0;
}

Условие 15 <= 10 вычисляется как false, поэтому связанная инструкция пропускается. Программа продолжается, и единственное, что будет напечатано – это «done!».

Бесконечные циклы

И наоборот, если условное выражение всегда истинно, цикл while будет выполняться вечно. Это называется бесконечным циклом. Вот пример бесконечного цикла:

#include <iostream>
 
int main()
{
    int count{ 1 };
    while (count <= 10) // это условие никогда не будет ложным
    {
        std::cout << count << ' '; // поэтому эта строка будет выполняться многократно
    }
 
    return 0; // эта строка никогда не будет выполнена
}

Поскольку в этой программе count никогда не увеличивается, условие count <= 10 всегда будет истинным. Следовательно, цикл никогда не завершится, и программа будет печатать «1 1 1 1 1» … всегда.

Преднамеренные бесконечные циклы

Мы можем намеренно объявить бесконечный цикл следующим образом:

while (true)
{
  // этот цикл будет выполняться вечно
}

Единственный способ выйти из бесконечного цикла – использовать инструкцию return, инструкцию break, инструкцию exit, инструкцию goto, сгенерировать исключение, или пользователю убить программу.

Вот глупый пример, демонстрирующий это:

#include <iostream>
 
int main()
{
 
    while (true) // бесконечный цикл
    {
        std::cout << "Loop again (y/n)? ";
        char c{};
        std::cin >> c;
 
        if (c == 'n')
            return 0;
    }
 
    return 0;
}

Эта программа будет непрерывно повторяться до тех пор, пока пользователь не введет n в качестве входных данных, после чего оператор if вычислит значение true,и связанный с ним return 0; вызовет выход из функции main(), завершив программу.

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

Лучшая практика


Для преднамеренных бесконечных циклов используйте while (true).

Переменные цикла

Часто нам нужно, чтобы цикл выполнялся определенное количество раз. Для этого обычно используется переменная цикла, часто называемая счетчиком. Переменная цикла – это целочисленное значение, которое используется для подсчета количества выполнений цикла. В приведенных выше примерах переменной цикла является переменная count.

Переменным цикла часто дают простые имена, такие как i, j или k. Однако если вы хотите знать, где в вашей программе используется переменная цикла, и вы используете функцию поиска по i, j или k, функция поиска вернет половину вашей программы! По этой причине некоторые разработчики предпочитают использовать такие имена переменных цикла, как iii, jjj или kkk. Поскольку эти имена более уникальны, это значительно упрощает поиск переменных цикла и помогает им выделяться как переменные цикла. Еще лучше – использовать «настоящие» имена переменных, такие как count, или имя, которое дает более подробную информацию о том, что вы подсчитываете (например, userCount).

Переменные цикла должны быть со знаком

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

#include <iostream>
 
int main()
{
    unsigned int count{ 10 };
 
    // счетчик от 10 до 0
    while (count >= 0)
    {
        if (count == 0)
        {
            std::cout << "blastoff!";
        }
        else
        {
            std::cout << count << ' ';
        }
        --count;
    }
 
    return 0;
}

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

Оказывается, эта программа представляет собой бесконечный цикл. Она начинается, как и предполагалось, с печати 10 9 8 7 6 5 4 3 2 1 blastoff!, но затем сходит с рельсов и начинает обратный отсчет с 4294967295. Почему? Потому что условие цикла count >= 0 никогда не будет ложным! Когда count равен 0, условие 0 >= 0 истинно. Затем выполняется --count, и count переходит к 4294967295 (предполагается, что int занимает 32 бита). И поскольку 4294967295 >= 0 истинно, программа продолжается. Поскольку count не имеет знака, он никогда не может быть отрицательным, а поскольку он никогда не может быть отрицательным, цикл не завершится.

Лучшая практика


Переменные цикла должны иметь тип (signed) int.

Выполнение чего-то при каждой N-ой итерации

Каждый раз, когда цикл выполняется, это называется итерацией.

Часто мы хотим делать что-то на каждой 2-й, 3-й или 4-й итерации, например, выводить символ новой строки. Это легко сделать с помощью оператора взятия остатка от деления для нашего счетчика:

#include <iostream>
 
// Перебираем все числа от 1 до 50
int main()
{
    int count{ 1 };
    while (count <= 50)
    {
        // выводим число (для форматирования добавляем 0 перед числами меньше 10)
        if (count < 10)
        {
            std::cout << '0';
        }
 
        std::cout << count << ' ';
 
        // если переменная цикла делится на 10, печатаем символ новой строки
        if (count % 10 == 0)
        {
            std::cout << 'n';
        }
            
        // увеличиваем счетчик цикла
        ++count;
    }
 
    return 0;
}

Эта программа дает следующий результат:

01 02 03 04 05 06 07 08 09 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>
 
// Цикл от 1 до 5
int main()
{
    int outer{ 1 };
    while (outer <= 5)
    {
        // цикл от 1 до outer
        int inner{ 1 };
        while (inner <= outer)
        {
            std::cout << inner << ' ';
            ++inner;
        }
 
        // выводим символ новой строки в конце каждой строки
        std::cout << 'n';
        ++outer;
    }
 
    return 0;
}

Эта программа печатает:

1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

Небольшой тест

Вопрос 1

Почему в приведенной выше программе переменная inner объявляется внутри блока while, а не сразу после объявления outer?

Ответ

Переменная inner объявляется внутри блока while, поэтому она создается (и повторно инициализируется значением 1) каждый раз при выполнении внешнего цикла. Если бы переменная inner была объявлена перед внешним циклом while, ее значение никогда не было бы сброшено до 1, или нам пришлось бы делать это с помощью оператора присваивания. Кроме того, поскольку переменная inner используется только внутри блока внешнего цикла while, имеет смысл объявить ее там. Помните, что мы объявляем переменные в минимально возможной области видимости!


Вопрос 2

Напишите программу, которая печатает буквы от a до z вместе с их кодами ASCII.

Подсказка

Чтобы напечатать символы как целые числа, вы должны использовать static_cast.

Ответ

#include <iostream>
 
int main()
{
    char myChar{ 'a' };
    while (myChar <= 'z')
    {
        std::cout << myChar << ' ' << static_cast<int>(myChar) << 'n';
        ++myChar;
    }
 
    return 0;
}

Вопрос 3

Инвертируйте пример вложенных циклов, чтобы он напечатал следующее:

5 4 3 2 1
4 3 2 1
3 2 1
2 1
1

Ответ

#include <iostream>
 
// Цикл от 5 до 1
int main()
{
	int outer{ 5 };
	while (outer >= 1)
	{
		// цикл от inner до 1
		int inner{ outer };
		while (inner >= 1)
        {
			std::cout << inner-- << ' ';
        }
 
		// выводим символ новой строки в конце каждой строки
		std::cout << 'n';
		--outer;
	}
 
	return 0;
}

Вопрос 4

Теперь напечатайте числа так:

        1
      2 1
    3 2 1
  4 3 2 1
5 4 3 2 1

Подсказка: сначала выясните, как печатать вот так:

X X X X 1
X X X 2 1
X X 3 2 1
X 4 3 2 1
5 4 3 2 1

Ответ

#include <iostream>
 
int main()
{
	// Есть 5 строк, мы можем выполнять цикл от 1 до 5
	int outer{ 1 };
 
	while (outer <= 5)
	{
		// Элементы строки отображаются в порядке убывания, поэтому начинаем с 5 и идем к 1
		int inner{ 5 };
 
		while (inner >= 1)
		{
			// Первое число в любой строке совпадает с номером строки
            // Значит, число должно быть напечатано, только если оно <= номеру строки,
            // в противном случае - пробел
			if (inner <= outer)
				std::cout << inner << ' ';
			else
				std::cout << "  "; // дополнительные пробелы исключительно для форматирования
 
			--inner;
		}
 
		// Строка напечатана, перейти к следующей строке
		std::cout << 'n';
 
		++outer;
	}
 
	return 0;
}

Теги

C++ / CppLearnCppwhileДля начинающихОбучениеПрограммированиеЦикл

Понравилась статья? Поделить с друзьями:
  • Требуемый адрес для своего контекста неверен error 10049 flylinkdc
  • Требуемая колонка не заполнена ошибка вайлдберриз
  • Требование компенсации морального вреда у медицинской клиники поставившей ошибочный диагноз
  • Тормозит ноутбук как исправить эту проблему
  • Трафик менеджер cities skylines ошибка