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

Указатели в двумерном массиве - C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Feni}{
 Аватар для Feni}{
0 / 0 / 0
Регистрация: 02.11.2008
Сообщений: 12
02.01.2009, 07:57     Указатели в двумерном массиве #1
Помогите пожайлуста!!! Как занулить главную диогональ, скока не пробовал, ни как не получается.... не могу найти ошибку
Вот программа которую я написал:
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
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
 
void show_matrix(int *mat, int n)
{
randomize;
 
   for (int i=0;i<n;i++){
   for (int j=0;j<n;j++){
 
      *(mat+i+j)=random(100);
       for (int l=0;l<n;l++){
        for (int s=0;s<n;s++){
 
         *(mat+(n*l+l))=0;
 
         *(mat+s+l)=*(mat+l+s);
 
     }}
   }}
 
    for (int k=0;k<n;k++){
    printf(" \n");
    for (int g=0;g<n;g++){printf("|");printf(" %.2d|",*(mat+k+g));}
    }
    //printf(" -----------------------------------\n");
 
}
 
void main(void)
{
clrscr();
 
int n;
printf("Vvedite n: ");scanf("%d",&n);
int *matrix = new int[n*n];
show_matrix(matrix,n);
getch();
delete []matrix;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
XuTPbIu_MuHTAu
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2219 / 734 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
02.01.2009, 11:06     Указатели в двумерном массиве #2
В перлы однозначно
Код
*(mat+s+l)=*(mat+l+s);//20 строка. Выполняется внутри четырех
             // вложенных циклов,каждый n раз. Т.е всего n в четверой степени 
            // Запомни : от перемены мест слагаемых сумма не меняется..
это ты чего добиться хотел?


В 27-й строке у тебя вывод неправильный нифига еще бы они у тебя занулялись
Доступ к элементу [i,j] матрицы это mas [ i+ j*n],где n - ее длина(число столбцов). Есть другой способ задать матрицу,там по-другому. Но у тебя именно так.

P.S так у тебя буковки для циклов кончатся

Добавлено через 4 минуты 33 секунды
Да,зачем нужны циклы в 15 и16 строке вообще не понял. Зануление главной диагонали делается в один цикл.
Код
for(i=0;i<n;i++) mas[i+i*n]=0;//
Feni}{
 Аватар для Feni}{
0 / 0 / 0
Регистрация: 02.11.2008
Сообщений: 12
02.01.2009, 13:06  [ТС]     Указатели в двумерном массиве #3
C++
1
*(mat+s+l)=*(mat+l+s);
эта строчка делает одинаковыми значения элемента строки и элемента столбца....
то есть матрица должна выглядить так(когда всё прально работает):

0 34 56 78 77
34 0 43 55 99
56 43 0 65 76
78 55 65 0 44
77 99 76 44 0

Добавлено через 30 минут 59 секунд
вот что получилось в итоге:
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
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
 
void show_matrix(int *mat, int n)
{
randomize;
 
   for (int i=0;i<n;i++){
   for (int j=0;j<n;j++){
 
      *(mat+i*n+j)=random(100);
      *(mat+i*n+j)=*(mat+j*n+i);// делаем одинаковым столбец и строку
      *(mat+i*n+i)=0;// зануляем главную диогональ
 
     }}
 
    for (int k=0;k<n;k++){
    printf(" \n");
    for (int g=0;g<n;g++){printf(" %.2d",*(mat+(k*n+g)));}
    }
 
}
 
void main(void)
{
clrscr();
 
int n;
printf("Vvedite n: ");scanf("%d",&n);
int *matrix = new int[n*n];
show_matrix(matrix,n);
getch();
delete []matrix;
}
большое спс за помощь.....
XuTPbIu_MuHTAu
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2219 / 734 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
02.01.2009, 13:08     Указатели в двумерном массиве #4
Feni}{,я тебе еще раз повторяю.От перемены мест слагаемых сумма не меняется. Эта строчка ничего не делает.

Поясню,как строится 2-мерный массив в памяти. Один из вариантов.
[0,0] [0,1] [0,2] ....... [0,n] [1,0] [2,0] ...... [2,n] ....... [n,0] [n,1] ... [n,n]
где запись [i,j] означает элемент на i-й строке j-го столбца.

Как ты должен понимать,память - штука одномерная,она как большая лента. Имитировать двумерность можно,например, записывая строки матрицы друг за другом в памяти. Тогда,чтобы попасть на начало i-й строки нужно сместиться относительно начала массива на i*n элементов.
А твоя запись *(mas + i+j) смещает на i+j элементов отн-но начала,как ты их ни меняй местами.Эта запись,кстати,полностью эквивалентна записи mas[i+j].Сам подумай,последний элемент,к которому ты обратишься будет иметь номер 2n, а у тебя их n^2.

P.S Можно с тем же успехом хранить друг за другом столбцы. Главное понимать,что ты вообще делаешь.
P.P.S Я хочу,чтобы ты взял бумагу,нарисовал "оперативную память" и подумал,как все это работает. В следующий раз хочу увидеть твой работающий код,а не вопрос или неправильное пояснение. Я пояснил принцип.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.01.2009, 14:05     Указатели в двумерном массиве #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
 
#include <stdio.h>
#include <stdlib.h>
 
#define M  4   /* количество строк матрицы    */
#define N  M   /* количество столбцов матрицы */
 
/* обнуляет главную диагональ матрицы */
main()
{
    int *m;
    int i, j;
    
    m = (int *) malloc(M*N*sizeof(int));
    for (i = 0; i < M*N; i++)
        m[i] = i+5;
    for (i = 0; i < M*N; i++)
        printf("%3d%s", m[i], ((i+1)%N == 0 ? "\n" : ""));
    putchar('\n');
    
    for (i = 0, j = 0; i < M*N; i++)
        if (i%N == 0 && j < N)
            m[i+j++] = 0;
    
    for (i = 0; i < M*N; i++)
        printf("%3d%s", m[i], ((i+1)%N == 0 ? "\n" : ""));
    free((void *) m);
    return 0;
}
вывод

Код
[guest@localhost q]$ ./test
  5  6  7  8
  9 10 11 12
 13 14 15 16
 17 18 19 20

  0  6  7  8
  9  0 11 12
 13 14  0 16
 17 18 19  0
[guest@localhost q]$
Feni}{
 Аватар для Feni}{
0 / 0 / 0
Регистрация: 02.11.2008
Сообщений: 12
02.01.2009, 15:50  [ТС]     Указатели в двумерном массиве #6
"Убей" не могу догнать как с помощью указателей сделать, что бы значения элементов столбцов были равны значениям элементов строк...
Помогите пожайлуста.... :'(
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.01.2009, 18:17     Указатели в двумерном массиве #7
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
 
#include <stdio.h>
#include <stdlib.h>
 
#define M  4   /* количество строк квадратной матрицы */
#define K  0   /* число главной диагонали */
 
int **mtxcreat(int m, int n);
int **mtxprint(int **mtx, int m, int n, FILE *ofp);
void mtxfree(int **mtx, int m);
 
/* обнуляет главную диагональ симметричной квадратной матрицы */
main()
{
    int **m;
    int i, j, k;
    
    if ((m = mtxcreat(M, M)) == NULL)
        return 1;
    for (i = 0, k = 0; i < M; k++, i++)
        for (j = k; j < M; j++)
            if (j == k)
                m[i][j] = K;
            else {
                m[i][j] = rand()%10;
                m[j][i] = m[i][j];
            }
    mtxprint(m, M, M, stdout);
    mtxfree(m, M);
    return 0;
}
 
/* mtxcreat:  создаёт матрицу [ m x n ] */
int **mtxcreat(int m, int n)
{
    int **mtx, i;
    
    if ((mtx = (int **) calloc(m, sizeof(int *))) == NULL)
        return NULL;
    for (i = 0; i < m; i++)
        if ((mtx[i] = (int *) calloc(n, sizeof(int))) == NULL) {
            while (--i >= 0)
                free((void *) mtx[i]);
            free((void *) mtx);
            return NULL;
        }
    return mtx;    
}
 
/* mtxprint:  выводит матрицу mtx [ m x n ] в файл ofp */
int **mtxprint(int **mtx, int m, int n, FILE *ofp)
{
    int i, j;
    
    for (i = 0; i < m; i++)
        if (mtx[i] != NULL)
            for (j = 0; j < n; j++)
                fprintf(ofp, "%3d%s",
                    mtx[i][j], (j == n-1 ? "\n" : ""));
    return ferror(ofp) ? NULL : mtx;
}
 
/* mtxfree:  удаляет матрицу mtx на m строк из памяти */
void mtxfree(int **mtx, int m)
{
    int i;
    
    for (i = 0; mtx != NULL && i < m; i++)
        free((void *) mtx[i]);
    free((void **) mtx);
}
вывод
Код
[guest@localhost tmp]$ ./test
  0  3  6  7
  3  0  5  3
  6  5  0  5
  7  3  5  0
[guest@localhost tmp]$
без одномерной матрицы и указателей
Feni}{
 Аватар для Feni}{
0 / 0 / 0
Регистрация: 02.11.2008
Сообщений: 12
02.01.2009, 19:55  [ТС]     Указатели в двумерном массиве #8
Без указателей всё можно сделать намного проще:
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
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
 
int ar[9][9];
 
void main(void){
clrscr();
randomize();
  for (int i=0;i<9;i++){
   for (int j=0;j<9;j++){
    if (i==j){ar[i][j]=0;}
     else {
      ar[i][j]=random(100);
       for (int l=0;l<9;l++){
        for (int s=1;s<9;s++){
         ar[l][s]=ar[s][l];
     }}}
   }}
  for (int k=0;k<9;k++){
    printf(" -----------------------------------\n");
    printf("| %.2d| %.2d| %.2d| %.2d| %.2d| %.2d| %.2d| %.2d| %.2d|\n",ar[k][0],ar[k][1],ar[k][2],ar[k][3],ar[k][4],ar[k][5],ar[k][6],ar[k][7],ar[k][8]);
  }
    printf(" -----------------------------------\n");
    getch();
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2009, 02:24     Указатели в двумерном массиве
Еще ссылки по теме:

C++ Звёздочки в двумерном массиве
C++ Функции в двумерном массиве
C++ Динамика в двумерном массиве
C++ Ошибки индексации в двумерном массиве
Потерялся в двумерном массиве C++

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

Или воспользуйтесь поиском по форуму:
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
03.01.2009, 02:24     Указатели в двумерном массиве #9
поменял массив с одномерного на двумерный ? я для одномерного попробовал, короче работать с ним симметрично это глюк, для диагонали там вообще координаты надо каждый раз вычислять (то есть нужна будет функция mtxgetelem)
Yandex
Объявления
03.01.2009, 02:24     Указатели в двумерном массиве
Ответ Создать тему
Опции темы

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