Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631

Как правильно настроить цикл?

11.03.2012, 15:29. Показов 1405. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
у меня поле 9 на 9, по диагонали цикл идет
C++
1
2
3
4
5
6
for (int i=0,j=8;i<8,j>0;i++,j--) {
  if (StringGrid1->Cells[i][j]=="  X ")
    NN=NN+1;
  else NN=0;
  if (NN==5)
    ShowMessage("Победа");}
если пять подряд крестиков идет по диагонали то, выдать слово победу - он выдает такое слово, если их пять, но пробел в том, что если с самого угла ставить крестики, то первый крестик он почему то не учитывает и всего выходит 6 для победы... почему я не могу понять уже по разному пробовал...
приложил пример моего поля, вот ячейки по диагонали с номером 1.9 2.8 3.7 4.6 и так далее, вот на этой диагонали почему то крестик, который в ячейки 1.9 не учитывается при подсчете крестиков по диагонали, подскажите как исправить
Миниатюры
Как правильно настроить цикл?  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.03.2012, 15:29
Ответы с готовыми решениями:

COM-порт, как правильно настроить
Доброго времени суток. Прошу помощи в решении следующей проблемы: на COM порте висит железка, которая постоянно посылает данные в порт....

Не правильно задан цикл?!Как лучше?
Всем привет!Вот освоил циклы(вроде). попытался написать прожку.И опять ничего не выходит. я ее и так и сяк. и while и for.Ну...

Как правильно организовать цикл для сравнения?
Всем привет!!!!!!! помогите пожалуйста с вопросом. Не могу организовать правильный цикл. Мне нужно сравнивать первую строку со всей...

16
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
11.03.2012, 15:38
Это очень странная конструкция
C
1
for ( int i=0,j=8;i<8,j>0;i++,j--)
Подумай, как работает условие "i<8, j>0" Имей в виду, что это не И и не ИЛИ.
Если думать лень, напиши
C
1
for ( int i=0,j=8;i<8;i++,j--)
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
11.03.2012, 15:38
Ячеек 9, а цикл до 8 i<8
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
11.03.2012, 15:44
Цитата Сообщение от mimicria Посмотреть сообщение
Ячеек 9, а цикл до 8 i<8
Да, правильно. Я так был ошарашен предложенной конструкцией цикла, что ячеек уже не посчитал
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
11.03.2012, 15:51  [ТС]
ну а то что счет идет не с единицы а с нуля разве не дает в итоге 9 ячеек?

Добавлено через 5 минут
просто при таком условии
C++
1
( int i=0,j=9;i<9;i++,j--)
цикл начинает с элемента 2.9 3.8 4.7 сдвиг происходит на одну диагональ
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
11.03.2012, 15:52
Цитата Сообщение от lexflax Посмотреть сообщение
ну а то что счет идет не с единицы а с нуля разве не дает в итоге 9 ячеек?
Если считать от 0, то последняя ячейка имеет индекс 8 (восемь). Восемь меньше восьми? Нет. Вот и тело цикла не выполнится.

Добавлено через 35 секунд
Цитата Сообщение от lexflax Посмотреть сообщение
j=9
А это зачем исправили? Последняя ячейка то 8, а не 9.
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
11.03.2012, 15:53  [ТС]
точно))) спасиб)
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
11.03.2012, 16:07  [ТС]
блин другой косяк выдает, по этой диагонали, косяк в том что допустим пять подряд крестиков нету, а победу фиксирует... посмотри пожалуйста файл кода прикрепил чтоб наглядно можно было посмотреть почему фиксирует победу если кресты на диагонали есть в нужном количестве но идут не подряд, победа фиксироваться должна только в том случае если идет пять крестов подряд
Вложения
Тип файла: rar крестики нолики.rar (6.6 Кб, 5 просмотров)
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
11.03.2012, 16:23
C++
1
if(i=j)
Печальная детская ошибка
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
11.03.2012, 16:25  [ТС]
да как раз диагональ где i=j работает нормально по условию, другая диагональ косячит по которой я цикл писал последний
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
11.03.2012, 16:30
lexflax, внимательно читаем сообщение от уважаемого mimicria
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
11.03.2012, 16:38  [ТС]
и что я там не так прочитал?
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
11.03.2012, 16:43
C++. Бархатный путь. Часть 1 Страница 39. Операции сравнения
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
11.03.2012, 16:47
Тут это мало на что влияет, матрица квадратная и можно было вообще не делать второй цикл. Просто проверить StringGrid1->Cells[i][i]
А что именно неправильно работает в последней проверке?
0
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
11.03.2012, 16:52  [ТС]
диагональ которая идет по адресам с картинки адреса говорю 1.9 2.8 3.7 и до конца когда ее начинаю заполнять допустим две крайние вечерки с адресом 1.9 и 2.8 и самые последние 3 ячейки потом нажимаю на любую заполненую уже ячейку в которой есть крестик допустим снова на 1.9 выдает сообщение победа, тоесть как будто есть момент когда 5 крестиков идут подрят, а при этом между ними есть пустые клетки на диагонали и победа не должна фиксироваться
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
11.03.2012, 17:08
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
static int counterO,counterX;
 
void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol,
      int ARow, bool &CanSelect)
{
        if (StringGrid1->Cells[ACol][ARow]=="")
                if (RadioButton1->Checked)
                        StringGrid1->Cells[ACol][ARow]="  X ";
    if (StringGrid1->Cells[ACol][ARow]=="")
                if (RadioButton2->Checked)
                        StringGrid1->Cells[ACol][ARow]="  O ";
        counterO=0;counterX=0;
    for (int i = 0; i < StringGrid1->ColCount; i++)
    { //ñêàíèðîâàíèå ïî ñòîëáöàì
        for (int j=0; j < StringGrid1->RowCount; j++)
        {
            if (StringGrid1->Cells[i][j]=="  X ") counterX++;
            else counterX=0;
            if (counterX==5) ShowMessage ("ïîáåäà X");
            if (StringGrid1->Cells[i][j]=="  O ") counterO++;
            else counterO=0;
            if (counterO==5) ShowMessage ("ïîáåäà O") ;
        }
    }
        counterO=0;counterX=0;
    for (int j = 0; j < StringGrid1->ColCount; j++)
    { //ñêàíèðîâàíèå ïî ñòðîêàì
        for (int i=0; i < StringGrid1->RowCount; i++)
        {
            if (StringGrid1->Cells[i][j]=="  X ") counterX++;
            else counterX=0;
            if (counterX==5) ShowMessage ("ïîáåäà X") ;
            if (StringGrid1->Cells[i][j]=="  O ") counterO++;
            else counterO=0;
            if (counterO==5) ShowMessage ("ïîáåäà O") ;
        }
        }
        counterO=0;counterX=0;
        for (int i = 0; i < StringGrid1->ColCount; i++)//ñêàíèðîâàíèå ïî äèàãîíàëè 1.1 2.2 3.3 ...
        {
            if (StringGrid1->Cells[i][i]=="  X ") counterX++;
        else counterX=0;
        if (counterX==5) ShowMessage ("ïîáåäà Õ") ;
        if (StringGrid1->Cells[i][i]=="  O ") counterO++;
        else counterO=0;
        if (counterO==5) ShowMessage ("ïîáåäà Î") ;
        }
        counterO=0;counterX=0;
        for (int i = 0; i < StringGrid1->ColCount; i++)//ñêàíèðîâàíèå ïî äèàãîíàëè 1.1 2.2 3.3 ...
        {
            if (StringGrid1->Cells[i][8-i]=="  X ") counterX++;
        else counterX=0;
        if (counterX==5) ShowMessage ("ïîáåäà Õ") ;
        if (StringGrid1->Cells[i][8-i]=="  O ") counterO++;
        else counterO=0;
        if (counterO==5) ShowMessage ("ïîáåäà Î") ;
        }
}
2
11 / 11 / 6
Регистрация: 03.04.2011
Сообщений: 631
18.03.2012, 09:07  [ТС]
спасибо теперь надо описать цикл по остальным возможным диагоналям, выбрал диагональ с адресом 4.0 5.1 6.2 7.3 8.4.
так как на этой диагонали в любом месте i-j равняется 4, то за начальное значение i взял 4, конечное значение j выщитал визуально по таблице которую прикрепляю рисунком, но код не работает, не фиксируется победа когда по этой диагонали проходит 5 иксов подряд.вот отрывок из программы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 for (int i = 0; i < StringGrid1->ColCount; i++) // диагональ от 4.0 до 8.4
     for (int j=0; j < StringGrid1->RowCount; j++)
      {
       if ((i>j)&&(i-j==4))
          {for (i=i-j; i<StringGrid1->ColCount;i++)
             { for (j = 0; j < 5; j++)
                  { if (StringGrid1->Cells[i][j]=="  X ") counterX++;
                    else counterX=0;
                    if(counterX==5) ShowMessage("победа");
                  }
 
             }
 
          } }
Вот вся программа в целом
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
#include <vcl.h>
#pragma hdrstop
 
#include "krest.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
static int counterO=0,counterX=0;
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
StringGrid1->Visible=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol, int ARow,
                  bool &CanSelect)
{
        if (StringGrid1->Cells[ACol][ARow]=="") if (RadioButton1->Checked)
        {
         StringGrid1->Cells[ACol][ARow]="  X ";
        }
        if (StringGrid1->Cells[ACol][ARow]=="") if (RadioButton2->Checked)
        {
         StringGrid1->Cells[ACol][ARow]="  O ";
        }
        counterX=0;counterO=0;
        for (int i = 0; i < StringGrid1->ColCount; i++)
        { //сканирование по столбцам
               for (int j=0; j < StringGrid1->RowCount; j++)
               {
                if (StringGrid1->Cells[i][j]=="  X ")counterX++;
                else counterX=0;if(counterX==5) ShowMessage ("победа");
                if (StringGrid1->Cells[i][j]=="  O ") counterO++;
                else counterO=0;if(counterO==5) ShowMessage ("победа");
               }
        }
        counterX=0;counterO=0;
        for (int j = 0; j < StringGrid1->ColCount; j++)
        { //сканирование по строкам
              for (int i=0; i < StringGrid1->RowCount; i++)
               {
                if (StringGrid1->Cells[i][j]=="  X ")counterX++;
                else counterX=0;if(counterX==5) ShowMessage ("победа");
                if (StringGrid1->Cells[i][j]=="  O ") counterO++;
                else counterO=0;if(counterO==5) ShowMessage ("победа");
               }
        }
        counterX=0;counterO=0;
         for (int i = 0; i < StringGrid1->ColCount; i++)//сканирование по диагонали 1.1 2.2 3.3 ...
         {
                if (StringGrid1->Cells[i][i]=="  X ")counterX++;
                else counterX=0;if(counterX==5) ShowMessage ("победа");
                if (StringGrid1->Cells[i][i]=="  O ") counterO++;
                else counterO=0;if(counterO==5) ShowMessage ("победа");
         }
         counterX=0;counterO=0;
          for (int i=0; i < StringGrid1->RowCount; i++)
               {
                if (StringGrid1->Cells[i][8-i]=="  X ")counterX++;
                else counterX=0;if(counterX==5) ShowMessage ("победа");
                if (StringGrid1->Cells[i][8-i]=="  O ") counterO++;
                else counterO=0;if(counterO==5) ShowMessage ("победа");
               }
     for (int i = 0; i < StringGrid1->ColCount; i++) // диагональ от 4.0 до 8.4
     for (int j=0; j < StringGrid1->RowCount; j++)
      {
       if ((i>j)&&(i-j==4))
          {for (i=i-j; i<StringGrid1->ColCount;i++)
             { for (j = 0; j < 5; j++)
                  { if (StringGrid1->Cells[i][j]=="  X ") counterX++;
                    else counterX=0;
                    if(counterX==5) ShowMessage("победа");
                  }
 
             }
 
          } }
      }
есть поле 9 на 9 ячеек игра судоку(крестики нолики) условие победы наступает когда пять крестиков или ноликов идут подряд, по вертикали и горизонтали циклы описаны, по двум центральным диагоналям тоже циклы описаны и работают, остались другие второстепенные которые возникли из за того что пять ячеек вызывают победу на поле 9 на 9 возникает 8 таких случаев.
выбрал диагональ с адресом 4.0 5.1 6.2 7.3 8.4.
так как на этой диагонали в любом месте i-j равняется 4, то за начальное значение i взял 4, конечное значение j выщитал визуально по таблице которую прикрепляю рисунком, но код не работает, не фиксируется победа когда по этой диагонали проходит 5 иксов подряд, почему не могу понять подскажите плиз((((
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
#include <vcl.h>
#pragma hdrstop
 
#include "krest.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
static int counterO=0,counterX=0;
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
StringGrid1->Visible=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol, int ARow,
                  bool &CanSelect)
{
        if (StringGrid1->Cells[ACol][ARow]=="") if (RadioButton1->Checked)
        {
         StringGrid1->Cells[ACol][ARow]="  X ";
        }
        if (StringGrid1->Cells[ACol][ARow]=="") if (RadioButton2->Checked)
        {
         StringGrid1->Cells[ACol][ARow]="  O ";
        }
        counterX=0;counterO=0;
        for (int i = 0; i < StringGrid1->ColCount; i++)
        { //сканирование по столбцам
               for (int j=0; j < StringGrid1->RowCount; j++)
               {
                if (StringGrid1->Cells[i][j]=="  X ")counterX++;
                else counterX=0;if(counterX==5) ShowMessage ("победа");
                if (StringGrid1->Cells[i][j]=="  O ") counterO++;
                else counterO=0;if(counterO==5) ShowMessage ("победа");
               }
        }
        counterX=0;counterO=0;
        for (int j = 0; j < StringGrid1->ColCount; j++)
        { //сканирование по строкам
              for (int i=0; i < StringGrid1->RowCount; i++)
               {
                if (StringGrid1->Cells[i][j]=="  X ")counterX++;
                else counterX=0;if(counterX==5) ShowMessage ("победа");
                if (StringGrid1->Cells[i][j]=="  O ") counterO++;
                else counterO=0;if(counterO==5) ShowMessage ("победа");
               }
        }
        counterX=0;counterO=0;
         for (int i = 0; i < StringGrid1->ColCount; i++)//сканирование по диагонали 1.1 2.2 3.3 ...
         {
                if (StringGrid1->Cells[i][i]=="  X ")counterX++;
                else counterX=0;if(counterX==5) ShowMessage ("победа");
                if (StringGrid1->Cells[i][i]=="  O ") counterO++;
                else counterO=0;if(counterO==5) ShowMessage ("победа");
         }
         counterX=0;counterO=0;
          for (int i=0; i < StringGrid1->RowCount; i++)
               {
                if (StringGrid1->Cells[i][8-i]=="  X ")counterX++;
                else counterX=0;if(counterX==5) ShowMessage ("победа");
                if (StringGrid1->Cells[i][8-i]=="  O ") counterO++;
                else counterO=0;if(counterO==5) ShowMessage ("победа");
               }
     for (int i = 0; i < StringGrid1->ColCount; i++) // диагональ от 4.0 до 8.4
     for (int j=0; j < StringGrid1->RowCount; j++)
      {
       if ((i>j)&&(i-j==4))
          {for (i=4; i<StringGrid1->ColCount;i++)
             { for (j = 0; j < 5; j++)
                  { if (StringGrid1->Cells[i][j]=="  X ") counterX++;
                    else counterX=0;
                    if(counterX==5) ShowMessage("победа");
                  }
 
             }
 
          } }
      }
Миниатюры
Как правильно настроить цикл?   Как правильно настроить цикл?  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.03.2012, 09:07
Помогаю со студенческими работами здесь

Как правильно организовать цикл для построения графика?
Нужно построить график экспоненты на промежутке с учетом изменения величины шага построения. В масштабе, я строю график от 20-й до 500-й...

Как правильно настроить аутентификацию?
Доброго времени суток. Третий день бьюсь с проблемой аутентификации WCF. Кучу всего перерыл, ничего не получается. Нашёл вроде одну...

Как правильно настроить интерфейс
Привет всем. Проблема вот в чем, Добавил пользователя, настроил интерфейс, поставили задачу, для этого пользователя чтоб другая форма...

Как правильно настроить напоминалку?
Поясните, пожалуйста, что я сделал неправильно (и сделал ли я хоть что-нибудь правильно:-|), почему не работает прога. Суть такова: в...

Как правильно настроить сеть
Помогите правильно настроить сеть на нескольких компах, ОП Win 7 Причем на одном компе интернет должен раздавать на другие! Все компы...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru