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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
barmalei_slv
23 / 23 / 1
Регистрация: 29.10.2008
Сообщений: 69
#1

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

17.12.2009, 22:03. Просмотров 583. Ответов 12
Метки нет (Все метки)

Имеется группа белых и серых мышей количеством 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 секунд
что в проге не так?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2009, 22:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос указатели (C++):

Указатели и указатели на указатели, а также типы данных - C++
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно. Накачал литературы, буду изучать) Щас...

Через указатели на указатели посчитать сумму двух чисел и записать в третье - C++
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать примитивный калькулятор, пользуясь только...

Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной - C++
Мой код. #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include&lt;iomanip&gt; using namespace std; void min_max(int*pa, int*pb,...

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов? - C++
Есть массив int **mas; mas=new int*; // выделил место под пять строк, верно ? mas=new int;// выделил для первой строки матрицы два...

Отсортировать массив и вывести на экран (массивы и указатели на указатели) - C++
Даны массивы F-фамилий студентов и S-результаты сессии (5 оценок) , причем s- результат сессии F студента. Отсортировать массив S по...

Указатели на слонов или А зачем нужны указатели? - C++
Знаю что таких вопросов было уйма, но я так и не нашел ответа на свой вопрос. Для чего нужны указатели? Что такое указатели я знаю, это...

12
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)){...} условие выхода из которого не выполняется.

я задания не понимаю, проверить всю прогу не могу.
1
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 секунду
вот сейчас проверь
0
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();
}
подходит?
0
barmalei_slv
23 / 23 / 1
Регистрация: 29.10.2008
Сообщений: 69
18.12.2009, 12:30  [ТС] #5
чет не так. при n=5 он мне выдал 8 единичек и двоек)) лан, щас помудрю))
0
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.
1
barmalei_slv
23 / 23 / 1
Регистрация: 29.10.2008
Сообщений: 69
18.12.2009, 13:22  [ТС] #7
вот, теперь всё супер, Спасибо!)) как бы теперь всё остальное работать заставить))
0
Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
18.12.2009, 13:47 #8
что после строчки 51 происходит, что вообще должно произойти. мне условие задачи не понятно.
0
barmalei_slv
23 / 23 / 1
Регистрация: 29.10.2008
Сообщений: 69
18.12.2009, 13:59  [ТС] #9
все двойки нужно сместить вверх, все единички вниз. каждая единичка и двойка может за раз перемещаться только на одну ячейку, и перемещаться может только на пустую, тоесть с нулём местами меняться

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

Добавлено через 38 секунд
только сами условия у меня косячные
0
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 нажимай. работает?
1
barmalei_slv
23 / 23 / 1
Регистрация: 29.10.2008
Сообщений: 69
18.12.2009, 14:59  [ТС] #11
Добавлено через 3 минуты
да, всё работает отлично! а как сделать, чтоб не по нажатию выходило, а просто отсортированный массив ниже вышел и всё? ты меня очень выручил!
0
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();
}
а в аську то зачем...
1
barmalei_slv
23 / 23 / 1
Регистрация: 29.10.2008
Сообщений: 69
18.12.2009, 16:43  [ТС] #13
еще раз огромное спасибо))а в аську.. просто отблагодарить хотел по-человечески)) ты время своё тратил как-никак)
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2009, 16:43
Привет! Вот еще темы с ответами:

Написать программу сортировки через указатели на указатели - C++
Вот моя программа #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string&gt; using namespace std; //Сортировка &quot;пузырьком&quot;. ...

Используются ли на практике указатели на указатели объектов? - C++
Имеются ввиду указатели именно на объекты, а не динамические массивы. Например такой: Object** obj; А как насчёт такого: Object***...

Указатели на массивы. Указатели и функции - C++
Вот задача: Даны два массива : А и B. Необходимо создать третий массив, в котором нужно собрать: -Элементы обоих массивов; -Общие...

Константные указатели и указатели на константу - C++
Чем они, собственно говоря, отличаются? Поясните, пожалуйста. Не знаю, как так получилось, что в разных источниках - разные...


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

Или воспользуйтесь поиском по форуму:
13
Yandex
Объявления
18.12.2009, 16:43
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru