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

Ошибка в цикле while

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

Author24 — интернет-сервис помощи студентам
Привет всем! Ниже приведен код программы, в программе две функции одна 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.09.2012, 01:30
Ответы с готовыми решениями:

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

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

Ошибка в цикле
Задание: Написать цикл программы. от К=1 до К=10 #include &lt;iostream&gt; #include &lt;math.h&gt; ...

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

28
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 14
09.09.2012, 02:27  [ТС] 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от alsav22 Посмотреть сообщение
Diezel2012, сделайте, как я написал, тогда программу не выкидывает и будем дальше разбираться.
Так ее тоже выкидывает. В написали условие - если после после пробела идет конец строки тогда завершить. Напомню мне необходимо условие что если после символа следует пробел или конец строки (если это последнее слово в строке) тогда прекратить наращивать счетчик
0
5498 / 4893 / 831
Регистрация: 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
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 14
09.09.2012, 02:33  [ТС] 23
Цитата Сообщение от Elboy Посмотреть сообщение
По вашему элемент s[-1] объявлен?
В 34 строке такое же условие (функция change) все прекрасно работает. Ну посмотрит программа в ячейку str[-1](если это первое слово), увидит там какую-нибудь муру и оперативки типа 487484151564 - оно ж все равно не будет равно пробелу или его коду в ascii и условие нормально выполнится тут причина сокрыта где-то в другом месте.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.09.2012, 02:38 24
Цитата Сообщение от Diezel2012 Посмотреть сообщение
Вы написали условие - если после пробела идет конец строки тогда завершить.
Смотрите внимательнее. Остановка будет при любом из двух условий: если пробел или если следующий символ конец строки.
1
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
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.09.2012, 02:39 26
Цитата Сообщение от Diezel2012 Посмотреть сообщение
Да большое спасибо действительно работает корректно,теперь пойду смотреть что там дальше не так.
Для начала посмотрите, та ли используется позиция последнего символа. Она равна p - 1, кроме последнего слова с строке, там - p.
0
0 / 0 / 0
Регистрация: 21.06.2012
Сообщений: 14
09.09.2012, 02:42  [ТС] 27
Цитата Сообщение от alsav22 Посмотреть сообщение
Для начала посмотрите, та ли используется позиция последнего символа. Она равна p - 1.
Да это я видел просто еще не исправлял, благодарю за оказанную помощь.
0
5498 / 4893 / 831
Регистрация: 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 минут
Сделал, как посоветовал и код, в общем-то, заработал.
Миниатюры
Ошибка в цикле while  
0
5498 / 4893 / 831
Регистрация: 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
09.09.2012, 04:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.09.2012, 04:05
Помогаю со студенческими работами здесь

Ошибка в цикле while
//--------------------------------------------------------------------------- #pragma hdrstop...

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

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

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


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

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

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