Форум программистов, компьютерный форум, киберфорум
Наши страницы
JavaScript
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.79
Rayne
76 / 62 / 23
Регистрация: 11.07.2009
Сообщений: 719
#1

Вращение двумерного массива - JavaScript

29.12.2011, 20:17. Просмотров 2813. Ответов 16
Метки нет (Все метки)

задача простая - создать функцию которая примет параметры: N строк и M столбцов, сгенерирует, отсортирует и возвратит массив R. Не могу найти правильное написание заголовка функции и её вызова, с остальным там всё знаю, покажите пожалуйста пример.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2011, 20:17
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вращение двумерного массива (JavaScript):

Удаление из двумерного массива
создаю двумерный массив таким образом <script type="text/javascript"> ...

Печать двумерного массива
Всем примет! Подскажите пожалуйста, почему данные код: var myFamily = new...

Заполнение двумерного массива
Нужно заполнить массив 0, помогите найти ошибку <html> <head> <title>...

Получение данных из двумерного массива
Есть данные вида temp0: Из них нужно получить поля userID, videoID,...

Ошибка в генерации двумерного массива
Добрый день, пытаюсь сгенерировать двумерный массив и заполнить его случайными...

Преобразование из двумерного массива в одномерный
Всем доброго. У меня есть "таблица" ячеек. При клике на ячейку я могу...

16
GuardCat
Просто любитель
618 / 458 / 118
Регистрация: 20.01.2011
Сообщений: 862
Записей в блоге: 2
29.12.2011, 23:19 #2
Задача интересная. Завтра будет время --- сделаю. Только не совсем понятен вопрос с сортировкой двумерного массива, сортировать как: по строкам или по столбцам?
0
Rayne
76 / 62 / 23
Регистрация: 11.07.2009
Сообщений: 719
30.12.2011, 13:43  [ТС] #3
задание не совсем такое на самом деле:
"Создать функцию rotateArray(X, angle), которая генерирует и возвращает массив, представляющий собой развернутый по часовой стрелке на angle градусов массив X. Разрешенные значения angle - 90, 180, 270. При любом другом значении angle функция должна возвращать исходный массив X. "
Как вращать примерно знаю, не знаю как правильно объявить функцию и обратиться к ней. Ответный массив числом строк\столбцов может отличаться от исходного, как например это учесть?Недавно совсем начал язык изучать, с синтаксисом большие проблемы пока
0
Vovan-VE
13148 / 6532 / 1038
Регистрация: 10.01.2008
Сообщений: 15,071
30.12.2011, 16:24 #4
Цитата Сообщение от Rayne Посмотреть сообщение
Создать функцию rotateArray(X, angle), которая генерирует
PHP
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
function rotate(array $matrix, $angle) {
    $angle = (int) $angle;
    switch ($angle) {
        case 180:
            $matrix = array_reverse(array_map('array_reverse', $matrix));
            break;
        
        case 90:
        case 270:
            $matrix = call_user_func_array('array_map', array_merge(array(null), $matrix));
            if (90 == $angle)
                $matrix = array_map('array_reverse', $matrix);
            else
                $matrix = array_reverse($matrix);
            
            break;
    }
    
    return $matrix;
}
 
function dump(array $matrix) {
    echo PHP_EOL;
    foreach ($matrix as $line)
        echo join(' ', $line), PHP_EOL;
}
 
$m = array(
    array(10, 11, 12, 13),
    array(20, 21, 22, 23),
    array(30, 31, 32, 33),
);
 
dump(rotate($m, 0));
dump(rotate($m, 90));
dump(rotate($m, 180));
dump(rotate($m, 270));
Rayne, В приведенном способе решения сутью является результат, а не алгоритм. Если с Вас требуют нормальный алгоритмический вариант, в котором сутью является сам алгоритм, а не результат, то этот способ Вам не подойдет.
1
GuardCat
Просто любитель
618 / 458 / 118
Регистрация: 20.01.2011
Сообщений: 862
Записей в блоге: 2
30.12.2011, 17:51 #5
Ну ё моё. Я под первый запрос написал... Ну выложу, мало ли понадобится...
Функция возвращает двухмерный массив, который сортирует по первому столбцу по возрастанию.
Для наглядности, написал функцию, которая возвращает таблицу, наполненную элементами двухмерного массива.
Всё размещено на тестовом стенде html.
Javascript
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
<html>
    <head>
        <style type = "text/css">
            table.arrayTable {
                border-collapse: collapse;
            }
            table.arrayTable td {
                border: 1px solid black;
                text-align: center;
                padding: 5px;
            }
        </style>
    </head>
    <body>
        <script>
            var array, table;
            /* Принимает число строк и столбцов,
                    возвращает двухмерный массив, отсортированный
                    по возрастанию по первому столбцу. 
            */
            function makeFilledArray (cols, rows) {
                var array = [];
                cols = Math.abs(parseInt(cols));
                rows = Math.abs(parseInt(rows));
                if (!cols || !rows) return [[]];
                while (array.length < rows) {
                    array.push([]);
                    while (array[array.length - 1].length < cols) {
                    array[array.length - 1].push(parseInt(Math.random() * 100)); 
                    }
                }
                array.sort (
                    function (a, b) {
                        if (a[0] < b[0]) return -1;
                        if (a[0] > b[0]) return 1;
                        return 0;
                    }
                );
                return array;
            }
            /* Принимает двухмерный массив, возвращает
             заполненный DOM-объект table
            */
            function makeTableFromArray(array) {
                var 
                    rows = array[0].length, cols = array.length, row,
                    table = document.createElement("table"), tr,td
                ;
                table.className = "arrayTable";
                while(array.length) {
                    tr = document.createElement("tr");
                    row = array.shift();
                    while(row.length){
                        td = document.createElement("td");
                        td.innerHTML = row.shift()
                        tr.appendChild(td); 
                    }
                    table.appendChild(tr);
                }
                return table;
            }
            array = makeFilledArray(prompt("Количество столбцов", ""), prompt("Количество строк",""));
            table = makeTableFromArray(array); 
            document.body.appendChild(table);
        </script>
    </body>
</html>
1
Rayne
76 / 62 / 23
Регистрация: 11.07.2009
Сообщений: 719
30.12.2011, 18:13  [ТС] #6
спасибо, много интересного выяснил отсюда
0
Vovan-VE
30.12.2011, 18:23
  #7

Не по теме:

А, так это JavaScript'а раздел

0
Rayne
30.12.2011, 19:33  [ТС]
  #8

Не по теме:

а я понял я понял что не то) PHP буковки заметил

0
GuardCat
Просто любитель
618 / 458 / 118
Регистрация: 20.01.2011
Сообщений: 862
Записей в блоге: 2
30.12.2011, 21:13 #9
Завтра сделаю повороты. Вращаем двухмерный массив, верно?

Не по теме:

Vovan-VE, ты меня чуть с ума не свёл, пока я пытался понять js, читая php =)

0
Vicont
front-end developer
283 / 274 / 39
Регистрация: 31.08.2010
Сообщений: 577
Записей в блоге: 1
30.12.2011, 21:34 #10
Цитата Сообщение от GuardCat Посмотреть сообщение
пока я пытался понять js, читая php =)
По моему символы $ должны сильно бросаться в глаза!)
0
GuardCat
30.12.2011, 21:40
  #11

Не по теме:

Vicont, я php не знаю просто. Думал, что фреймворк =)

0
Rayne
31.12.2011, 09:25  [ТС]
  #12

Не по теме:

так точно, вращение массива

0
GuardCat
Просто любитель
618 / 458 / 118
Регистрация: 20.01.2011
Сообщений: 862
Записей в блоге: 2
31.12.2011, 19:41 #13
Rayne, прошу прощения, сегодня точно не возьмусь. Неожиданно пришёл НГ =). Приступлю на каникулах (завтра-послезавтра).
0
Vovan-VE
13148 / 6532 / 1038
Регистрация: 10.01.2008
Сообщений: 15,071
01.01.2012, 08:57 #14
Javascript
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
function dump(matrix) {
    var s = [], i, L;
    for (i = 0, L = matrix.length; i < L; i++)
        s.push(matrix[i].join('\t'));
    
    alert(s.join('\n'));
};
 
function transp(matrix) {
    var result = [], y, h, x, w;
    for (y = 0, h = matrix.length; y < h; y++) {
        for (x = 0, w = matrix[y].length; x < w; x++) {
            if (!result[x])
                result[x] = [];
            
            result[x][y] = matrix[y][x];
        };
    };
    return result;
};
 
function rotate(matrix, angle) {
    var result, y, h;
    
    angle = ~~angle;
    switch (angle) {
        case 90:
            result = transp(matrix);
            for (y = 0, h = matrix.length; y < h; y++)
                result[y] = result[y].reverse();
            
            break;
        
        case 180:
            result = matrix.slice(0).reverse();
            for (y = 0, h = result.length; y < h; y++)
                result[y] = result[y].slice(0).reverse();
            
            break;
        
        case 270:
            result = transp(matrix).reverse();
            break;
        
        default:
            result = [];
            for (y = 0, h = matrix.length; y < h; y++)
                result.push(matrix[y].slice(0));
    };
    
    return result;
};
 
var m = [
    [10, 11, 12, 13],
    [20, 21, 22, 23],
    [30, 31, 32, 33]
];
 
dump(rotate(m, 0));
dump(rotate(m, 90));
dump(rotate(m, 180));
dump(rotate(m, 270));

Не по теме:

Увидел-таки, что Array.prototype.reverse() изменяет исходный массив. Как-то раньше, видимо, не особо пользовался этой функцией.

0
GuardCat
Просто любитель
618 / 458 / 118
Регистрация: 20.01.2011
Сообщений: 862
Записей в блоге: 2
02.01.2012, 12:14 #15
Ну вот, пока я праздновал, уже решили задачу =). Ну что ж, тогда реализую поворот без изменения переданного массива. Т.е. функция возвращает развёрнутый массив, не изменяя тот, которй был ей передан. Всё разместил на том же тестовом стенде. Обратите внимание на организацию объявления переменных в функции rotateArray --- сделал по паттерну однократного объявления переменных в функции.

Листинг:
Javascript
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
<html>
    <head>
        <style type = "text/css">
            table.arrayTable {
                border-collapse: collapse;
                margin: 20px;
            }
            table.arrayTable td {
                border: 1px solid black;
                text-align: center;
                padding: 5px;
            }
        </style>
    </head>
    <body>
        <script>
            var array, table, rotatedArray;
            /* Принимает число строк и столбцов,
                    возвращает двухмерный массив, отсортированный
                    по возрастанию по первому столбцу. 
            */
            function makeFilledArray (cols, rows) {
                var array = [];
                cols = Math.abs(parseInt(cols));
                rows = Math.abs(parseInt(rows));
                if (!cols || !rows) return [[]];
                while (array.length < rows) {
                    array.push([]);
                    while (array[array.length - 1].length < cols) {
                    array[array.length - 1].push(parseInt(Math.random() * 100)); 
                    }
                }
                array.sort (
                    function (a, b) {
                        if (a[0] < b[0]) return -1;
                        if (a[0] > b[0]) return 1;
                        return 0;
                    }
                );
                return array;
            }
            /* Принимает двухмерный массив, возвращает
             заполненный DOM-объект table
            */
            function makeTableFromArray(array) {
                var 
                    cols = array[0].length, rows = array.length, row,
                    table = document.createElement("table"), tr, td, x, y
                ;
                table.className = "arrayTable";
                for(x = 0; x < rows; x++) {
                    tr = document.createElement("tr");
                    row = array[x];
                    for(y = 0; y < cols; y++){
                        td = document.createElement("td");
                        td.innerHTML = row[y]
                        tr.appendChild(td); 
                    }
                    table.appendChild(tr);
                }
                return table;
            }
            /*
                    Поворачивает двухмерный массив на нужное число градусов, кратое 90.
                 и возвращает результат поворота. Не меняет исходный массив.
                    Интересный момент: большая часть переменных объявляется один раз
                при первом вызове функции, а при последующих уже просто используются.
                
            */
            rotateArray = (
                function () {
                    var
                        x, y, result,
                        angles = {
                            "90": function () {
                                for(x = 0; x < array[0].length; x++){
                                    result.push([])
                                    for(y = array.length - 1; y >= 0; y--) {
                                        result[result.length - 1].push(array[y][x]);
                                    }
                                }
                                return result;
                            },
                            "180": function () {
                                // не используем reverse, чтобы не изменялся исходный массив.
                                for(x = array.length - 1; x >= 0; x--){
                                    result.push([]);
                                    for(y = array[x].length - 1; y >=0; y--) {
                                        result[result.length - 1].push(array[x][y]);
                                    }
                                }
                                return result;
                            },
                            "270": function () {
                                for(x = array[0].length - 1; x >= 0; x--){
                                    result.push([])
                                    for(y = 0; y < array.length; y++) {
                                        result[result.length - 1].push(array[y][x]);
                                    }
                                }
                                return result; 
                            }
                        }
                    ;
                    return function (array, angle) {
                        result = [];
                        angle = String(angle);
                        if(!(angle in angles)) return array;
                        return angles[angle]();
                    }
                }
            )();
            array = makeFilledArray(prompt("Введите число строк в массиве",""), prompt("Введите число столбцов в массиве","")); //Создать массив
            table = makeTableFromArray(array); // Создать с ним таблицу
            document.body.appendChild(table); // Приделать эту таблицу к Body документа
            rotatedArray = rotateArray(array, prompt("На какой угол повернём массив?","")); // Повернуть массив
            table = makeTableFromArray(rotatedArray); // Создать таблицу с развёрнутым массивом
            document.body.appendChild(table); // Приделать эту таблицу к Body документа
        </script>
    </body>
</html>
А вот здесь можно запустить код и разметку.
0
Vovan-VE
02.01.2012, 12:23
  #16

Не по теме:

Цитата Сообщение от GuardCat Посмотреть сообщение
Ну что ж, тогда реализую поворот без изменения переданного массива. Т.е. функция возвращает развёрнутый массив, не изменяя тот, которй был ей передан.
Так у меня тоже самое происходит - всегда выдается новый массив. Это я просто для себя открыл, что reverse() так себя ведет.

0
GuardCat
02.01.2012, 12:34     Вращение двумерного массива
  #17

Не по теме:

Цитата Сообщение от Vovan-VE Посмотреть сообщение
ак у меня тоже самое происходит - всегда выдается новый массив. Это я просто для себя открыл, что reverse() так себя ведет.
Блин, точно! Ну тогда у меня просто немного другая компоновка кода. И строк меньше)))

1
02.01.2012, 12:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2012, 12:34
Привет! Вот еще темы с ответами:

Вывод двумерного массива на экран
Здравствуйте! У меня возникла проблема с выведением двумерного массива на...

почему не присваиваются элементы двумерного массива?
var k=3; xOtv = new Array(); kolOtv = new Array(); for (m=1;m&lt;k;m++) ...

Определение координат элементов двумерного массива
Сложности с написанием задачи &quot;Постановка задачи: Определить: А) Координаты...

Сортировка двумерного массива, заполненного случайными значениями, по возрастанию
Подскажите в чем ошибка, есть задание: Создайте двумерный массив NxN (значение...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

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