Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
nurs888
0 / 0 / 0
Регистрация: 21.07.2014
Сообщений: 8
#1

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

21.07.2014, 09:29. Просмотров 1254. Ответов 20
Метки нет (Все метки)

помогите пожалуйста
Даны числа 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2014, 09:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Заполнение квадратной матрицы змейкой по горизонтали (C++):

Заполнение квадратной матрицы змейкой по вертикали - C++
помогите пожалуйста!!!!заполнить квадратную матрицу змейкой по вертикали!!! вот так: 1 8 9 2 7 10 3 6 11 4 5 12... зарание...

Заполнение не квадратной матрицы по диагоналям змейкой - C++
Пробовал написать программу, но мой вариант адекватно работает только с квадратными матрицами. Помогите подправить программу. Вот код: ...

Заполнение матрицы змейкой - C++
Подскажите как мне изменить код #include &lt;iostream&gt; #include &lt;iomanip&gt; using namespace std; int main() { int n; ...

Заполнение матрицы змейкой - C++
Здравствуйте, нужно заполнить матрицу змейкой(картинка змейки вложена). Матрица NxN (1&lt;=N&lt;=10), заполнить числами от 1 до N^2 - 1 по...

Заполнение матрицы змейкой по диагонали - C++
Дано натуральное N (1&lt;=N&lt;=10). Заполнить матрицу порядка NxN целыми числами 0, 1, 2, 3, …, NxN – 1 по диагонали(из правого верхнего угла...

Заполнение матрицы по диагонали змейкой - C++
будьте добры ,помогите написать програму: заполнение матрицы введенными с клавиатуры числами по диагонали змейкой по принципу 1 3 4 ...

20
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 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;
}
0
Vtulhu
371 / 377 / 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++;
    }
}
1
Psilon
Master of Orion
Эксперт .NET
5908 / 4805 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 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.
0
marina2
Рожденная для битвы
272 / 50 / 5
Регистрация: 08.11.2009
Сообщений: 1,023
21.07.2014, 12:15 #5
Странно, что n и m должны быть только константами.

Добавлено через 46 минут
Люди, поясните, пожалуйста
C++
1
if (i & 1)
& - это же операция взятия адреса
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
21.07.2014, 12:16 #6
Цитата Сообщение от marina2 Посмотреть сообщение
& - это же операция взятия адреса
Зависит от контекста использования. В данном случае это битовая операция 'И'.
1
Тамика
Котовчанин
917 / 460 / 145
Регистрация: 16.02.2010
Сообщений: 3,190
Записей в блоге: 27
21.07.2014, 12:19 #7
Цитата Сообщение от marina2 Посмотреть сообщение
Странно, что n и m должны быть только константами.
Почему странно? Вполне логично.
Люди, поясните, пожалуйста
Код C++
1
if (i & 1)
& - это же операция взятия адреса
Вовсе нет. Это еще и побитовое И.
1
Psilon
Master of Orion
Эксперт .NET
5908 / 4805 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 5
Завершенные тесты: 4
21.07.2014, 13:24 #8
Помню, читал авторитетное мнение, что все эти i&1 и там замена умножений/делений на сдвиги - только ухудшают читабельность кода, а компилятор и сам спокойно может проводить эти оптимизации. Полностью придерживаюсь данной точки зрения
0
Vtulhu
371 / 377 / 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
0
Psilon
Master of Orion
Эксперт .NET
5908 / 4805 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 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 компилятор обычно и сам умеет границы цикла сохранять во временные переменные. Ну и не только.
0
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;
}
0
Psilon
Master of Orion
Эксперт .NET
5908 / 4805 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 5
Завершенные тесты: 4
21.07.2014, 18:49 #12
nurs888, кстати, любопытно, в чем сакральный смысл такой записи
C++
1
2
3
4
if (a)
  ++c;
else 
  ++c;
?
0
Vtulhu
371 / 377 / 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 */
}
Как Вы думаете, почему? Между прочим, это мой собственный код. Видите, я даже его тестами покрыл. Но потом переписал. Почему? Ну, я бы дал ссылку на статью, объясняющую это, но она опять-таки на том самом сайте...
0
Psilon
Master of Orion
Эксперт .NET
5908 / 4805 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 5
Завершенные тесты: 4
21.07.2014, 19:56 #14
Цитата Сообщение от Vtulhu Посмотреть сообщение
Знаете, на въезде в Нью-Йорк висит огромный плакат: "Если Вам не нравятся гей-браки - не вступайте в гей-брак!"
пожалуйста, но когда у меня под окном орут на параде, это немного напрягает

Короче, предлагаю не спорить. У вас видимо тяжелый день выдался, вы очень бурно реагируете на все. Вопрос в том, что считать "идиоматическим" и в личном отношении, что это "допустимо", а это - нет. То есть не объективно. А значит, и спорить не о чем.
0
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;
}
0
21.07.2014, 23:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2014, 23:24
Привет! Вот еще темы с ответами:

Заполнение Квадратной Матрицы - C++
Привет Всем ;) Помогите плиз с простенькой прогой , у самого не получается =( Задание: Получить квадратную матрицу, порядка n . ...

Заполнение квадратной матрицы - C++
Здравствуйте. Нужно написать программу заполнения правого верхнего треугольника квадратной матрицы, включая диагональ, последовательностью...

Заполнить матрицу размером n*m змейкой по горизонтали, начиная движение от элемента matrix[0][0] - C++
Необходимо заполнить массив int a следующим образом (пример для n=4, m=6): Пытаюсь сделать вот так, но не получается: for(i=1;...

Заполнение змейкой - C++
заполнение матрицы по диагонали змейкой по принципу 1 3 4 10 2 5 9 11 6 8 12 15 7 13 14 16. Программа работает при вводе данных с...


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

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

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