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

Заполнение квадратной матрицы змейкой по горизонтали - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
nurs888
0 / 0 / 0
Регистрация: 21.07.2014
Сообщений: 8
21.07.2014, 09:29     Заполнение квадратной матрицы змейкой по горизонтали #1
помогите пожалуйста
Даны числа n и m. Создайте массив A[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
#include <iostream>
 
using namespace std;
 
 
 
int main () { 
 
    int n;
    int m,c=0;
    cin>>n>>m;
    int a[n][m];
  
    for(int i = 0; i <n; i++)
        for(int j = 0; j<m; j++){
    
    if(i%2==0){
    {
    a[i][j]=c;
    c++;
    }
    }
    else{
        
        a[m-i-1][j]=c;
    c++;
    }
    
    }
    for(int i = 0; i <n; i++){
        for(int j = 0; j<m; j++)
        cout<<a[i][j]<<" ";}
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2014, 09:29     Заполнение квадратной матрицы змейкой по горизонтали
Посмотрите здесь:

C++ заполнение квадратной матрицы змейкой по вертикали C++
C++ Заполнение Квадратной Матрицы
C++ Заполнение матрицы змейкой по диагонали
заполнение матрицы по диагонали змейкой C++
C++ Заполнение змейкой
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
21.07.2014, 09:41     Заполнение квадратной матрицы змейкой по горизонтали #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
#include <iostream>
#include <iomanip>
using namespace std;
int main () {
    const int n = 5;
    const int m = 5;
    int c=0;
    int a[n][m];
 
    for(int i = 0; i < n; ++i)
        for(int j = 0; j < m; ++j){
            if(i % 2 == 0){
                a[i][j] = c;
                ++c;
            }
            else{
                a[i][m - j - 1l] = c;
                ++c;
            }
        }
    for(int i = 0; i < n; ++i){
        for(int j = 0; j < m; ++j)
            cout << setw(2) << a[i][j] <<" ";
        cout << endl;
    }
    return 0;
}
Vtulhu
369 / 375 / 96
Регистрация: 12.08.2011
Сообщений: 1,610
21.07.2014, 10:19     Заполнение квадратной матрицы змейкой по горизонтали #3
Во-первых, на каждой итерации цикла j происходит проверка i на четность. i же не меняется внутри цикла j!
Во-вторых, c++ происходит в обеих ветках if. Трудно придумать более очевидное нарушение принципа DRY.
В-третьих, цикл можно переписать более понятно. Понятность, самоочевидность - самое ценное качество кода.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int first, last, add;
 
for( int i = 0; i < n; ++i ) {
    if( i & 1 ) {
        first = m - 1;
        last = -1;
        add = -1;
    } else {
        first = 0;
        last = m;
        add = 1;
    }
    for( int j = first; j != last; j += add ) {
        a[i][j] = c++;
    }
}
Psilon
Master of Orion
 Аватар для Psilon
5742 / 4690 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
21.07.2014, 10:57     Заполнение квадратной матрицы змейкой по горизонтали #4
извращенный вариант

C++
1
2
3
for (int i = 0; i < m; i++)            
   for (int j = 0; j < n; j++)                
      a[i][j] = 1 + i * n + i % 2 * (n - 2 * j - 1) + j;
в общем случае m != n.
marina2
Рожденная для битвы
 Аватар для marina2
268 / 48 / 4
Регистрация: 08.11.2009
Сообщений: 1,016
21.07.2014, 12:15     Заполнение квадратной матрицы змейкой по горизонтали #5
Странно, что n и m должны быть только константами.

Добавлено через 46 минут
Люди, поясните, пожалуйста
C++
1
if (i & 1)
& - это же операция взятия адреса
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
21.07.2014, 12:16     Заполнение квадратной матрицы змейкой по горизонтали #6
Цитата Сообщение от marina2 Посмотреть сообщение
& - это же операция взятия адреса
Зависит от контекста использования. В данном случае это битовая операция 'И'.
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,538
Записей в блоге: 27
21.07.2014, 12:19     Заполнение квадратной матрицы змейкой по горизонтали #7
Цитата Сообщение от marina2 Посмотреть сообщение
Странно, что n и m должны быть только константами.
Почему странно? Вполне логично.
Люди, поясните, пожалуйста
Код C++
1
if (i & 1)
& - это же операция взятия адреса
Вовсе нет. Это еще и побитовое И.
Psilon
Master of Orion
 Аватар для Psilon
5742 / 4690 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
21.07.2014, 13:24     Заполнение квадратной матрицы змейкой по горизонтали #8
Помню, читал авторитетное мнение, что все эти i&1 и там замена умножений/делений на сдвиги - только ухудшают читабельность кода, а компилятор и сам спокойно может проводить эти оптимизации. Полностью придерживаюсь данной точки зрения
Vtulhu
369 / 375 / 96
Регистрация: 12.08.2011
Сообщений: 1,610
21.07.2014, 16:31     Заполнение квадратной матрицы змейкой по горизонтали #9
Цитата Сообщение от Psilon Посмотреть сообщение
Помню, читал авторитетное мнение, что все эти i&1 и там замена умножений/делений на сдвиги - только ухудшают читабельность кода, а компилятор и сам спокойно может проводить эти оптимизации. Полностью придерживаюсь данной точки зрения
Так и я тоже. Но нужно хорошо различать совершенно избыточную микрооптимизацию и очевидное улучшение алгоритма. Не знаю, кому как, а мне код (i & 1) кажется самоочевидным. Конечно, для этого надо представлять, что такое биты. Или вот еще, буквально только что в другой теме я оптимизировал цикл, перевернув его задом наперед. Потому что начальный параметр - константа, а конечный - выражение. Выражение элементарное, что-то типа n / 2. Но оно вычислялось на каждой итерации! Это нужная оптимизация? Казалось бы, в данном контексте - нет. Насколько замедляется программа, учитывая еще и очевидную замену деления на битовый сдвиг? Исчезающе малая величина. Наносекунды. Беда в том, что когда произойдет тот один случай из миллиона, когда величина станет существенной, Вы этого не увидите. Потому что не приучили себя видеть это. Глаз уже привык пропускать строчку с параметрами цикла. Думаете, я сказки рассказываю? Такое может произойти с кем угодно, но с Вами, конечно, никогда? Вот, почитайте:

http://avl2.info/index.php?option=co...ammer&Itemid=8
Psilon
Master of Orion
 Аватар для Psilon
5742 / 4690 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
21.07.2014, 16:45     Заполнение квадратной матрицы змейкой по горизонтали #10
Vtulhu, вы уже даете наверное 10 ссылку на этот сайт за последине 24 часа. Можно уже этого не делать? назойливость лишь раздражает.
Не знаю, кому как, а мне код (i & 1) кажется самоочевидным
Мне тоже. А насколько самоочевидный для вас такой код?
C#
1
2
3
4
public static unsafe bool Foo(double d)
{
  return (ulong) (*(long*) &d & 18446744073709551615) > 9218868437227405312UL;
}
хотя новичку конечно будет полезно изучить битовые операции, но в реальности все печальнее зачастую.

Потому что начальный параметр - константа, а конечный - выражение. Выражение элементарное, что-то типа n / 2. Но оно вычислялось на каждой итерации! Это нужная оптимизация?
я полагаю, вы оптимизировали debug-сборку? Потому как в release компилятор обычно и сам умеет границы цикла сохранять во временные переменные. Ну и не только.
nurs888
0 / 0 / 0
Регистрация: 21.07.2014
Сообщений: 8
21.07.2014, 18:45  [ТС]     Заполнение квадратной матрицы змейкой по горизонтали #11
спасибо всем, вот конечный рабочий код
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 <iostream>
 
using namespace std;
int main () {
    int n;
    int m;
    int c=0;
    cin>>n>>m;
    int a[n][m];
 
    for(int i = 0; i < n; ++i)
        for(int j = 0; j < m; ++j){
            if(i % 2 == 0){
                a[i][j] = c;
                ++c;
            }
            else{
                a[i][m - j - 1] = c;
                ++c;
            }
        }
    for(int i = 0; i < n; ++i){
        for(int j = 0; j < m; ++j)
            cout<< a[i][j] <<" ";
        cout << endl;
    }
    return 0;
}
Psilon
Master of Orion
 Аватар для Psilon
5742 / 4690 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
21.07.2014, 18:49     Заполнение квадратной матрицы змейкой по горизонтали #12
nurs888, кстати, любопытно, в чем сакральный смысл такой записи
C++
1
2
3
4
if (a)
  ++c;
else 
  ++c;
?
Vtulhu
369 / 375 / 96
Регистрация: 12.08.2011
Сообщений: 1,610
21.07.2014, 19:46     Заполнение квадратной матрицы змейкой по горизонтали #13
Цитата Сообщение от Psilon Посмотреть сообщение
Vtulhu, вы уже даете наверное 10 ссылку на этот сайт за последине 24 часа. Можно уже этого не делать? назойливость лишь раздражает.
Знаете, на въезде в Нью-Йорк висит огромный плакат: "Если Вам не нравятся гей-браки - не вступайте в гей-брак!"

Цитата Сообщение от Psilon Посмотреть сообщение
Мне тоже. А насколько самоочевидный для вас такой код?
Совершенно не очевидный. Надо гуглить, как хранятся числа в double, потом преобразовывать десятичное число в битовое... Это может быть, например, очень быстрый способ проверить, что дробная часть числа больше 0.5.

Цитата Сообщение от Psilon Посмотреть сообщение
я полагаю, вы оптимизировали debug-сборку? Потому как в release компилятор обычно и сам умеет границы цикла сохранять во временные переменные. Ну и не только.
Я не уверен, что TCC умеет это делать. Но это неважно. Вы никак не поймете мою мысль. Есть вещи, которые я не буду оптимизировать, даже если буду точно знать, что компилятор за меня это не сделает. Потому что это микрооптимизация, которая ускорит программу на неизмеримо малую величину, зато усложнит ее и затуманит смысл. А есть оптимизации, которые я сделаю, и опять-таки вне зависимости от того, что там на этот счет думает компилятор. Во-первых, компиляторы бывают разные. Во-вторых, компилятор может ошибиться и "не понять", что там вообще происходит. Такие случаи бывают! А в-третьих, и это самое главное, эта оптимизация ничего не стоит. Именно в смысловом плане. Другими словами, она не ухудшит код, не затуманит его. Код останется таким же читаемым. А может, и более читаемым. Ведь есть такое понятие, как идиома. Выражение типа while( (c = *str++ ) && c != '\n' ) выглядит сложно, громоздко. Сначала. Потом это читается легко. Потому что это идиома. Она часто встречается. Выражение (i & 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
44
45
46
47
48
49
#include "greatest.h"
 
void copy_without_spaces(char* dst, const char* src)
{
    do {
        if( *src != ' ' ) {
            *dst++ = *src;
        }
    } while( *src++ );
}
 
TEST empty()
{
    char buf[1];
    copy_without_spaces(buf, "");
    ASSERT(buf[0] == '\0');
    PASS();
}
 
TEST spaces_only()
{
    char buf[1];
    copy_without_spaces(buf, "     ");
    ASSERT(buf[0] == '\0');
    PASS();
}
 
TEST a_b()
{
    char buf[3];
    copy_without_spaces(buf, "a   b");
    ASSERT_STR_EQ(buf, "ab");
    PASS();
}
 
SUITE(the_suite)
{
    RUN_TEST(empty);
    RUN_TEST(spaces_only);
    RUN_TEST(a_b);
}
 
GREATEST_MAIN_DEFS();
 
int main(int argc, char **argv) {
    GREATEST_MAIN_BEGIN();      /* command-line arguments, initialization. */
    RUN_SUITE(the_suite);
    GREATEST_MAIN_END();        /* display results */
}
Как Вы думаете, почему? Между прочим, это мой собственный код. Видите, я даже его тестами покрыл. Но потом переписал. Почему? Ну, я бы дал ссылку на статью, объясняющую это, но она опять-таки на том самом сайте...
Psilon
Master of Orion
 Аватар для Psilon
5742 / 4690 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
21.07.2014, 19:56     Заполнение квадратной матрицы змейкой по горизонтали #14
Цитата Сообщение от Vtulhu Посмотреть сообщение
Знаете, на въезде в Нью-Йорк висит огромный плакат: "Если Вам не нравятся гей-браки - не вступайте в гей-брак!"
пожалуйста, но когда у меня под окном орут на параде, это немного напрягает

Короче, предлагаю не спорить. У вас видимо тяжелый день выдался, вы очень бурно реагируете на все. Вопрос в том, что считать "идиоматическим" и в личном отношении, что это "допустимо", а это - нет. То есть не объективно. А значит, и спорить не о чем.
jupi
0 / 0 / 0
Регистрация: 21.07.2014
Сообщений: 3
21.07.2014, 23:24     Заполнение квадратной матрицы змейкой по горизонтали #15
Подскажите пожалуйста, почему студия ругается на объявление массива?

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 <iostream>
 
using namespace std;
int main () {
    int n;
    int m;
    int c=0;
    cin>>n>>m;
    int a[n][m];
 
    for(int i = 0; i < n; ++i)
        for(int j = 0; j < m; ++j){
            if(i % 2 == 0){
                a[i][j] = c;
                ++c;
            }
            else{
                a[i][m - j - 1] = c;
                ++c;
            }
        }
    for(int i = 0; i < n; ++i){
        for(int j = 0; j < m; ++j)
            cout<< a[i][j] <<" ";
        cout << endl;
    }
    return 0;
}
marina2
Рожденная для битвы
 Аватар для marina2
268 / 48 / 4
Регистрация: 08.11.2009
Сообщений: 1,016
22.07.2014, 04:15     Заполнение квадратной матрицы змейкой по горизонтали #16
Цитата Сообщение от jupi Посмотреть сообщение
Подскажите пожалуйста, почему студия ругается на объявление массива?
Особенности Visual C++ наверно.
Размер массива должен быть константой (пост 2)
Vtulhu
369 / 375 / 96
Регистрация: 12.08.2011
Сообщений: 1,610
22.07.2014, 14:19     Заполнение квадратной матрицы змейкой по горизонтали #17
Мы тут спорили, спорили, а ТС ни одной из наших рекомендаций не воспользовался. Какие недочеты у него в коде были, такие и остались. Включая очевидный повтор ++c, в который его ткнули носом несколько разных людей.

Страшно далеки мы от народа...
jupi
0 / 0 / 0
Регистрация: 21.07.2014
Сообщений: 3
22.07.2014, 22:52     Заполнение квадратной матрицы змейкой по горизонтали #18
Цитата Сообщение от marina2 Посмотреть сообщение
Особенности Visual C++ наверно.
Размер массива должен быть константой (пост 2)
действительно, в qt никаких проблем не возникает) спасибо
marina2
Рожденная для битвы
 Аватар для marina2
268 / 48 / 4
Регистрация: 08.11.2009
Сообщений: 1,016
24.08.2014, 07:40     Заполнение квадратной матрицы змейкой по горизонтали #19
jupi, чтобы избежать использование констант, можно создать массив по ссылке, например
C++
1
2
3
int ** a = new int * [n];
     for(int i = 0; i < n; i++)
       a [i] = new int [m];
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2014, 13:45     Заполнение квадратной матрицы змейкой по горизонтали
Еще ссылки по теме:

Заполнение не квадратной матрицы по диагоналям змейкой C++
C++ Заполнение матрицы змейкой
C++ Заполнение квадратной матрицы

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

Или воспользуйтесь поиском по форуму:
gru74ik
24.08.2014, 13:45     Заполнение квадратной матрицы змейкой по горизонтали
  #20

Не по теме:

Цитата Сообщение от Vtulhu Посмотреть сообщение
Страшно далеки мы от народа...
Профдеформация

Yandex
Объявления
24.08.2014, 13:45     Заполнение квадратной матрицы змейкой по горизонтали
Ответ Создать тему
Опции темы

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