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

Условие в while - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
gr_8_zizu
13 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 149
01.08.2011, 01:56     Условие в while #1
подскажите пожалуйста, могу ли я таким образом задавать условие в while как ниже в коде. Мне в принцепи надо что бы выполнялось до тех пор пока указатель не будет над последним элементом матрицы, то есть pArray[n][m].
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
bool dfs (int i1, int **pArray,int *q)
{
bool test=false;
int n=10, m=12, ii=i1;
while(!pArray[n][m])
{
   for(int d=0; d<m; d++)
   {
   if(pArray[ii][d]==1)
      {
      for(int d1=0; d1<n; d1++)
         {
         if(pArray[d1][d]==2)
            {
             if(ii==q[0]||ii==q[1]||ii==q[2]||ii==q[3]||ii==q[4]||ii==q[5])
             {
             test=true;
             break;
             }
             else
             {
             test=false;
             ii=d1;
             }
            }
         }
      }
   }
}
return test;
}
И еще вопрос, а точнее уточнение. Из программы мне эту функцию вызывать как? так?:
C++
1
dfs(i1,**pArray,*q);
И можно ли в While указывать 2 условия, ну например:
C++
1
while(i!=j || a<b)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2011, 01:56     Условие в while
Посмотрите здесь:

C++ условие в if
C++ Условие
условие C++
C++ условие
C++ Условие if
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Overmind024
99 / 99 / 6
Регистрация: 10.09.2010
Сообщений: 267
01.08.2011, 02:32     Условие в while #2
Цитата Сообщение от gr_8_zizu Посмотреть сообщение
while(!pArray[n][m])
Цикл будет работать до тех пока найдет не ноль.

Цитата Сообщение от gr_8_zizu Посмотреть сообщение
C++
1
dfs(i1,**pArray,*q);
Нет не так.
C++
1
2
3
4
int i1;
int** array;
int* q;
dfs(i1,array,q);
Цитата Сообщение от gr_8_zizu Посмотреть сообщение
C++
1
while(i!=j || a<b)
Да так можно.

А вообще легче запустить компилятор, а уже если не получается создавать тему.
-=ЮрА=-
Заблокирован
Автор FAQ
01.08.2011, 09:53     Условие в while #3
Условие достижения конца массива можно выполнить
C++
1
while(pArray + d*d1)
, только объявить счётчики d и d1 нужно до цикла while.
Вообще объявлять переменные в цикле это очень не рационально!
LosAngeles
Заблокирован
01.08.2011, 09:59     Условие в while #4
Цитата Сообщение от Overmind024 Посмотреть сообщение
Цикл будет работать до тех пока найдет не ноль.
нет
grizlik78
Эксперт С++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,960
01.08.2011, 10:00     Условие в while #5
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Условие достижения конца массива можно выполнить
C++
1
while(pArray + d*d1)
Что, опять? Цикл пока указатель не станет нулю, либо не придёт SIGSEGV?
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Вообще объявлять переменные в цикле это очень не рационально!
Вот ещё, новости какие.
-=ЮрА=-
Заблокирован
Автор FAQ
01.08.2011, 10:03     Условие в while #6
Прототип dfs можно выполнить вот так (при этом делать переприсваивание вообще не нужно ii=i1;, переменная i1 при выходе из функции не изменится в основном теле программы)
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
bool dfs (int m, int n, int i1, int **pArray,int *q)
{
    bool test=false;
    int d = 0, d1 = 0;
    while(pArray + d*d1)
    {
        for(d=0; d<m; d++)
        {
            if(pArray[i1][d]==1)
            {
                for(d1=0; d1<n; d1++)
                {
                    if(pArray[d1][d]==2)
                    {
                        if(
                            i1==q[0]||
                            i1==q[1]||
                            i1==q[2]||
                            i1==q[3]||
                            i1==q[4]||
                            i1==q[5])
                        {
                            test = true;
                            //break - ом остановишь лишь for(d1=0; d1<n; d1++)
                            return test;
                        }
                        else
                        {
                            test = false;
                            i1=d1;
                        }
                    }
                }
            }
        }
    }
    return test;
}
Добавлено через 1 минуту
Цитата Сообщение от grizlik78 Посмотреть сообщение
Вот ещё, новости какие.
, ну вот работал бы с минимальными ресурсами оперативной памяти и на максимальную быстроту выполнения, понял бы что такое выделение памяти под переменную
LosAngeles
Заблокирован
01.08.2011, 10:03     Условие в while #7
товарищ SIGSEGV не придёт, пока не попытаться что-то сделать с указателям, типа разыменования. От сложения он только переполниться может
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Условие достижения конца массива можно выполнить
помоему ты уже так предлагал так проверять. Эта шняга не работает!
-=ЮрА=-
Заблокирован
Автор FAQ
01.08.2011, 10:06     Условие в while #8
C++
1
while(pArray + (d - 1)*d1)
так точней будет...
grizlik78
Эксперт С++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,960
01.08.2011, 10:07     Условие в while #9
Цитата Сообщение от LosAngeles Посмотреть сообщение
товарищ SIGSEGV не придёт, пока не попытаться что-то сделать с указателям, типа разыменования. От сложения он только переполниться может
Ну дык в теле это есть.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
, ну вот работал бы с минимальными ресурсами оперативной памяти и на максимальную быстроту выполнения, понял бы что такое выделение памяти под переменную
Подвинуть указатель стека на несколько байт? При том, что нормальный компилятор с оптимизацией сделает это 1 раз до цикла, и один после (если вообще сделает)
LosAngeles
Заблокирован
01.08.2011, 10:09     Условие в while #10
с оптимизацией скорее всего в регистр счётчик затолкает

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
while(pArray + (d - 1)*d1)
если внутри цикла не проверяется некоторое условие и нету брейка, то это будет очень странный цикл
grizlik78
Эксперт С++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,960
01.08.2011, 10:18     Условие в while #11
Ну я не про счётчик конкретно, а про переменные внутри цикла вообще. Которые тоже, в большинстве своём, до памяти так и не дойдут, согласен. Другое дело объекты сложные или динамическое выделение памяти.

Добавлено через 6 минут
А теперь внимание, правильный ответ! (хотя, возможно и не полный)
Цикл while из строки 5 исходной программы вообще не нужен.
gr_8_zizu
13 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 149
01.08.2011, 12:17  [ТС]     Условие в while #12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
//break - ом остановишь лишь for(d1=0; d1<n; d1++)
А как выполнить выход из всех циклов если переменная test=true;

Добавлено через 2 минуты
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ну я не про счётчик конкретно, а про переменные внутри цикла вообще. Которые тоже, в большинстве своём, до памяти так и не дойдут, согласен. Другое дело объекты сложные или динамическое выделение памяти.

Добавлено через 6 минут
А теперь внимание, правильный ответ! (хотя, возможно и не полный)
Цикл while из строки 5 исходной программы вообще не нужен.
Ты в полне возможно что прав, я еще не до конца с этим согласен но эта тема прокатит только с условием того что ii=d1

Добавлено через 2 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
C++
1
//break - ом остановишь лишь for(d1=0; d1<n; d1++)
А как можно выйти из всех циклов?

Добавлено через 1 минуту
И все же оставлю вопрос с 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
int a;
int pArray[10][12]={{1,1,0,0,0,0,0,0,0,0,0,0}, //1-выходит, 2-входит
                    {2,0,0,0,0,0,0,1,0,0,0,0},
                    {0,2,1,0,0,0,0,0,0,0,0,0},
                    {0,0,2,1,2,1,0,0,0,0,0,0},
                    {0,0,0,2,1,0,0,0,0,0,0,0},
                    {0,0,0,0,0,2,1,0,0,0,0,0},
                    {0,0,0,0,0,0,2,2,1,2,1,0},
                    {0,0,0,0,0,0,0,0,2,1,0,0},
                    {0,0,0,0,0,0,0,0,0,0,2,1},
                    {0,0,0,0,0,0,0,0,0,0,0,2}};
while(!pArray[9][10])
{
for(int i=0; i<10; i++)
{
  for(int j=0; j<12; j++)
  {
  cout<<pArray[i][j];
  }
  cout<<'\n';
}
}
cin>>a;
в данном случае на экран выводиться вся матрица, и потом она все время повторяется до закрытия программы. В связи с этим объясните пожалуйста что означает условие while(!pArray[9][10])
-=ЮрА=-
Заблокирован
Автор FAQ
01.08.2011, 12:45     Условие в while #13
Долго сидел пришёл к тому что проверять нужно не содержимое ячейки памяти а выход указателя за пределы массива. Все желающие могут проверить код ниже
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
#include <stdio.h>
#include <conio.h>
 
int main()
{
    bool bCont = true;
    printf("Enter rows\r\n");
    int rows;scanf("%d",&rows);
    printf("Enter cols\r\n");
    int cols;scanf("%d",&cols);
    int ** mass = new int * [rows];
    for(int i = 0,j; i < rows;i++)
    {
        mass[i] = new int[cols];
        for(j = 0; j < cols; j++)
            printf("%d ",mass[i][j] = i + j);
        printf("\r\n");
    }
    int *adr = &mass[0][0] + rows*cols;
    for(i = 0; true; i++)
    {
        if((int *)adr <= (int *)(&mass[0][0] + i*j))
        {
            printf("End of mass reached\r\n");
            break;
        }
        for(j = 0; j < cols; j++)
            printf("%d ",mass[i][j]);
        printf("\r\n");
    }
    printf("Press any key to continue\r\n");
    getch();
    return 0;
}
C++
1
int *adr = &mass[0][0] + rows*cols;
- указатель на ячейку памяти содержащий последний элемент
C++
1
(int *)(&mass[0][0] + i*j)
- указатель на текущую ячейку памяти

Добавлено через 3 минуты
gr_8_zizu,
Цитата Сообщение от gr_8_zizu Посмотреть сообщение
while(!pArray[9][10])
означае проверку условия
C++
1
pArray[9][10] != NULL
. Такой вариант катит для строк но не массивов, в которых элементы могут иметь и нулевые значения. Матрица будет выводиться постоянно(зацикливание), если
C++
1
pArray[9][10] == 0
то вывода вообще не будет. В твоей программе цикл с условием while вообще не нужен.

Добавлено через 2 минуты
Цитата Сообщение от LosAngeles Посмотреть сообщение
помоему ты уже так предлагал так проверять. Эта шняга не работает!
Работает шняга в предпоследнем посте, эта шняга работала бы для массива символов...

Добавлено через 8 минут
Цитата Сообщение от gr_8_zizu Посмотреть сообщение
А как выполнить выход из всех циклов если переменная test=true;
я писал
C++
1
return test;
- сразу возврат из функции при достижении нужного условия
gr_8_zizu
13 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 149
01.08.2011, 15:12  [ТС]     Условие в while #14
Исходя из поставленной задачи цикл должен быть, только надо ему условие правильное выбрать. ну вот например есть матрица
C++
1
2
3
4
5
6
7
8
9
10
int pArray[10][12]={{1,1,0,0,0,0,0,0,0,0,0,0}, //1-выходит, 2-входит
                    {2,0,0,0,0,0,0,1,0,0,0,0},
                    {0,2,1,0,0,0,0,0,0,0,0,0},
                    {0,0,2,1,2,1,0,0,0,0,0,0},
                    {0,0,0,2,1,0,0,0,0,0,0,0},
                    {0,0,0,0,0,2,1,0,0,0,0,0},
                    {0,0,0,0,0,0,2,2,1,2,1,0},
                    {0,0,0,0,0,0,0,0,2,1,0,0},
                    {0,0,0,0,0,0,0,0,0,0,2,1},
                    {0,0,0,0,0,0,0,0,0,0,0,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
bool dfs (int i1, int **pArray,int *q)
{
bool test=false;
int n=10, m=12;
   for(int d=0; d<m; d++)
   {
   if(pArray[i1][d]==1)
      {
      for(int d1=0; d1<n; d1++)
         {
         if(pArray[d1][d]==2)
            {
             if(i1==q[0]||i1==q[1]||i1==q[2]||i1==q[3]||i1==q[4]||i1==q[5])
             {
             test=true;
             break;
             }
             else
             {
             test=false;
             i1=d1;
             }
            }
         }
      }
   }
return test;
}
так вот, работать буит так: как только встретиться в строке 1 так сразу пойдет работать функция. Но вот вторая и последующие однушки в этой строке остаются не затронутыми, хотя должны обрабатываться тойже функции.

Добавлено через 23 минуты
Так вот есть у каво нить идеи как это можно сделать?
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
01.08.2011, 15:30     Условие в while #15
C++
1
int pArray[10]/*столбцы*/[12]/*строки*/
- точно так? или так?
C++
1
int pArray[10]/*строки*/[12]/*столбцы*/
я запутался
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,694
01.08.2011, 15:36     Условие в while #16
сначала строки, потом столбцы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2011, 15:54     Условие в while
Еще ссылки по теме:

C++ Составить программу, которая выводит на экран слово «ИСТИНА», если условие выполнено или слово «ЛОЖЬ», если условие не выполнено.
Условие C++
Условие C++

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

Или воспользуйтесь поиском по форуму:
gr_8_zizu
13 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 149
01.08.2011, 15:54  [ТС]     Условие в while #17
вот еще вопрос, в чем ошибка?Условие в while объявлял так int pArray[10][12] и int q[]
Yandex
Объявления
01.08.2011, 15:54     Условие в while
Ответ Создать тему
Опции темы

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