Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Diezel2012
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 14
#1

Ошибка в цикле while - C++

09.09.2012, 01:30. Просмотров 971. Ответов 28
Метки нет (Все метки)

Привет всем! Ниже приведен код программы, в программе две функции одна change() переводит Ф.И.О в формат фамилия - инициалы, а вторая polindrom() с которой собственно и проблема - ищет в введенной пользователем строке полиндромы и выводит их на экран. Программа создана в VS2010. Ошибок в данной программе компилятор не обнаруживает, но программа вылетает и отладчик указывает на то что в строке где определяется конец текущего слова (помечена комментарием) возникает бесконечный цикл и условие не срабатывает.
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
#include <iostream>
#include <windows.h>
 
using namespace std;
 
void change(char *str);
void polindrom(char *str1);
 
int main ()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    char *str, *str1;
    str=new char[256];
    str1=new char[256];
    cout<<"Введите Ф.И.О\n";
    gets(str);
    change(str);
    puts(str);
    cout<<"Введите строку\n";
    gets(str1);
    polindrom(str1);
    delete[]str;
    delete[]str1;
return 0;
}
 
void change(char *str)
{
    int position=0, position1=0, s=0;
    for(int i=0; str[i]!='\0'; i++)
        {
            if((str[i]!=' '&&str[i-1]==' ')||(i==0))
                {
                    if((str[i]>='a'&&str[i]<='z')||(str[i]>='а'&&str[i]<='я'))str[i]=(int)str[i]-32;
                }
                else if((str[i]!=' '&&str[i-1]!=' ')||(i!=0))
                    {
                        if((str[i]>='A'&&str[i]<='Z')||(str[i]>='А'&&str[i]<='Я'))str[i]=(int)str[i]+32;
                    }
        }
 
    for(int i=0; str[i]!='\0'; i++)
        {
            if(((str[i]>='A'&&str[i]<='Z')||(str[i]>='А'&&str[i]<='Я'))&&(i!=0))
                {
                    if(position==0)position=i;
                    if(position!=0)position1=i;
                }
        }
 
    for(int i=0; str[i]!='\0'; i++)
        {
            if(((str[i]>='A'&&str[i]<='Z')||(str[i]>='А'&&str[i]<='Я'))&&(i!=0))
                {
                    if(position==0)position=i;
                    if(position!=0)position1=i;
                }
        }
 
    for(int i=position; str[i]!='\0'; i++)
        {
            switch(s)
                {
                    case 1:
                    str[i]='.';
                    break;
 
                    case 2:
                    str[i]=str[position1];
                    break;
 
                    case 3:
                    str[i]='.';
                    break;
                }
            if(s>3)str[i]='\0';
            s++;
        }
}
 
void polindrom(char *str1)
{
    int p;
    bool flag;
    for(int i=0; str1[i]!='\0'; i++)
        {
            p=i;
            if((str1[i]!=' '&&str1[i-1]==' ')||(i==0))
                {
                    while(str1[p]!=' '||str1[p]!='\0')p++;//<-Проблема здесь (бесконечный цикл)
                        for(int j=i, k=0;j<=(p+i)/2;j++,k++)
                            {
                                if(str1[j]!=str1[p-k])flag=false;
                            }
                            if(flag==true)
                                {
                                    cout<<"Слово ";
                                        for(int j=i;j<=p;j++)
                                            {
                                                cout<<str1[j];
                                            }
                                        cout<<" - является полиндромом\n";
                                    }
                }
        }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2012, 01:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка в цикле while (C++):

Ошибка в цикле - C++
(Задание - см. вложение) Почему функция fill_array() возвращает неправильные значения? Когда ввожу 1 или 2 числа, выводит цифру 1;...

Ошибка в цикле - C++
Хочу создать массив из 10 чисел. void main() { char a,i; for (i=0; i&lt;10; i++) { printf (&quot;Enter...

Ошибка в цикле while - C++
//--------------------------------------------------------------------------- #pragma hdrstop #include &lt;locale&gt; #include &lt;stdio.h&gt; ...

Ошибка в цикле - C++
Здравствуйте. Нужно вычислить факториал неотрицательного числа. К примеру: n! = n * (n - 1) * (n - 2) * ... (для значений n &gt; 1) ...

Ошибка в цикле - C++
Суть задачи: Разработать программу для приближенного вычисления величины y=Ʃ(1/((2*n+1)*(2*n-1))) , n=1,2,3,... Процесс вычисления...

Ошибка в цикле - C++
Суть программы: создаёт динамический список, каждый новый элемент списка заносится в конец. Ну, там далее ещё функций по мелочи, но не...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Diezel2012
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 14
09.09.2012, 02:18  [ТС] #16
Цитата Сообщение от Elboy Посмотреть сообщение
Господи, да не в этом дело. 100 раз уже было сказано в чём.
Смотрите я прохожу отладчиком по все программе и ошибка обнаруживается именно в цикле - после прохода первого слова условие не срабатывает, а переменная p продолжает наращивать значения и где-то на 12000 программу выкидывает; Про память не совсем понятно ведь все элементы и массив объявлены и я нигде не выхожу за их пределы.
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.09.2012, 02:20 #17
Цитата Сообщение от Diezel2012 Посмотреть сообщение
В строке с while у вас всё в порядке.
Где там порядок? У него цикл неизвестно куда уходит.

Добавлено через 1 минуту
Цитата Сообщение от Elboy Посмотреть сообщение
Господи, да не в этом дело. 100 раз уже было сказано в чём.
Для начала, именно в этом, дальше тоже могут быть ошибки, но нужно это правильно сдлать.
0
Elboy
131 / 112 / 4
Регистрация: 01.09.2012
Сообщений: 288
09.09.2012, 02:20 #18
Цитата Сообщение от Diezel2012 Посмотреть сообщение
Смотрите я прохожу отладчиком по все программе и ошибка обнаруживается именно в цикле - после прохода первого слова условие не срабатывает, а переменная p продолжает наращивать значения и где-то на 12000 программу выкидывает; Про память не совсем понятно ведь все элементы и массив объявлены и я нигде не выхожу за их пределы.
По вашему элемент s[-1] объявлен?
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.09.2012, 02:21 #19
Diezel2012, сделайте, как я написал, тогда программу не выкидывает и будем дальше разбираться.
0
Elboy
131 / 112 / 4
Регистрация: 01.09.2012
Сообщений: 288
09.09.2012, 02:24 #20
Цитата Сообщение от alsav22 Посмотреть сообщение
Где там порядок? У него цикл неизвестно куда уходит.
Всё известно. Пока символ не равен пробелу или концу строки, то переходим к след символу. А ваше предложение ничего не изменит.
0
Diezel2012
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 14
09.09.2012, 02:27  [ТС] #21
Цитата Сообщение от alsav22 Посмотреть сообщение
Diezel2012, сделайте, как я написал, тогда программу не выкидывает и будем дальше разбираться.
Так ее тоже выкидывает. В написали условие - если после после пробела идет конец строки тогда завершить. Напомню мне необходимо условие что если после символа следует пробел или конец строки (если это последнее слово в строке) тогда прекратить наращивать счетчик
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.09.2012, 02:33 #22
Цитата Сообщение от Diezel2012 Посмотреть сообщение
Так ее тоже выкидывает.
В этом коде выкидывает?
Код
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 <windows.h>
 
using namespace std;
 
void change(char *str);
void polindrom(char *str1);
 
int main ()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    char *str, *str1;
    str=new char[256];
    str1=new char[256];
    //cout<<"Введите Ф.И.О\n";
    //gets(str);
    //change(str);
    //puts(str);
    cout<<"Введите строку\n";
    gets(str1);
    polindrom(str1);
    delete[]str;
    delete[]str1;
    system("pause");
return 0;
}
 
void change(char *str)
{
    int position=0, position1=0, s=0;
    for(int i=0; str[i]!='\0'; i++)
        {
            if((str[i]!=' '&&str[i-1]==' ')||(i==0))
                {
                    if((str[i]>='a'&&str[i]<='z')||(str[i]>='а'&&str[i]<='я'))str[i]=(int)str[i]-32;
                }
                else if((str[i]!=' '&&str[i-1]!=' ')||(i!=0))
                    {
                        if((str[i]>='A'&&str[i]<='Z')||(str[i]>='А'&&str[i]<='Я'))str[i]=(int)str[i]+32;
                    }
        }
 
    for(int i=0; str[i]!='\0'; i++)
        {
            if(((str[i]>='A'&&str[i]<='Z')||(str[i]>='А'&&str[i]<='Я'))&&(i!=0))
                {
                    if(position==0)position=i;
                    if(position!=0)position1=i;
                }
        }
 
    for(int i=0; str[i]!='\0'; i++)
        {
            if(((str[i]>='A'&&str[i]<='Z')||(str[i]>='А'&&str[i]<='Я'))&&(i!=0))
                {
                    if(position==0)position=i;
                    if(position!=0)position1=i;
                }
        }
 
    for(int i=position; str[i]!='\0'; i++)
        {
            switch(s)
                {
                    case 1:
                    str[i]='.';
                    break;
 
                    case 2:
                    str[i]=str[position1];
                    break;
 
                    case 3:
                    str[i]='.';
                    break;
                }
            if(s>3)str[i]='\0';
            s++;
        }
}
 
void polindrom(char *str1)
{
    int p;
    bool flag;
    for(int i=0; str1[i]!='\0'; i++)
        {
            p=i;
            if((str1[i]!=' '&&str1[i-1]==' ')||(i==0))
                {
                    while(str1[p]!=' '&& str1[p + 1]!='\0')p++;//<-Проблема здесь (бесконечный цикл)
                        for(int j=i, k=0;j<=(p+i)/2;j++,k++)
                            {
                                if(str1[j]!=str1[p-k])flag=false;
                            }
                            if(flag==true)
                                {
                                    cout<<"Слово ";
                                        for(int j=i;j<=p;j++)
                                            {
                                                cout<<str1[j];
                                            }
                                        cout<<" - является полиндромом\n";
                                    }
                }
        }
}


Добавлено через 3 минуты
Цитата Сообщение от Diezel2012 Посмотреть сообщение
Напомню мне необходимо условие что если после символа следует пробел или конец строки (если это последнее слово в строке) тогда прекратить наращивать счетчик
Так и работает. Поставьте точку остановки и посмотрите сами.
0
Diezel2012
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 14
09.09.2012, 02:33  [ТС] #23
Цитата Сообщение от Elboy Посмотреть сообщение
По вашему элемент s[-1] объявлен?
В 34 строке такое же условие (функция change) все прекрасно работает. Ну посмотрит программа в ячейку str[-1](если это первое слово), увидит там какую-нибудь муру и оперативки типа 487484151564 - оно ж все равно не будет равно пробелу или его коду в ascii и условие нормально выполнится тут причина сокрыта где-то в другом месте.
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.09.2012, 02:38 #24
Цитата Сообщение от Diezel2012 Посмотреть сообщение
Вы написали условие - если после пробела идет конец строки тогда завершить.
Смотрите внимательнее. Остановка будет при любом из двух условий: если пробел или если следующий символ конец строки.
1
Diezel2012
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 14
09.09.2012, 02:38  [ТС] #25
Цитата Сообщение от alsav22 Посмотреть сообщение
В этом коде выкидывает?
Код
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 <windows.h>
 
using namespace std;
 
void change(char *str);
void polindrom(char *str1);
 
int main ()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    char *str, *str1;
    str=new char[256];
    str1=new char[256];
    //cout<<"Введите Ф.И.О\n";
    //gets(str);
    //change(str);
    //puts(str);
    cout<<"Введите строку\n";
    gets(str1);
    polindrom(str1);
    delete[]str;
    delete[]str1;
    system("pause");
return 0;
}
 
void change(char *str)
{
    int position=0, position1=0, s=0;
    for(int i=0; str[i]!='\0'; i++)
        {
            if((str[i]!=' '&&str[i-1]==' ')||(i==0))
                {
                    if((str[i]>='a'&&str[i]<='z')||(str[i]>='а'&&str[i]<='я'))str[i]=(int)str[i]-32;
                }
                else if((str[i]!=' '&&str[i-1]!=' ')||(i!=0))
                    {
                        if((str[i]>='A'&&str[i]<='Z')||(str[i]>='А'&&str[i]<='Я'))str[i]=(int)str[i]+32;
                    }
        }
 
    for(int i=0; str[i]!='\0'; i++)
        {
            if(((str[i]>='A'&&str[i]<='Z')||(str[i]>='А'&&str[i]<='Я'))&&(i!=0))
                {
                    if(position==0)position=i;
                    if(position!=0)position1=i;
                }
        }
 
    for(int i=0; str[i]!='\0'; i++)
        {
            if(((str[i]>='A'&&str[i]<='Z')||(str[i]>='А'&&str[i]<='Я'))&&(i!=0))
                {
                    if(position==0)position=i;
                    if(position!=0)position1=i;
                }
        }
 
    for(int i=position; str[i]!='\0'; i++)
        {
            switch(s)
                {
                    case 1:
                    str[i]='.';
                    break;
 
                    case 2:
                    str[i]=str[position1];
                    break;
 
                    case 3:
                    str[i]='.';
                    break;
                }
            if(s>3)str[i]='\0';
            s++;
        }
}
 
void polindrom(char *str1)
{
    int p;
    bool flag;
    for(int i=0; str1[i]!='\0'; i++)
        {
            p=i;
            if((str1[i]!=' '&&str1[i-1]==' ')||(i==0))
                {
                    while(str1[p]!=' '&& str1[p + 1]!='\0')p++;//<-Проблема здесь (бесконечный цикл)
                        for(int j=i, k=0;j<=(p+i)/2;j++,k++)
                            {
                                if(str1[j]!=str1[p-k])flag=false;
                            }
                            if(flag==true)
                                {
                                    cout<<"Слово ";
                                        for(int j=i;j<=p;j++)
                                            {
                                                cout<<str1[j];
                                            }
                                        cout<<" - является полиндромом\n";
                                    }
                }
        }
}


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

Так и работает. Поставьте точку остановки и посмотрите сами.
Да большое спасибо действительно работает корректно,теперь пойду смотреть что там дальше не так.
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.09.2012, 02:39 #26
Цитата Сообщение от Diezel2012 Посмотреть сообщение
Да большое спасибо действительно работает корректно,теперь пойду смотреть что там дальше не так.
Для начала посмотрите, та ли используется позиция последнего символа. Она равна p - 1, кроме последнего слова с строке, там - p.
0
Diezel2012
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 14
09.09.2012, 02:42  [ТС] #27
Цитата Сообщение от alsav22 Посмотреть сообщение
Для начала посмотрите, та ли используется позиция последнего символа. Она равна p - 1.
Да это я видел просто еще не исправлял, благодарю за оказанную помощь.
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.09.2012, 03:30 #28
Цитата Сообщение от Elboy Посмотреть сообщение
Всё известно. Пока символ не равен пробелу или концу строки, то переходим к след символу. А ваше предложение ничего не изменит.
При || выход из цикла будет если оба условия не выполнятся, т.е. str[p] должен одновременно стать равен и ' ' и '\0'. И как по вашему, где это произойдёт?

Добавлено через 24 минуты
Добавлю. Diezel2012, вы эту строчку лучше так напишите:
C++
1
while(str1[p + 1]!=' '&& str1[p + 1]!='\0')p++;
Тогда позиция последнего символа в слове будет равна p, и не будет другой для последнего символа последнего слова в строке.

Добавлено через 8 минут
Еще. Там, где объявляете bool flag;, присвойте ему значение, а то при переходе к третьему if, минуя второй, будет обращение к неинициализированной переменной.

Добавлено через 5 минут
Сделал, как посоветовал и код, в общем-то, заработал.
0
Миниатюры
Ошибка в цикле while  
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.09.2012, 04:05 #29
Но в коде есть баг. Полиндромы определяются только до обычного слова.

Добавлено через 19 минут
Понял. В начале for() нужно устанавливать flag = true.
Код
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
void polindrom(char *str1)
{
    int p;
    bool flag;
    for(int i=0; str1[i]!='\0'; i++)
    {
        flag = true;
        p=i;
        if((str1[i]!=' '&&str1[i-1]==' ')||(i==0))
        {
            while(str1[p + 1]!=' '&& str1[p + 1]!='\0')p++;
                    
            for(int j=i, k=0;j<=(p+i)/2;j++,k++)
                if(str1[j]!=str1[p-k])flag=false;
                            
             if(flag==true)
             {
                  cout<<"Слово ";
                  for(int j=i;j<=p;j++)
                      cout<<str1[j];
                  cout<<" - является полиндромом\n";
              }
         } 
    } 
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2012, 04:05
Привет! Вот еще темы с ответами:

Ошибка в цикле - C++
Помогите найти ошибку в цикле, пожалуйста #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; ...

Ошибка в цикле - C++
Задание: Написать цикл программы. от К=1 до К=10 #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int main () ...

Ошибка в цикле с очередью - C++
Добрый день! Придумал глупый, но рабочий цикл проверки элементов очереди queue Моя очередь содержит числа с плавающей запятой...

Логическая ошибка в цикле for - C++
Привет всем! Написал небольшую программу для изучения цикла for. Проблема в том, что все компилируется, но ничего на экран не...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.09.2012, 04:05
Ответ Создать тему
Опции темы

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