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

Оператор if и указатель на цикл (ввод цифр и преобразование в буквы) - C++

Восстановить пароль Регистрация
 
КенТюРиК
11 / 11 / 1
Регистрация: 18.10.2012
Сообщений: 148
10.02.2013, 00:55     Оператор if и указатель на цикл (ввод цифр и преобразование в буквы) #1
Программа работает так:Спрашивает Go Go? Когда вводим число 4 начинается...Водим цепочку из цифр потом она преобразует их в буквы и проверяет на условие.Потом вводим 2 цепочку ее тоже проверяет затем вывод.
Если второй раз не даем разрешения на ввод,выводим строчки...С помощью Goto(по другому не умею).

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

Как можно сделать чтобы каждая цепочка рассматривалась отдельно.И если допустим данная цепочка не проходила то сразу был Вывод всех предыдущих(которые удовлетворяли условию).
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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdlib.h>
using namespace std;
 
int main(){
    const int n(1);
    const int m(4);
 
    int arr[n][m],b,i,j,usl,y,k,z;
for(k=0;k<2;k++)
{ cout<<"Go Go?";
    cin>>z;
    if(z==4)
    {
  cout << "Enter " << m << " space separated values for each row" << endl; 
    for (  i = 0; i < n; ++i )      
    {
        cout << "Row #" << ( i + 1 ) << ": ";
        for ( 
        j = 0; j < m; ++j )
        {           
            cin >> arr[i][j];
        b=arr[i][j];
        if (b == 0)
                            arr[i][j] = 'a';
                        if (b == 1)
                           arr[i][j] = 'b';
                        if (b == 2)
                            arr[i][j] = 'c';        
        }   
    }
    }
            else
goto first;     
}
 
for(k=0;k<2;k++)    
        first://///МЕТКА
    for ( int i = 0; i < n; ++i )
        for ( int j = 0; j < m; ++j )       
               cout <<(char)arr[i][j] << ( j < m - 1 ? "" : "\n" );
                
        getch();
        
}
Добавлено через 14 минут
Прошу прощения,название темы забыл отредактировать...
Вот условие которое должно выполнятся.
C++
1
2
3
4
5
6
for(k=0;k<2;k++)    
        first://///МЕТКА
    for ( int i = 0; i < n; ++i )
 
        for ( int j = 0; j < m; ++j )
            if(arr[0][0]=='a')///Условие.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.02.2013, 00:55     Оператор if и указатель на цикл (ввод цифр и преобразование в буквы)
Посмотрите здесь:

ввод n-значного числа, вывод цифр, из которых оно состоит и вывод суммы его цифр. C++
C++ ввод данных в одномерный массив через указатель
Преобразование в указатель на указатель на константу C++
C++ Как использовать перегруженный оператор [ ], если дан не сам класс, а указатель на него?
Можно ли передать в функцию указатель на перегруженный оператор? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rivory
146 / 112 / 2
Регистрация: 15.01.2013
Сообщений: 266
10.02.2013, 01:06     Оператор if и указатель на цикл (ввод цифр и преобразование в буквы) #2
Вы 2 раза записываете в один и тот же массив: arr[0][n] На первом проходе цикла первую вводимую строку, и во второй проход цикла вторую, поверх первой. Поэтому при распечатке массива, вам распечатывается всегда вторая вводимая строка.
КенТюРиК
11 / 11 / 1
Регистрация: 18.10.2012
Сообщений: 148
10.02.2013, 01:08  [ТС]     Оператор if и указатель на цикл (ввод цифр и преобразование в буквы) #3
Не поможете правильно реализовать этот момент?Буду очень благодарен.
Rivory
146 / 112 / 2
Регистрация: 15.01.2013
Сообщений: 266
10.02.2013, 01:21     Оператор if и указатель на цикл (ввод цифр и преобразование в буквы) #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
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    const int n(1);
    const int m(4);
 
    //num - кол-во проходов алгоритма
    const num = 2;
    int arr[num][n][m],b,i,j,usl,y,k,z;
    //curr - количество выполненных проходов
    int curr = 0;
    for(k=0; k < num; k++)
    {
        cout<<"Go Go?";
        cin>>z;
        if(z==4)
        {
            curr++;
            cout << "Enter " << m << " space separated values for each row" << endl;
            for (  i = 0; i < n; ++i )
            {
                cout << "Row #" << ( i + 1 ) << ": ";
                for (j = 0; j < m; ++j )
                {
                    cin >> arr[k][i][j];
                    b=arr[k][i][j];
 
                    //Заменил if'ы на switch, тут он более уместен
                    switch(b)
                    {
                        case 0: {arr[k][i][j] = 'a'; break;}
                        case 1: {arr[k][i][j] = 'b'; break;}
                        case 2: {arr[k][i][j] = 'c'; break;}
                        default: {cout<<"Wrong number input."<<endl; return;}
                    }
                }
            }
        }
        //goto не нужен. Вообще его использование - дурной тон.
    }
 
    for(k=0;k<curr;k++)
        for ( int i = 0; i < n; ++i )
            for ( int j = 0; j < m; ++j )
               cout <<(char)arr[k][i][j] << ( j < m - 1 ? "" : "\n" );
    system("pause");
}
Вот реализовал, вроде правильно работает. По поводу условия - не понял что Вы хотите.
КенТюРиК
11 / 11 / 1
Регистрация: 18.10.2012
Сообщений: 148
10.02.2013, 01:32  [ТС]     Оператор if и указатель на цикл (ввод цифр и преобразование в буквы) #5
Есть две ошибки...
Ошибка 2 error C2561: wmain: функция должна возвращать значение c:\users\dir-fin\documents\visual studio 2010\projects\888\888\888.cpp 42 1 888

Ошибка 1 error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию c:\users\dir-fin\documents\visual studio 2010\projects\888\888\888.cpp 14 1 888
Подчеркивает const num=2; num подчеркнуло.
Rivory
146 / 112 / 2
Регистрация: 15.01.2013
Сообщений: 266
10.02.2013, 01:37     Оператор if и указатель на цикл (ввод цифр и преобразование в буквы) #6
Вашему компилятору не нравится выражения вида return; Ну, попробуйте заменить на return 1;
(0 функция main должна возвращать при правильной работе).

Ну и не понравилось объявление константы const num = 2; Сделайте объявление как у Вас выше, const int num(2);
КенТюРиК
11 / 11 / 1
Регистрация: 18.10.2012
Сообщений: 148
10.02.2013, 01:38  [ТС]     Оператор if и указатель на цикл (ввод цифр и преобразование в буквы) #7
А под условием я имел в виду,что если на первом месте в цепочке стоит буква а то тогда цепочка подходит а если нет то цепочка не годится.


Все работает,внес поправки.
Rivory
146 / 112 / 2
Регистрация: 15.01.2013
Сообщений: 266
10.02.2013, 01:40     Оператор if и указатель на цикл (ввод цифр и преобразование в буквы) #8
Подходит для чего, чтобы её распечатать? Если да, то добавьте if() в части, ответственной за распечатку, должно работать.
КенТюРиК
11 / 11 / 1
Регистрация: 18.10.2012
Сообщений: 148
10.02.2013, 04:02  [ТС]     Оператор if и указатель на цикл (ввод цифр и преобразование в буквы) #9
Я только что так и сделал)
Еще раз спасибо)

Добавлено через 2 часа 20 минут
Непонятные проблемы возникли с реализацией 2 условия...3 еще не пробовал.
1)Начинается на ac.2)символ a встречается только по одному 3)содержит не более двух символов 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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdlib.h>
 
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    const int n(1);
    const int m(6);
     const int num=1;
    //num - кол-во проходов алгоритма
 
    int arr[num][n][m],b,i,j,k,z;
    
    //curr - количество выполненных проходов
    int curr = 0;
    for(k=0; k < num; k++)
    {
        cout<<"Go Go?";
        cin>>z;
        if(z==4)
        {
            curr++;
            cout << "Enter " << m << " space separated values for each row" << endl;
            for (  i = 0; i < n; ++i )
            {
                cout << "Row #" << ( i + 1 ) << ": ";
                for (j = 0; j < m; ++j )
                {
                    cin >> arr[k][i][j];
                    b=arr[k][i][j];
 
                    
                    switch(b)
                    {
                        case 0: {arr[k][i][j] = 'a'; break;}
                        case 1: {arr[k][i][j] = 'b'; break;}
                        case 2: {arr[k][i][j] = 'c'; break;}
                        default: {cout<<"Wrong number input."<<endl; return(0);}
                    }
                }
            }
        }
      
    }
 
    for(k=0;k<curr;k++)
        for ( int i = 0; i < n; ++i )
            for ( int j = 0; j < m; ++j )
                if(arr[k][0][0]=='a' && arr[k][0][1]=='c')
                    if(arr[k][i][j]=='a')
                    {arr[k][i][j+1]=='b'||'c';j++;
                    }
                        
 
               cout <<(char)arr[k][i][j] << ( j < m - 1 ? "" : "\n" );
    system("pause");
}
Rivory
146 / 112 / 2
Регистрация: 15.01.2013
Сообщений: 266
10.02.2013, 04:38     Оператор if и указатель на цикл (ввод цифр и преобразование в буквы) #10
Вот эта каша-мала не несет никакой логической нагрузки.
C++
1
2
3
4
5
6
7
8
9
10
    for(k=0;k<curr;k++)
        for ( int i = 0; i < n; ++i )
            for ( int j = 0; j < m; ++j )
                if(arr[k][0][0]=='a' && arr[k][0][1]=='c')
                    if(arr[k][i][j]=='a')
                    {arr[k][i][j+1]=='b'||'c';j++;
                    }
                        
 
               cout <<(char)arr[k][i][j] << ( j < m - 1 ? "" : "\n" );
Особенно вот эта часть
C++
1
arr[k][i][j+1]=='b'||'c';
Внутри if'a(не в условии, а в самом ифе)
Реализовать можно как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    //Счетчик "c"
    int c_counter = 0;
    //Переменная, разрешающая печать строки
    bool legit = true;
    for(k=0;k<curr;k++)
    {
        for ( int i = 0; i < n; ++i )
        {
            for ( int j = 1; j < m; ++j )
            {
                if(arr[k][i][0]=='a' && arr[k][i][1]=='c')
                {
                    //cout << (char)arr[k][i][j] << ( j < m - 1 ? "" : "\n" );
                    if(arr[k][i][j] == 'a')         legit = false; //Если есть ещё 1 символ a
                    else if(arr[k][i][j] == 'c')    c_counter++;
                    if(c_counter > 2)               legit = false; //Если болье 2х c
                }
                else legit = false; //Если начинается не на ac
            }
            if(legit) for(int j=0; j<m; ++j) cout << (char)arr[k][i][j] << ( j < m - 1 ? "" : "\n" );
            else cout << "String is not legit" << endl;
        }
    }
КенТюРиК
11 / 11 / 1
Регистрация: 18.10.2012
Сообщений: 148
10.02.2013, 19:43  [ТС]     Оператор if и указатель на цикл (ввод цифр и преобразование в буквы) #11
А как можно написать что если следующий за символом (а) тоже символ (а),тогда False.
Rivory
146 / 112 / 2
Регистрация: 15.01.2013
Сообщений: 266
10.02.2013, 20:23     Оператор if и указатель на цикл (ввод цифр и преобразование в буквы) #12
Так он и так будет false, 2 символа 'a' нельзя же.
КенТюРиК
11 / 11 / 1
Регистрация: 18.10.2012
Сообщений: 148
10.02.2013, 20:28  [ТС]     Оператор if и указатель на цикл (ввод цифр и преобразование в буквы) #13
символ (a) встречается только по одному.Тоесть цепочка может быть такой acbababababa...Вот что я имел в виду)
Rivory
146 / 112 / 2
Регистрация: 15.01.2013
Сообщений: 266
10.02.2013, 20:29     Оператор if и указатель на цикл (ввод цифр и преобразование в буквы) #14
C++
1
2
if(j!=0 && arr[k][i][j] == 'a' && arr[k][i][j-1] == 'a') legit = false;
//Проверка на j!=0, чтобы не вылезти за края массива в самом начале.
КенТюРиК
11 / 11 / 1
Регистрация: 18.10.2012
Сообщений: 148
10.02.2013, 23:19  [ТС]     Оператор if и указатель на цикл (ввод цифр и преобразование в буквы) #15
Проблемы с выводом последующих строк.

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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdlib.h>
 
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    const int n(4);
    const int m(5);
     const int num=1;
    //num - кол-во проходов алгоритма
 
    int arr[num][n][m],b,i,j,k,z;
    
    //curr - количество выполненных проходов
    int curr = 0;
    for(k=0; k < num; k++)
    {
        cout<<"Go Go?";
        cin>>z;
        if(z==4)
        {
            curr++;
            cout << "Enter " << m << " space separated values for each row" << endl;
            for (  i = 0; i < n; ++i )
            {
                cout << "Row #" << ( i + 1 ) << ": ";
                for (j = 0; j < m; ++j )
                {
                    cin >> arr[k][i][j];
                    b=arr[k][i][j];
 
                    
                    switch(b)
                    {
                        case 0: {arr[k][i][j] = 'a'; break;}
                        case 1: {arr[k][i][j] = 'b'; break;}
                        case 2: {arr[k][i][j] = 'c'; break;}
                        default: {cout<<"Wrong number input."<<endl; return(0);}
                    }
                }
            }
        }
        
    }
 //Счетчик "c"
    int c_counter = 0;
    //Переменная, разрешающая печать строки
    bool legit = true;
    for(k=0;k<curr;k++)
    {
        for ( int i = 0; i < n; ++i )
        {
            for ( int j = 1; j < m; ++j )
            {
            
                if(arr[k][i][0]=='a' && arr[k][i][1]=='c')
                {
                    if(j!=0 && arr[k][i][j] == 'a' && arr[k][i][j-1] == 'a') legit = false;//Если после символа а есть еще одни симол а
                    else
                     if(arr[k][i][j] == 'c')    c_counter++;
                    if(c_counter > 2)               legit = false; //Если болье 2х c
                }
                else legit = false; //Если начинается не на ac
                
            }
            
            if(legit) for(int j=0; j<m; ++j) cout << (char)arr[k][i][j] << ( j < m - 1 ? "" : "\n" );
            else cout << "String is not legit" << endl;
        }
    }
 
    system("pause");
}
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
Go Go?4
Enter 5 space separated values for each row
Row #1: 0
2
1
1
1
Row #2: 0
2
1
1
1
Row #3: 0
2
1
1
1
Row #4: 0
2
1
1
1
acbbb
acbbb
String is not legit
String is not legit
Для продолжения нажмите любую клавишу . . .
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2013, 23:44     Оператор if и указатель на цикл (ввод цифр и преобразование в буквы)
Еще ссылки по теме:

Файловый ввод/вывод. Во всех словах строки переставить все входящие буквы «а» в начало слова, а буквы «я» – в конец C++
Перезагрузить оператор cout, объекты класса передать через указатель и C++
C++ Преобразование из целого типа в указатель через reinterpret_cast

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

Или воспользуйтесь поиском по форуму:
Rivory
146 / 112 / 2
Регистрация: 15.01.2013
Сообщений: 266
10.02.2013, 23:44     Оператор if и указатель на цикл (ввод цифр и преобразование в буквы) #16
c_counter надо обнулять.
C++
1
2
3
4
5
6
                else legit = false; //Если начинается не на ac
                
            }
            c_counter = 0;
            if(legit) for(int j=0; j<m; ++j) cout << (char)arr[k][i][j] << ( j < m - 1 ? "" : "\n" );
            else cout << "String is not legit" << endl;
Yandex
Объявления
10.02.2013, 23:44     Оператор if и указатель на цикл (ввод цифр и преобразование в буквы)
Ответ Создать тему
Опции темы

Текущее время: 13:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru