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

указатели - C++

Восстановить пароль Регистрация
 
barmalei_slv
23 / 23 / 1
Регистрация: 29.10.2008
Сообщений: 69
17.12.2009, 22:03     указатели #1
Имеется группа белых и серых мышей количеством 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
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
109
110
111
112
113
114
115
116
117
118
#pragma hdrstop
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <iomanip>
 
int change(int *a,int *b)
{
 int i=*a;
 *a=*b;
 *b=i;
}
#pragma argsused
using namespace std;
int main(int argc,char* argv[])
{
  int j,n,m,s1=0,s2=0,x,g=0;
  int mas[n][n];
  cin>>n;
  m=n*n-n;
 
   for(j;j<n;j++)
   for(x;x<n;x++)
   {
    mas[j][x]=rand()%3-0;
 
     if(mas[j][x]==0)
     g++;
     if(g==m)
     mas[j][x]=rand()%2+1;
 
     if(mas[j][x]==1)
     s1++;
     if(mas[j][x]==2)
     s2++;
   }
  for(j;j<n;j++)
  {
  for(x;x<n;x++)
  {
   if(mas[j][x]==1)
   cout<<"b"<<" ";
 
   if(mas[j][x]==2)
   cout<<"s"<<" ";
 
   if(mas[j][x]==0)
   cout<<" "<<" ";
 
   cout<<endl;
  }
  }
  int s3=0,s4=0,z,v;
   while(!(z==s1))
   {
    for(j;j<n;j++)
     for(x;x<n;x++)
      {if(mas[j][x]==1)
       s3++;
      }
      z++;
   }
   while(!(v==s2))
   {
    for(j;j<n;j++)
     for(x;x<n;x++)
     {
      if(mas[j][x]==2)
       s4++;
     }
     v++;
   }
  while((s3==s1)&&(s4==s2))
 {
   for(j;j<n;j++)
     for(x;x<n;x++)
     {
         if((mas[j][x]==1)&&(mas[j+1][x]==0))
         change(&mas[j][x],&mas[j+1][x]);
 
         if((mas[j][x]==1)&&(!(mas[j+1][x]==0))&&(mas[j][x+1]==0))
         change(&mas[j][x],&mas[j][x+1]);
 
         if((mas[j][x]==1)&&(!(mas[j+1][x]==0))&&(mas[j][x-1]==0))
         change(&mas[j][x],&mas[j][x-1]);
         }
 
    for(j;j<n;j++)
     for(x;x<n;x++)
     {
         if((mas[j][x]==2)&&(mas[j-1][x]==0))
         change(&mas[j][x],&mas[j-1][x]);
 
         if((mas[j][x]==2)&&(!(mas[j+1][x]==0))&&(mas[j][x+1]==0))
         change(&mas[j][x],&mas[j][x+1]);
 
         if((mas[j][x]==2)&&(!(mas[j+1][x]==0))&&(mas[j][x-1]==0))
         change(&mas[j][x],&mas[j][x-1]);
         }
 
     }
    for(j;j<n;j++)
 {
  for(x;x<n;x++)
  {
   if(mas[j][x]==1)
   cout<<"b"<<" ";
 
   if(mas[j][x]==2)
   cout<<"s"<<" ";
 
   if(mas[j][x]==0)
   cout<<" "<<" ";
 
   cout<<endl;
  }
 }
}
Добавлено через 25 секунд
что в проге не так?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2009, 22:03     указатели
Посмотрите здесь:

Указатели C++
указатели C++
Указатели C++
указатели C++
C++ Указатели в С++.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
18.12.2009, 10:46     указатели #2
строка 18
int mas[n][n]; // n еще не было инициализировано, а уже используется.

обявления не достаточно, пример:
C++
1
2
int i;
cout << i;
на экран вйдет белеберда
вот так
C++
1
2
  cin>>n;
  int mas[n][n];
правда, тут еще в чем-то ошибка по-моему, пока не нашел.

Добавлено через 11 часов 29 минут
for(j;j<n;j++) //так не получится. надо незабывать инициализироваить счетчик j. for(j=0;j<n;j++)
в С++ при обьявлении переменной не происходит инициализации по умолчанию, как в паскале!
на строчке 54 начинается цикл while(!(z==s1)){...} условие выхода из которого не выполняется.

я задания не понимаю, проверить всю прогу не могу.
barmalei_slv
23 / 23 / 1
Регистрация: 29.10.2008
Сообщений: 69
18.12.2009, 11:29  [ТС]     указатели #3
мне сейчас нужно, чтоб цикл while заработал

Добавлено через 5 минут
и еще нужно, чтобы рандом выдавал тольуко n единичек и двоек, остальное нулями забивал. что-то пока не получается

Добавлено через 31 минуту
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
109
110
111
112
113
114
115
#pragma hdrstop
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <iomanip>
 
int change(int *a,int *b)
{
 int i=*a;
 *a=*b;
 *b=i;
}
#pragma argsused
using namespace std;
int main(int argc,char* argv[])
{
  int j,n,m,s1=0,s2=0,x,g=0;
  cin>>n;
  int mas[n][n];
 
  m=n*n-n;
 
   for(j=1;j<n;j++)
   for(x=1;x<n;x++)
   {
    mas[j][x]=rand()%3-0;
 
     if(mas[j][x]==0)
     g++;
     if(g==m)
     mas[j][x]=rand()%2+1;
 
     if(mas[j][x]==1)
     s1++;
     if(mas[j][x]==2)
     s2++;
   }
  for(j=1;j<n;j++)
  {
  for(x=1;x<n;x++)
   if(mas[j][x]==1)
   cout<<"b"<<" ";
 
   if(mas[j][x]==2)
   cout<<"s"<<" ";
 
   if(mas[j][x]==0)
   cout<<" "<<" ";
   cout<<endl;
  }
  int s3=0,s4=0,z=0,v=0;
   while(!(z==s1))
   {z++;
    for(j=1;j<n;j++)
     {
     for(x=1;x<n;x++)
      if(mas[j][x]==1)
       s3++;
      }
 
   }
   while(!(v==s2))
   {v++;
    for(j=n;j>0;j--)
     {
     for(x=n;x>0;x--)
      if(mas[j][x]==2)
       s4++;
     }
        }
  while((s3==s1)&&(s4==s2))
 {
   for(j=1;j<n;j++)
     for(x=1;x<n;x++)
     {
         if((mas[j][x]==1)&&(mas[j+1][x]==0))
         change(&mas[j][x],&mas[j+1][x]);
 
         if((mas[j][x]==1)&&(!(mas[j+1][x]==0))&&(mas[j][x+1]==0))
         change(&mas[j][x],&mas[j][x+1]);
 
         if((mas[j][x]==1)&&(!(mas[j+1][x]==0))&&(mas[j][x-1]==0))
         change(&mas[j][x],&mas[j][x-1]);
         }
 
    for(j=1;j<n;j++)
     for(x=1;x<n;x++)
     {
         if((mas[j][x]==2)&&(mas[j-1][x]==0))
         change(&mas[j][x],&mas[j-1][x]);
 
         if((mas[j][x]==2)&&(!(mas[j+1][x]==0))&&(mas[j][x+1]==0))
         change(&mas[j][x],&mas[j][x+1]);
 
         if((mas[j][x]==2)&&(!(mas[j+1][x]==0))&&(mas[j][x-1]==0))
         change(&mas[j][x],&mas[j][x-1]);
         }
 
     }
    for(j=0;j<n;j++)
 {
  for(x=0;x<n;x++)
 
   if(mas[j][x]==1)
   cout<<"b"<<" ";
 
   if(mas[j][x]==2)
   cout<<"s"<<" ";
 
   if(mas[j][x]==0)
   cout<<" "<<" ";
 
   cout<<endl;
 }
}
Добавлено через 21 секунду
вот сейчас проверь
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
18.12.2009, 12:26     указатели #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
#include <conio.h>
#include <iostream>
#include <time.h>
using namespace std;
 
int main()
{
    int n;
    cin >> n;
    int mas[n][n];
   
    srand(time(0));
    
    for (int i=0;i<n;i++)
    for (int j=0;j<n;j++) mas[i][j]=0;
    for (int i=1;i<=n*n-n-1;i++)// меняешь i<=(чего-нибудь) - для изменения количества, мышей на поле, но они все равно случайное.
    {
        int place=rand()%(n*n)-0;
        int type=rand()%(99)-0;
        if (type > 49){ mas[(int)place/n][place % n]=1;}//1 - белая;
        else {mas[(int)place/n][place % n]=2;}//2-черная.
    }
    //здесь уже матрица со случайными 1 и 2 в случайных клетках.
    for (int i=0;i<n;i++)
    {
        for (int j=0;j<n;j++) cout << mas[i][j] << " ";
        cout << endl;
    }
    getch();
}
подходит?
barmalei_slv
23 / 23 / 1
Регистрация: 29.10.2008
Сообщений: 69
18.12.2009, 12:30  [ТС]     указатели #5
чет не так. при n=5 он мне выдал 8 единичек и двоек)) лан, щас помудрю))
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
18.12.2009, 13:03     указатели #6
у меня в предыдузем примере n - это порядок матрицы!
а теперь:
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
#include <conio.h>
#include <iostream>
#include <time.h>
using namespace std;
 
int main()
{
    int n;
    cin >> n;
    int mas[n][n];
   
    srand(time(0));
    
    for (int i=0;i<n;i++)
    for (int j=0;j<n;j++) mas[i][j]=0;
    for (int i=1;i<=n;i++)// меняешь i<=(чего-нибудь) - для изменения количества, мышей на поле.
    {
        int place=rand()%(n*n)-0;
        int type=rand()%(99)-0;
        if (type > 49){ if (mas[(int)place/n][place % n]==0)mas[(int)place/n][place % n]=1;else i--;}//1 - белая;
        else {if(mas[(int)place/n][place % n]==0)mas[(int)place/n][place % n]=2;else i--;}//2-черная.
    }
    //здесь уже матрица со случайными 1 и 2 в случайных клетках.
    for (int i=0;i<n;i++)
    {
        for (int j=0;j<n;j++) cout << mas[i][j] << " ";
        cout << endl;
    }
    getch();
}
я в 16-ой строке заменил n*n ... на просто n.
barmalei_slv
23 / 23 / 1
Регистрация: 29.10.2008
Сообщений: 69
18.12.2009, 13:22  [ТС]     указатели #7
вот, теперь всё супер, Спасибо!)) как бы теперь всё остальное работать заставить))
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
18.12.2009, 13:47     указатели #8
что после строчки 51 происходит, что вообще должно произойти. мне условие задачи не понятно.
barmalei_slv
23 / 23 / 1
Регистрация: 29.10.2008
Сообщений: 69
18.12.2009, 13:59  [ТС]     указатели #9
все двойки нужно сместить вверх, все единички вниз. каждая единичка и двойка может за раз перемещаться только на одну ячейку, и перемещаться может только на пустую, тоесть с нулём местами меняться

Добавлено через 2 минуты
надо сделать, чтобы функция, котора местами меняет элементы была через указатели написана. ну она у меня вроде правильно написана

Добавлено через 38 секунд
только сами условия у меня косячные
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
18.12.2009, 14:45     указатели #10
вот. только черные мыши моментально убегают. странно, но поправить не могу
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
#include <conio.h>
#include <iostream>
#include <time.h>
 
int change(int *a,int *b)
{
 int i=*a;
 *a=*b;
 *b=i;
}
using namespace std;
int main()
{
  int n;
    cin >> n;
    int mas[n][n];
   
    srand(time(0));
    
    for (int i=0;i<n;i++)
    for (int j=0;j<n;j++) mas[i][j]=0;
    for (int i=1;i<=n;i++)// меняешь i<=(чего-нибудь) - для изменения количества, мышей на поле.
    {
        int place=rand()%(n*n)-0;
        int type=rand()%(99)-0;
        if (type > 49){ if (mas[(int)place/n][place % n]==0)mas[(int)place/n][place % n]=1;else i--;}//1 - белая;
        else {if(mas[(int)place/n][place % n]==0)mas[(int)place/n][place % n]=2;else i--;}//2-черная.
    }
    //здесь уже матрица со случайными 1 и 2 в случайных клетках.
    for (int i=0;i<n;i++)
    {
        for (int j=0;j<n;j++) 
        {
            //cout << mas[i][j] << " ";
            if(mas[i][j]==1) cout << "-w-";
            if(mas[i][j]==0) cout << "---";
            if(mas[i][j]==2) cout << "-b-";
        }
        cout << endl;
    }
    
    getch();
    
    for (int c=0;c<n;c++)
    {
        for (int i=0;i<n;i++)
            for (int j=0;j<n;j++)
            {
                if((mas[i][j]==1)&&(i>0))change(&mas[i-1][j],&mas[i][j]);
                if((mas[i][j]==2)&&(i<n-1)){change(&mas[i+1][j],&mas[i][j]);}
            }
        //вывод на экран
        system("cls");
        cout << endl;
        for (int i=0;i<n;i++)
        {
            for (int j=0;j<n;j++) 
            {
                if(mas[i][j]==1) cout << "-w-";
                if(mas[i][j]==0) cout << "---";
                if(mas[i][j]==2) cout << "-b-";
            }
            cout << endl;
        }
        getch();
    }
}
введи 20, или типа того, потом enter нажимай. работает?
barmalei_slv
23 / 23 / 1
Регистрация: 29.10.2008
Сообщений: 69
18.12.2009, 14:59  [ТС]     указатели #11
Добавлено через 3 минуты
да, всё работает отлично! а как сделать, чтоб не по нажатию выходило, а просто отсортированный массив ниже вышел и всё? ты меня очень выручил!
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
18.12.2009, 16:36     указатели #12
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
#include <conio.h>
#include <iostream>
#include <time.h>
 
int change(int *a,int *b)
{
 int i=*a;
 *a=*b;
 *b=i;
}
using namespace std;
int main()
{
  int n;
    cin >> n;
    int mas[n][n];
   
    srand(time(0));
    
    for (int i=0;i<n;i++)
    for (int j=0;j<n;j++) mas[i][j]=0;
    for (int i=1;i<=n;i++)// меняешь i<=(чего-нибудь) - для изменения количества, мышей на поле.
    {
        int place=rand()%(n*n)-0;
        int type=rand()%(99)-0;
        if (type > 49){ if (mas[(int)place/n][place % n]==0)mas[(int)place/n][place % n]=1;else i--;}//1 - белая;
        else {if(mas[(int)place/n][place % n]==0)mas[(int)place/n][place % n]=2;else i--;}//2-черная.
    }
    //здесь уже матрица со случайными 1 и 2 в случайных клетках.
    for (int i=0;i<n;i++)
    {
        for (int j=0;j<n;j++) 
        {
            //cout << mas[i][j] << " ";
            if(mas[i][j]==1) cout << "-w-";
            if(mas[i][j]==0) cout << "---";
            if(mas[i][j]==2) cout << "-b-";
        }
        cout << endl;
    }
    
    getch();
    //тут мыши поползли к верху и к низу
    for (int c=0;c<n;c++)
    {
        for (int i=0;i<n;i++)
            for (int j=0;j<n;j++)
            {
                if((mas[i][j]==1)&&(i>0))change(&mas[i-1][j],&mas[i][j]);
                if((mas[i][j]==2)&&(i<n-1)){change(&mas[i+1][j],&mas[i][j]);}
            }
    }
    //вывод на экран
    system("cls");
    cout << endl;
    for (int i=0;i<n;i++)
    {
        for (int j=0;j<n;j++) 
        {
            if(mas[i][j]==1) cout << "-w-";
            if(mas[i][j]==0) cout << "---";
            if(mas[i][j]==2) cout << "-b-";
         }
         cout << endl;
    }    
    getch();
}
а в аську то зачем...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2009, 16:43     указатели
Еще ссылки по теме:

указатели C++
Указатели C++
Указатели C++

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

Или воспользуйтесь поиском по форуму:
barmalei_slv
23 / 23 / 1
Регистрация: 29.10.2008
Сообщений: 69
18.12.2009, 16:43  [ТС]     указатели #13
еще раз огромное спасибо))а в аську.. просто отблагодарить хотел по-человечески)) ты время своё тратил как-никак)
Yandex
Объявления
18.12.2009, 16:43     указатели
Ответ Создать тему
Опции темы

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