Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 14 / 1
Регистрация: 29.05.2015
Сообщений: 61
1

Компилятор игнорирует функции cin, if, for

07.06.2015, 15:30. Показов 2111. Ответов 15
Метки нет (Все метки)

После запуска программа дает ввести только строку. После чего выбивается весь cout, игнорируя и функции cin, и разветвление іf и циклы for. Были попытки запустить в C++ Builder 6 и в Dev-C++, результат один. Компилятор в билдере пишет [C++ Warning] Unit1.cpp(19): W8060 Possibly incorrect assignment, гуглила, но что ему не нравится понять все равно не могу. На скрине - то, что выводит программа сразу же после ввода строки.
Dev-C++ :
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
#include <iostream>
#include <conio.h>
using namespace std;
//---------------------------------------------------------------------------
int main()
{ int g,f, hordim,verdim; char  stroka, answer1, table[100][100];
cout<<"Enter the string needed to transform\n";
cin>>stroka;
cout<<"what's the horizontal dimension of Turing mashine's table?\n";
cin>>hordim;
cout<<"Okay, and what's about vertical dimension?";
cin>>verdim;
cout<<"Please enter the content to each cell. \n";
cout<<"Do you need an examle how to do this?\n";
cin>>answer1;
if (answer1="YES"||"yes"||"y"||"Y"){
cout<<"Attention!\n";
cout<<"First string of array must to contain all the symbols used in entered string\n";
cout<<"The cells of main table have to contain the bunch of 3 positions:\n";
cout<<"The number of next condition as first position;\n";
cout<<"The symbol for which it changes as second position;\n";
cout<<"The character of motion direction  as last position;\n";
cout<<"EXAMLE:\n";
cout<<"S: || 0 | M | Q | $ | 3 |\n";
cout <<  "----------------------------" << endl;
cout<<"S0: |2QL 3Mr 2$R 33L 10l|\n";
cout << "----------------------------" << endl;
cout <<"S1: |1QL 1Mr 2$R 33L 30l|\n";
cout << "----------------------------" << endl;
cout <<"S2: |0QL 3Mr 2$R 03L 2Kl|\n";
cout << "----------------------------" << endl;
cout <<"S3: |0QL 0Mr 1$R 33L 0Kl|\n";
cout << endl<< "----------------------------" << endl;} else
for (hordim = 0; hordim < 3; hordim++) //переключение по строкам
    {for (verdim = 0; verdim < 3; verdim++)// переключение по столбцам
            {cin>>table[hordim][verdim]; }}
            for (hordim = 0; hordim < 3; hordim++) //переключение по строкам
{cout << hordim + 1 << " string:  ";
        for (verdim = 0; verdim < 3; verdim++)
         {cout << table[hordim][verdim] << " | "; // сразу показать}
        cout << endl << "-----------------------------------" << endl;}}
getch();
getch();
return 0;
}
C++ Builder 6:
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
#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#include <conio.h>
//---------------------------------------------------------------------------
#pragma argsused
 
int main()
{ int g,f, hordim,verdim; char  stroka, answer1, table[100][100];
cout<<"Enter the string needed to transform\n";
cin>>stroka;
cout<<"what's the horizontal dimension of Turing mashine's table?\n";
cin>>hordim;
cout<<"Okay, and what's about vertical dimension?";
cin>>verdim;
cout<<"Please enter the content to each cell. \n";
cout<<"Do you need an examle how to do this?\n";
cin>>answer1;
if (answer1="YES"||"yes"||"y"||"Y"){
cout<<"Attention!\n";
cout<<"First string of array must to contain all the symbols used in entered string\n";
cout<<"The cells of main table have to contain the bunch of 3 positions:\n";
cout<<"The number of next condition as first position;\n";
cout<<"The symbol for which it changes as second position;\n";
cout<<"The character of motion direction  as last position;\n";
cout<<"EXAMLE:\n";
cout<<"S: || 0 | M | Q | $ | 3 |\n";
cout <<  "----------------------------" << endl;
cout<<"S0: |2QL 3Mr 2$R 33L 10l|\n";
cout << "----------------------------" << endl;
cout <<"S1: |1QL 1Mr 2$R 33L 30l|\n";
cout << "----------------------------" << endl;
cout <<"S2: |0QL 3Mr 2$R 03L 2Kl|\n";
cout << "----------------------------" << endl;
cout <<"S3: |0QL 0Mr 1$R 33L 0Kl|\n";
cout << endl<< "----------------------------" << endl;} else
for (hordim = 0; hordim < 3; hordim++) //ïåðåêëþ÷åíèå ïî ñòðîêàì
    {for (verdim = 0; verdim < 3; verdim++)// ïåðåêëþ÷åíèå ïî ñòîëáöàì
            {cin>>table[hordim][verdim]; }}
            for (hordim = 0; hordim < 3; hordim++) //ïåðåêëþ÷åíèå ïî ñòðîêàì
{cout << hordim + 1 << " string:  ";
        for (verdim = 0; verdim < 3; verdim++)
         {cout << table[hordim][verdim] << " | "; // ñðàçó ïîêàçàòü}
        cout << endl << "-----------------------------------" << endl;}}
getch();
getch();
return 0;
}
Миниатюры
Компилятор игнорирует функции cin, if, for  
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.06.2015, 15:30
Ответы с готовыми решениями:

Игнорирует cin в цикле.
Здравствуйте, уважаемые. Прошу помочь. Не могу понять почему в приведенном ниже коде при втором...

Игнорирует ввод cin
Не могу понять почему не считывает переменную 'q' в 13 строке. Программа просто обходит её...

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

Как работает cin.peek, cin,get, cin.ignore, cin.clear?
Здравствуйте, товарищи и не товарищи!:) Я только начал изучать C++, а уже использую вещи, которые...

15
Модератор
Эксперт С++
11301 / 9286 / 5570
Регистрация: 18.12.2011
Сообщений: 24,782
07.06.2015, 15:34 2
Цитата Сообщение от Tranquilllity Посмотреть сообщение
char stroka;
....
cout<<"Enter the string needed to transform\n";
cin>>stroka;
Как-то странно называть именем stroka переменную, содержащую только один символ
C++
1
char  stroka[100], answer1[100];
1
0 / 14 / 1
Регистрация: 29.05.2015
Сообщений: 61
07.06.2015, 15:42  [ТС] 3
Если сделать так,
C++
1
char  stroka[100];
, проблема остается, потому что остановку на вводе значений в массив компилятор не делает все равно.
В чем может быть моя ошибка?
0
14 / 14 / 13
Регистрация: 04.06.2015
Сообщений: 85
07.06.2015, 15:46 4
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
#include <iostream>
#include <conio.h>
using namespace std;
//---------------------------------------------------------------------------
int main()
{
    int g, f, hordim, verdim; 
    char  stroka[100], answer1, table[100][100];
    cout << "Enter the string needed to transform\n";
    cin >> stroka;
    cout << "what's the horizontal dimension of Turing mashine's table?\n";
    cin >> hordim;
    cout << "Okay, and what's about vertical dimension?";
    cin >> verdim;
    cout << "Please enter the content to each cell. \n";
    cout << "Do you need an examle how to do this?\n";
    cin >> answer1;
    if (answer1 = "YES" || "yes" || "y" || "Y"){
        cout << "Attention!\n";
        cout << "First string of array must to contain all the symbols used in entered string\n";
        cout << "The cells of main table have to contain the bunch of 3 positions:\n";
        cout << "The number of next condition as first position;\n";
        cout << "The symbol for which it changes as second position;\n";
        cout << "The character of motion direction  as last position;\n";
        cout << "EXAMLE:\n";
        cout << "S: || 0 | M | Q | $ | 3 |\n";
        cout << "----------------------------" << endl;
        cout << "S0: |2QL 3Mr 2$R 33L 10l|\n";
        cout << "----------------------------" << endl;
        cout << "S1: |1QL 1Mr 2$R 33L 30l|\n";
        cout << "----------------------------" << endl;
        cout << "S2: |0QL 3Mr 2$R 03L 2Kl|\n";
        cout << "----------------------------" << endl;
        cout << "S3: |0QL 0Mr 1$R 33L 0Kl|\n";
        cout << endl << "----------------------------" << endl;
    }
    else
    for (hordim = 0; hordim < 3; hordim++) //переключение по строкам
    {
        for (verdim = 0; verdim < 3; verdim++)// переключение по столбцам
        {
            cin >> table[hordim][verdim];
        }
    }
    for (hordim = 0; hordim < 3; hordim++) //переключение по строкам
    {
        cout << hordim + 1 << " string:  ";
        for (verdim = 0; verdim < 3; verdim++)
        {
            cout << table[hordim][verdim] << " | "; // сразу показать}
            cout << endl << "-----------------------------------" << endl;
        }
    }
    _getch();
    return 0;
}
Проверил, всё работает у меня.
0
0 / 14 / 1
Регистрация: 29.05.2015
Сообщений: 61
07.06.2015, 15:50  [ТС] 5
Массив тоже и заполняется и выводится?
0
Модератор
Эксперт С++
11301 / 9286 / 5570
Регистрация: 18.12.2011
Сообщений: 24,782
07.06.2015, 15:57 6
А почему не можете воспользоваться отладчиком?
https://www.cyberforum.ru/cpp-... 62479.html
0
Модератор
Эксперт по электронике
8514 / 6329 / 857
Регистрация: 14.02.2011
Сообщений: 21,981
07.06.2015, 16:04 7
Цитата Сообщение от ArtFeather Посмотреть сообщение
Проверил, всё работает у меня.
а как работает???
нажми например "N";
Цитата Сообщение от ArtFeather Посмотреть сообщение
char........ answer1,
Цитата Сообщение от ArtFeather Посмотреть сообщение
if (answer1 = "YES" || "yes" || "y" || "Y")
итак answer1 имеет размер одиночного символа
в if происходит присваивание =а не сравнение ==
присваивается адрес строки "YES" кастрированная до одного байта, до остальных не доходит поскольку адрес имеет значение отличное от 0 то соответственно TRUE
if срабатывает
для сравнения строк есть такая функция strcmp
http://cppstudio.com/post/707/
0
195 / 195 / 120
Регистрация: 27.05.2011
Сообщений: 545
07.06.2015, 16:10 8
Цитата Сообщение от ArtFeather Посмотреть сообщение
cin >> stroka;
Как уже сказали, это ввод только одного символа: первого непробелного
Цитата Сообщение от Tranquilllity Посмотреть сообщение
if (answer1="YES"||"yes"||"y"||"Y"){
Это условие всегда истинно
Цитата Сообщение от Tranquilllity Посмотреть сообщение
cout << endl<< "----------------------------" << endl;} else
for (hordim = 0; hordim < 3; hordim++) //ïåðåêëþ÷åГ*ГЁГҐ ГЇГ® ñòðîêГ*Г¬
{for (verdim = 0; verdim < 3; verdim++)// ïåðåêëþ÷åГ*ГЁГҐ ГЇГ® ñòîëáöГ*Г¬
{cin>>table[hordim][verdim]; }}
for (hordim = 0; hordim < 3; hordim++) //ïåðåêëþ÷åГ*ГЁГҐ ГЇГ® ñòðîêГ*Г¬
{cout << hordim + 1 << " string: ";
for (verdim = 0; verdim < 3; verdim++)
{cout << table[hordim][verdim] << " | "; // Г±Г°Г*çó ïîêГ*Г§Г*ГІГј
} cout << endl << "-----------------------------------" << endl;}}
Нечитаемо. Исправьте форматирование согласно правилам!
0
14 / 14 / 13
Регистрация: 04.06.2015
Сообщений: 85
07.06.2015, 16:35 9
ValeryS,
Я лишь сказал про то, что у меня вводятся все строки и ничего не игнорируется , как говорит автор. Про остальное - ничего, остальное я даже не смотрел.

Добавлено через 2 минуты
Цитата Сообщение от mymedia Посмотреть сообщение
Как уже сказали, это ввод только одного символа: первого непробелного
C++
1
2
char stroka[100];
cin.getline(stroka,100);
0
195 / 195 / 120
Регистрация: 27.05.2011
Сообщений: 545
07.06.2015, 16:40 10
Цитата Сообщение от ArtFeather Посмотреть сообщение
Цитата Сообщение от mymedia Посмотреть сообщение
Как уже сказали, это ввод только одного символа: первого непробелного
C++
1
2
char stroka[100];
cin.getline(stroka,100);
Да, я ошибся: хотел автору темы ответить
0
0 / 14 / 1
Регистрация: 29.05.2015
Сообщений: 61
07.06.2015, 17:16  [ТС] 11
ValeryS, Вы имеете ввиду попробовать вот так?
C++
1
if (strcmp(answer1, "Y"){}
0
195 / 195 / 120
Регистрация: 27.05.2011
Сообщений: 545
07.06.2015, 17:52 12
Цитата Сообщение от Tranquilllity Посмотреть сообщение
ValeryS, Вы имеете ввиду попробовать вот так?
Да, и так написать для каждой строчки. Только учтите, что strcmp возвращает 0, если строчки раавны
0
0 / 14 / 1
Регистрация: 29.05.2015
Сообщений: 61
07.06.2015, 18:06  [ТС] 13
mymedia,
Прописывая вот так
C++
1
if (strcmp(answer1, "Y")==0||strcmp(answer1, "y")==0|| strcmp(answer1, "yes")==0 || strcmp(answer1, "YES")==0||strcmp(answer1, "Yes")==0){}
что не введу, cout-ы в if-е пропускаются.
Попробовала сделать следующим образом
C++
1
2
3
  cin >> answer1[100];
    dt=strcmp(answer1, "Y");
    cout<<dt;
и обнаружила, что переменная dt в независимости от содержимого переменной answer1 постоянно равна 1.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16829 / 6707 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
07.06.2015, 18:16 14
По сути, в этой строчке
Цитата Сообщение от Tranquilllity Посмотреть сообщение
C++
1
strcmp(answer1, "Y")==0||strcmp(answer1, "y")==0|| strcmp(answer1, "yes")==0 || strcmp(answer1, "YES")==0||strcmp(answer1, "Yes")==0)
нужно либо поменять местами условия, чтобы сначала проверялись Yes и т.п., а уже потом одна буква, либо убрать дальнейшие проверки на "yes" и т.д. Так как компилятор, видя оператор логического ИЛИ при выполнении условия, в целях оптимизации, дальше проверять ничего не будет - не имеет смысла, условие уже по любому выполнено.
Имхо, проще всего убрать лишние проверки - есть Y/y, значит, все ок.
C++
1
if(!strcmp(answer1, "Y") || !strcmp(answer1, "y")) { ... }
что можно еще укоротить, т.к. есть другая функция, которая здесь более подходит - strpbrk
C++
1
if(strpbrk(s, "yY")) { ... }
или strcspn
ну а по поводу
Цитата Сообщение от Tranquilllity Посмотреть сообщение
что не введу, cout-ы в if-е пропускаются
лучше всего посмотреть текущий код..
1
195 / 195 / 120
Регистрация: 27.05.2011
Сообщений: 545
07.06.2015, 18:18 15
Цитата Сообщение от Tranquilllity Посмотреть сообщение
cin >> answer1[100];
Ввод одного символа в сотый элемент массива answer1 (если считать с нуля). У вас есть столько элементов в массиве?. Или всё-таки надо ввести строчку… Для этого уберите индекс
0
0 / 14 / 1
Регистрация: 29.05.2015
Сообщений: 61
07.06.2015, 18:38  [ТС] 16
KOPOJI,
Огромное спасибо, помогло.
Цитата Сообщение от KOPOJI Посмотреть сообщение
нужно либо поменять местами условия, чтобы сначала проверялись Yes и т.п., а уже потом одна буква, либо убрать дальнейшие проверки на "yes" и т.д. Так как компилятор, видя оператор логического ИЛИ при выполнении условия, в целях оптимизации, дальше проверять ничего не будет - не имеет смысла, условие уже по любому выполнено.
Имхо, проще всего убрать лишние проверки - есть Y/y, значит, все ок.
видимо беда в том, что я после паскаля неизменно путаюсь, где в квадратных скобках размерность массива, где длина строки, а где указание на конкретную ее позицию.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.06.2015, 18:38

Отличие функции cin.get и cin.getline
Добрый день! Изучаю функции get и getline, сказано, что они отличаются тем, что функция get...

Защита от дурака при вводе текста с помощью: cin.get cin.clear cin.sync
Доброго времени суток. На С++ учусь с недавних пор. Имеется стандартная &quot;защита от дурака&quot; на ввод....

Объясните пожалуйста как работают cin.good(), cin.sync(), cin.clear()
Такая проблема: сдаю в вуза лабораторные по программированию, писал все сам, до этого c++ не...

Компилятор игнорирует директиву $F
Здравствуйте! Компилятор игнорирует директиву $F. Проверял код в PascalABС, там все работает. ...


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

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

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