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

Динамический массив - C++

Восстановить пароль Регистрация
 
Элеонора
 Аватар для Элеонора
7 / 2 / 1
Регистрация: 20.09.2010
Сообщений: 39
17.09.2012, 20:09     Динамический массив #1
Распечатать элементы динамического массива mas[][] в одномерный динамический a[].
1 по правым диагоналям, начиная с правого верхнего элемента
2 по спирали, начиная с центрального элемента

Массив забила элементами, а с алгоритмом не могу разобраться(
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
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <iostream>
using std::cout;
#define N 5
#define M 5
 
 
int _tmain(int argc, _TCHAR* argv[])
{ 
   int i, j, n, tmp;
   unsigned char **mas;
   unsigned char *m;
   unsigned char *a;
   srand(time(NULL));
 
    mas = (unsigned char**) malloc(M * sizeof(unsigned char*));
    a = (unsigned char*) malloc(M * sizeof(unsigned char*));
    
    for (i=0; i<M; i++)
    {
        mas[i] = (unsigned char*) malloc(N * sizeof(unsigned char));
        a[i] = (unsigned char) malloc(M * sizeof(unsigned char));
    
        for (i=0; i<M; i++)
        {   mas[i] = (unsigned char*) malloc(N * sizeof(unsigned char));
            for (j=0; j<N; j++)
            { 
                
                 mas[i][j]=(rand()%100);
            }
        }
    }
                
     for (i=0; i<M; i++)
    {
        printf("\n\n");
        for (j=0; j<N; j++)
            printf("%7.1u", mas[i][j]);
    }
     printf("\n\n");
 
getch();
return 0;
 
}
Добавлено через 23 минуты
Help me, please ^_^
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2012, 20:09     Динамический массив
Посмотрите здесь:

Можно ли в классе создавать массив переменной длинны. Например динамический массив? C++
Массив: передать динамический массив в функцию и записать в каждый элемент строку из файла C++
динамический массив (Целое число разложить на массив простых множителей) C++
C++ Динамический массив строк (считать с файла строки и поместить их в динамический массив строк)
Создать динамический массив (Если чётных чисел больше, то массив должен быть укорочен на 2 элемента) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
RinatV
115 / 108 / 5
Регистрация: 15.05.2012
Сообщений: 317
Записей в блоге: 10
17.09.2012, 20:25     Динамический массив #2
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
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <iostream>
using std::cout;
#define N 5
#define M 5
 
 
int _tmain(int argc, _TCHAR* argv[])
{ 
   int i, j, n, tmp;
   unsigned char **mas;
   unsigned char *m;
   unsigned char *a;
   srand(time(NULL));
 
    mas = (unsigned char**) malloc(M * sizeof(unsigned char*));
    a = (unsigned char*) malloc(M * N * sizeof(unsigned char*)); // будет размером M*N
    
    for (i=0; i<M; i++)
    {
        mas[i] = (unsigned char*) malloc(N * sizeof(unsigned char));
/*        a[i] = (unsigned char) malloc(M * sizeof(unsigned char));  // не нужно его инициализировать каждый раз*/
    
/*        for (i=0; i<M; i++)
        {   mas[i] = (unsigned char*) malloc(N * sizeof(unsigned char)); // тоже не нужно*/
            for (j=0; j<N; j++)
            { 
                
                 mas[i][j]=(rand()%100);
            }
/*      } */
    }
                
     for (i=0; i<M; i++)
    {
        printf("\n\n");
        for (j=0; j<N; j++)
            printf("%7.1u", mas[i][j]);
    }
     printf("\n\n");
// тут должен быть код задач
// тут должен быть вывод массива a
getch();
return 0;
 
}
в итоге правильная заготовка
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
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <iostream>
using std::cout;
#define N 5
#define M 5
 
 
int _tmain(int argc, _TCHAR* argv[])
{ 
   int i, j, n, tmp;
   unsigned char **mas;
   unsigned char *m;
   unsigned char *a;
   srand(time(NULL));
 
    mas = (unsigned char**) malloc(M * sizeof(unsigned char*));
    a = (unsigned char*) malloc(M * N * sizeof(unsigned char*));
    
    for (i=0; i<M; i++){
        mas[i] = (unsigned char*) malloc(N * sizeof(unsigned char));
        for (j=0; j<N; j++){ 
            mas[i][j]=(rand()%100);
        }
    }
 
 
    for (i=0; i<M; i++){
        printf("\n\n");
        for (j=0; j<N; j++)
            printf("%7.1u", mas[i][j]);
    }
    printf("\n\n");
 
// тут должен быть код задач
 
    printf("\n\n");
    for (i=0; i<N*M; i++)
        printf("%7.1u", a[i]);
    printf("\n\n");
    getch();
 
    return 0;
}
Элеонора
 Аватар для Элеонора
7 / 2 / 1
Регистрация: 20.09.2010
Сообщений: 39
17.09.2012, 20:31  [ТС]     Динамический массив #3
А как быть с алгоритмами вывода по диагоналям?
RinatV
115 / 108 / 5
Регистрация: 15.05.2012
Сообщений: 317
Записей в блоге: 10
18.09.2012, 00:28     Динамический массив #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int k=0;
int c=1;//количество элементов в диоганали
for(int i=M;i>0;i--){
        for(int n=0;n<c;n++){
                a[k]=mas[i+n][n];
                k++;
        }
        if(с<N)c++;     // увеличивается если не достигли дна
}
 
c=(N>M)?M:N; // выбирается минимальная длина стороны
for(int i=0;i<N;i++){
        if((i+c)>N)c--;// уменьшается если начнем упираться в дно
        for(int n=0;n<c;n++){
                a[k]=mas[n][i+n];
                k++;
        }
}
не проверено могут быть ошибки

логика: сперва выбираем данные спускаясь по диагоналям, увеличивая количество элементов в диоганали пока не начнем упиратся в дно в случае продолговаго массива

для нижней части уменьшаем количество элементов когда начинаем упиратся в дно

Добавлено через 1 час 54 минуты
спираль

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
/*
для того чтобы выбрать элементы из массива по спирали можно придумать робот 
работающей по следующей логике
вначале робот находится в некой позиции 
и известны 4 ограничения координат сверху справа снизу всерху 
они равны начальным координатам
в каждом цикле робот забирает элемент под собой 
и двигается в заданном направлении
если он вдруг оказывается выше ограничения направления 
то должен сменить направление и записать новое ограничение направления
таким образом создается спираль
 
робот забирает элементы если они находятся в поле, 
заканчивает работу если собраны все элементы
*/
 
int rn=0,ri=M/2,rj=N/2,ru=ri,rd=ri,rr=rj,rl=rj;
int k=0;
 
while(k<(M*N)){
    if((ri>=0)&&(ri<M)&&(rj>=0)&&(rj<N)){
        a[k]=mas[ri][rj];
        k++;
    }
    switch(rn){
        case 0:
            ri--;
            if(ri<ru){
                ru=ri;
                rn=1;
            }
            break;
        case 1:
            rj++;
            if(rj>rr){
                rr=rj;
                rn=2;
            }
            break;
        case 2:
            ri++;
            if(ri>rd){
                rd=ri;
                rn=3;
            }
            break;
        case 3:
            rj--;
            if(rj<rl){
                rl=rj;
                rn=0;
            }
            break;
    }
}
Yandex
Объявления
18.09.2012, 00:28     Динамический массив
Ответ Создать тему
Опции темы

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