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

Как всегда у новичков недоразумения с массивами:) - C++

Восстановить пароль Регистрация
 
ForestG
 Аватар для ForestG
32 / 32 / 3
Регистрация: 21.11.2009
Сообщений: 201
15.12.2009, 19:45     Как всегда у новичков недоразумения с массивами:) #1
Короче у меня есть массив динамический 2-х мерный массив заполненный случайными числами от 0-до 100, нужно хотя бы вывести главную и побочную диагональ...

У меня проблема в последней строке хочу что бы выводились числа ... у которых одинаковы индексы if(i==j)
{
cout<<ukazatel[i];
}

он у меня выводит почему-то последний столбец хотя по идее должен выводить главную диагональ?

Вот мой исходник...

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
#include<iostream>   //для работы cin, cout
#include<conio.h>   //для работы getch()
#include<stdlib.h> //для случайных чисел
#include<time.h>
 
using namespace std;
 
int main()
{setlocale( LC_ALL,"Russian" );//Русский язык в консоли
int i,j;
int m;
int *ukazatel;
//int *dop_m_ukaz;
 
cout<<"Двумерный массив M x M!\n Введите размер массива:";
cin>>m;
 
if(m<2)
{
    cout<<"Введите что-нибудь побольше:)";
 
_getch();
return 0;
}
 
cout<<"\n";
 
ukazatel=new int[m*m];
 
dop_m_ukaz=new int[m*2];
 
 
srand((unsigned)time(NULL));
 
int R_MIN=0;
int R_MAX=101;
 
 
cout<<"*******Исходный массив*******\n";
 
for( i = 0; i < m; i++)
{
    cout<<"\n";
 
    for( j = 0; j < m; j++)
    {
        ukazatel[i]=(((double)rand()/RAND_MAX) * R_MAX + R_MIN);
 
        cout<<i<<","<<j<<" = "<<ukazatel[i]<<";"<<" ";
    }
    
}
 
 
cout<<"\n\n******* А ЗДЕСЬ******\n";
 
//int max=*ukazatel;
//int im=0,jm=0;
//int k=0;
 
 
for(i = 0; i < m; i++)
{
    //k=0;
    cout<<"\n";
        
    for(j = 0; j < m; j++)
    {   
        if(i==j)
                 {
                  cout<<ukazatel[i]<<"!!!!";
            }
    }   
} 
 
 
cout<<"\n";
//cout<<"\n MAX = "<<max;
//cout<<"\n Координаты: "<<v<<", "<<v1;
 
_getch();
return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
15.12.2009, 19:55     Как всегда у новичков недоразумения с массивами:) #2
ForestG,
У Вас в программе нет двумерного массива
ForestG
 Аватар для ForestG
32 / 32 / 3
Регистрация: 21.11.2009
Сообщений: 201
15.12.2009, 19:57  [ТС]     Как всегда у новичков недоразумения с массивами:) #3
Ну понятие 2-х мерный массив растижимое

Добавлено через 1 минуту
В VB вообще указатели не нужны, там тупо переменные ставишь вот тебе и динамический массив
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
15.12.2009, 20:06     Как всегда у новичков недоразумения с массивами:) #4
ForestG, Согласен, но в данном случае:
Цитата Сообщение от ForestG Посмотреть сообщение
if(i==j)
не пройдет. У Вас сам принцип понятия двумерного и одномерного массива не правильный.
ForestG
 Аватар для ForestG
32 / 32 / 3
Регистрация: 21.11.2009
Сообщений: 201
15.12.2009, 20:08  [ТС]     Как всегда у новичков недоразумения с массивами:) #5
Возможно, но индексы у меня выводит правильно...
ForestG
 Аватар для ForestG
32 / 32 / 3
Регистрация: 21.11.2009
Сообщений: 201
15.12.2009, 20:09  [ТС]     Как всегда у новичков недоразумения с массивами:) #6
вот
Миниатюры
Как всегда у новичков недоразумения с массивами:)  
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
15.12.2009, 20:24     Как всегда у новичков недоразумения с массивами:) #7
Объясняю, например у Вас m=3. Память выделяется у Вас 3*3 (массив ukazatel), то есть для хранения девяти элементов типа int.
Цитата Сообщение от ForestG Посмотреть сообщение
for( i = 0; i < m; i++)
{
cout<<"\n";
for( j = 0; j < m; j++)
{
ukazatel[i]=(((double)rand()/RAND_MAX) * R_MAX + R_MIN);
cout<<i<<","<<j<<" = "<<ukazatel[i]<<";"<<" ";
}
}
Вот с помощью этого кода три раза присваивается значение элементу массива ukazatel с нулевым индексом, три раза присваивается значение элементу массива ukazatel с индексом номер один и три раза присваивается значение элементу массива ukazatel с индексом номер два (при этом каждое присваивание сопровождается выводом на экран этих значений). Остальным элементам этого массива (с индексами 3-8) значений не присваивается. Вывод на экран вот в этих строках:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
for(i = 0; i < m; i++)
{
//k=0;
cout<<"\n";
 
for(j = 0; j < m; j++)
{ 
if(i==j)
{
cout<<ukazatel[i]<<"!!!!";
}
} 
}
Это просто вывод на экран первых трех элементов массива ukazatel
ForestG
 Аватар для ForestG
32 / 32 / 3
Регистрация: 21.11.2009
Сообщений: 201
15.12.2009, 20:30  [ТС]     Как всегда у новичков недоразумения с массивами:) #8
Ну немного стало понятнее...

Добавлено через 59 секунд
Только как мне выйти из этого положения не знаю
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
15.12.2009, 20:39     Как всегда у новичков недоразумения с массивами:) #9
Если хотите такой принцип объявления оставить, тогда так: Заполнение массива значениями и вывод этих значений на экран:
C++
1
2
3
4
5
6
7
8
9
for( i = 0; i < m; i++)
{
cout<<"\n";
for( j = 0; j < m; j++)
{
ukazatel[i*m+j]=(((double)rand()/RAND_MAX) * R_MAX + R_MIN);
cout<<i<<","<<j<<" = "<<ukazatel[i*m+j]<<";"<<" ";
}
}
Конечный вывод на экран:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
for(i = 0; i < m; i++)
{
//k=0;
cout<<"\n";
 
for(j = 0; j < m; j++)
{ 
if(i==j)
{
cout<<ukazatel[i*m+j]<<"!!!!";
}
} 
}
ForestG
 Аватар для ForestG
32 / 32 / 3
Регистрация: 21.11.2009
Сообщений: 201
15.12.2009, 20:41  [ТС]     Как всегда у новичков недоразумения с массивами:) #10
ukazatel[i*m+j] - а что это?
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
15.12.2009, 20:51     Как всегда у новичков недоразумения с массивами:) #11
Цитата Сообщение от ForestG Посмотреть сообщение
ukazatel[i*m+j] - а что это?
Объясняю принцип: Например массив 3*3 (три строки, три столбца). Реально будет выделен массив размерностью 9.
Например нужен элемент 0 строки, 0 столбца. Тогда обращение к ukazatel[i*m+j] (где i- номер строки, а j - номер столбца) будет соответствено как ukazatel[0] . Например, нужен элемент 0 строки, 1 столбца. Тогда ukazatel[i*m+j] будет ukazatel[1]. Например, нужен элемент 1 строки, 0 столбца. Тогда ukazatel[i*m+j] будет ukazatel[3]. И т.д.
ForestG
 Аватар для ForestG
32 / 32 / 3
Регистрация: 21.11.2009
Сообщений: 201
15.12.2009, 20:56  [ТС]     Как всегда у новичков недоразумения с массивами:) #12
ту так более менее но я это все изучу завтра...

Я передела но проблема...
ForestG
 Аватар для ForestG
32 / 32 / 3
Регистрация: 21.11.2009
Сообщений: 201
15.12.2009, 20:56  [ТС]     Как всегда у новичков недоразумения с массивами:) #13
Вот вывод...
Миниатюры
Как всегда у новичков недоразумения с массивами:)  
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
15.12.2009, 21:01     Как всегда у новичков недоразумения с массивами:) #14
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<iostream> //для работы cin, cout
#include<conio.h> //для работы getch()
#include<stdlib.h> //для случайных чисел
#include<time.h>
 
using namespace std;
 
int main()
{setlocale( LC_ALL,"Russian" );//Русский язык в консоли
int i,j;
int m;
int *ukazatel;
//int *dop_m_ukaz;
 
cout<<"Двумерный массив M x M!\n Введите размер массива:";
cin>>m;
 
if(m<2)
{
cout<<"Введите что-нибудь побольше";
 
_getch();
return 0;
}
 
cout<<"\n";
 
ukazatel=new int[m*m];
 
//dop_m_ukaz=new int[m*2];
 
 
srand((unsigned)time(NULL));
 
int R_MIN=0;
int R_MAX=101;
 
 
cout<<"*******Исходный массив*******\n";
 
for( i = 0; i < m; i++)
{
cout<<"\n";
for( j = 0; j < m; j++)
{
ukazatel[i*m+j]=(((double)rand()/RAND_MAX) * R_MAX + R_MIN);
cout<<i<<","<<j<<" = "<<ukazatel[i*m+j]<<";"<<" ";
}
}
 
 
cout<<"\n\n******* А ЗДЕСЬ******\n";
 
//int max=*ukazatel;
//int im=0,jm=0;
//int k=0;
 
 
for(i = 0; i < m; i++)
{
//k=0;
cout<<"\n";
 
for(j = 0; j < m; j++)
{ 
if(i==j)
{
cout<<ukazatel[i*m+j]<<"!!!!";
}
} 
} 
 
 
 
cout<<"\n";
//cout<<"\n MAX = "<<max;
//cout<<"\n Координаты: "<<v<<", "<<v1;
 
_getch();
return 0;
}
Вот исправленный вариант, работает как нужно
ForestG
 Аватар для ForestG
32 / 32 / 3
Регистрация: 21.11.2009
Сообщений: 201
15.12.2009, 21:03  [ТС]     Как всегда у новичков недоразумения с массивами:) #15
Блин извини я виноват забыл на выводе переправить
cout<<i<<","<<j<<" = "<<ukazatel[i*m+j]<<";"<<" ";
ForestG
 Аватар для ForestG
32 / 32 / 3
Регистрация: 21.11.2009
Сообщений: 201
15.12.2009, 21:07  [ТС]     Как всегда у новичков недоразумения с массивами:) #16
Ну что ж, а остальное сам попробую сделать... там чуть-чуть, найти побочную диоганаль...

А потом я хотел их записать в дополнительный массив, но чтобы их индексы не потерялись...
Потом найти максимальные элементы в доп массиве...
Ну а потом переставить их местами

Как думаешь сработает такой алгоритм, или ерунда?
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
15.12.2009, 21:21     Как всегда у новичков недоразумения с массивами:) #17
Запросто, главное воспринимать такую индексацию правильно. Например побочная диагональ это:
C++
1
2
if(i==m-j-1)
cout<<ukazatel[i*m+j]<<"!!!!";
.
ForestG
 Аватар для ForestG
32 / 32 / 3
Регистрация: 21.11.2009
Сообщений: 201
15.12.2009, 21:25  [ТС]     Как всегда у новичков недоразумения с массивами:) #18
Ага отлично
MotherBoard
Путешественница
 Аватар для MotherBoard
1250 / 478 / 11
Регистрация: 22.02.2009
Сообщений: 2,843
15.12.2009, 23:44     Как всегда у новичков недоразумения с массивами:) #19
Цитата Сообщение от ForestG Посмотреть сообщение
Ага отлично
И не забывайте код в теги заключать,в такие
C++
1
......
...когда пишите код..выделили и нажали вверху сообщения кнопка С, С++ нажали нужную...Чтобы модеров не гонять...
А то форум большой...хватает работы,чтобы всё поправлять...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2009, 19:38     Как всегда у новичков недоразумения с массивами:)
Еще ссылки по теме:

При вынесении определения всегда ли нужно указывать функцию как inline явно? C++
C++ Как сделать чтобы из шаблона всегда возвращался тип наибольшего размера
C++ Работа со строками, как с массивами

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

Или воспользуйтесь поиском по форуму:
ForestG
 Аватар для ForestG
32 / 32 / 3
Регистрация: 21.11.2009
Сообщений: 201
16.12.2009, 19:38  [ТС]     Как всегда у новичков недоразумения с массивами:) #20
Задние было такое создать массив M x 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
119
120
121
122
123
124
125
126
#include<iostream>   //для работы cin, cout
#include<conio.h>   //для работы getch()
#include<stdlib.h> //для случайных чисел
#include<time.h>  //для времени
 
using namespace std;
 
int main()
{setlocale( LC_ALL,"Russian" );//Русский язык в консоли
int i,j;
int m;
int *ukazatel;
int *dop_Glav_ukaz;
int *dop_Pobch_ukaz;
 
cout<<"Двумерный массив M x M!\n Введите размер массива:";
cin>>m;
 
if(m<2)
{
    cout<<"(:Введите что-нибудь побольше:)";
 
_getch();
return 0;
}
cout<<"\n";
 
//2-х мерный массив
ukazatel=new int[m*m];
//дополнительные массивы
dop_Glav_ukaz=new int[m*m];
dop_Pobch_ukaz=new int[m*m];
 
 
srand((unsigned)time(NULL));
 
int R_MIN = 0;
int R_MAX = 101;
 
 
cout<<"*******<< Исходный массив >>*******\n";
 
//переменные max
int max_GlavD = *dop_Glav_ukaz;
int max_PobD = *dop_Pobch_ukaz;
 
//индексы max
int imaxG, imaxP;
 
for( i = 0; i < m; i++)
{
    cout<<"\n";
 
    for( j = 0; j < m; j++)
    {
        ukazatel[i*m+j]=(((double)rand()/RAND_MAX) * R_MAX + R_MIN);
 
 
        cout<<"["<<i<<","<<j<<"] = "<<ukazatel[i*m+j]<<";"<<" ";
        
 
        if(i == j)
 
        {            
            dop_Glav_ukaz[i*m+j]=ukazatel[i*m+j];
        }
 
        if(i == m-1-j)
 
        {
            dop_Pobch_ukaz[i*m+j]=ukazatel[i*m+j];
        }
 
        
        if(max_GlavD < dop_Glav_ukaz[i*m+j])
 
        {
            max_GlavD = dop_Glav_ukaz[i*m+j];
 
                        
            imaxG=i*m+j;
        
        }
 
        if(max_PobD < dop_Pobch_ukaz[i*m+j])
 
        {
            max_PobD = dop_Pobch_ukaz[i*m+j];
 
                        
                    imaxP=i*m+j;
        }
    }
 
}
    
    cout<<"\n\nМаксимальное число в Главной диагонали = "<<max_GlavD;
 
    cout<<"\n\nМаксимальное число в Побочной диагонали = "<<max_PobD;
 
 
////////////////////Так поехали:)//////////////////////////
 
    cout<<"\n\n*******<< Передвинутый массив >>******\n";
        
                //обмен
 
            ukazatel[imaxG] = dop_Pobch_ukaz[imaxP];
    
            ukazatel[imaxP] = dop_Glav_ukaz[imaxG];
 
for(i = 0; i < m; i++)
{
    cout<<"\n";
        
    for(j = 0; j < m; j++)
    {    
        cout<<"["<<i<<","<<j<<"] = "<<ukazatel[i*m+j]<<";"<<" ";
    }
}
 
cout<<"\n";
 
_getch();
return 0;
}
Yandex
Объявления
16.12.2009, 19:38     Как всегда у новичков недоразумения с массивами:)
Ответ Создать тему
Опции темы

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