Последние новости

YoungCoder теперь и на Stepikе. Записывайтесь: https://vk.cc/75rISy

Чтобы записаться на курс, необходимо зарегистрироваться на Степике: https://vk.cc/75rIC4

Это моя личная ссылка-приглашение на Stepik для вас. Регистрируясь по этой ссылке, записываясь на курсы и решая задачи, Вы помогаете автору данного сайта принять участие в конкурсе платформы Stepik! Подробности конкурса здесь: https://vk.cc/75rKuS

воскресенье, 27 октября 2013 г.

Занятие 19. Двумерные массивы.


Добрый день друзья.
Сегодня затронем новую тему. Двумерные массивы. Или их еще называют матрицы.   

Прочитайте улучшенную версию этого урока "Двумерные массивы".

В новой версии:

  • Ещё более доступное объяснение
  • Дополнительные материалы
  • 10 задач на программирование с автоматической проверкой решения

Что такое двумерный массив?

Двумерный массив это прямоугольная таблица с определенным количеством строк и столбиков.  Каждая строка и каждый столбик имеют свой порядковый номер. На рисунке изображен двумерный массив, который имеет 6 строк и 7 столбцов.
Рис.1. Двумерный массив. Общий вид.

Обратите внимание, что столбцы и строки нумеруются, начиная с нуля, как и в одномерных массивах.
Сразу же покажу, как объявить двумерный массив. В сущности, ничего нового. Синтаксис прост и очень похож на объявление обычного массива и любой другой переменной.  Сначала указываем тип данных, затем имя массива, а после в квадратных скобках его размерность, то есть количество строк и количество столбиков.  На рисунке ниже мы объявили двумерный массив размерностью 6 на 7.
Рис.2 Двумерный массив, объявление.

Важно помнить, что первая строка и первый столбик имеют индекс нуль, поэтому последняя строка будет иметь номер не шесть, а пять, и аналогично последний столбец будет иметь номер шесть, а не семь.
Кстати, нельзя путать местами строки и столбики. Сначала записывается количество строк, потом количество столбиков.

Следующий естественный вопрос:

Как работать с двумерным массивом?

Как и другие переменные, двумерные массивы мы можем инициализировать  при их объявлении. Для этого нам нужно указать все элементы массива. Делается это следующим образом.

Листинг 19.1
int arr [2][4] = {{1,2,4,29},{3,4,6,1}};

Записанный выше код создает массив с двумя строчками и четырьмя столбцами, и присваивает каждому элементу определенные значения. Получится вот такой массив.
Рис.3. Двумерный массив инициализированный при объявлении


Кроме того, мы можем задать только некоторые элементы массива, тогда остальные будут заполнены нулями. Например:

Листинг 19.2
int arr [2][4] = {{1,2,4},{3,4}};

При таком объявлении мы получим массив, который изображен на следующем рисунке.
Рис.4. Двумерный массив, инициализированный не полностью.


Понятно, что если у нас будет большой массив, то мы замучаемся так все записывать. Да и редко такое бывает нужно.  

Как работать с отдельным элементом массива.

Понятно, что любой элемент задается номер строки и столбца, на пересечении которых он расположен.  Посмотрите на следующий рисунок. На нем мы выбрали элемент, который находится во второй строке и третьем столбике (в естественной нумерации).

Рис.5. Обращение к элементу двумерного массива.

Обращение к конкретному элементу происходит так же, как и в одномерном массиве. Сначала пишут имя массива, а затем, в квадратных скобках номер строки и номер столбика.  Опять напоминаю, сначала идет номер строки, а потом номер столбика. Не путайте это. А так же, помните, что нумерация идет не с единицы, а с нуля.  Это очень частая ошибка, всегда следите за этим.

Помните, когда мы хотели пройтись по всему одномерному массиву, мы использовали цикл for, который изменял наш индекс. Так как в двумерном массиве у нас два индекса ( один для строки и один для столбца), то для того, чтобы пройтись по всему массиву нам потребуется два вложенных цикла for. Разберите следующий пример. 

Листинг 19.3
#include <stdio.h> 
int main (){ 
      int arr [2][4] = {{1,2,4},{3,4}}; 
      for (int i=0; i<2; i++){ // 1 цикл 
            for (int j=0; j<4; j++) // 2 цикл 
                  printf("%d\t",arr[i][j]); 
            printf("\n"); 
      } 
return 0; 
}  
Данная программа, выводит последовательно все элементы массива. Результат её работы, представлен на следующем рисунке.
Рис.6. Двумерный массив. Поэлементный вывод на экран.

Как  работает вложенный цикл, вам уже должно быть понятно.
Сначала переменной i присваивается значение нуль, проверяется условие 0<2, и так как оно выполняется, программа начинает выполнять тело первого цикла. В теле первого цикла программа опять попадает в цикл, теперь уже второй. Переменной j присваивается значение 0 и проверяется условие 0<4. Оно истинно, поэтому выполняется тело второго цикла. Оно состоит из одной инструкции вывода на экран элемента arr[i][j]. Так как на данном шаге у нас i=0 j=0, то выводится значение элемент из нулевой строки и нулевого столбика. В нашем примере это элемент число 1. Тело второго цикла закончилось, происходит увеличение j на единицу j=1.
Проверка условия 1<4. Выполнение тела второго цикла: вывод на экран элемента arr[0][1] в нашем случае это 2. И так далее …
Используя вложенные циклы, мы можем и заполнять двумерные массивы.  

Зачем нужны двумерные массивы?

Двумерные массивы используются для хранения данных одинакового типа и одинаковой структуры. Приведу пример. В одном из практических заданий к прошлым урокам,  необходимо было составить программу, которая хранила оценки ученика по разным предметам. Для их хранения в памяти компьютера мы использовали несколько одномерных массивов. Это было не очень удобно. Для этих же целей, мы могли использовать двумерный массив. Например, нам нужно хранить оценки ученика по русскому, математике, физике и информатике, за целый месяц. Для этого мы создадим массив с 4 строками и 30 столбиками (или наоборот, 30 строк и 4 столбика, кому как больше нравится), и в каждую отдельную строчку будем записывать оценки по какому либо предмету. Это гораздо удобнее и практичнее.
Например, рассмотрим такую задачку. Пусть нам нужно было бы найти среднее арифметическое всех оценок по всем предметам.  Если бы у нас было четыре одномерных массива, то нам пришлось бы писать четыре цикла, в каждом из них считать среднее арифметическое оценок по одному предмету, потом  находить среднее арифметическое этих четырех чисел. Если оценки у нас хранятся в двумерном массиве, нам достаточно будет просто пройтись по всем элементам массива, используя два вложенных цикла for, и найти среднее арифметическое.
Но это еще не всё. Представьте, что вы хотите добавить один предмет и снова посчитать среднюю арифметическую оценку для всех предметов.   Сколько мороки будет, если вы храните оценки в одномерных массивах. Вам придется кучу изменений вносить, дописывать еще один цикл (а вдруг добавилось 7 предметов?). Потом еще среднее искать между этими цифрами.
Другое дело если вы храните оценки в двумерном массиве. Всего лишь изменить условие в одном из циклов. Поменять одно число, представляете как удобно?


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

Если этот материал кажется вам полезным, расскажите о нем друзьям используя кнопки основных социальных сетей, расположенные ниже.

Практическое задание.

Напишите программу, работающую следующим образом. Создайте массив 10 на 10. Заполните его нулями. Считайте два произвольных целых числа с клавиатуры, меньших либо равных 10. Первое число количество строк, второе - количество столбцов.  Напишите функцию, которая заполняет массив по спирали и выводит его на экран. Т.е. если бы мы ввели 6 и 7, то получили бы следующий массив.
При этом табличка  приблизительно должна быть выровнена по центру окна вывода.

Готовое решение пользователя с ником "Дмитрий". За проявленное упорство и трудолюбие, и как первый выполнивший правильно практическое задание, Дмитрий награждается печенькой:

57 комментариев :

  1. Заебись. Красавчик. Так и к успеху скоро придешь. Пиши ещё.

    ОтветитьУдалить
  2. Здравствуйте, подскажите пожалуйста, когда я выполняю построение проекта на visual c++, то консольное окно после выполнения программы сразу закрывается. Это началось пару дней назад. Не знаю почему. Что делать? Спасибо.

    ОтветитьУдалить
    Ответы
    1. Добрый день. Ответ на ваш вопрос есть в F.A.Q.
      http://youngcoder.blogspot.ru/p/blog-page_10.html

      Удалить
    2. заинклудь и допиши в конце мэйна _getch();

      Удалить
    3. Я пользуюсь командой system("pause"); в конце программы перед return 0;

      Удалить
  3. народ, сделал ли кто это практическое задание(массив по спирали). хотелось бы глянуть, так как у самого ни чего не получилось=(

    ОтветитьУдалить
    Ответы
    1. До какого момента вы уже дошли самостоятельно? ))
      Какие есть идеи?

      Удалить
  4. Дали в колледже почти аналогичное задание, только там нужно, чтобы элементы появлялись с задержкой (sleep). Я пытался делать спираль, но ее выводит построчно, а не по спирали.
    Можете дать подсказку, как это можно сделать?

    ОтветитьУдалить
    Ответы
    1. Подсказать что?!Показал бы код)
      Мои предположения,что забыл printf("\n") добавить...Посмотри пример ниже...Я его вставил в цикл по for по i

      Удалить
  5. #include
    #define n 10
    void main()
    {
    int m[n][n],i,j,a,c=1;
    for(a=0;a<n/2;a++)
    {
    for(j=a;j<=n-a-1;j++)
    m[a][j]=c++;
    for(i=a+1;i<n-a;i++)
    m[i][n-a-1]=c++;

    ОтветитьУдалить
  6. for(j=n-a-2;j>=a;j--)
    m[n-a-1][j]=c++;
    for(i=n-a-2;i>=a+1;i--)
    m[i][a]=c++;
    }
    for(i=0;i<n;i++,printf("\n"))
    for(j=0;j<n;j++)
    printf("%3d",m[i][j]);
    }

    ОтветитьУдалить
    Ответы
    1. Прогу разбил на 2 части,так как при переносе полного кода исчезают часть строк))
      Я первый...мне печеньку)

      Удалить
  7. Исправил
    #include
    #define n 5
    void main()
    {
    int m[n][n],i,j,a,c=1;
    for(a=0;a<n/2;a++)
    {
    for(j=a;j<=n-a-1;j++)
    m[a][j]=c++;
    for(i=a+1;i<n-a;i++)
    m[i][n-a-1]=c++;

    ОтветитьУдалить
    Ответы
    1. Этот комментарий был удален автором.

      Удалить
    2. for(j=n-a-2;j>=a;j--)
      m[n-a-1][j]=c++;
      for(i=n-a-2;i>=a+1;i--)
      m[i][a]=c++;
      }
      if((n%2)!=0)
      m[n/2][n/2]=n*n;

      Удалить
    3. for(i=0;i<n;i++,printf("\n\n"))
      for(j=0;j<n;j++)
      printf("%5d",m[i][j]);
      }

      Удалить
    4. Вы облегчили себе задачу. Ваша программа работает только с квадратными матрицами. =)) А в задаче, речь шла о произвольных. =))

      Удалить
    5. Так что без печеньки. =)

      Удалить
  8. //объявление двухмерного массива
    // заполнение спиралью
    #include ((stdio.h))
    #include((iostream))
    int main()
    {
    setlocale(LC_ALL,".1251");//
    int mass[10][10]={{0}};//объявляем двумерный массив 10*10 и заполняем 0
    int i=0,j=-1;//счётчики
    int n,k,c=0,a=0,b=1;//номера строки и столбца
    printf("Введите через пробел номер строки и столбца меньше 10\n");
    scanf("%d %d",&n,&k);
    while((j<(k-1))||(i<(n-1))){//проверка окончания спирали
    while(ja){
    if (mass[i][j-1]==0) mass[i][j-1]=++c;
    j--;
    }
    a++;
    while(i>b){
    if (mass[i-1][j]==0) mass[i-1][j]=++c;
    i--;
    }
    b++;
    }
    for (i=0;i<10;i++){
    printf("\n");
    for(j=0;j<10;j++){
    printf ("%4d",mass[i][j]);
    }
    printf("\n");
    }
    return(0);
    }
    Всё достаточно просто и понятно.Огромное спасибо.Жаль последний урок...

    ОтветитьУдалить
    Ответы
    1. Кажется коряво копировалось, не работает.

      Не последний, будут и другие. =)

      Удалить
  9. KaDeaT, большое спасибо за уроки. было очень интересно. всего наилучшего)

    ОтветитьУдалить
    Ответы
    1. Пожалуйста. надеюсь они вам помогли.
      И это еще не конец. Заходите время от времени, быть может появится что-то новое. =))

      Удалить
  10. Тогда мне печеньку.
    #include

    void fun_spiral (int [10][10], int, int);

    int main ()
    {
    int str, stb;
    int mass_a[10][10] = {};

    printf ("Vvedite razmer matrizi \n");
    scanf ("%i", &str);
    scanf ("%i", &stb);

    fun_spiral (mass_a, str, stb);

    for (int i = 0; i < 10; i++)
    {
    for (int j = 0; j < 10; j++)
    {
    printf ("%i\t", mass_a[i][j]);
    }//for
    printf ("\n");
    }//for str

    return (0);
    }//main

    void fun_spiral (int a[10][10], int str, int stb)
    {
    int z, b, x = 0, y = 1, chislo = 1;

    z = str*stb;

    while (chislo != z+1)//(a[str][x-1] != z)
    {
    for (b = x; b < stb; b++)
    {
    a[x][b] = chislo;
    chislo++;
    }//for

    if (chislo == z+1)
    {
    break;
    }//if

    for (b = y; b < str; b++)
    {
    a[b][stb-1] = chislo;
    chislo++;
    }//for

    if (chislo == z+1)
    {
    break;
    }//if

    y++;
    stb--;

    for (b = stb-1; b > x; b--)
    {
    a[str-1][b] = chislo;
    chislo++;
    }//for

    if (chislo == z+1)
    {
    break;
    }//if

    for (b = str-1; b > x; b--)
    {
    a[b][x] = chislo;
    chislo++;
    }//for

    if (chislo == z+1)
    {
    break;
    }//if

    x++;
    str--;

    }//while
    }//fun_spiral

    ОтветитьУдалить
    Ответы
    1. К сожалению, тоже без печеньки. =)
      1. Код длинный, а Вы его в комментариях написали.
      2. Эти нули излишний, лучше бы попробовали написать программу так, чтобы полученная табличка была выровнена по центру окошка. Это конечно дополнительное задание, но все же. Думаю стоит его добавить в условие задачи. )

      Удалить
    2. Ссылка:
      http://pastebin.ru/LAd8YZNS
      Первое условие выполнено.
      Второе условие, не честное, выполнено: нули убраны, табличка по центру.
      Нули вывел потому, что в условии сказано заполнить массив нулями...я и подумал, что это не просто так, а чтобы их потом и вывести.

      Хочу печеньку.

      Удалить
    3. С первым согласен. Со втором нет. Табличка выровнена по центру лишь по горизонтали, а как же вертикальная составляющая? Ваш способ выравнивания немножечко извращен. Что если сдвинуть полученную матрицу на середину, а потом при выводе просто заменять нули пробелами?
      И еще, сто штук одинаковых if - не порядок. Нужно подумать. =)))

      Удалить
    4. Ссылка:
      http://pastebin.ru/hNlxNutg
      От if избавился причём понял как, но не сразу.
      И всё по центру.

      Удалить
    5. Вот это уже намного лучше. Хотя и тут есть один странный if, повторяющий условие цикла. Можно ли без него? Хотя печеньку вы уже заслужили. Посмотрите конец этого урока. ))

      Удалить
    6. Спасибо, очень вкусно.
      Без этого if даже если изменить условие
      while (!(chislo >= z))
      если ввести, к примеру, 7стр и 3стб
      будет ошибка в таблице.
      Так, что я пока не знаю как по другому.

      Удалить
  11. Здравствуйте, в первую очередь хочу сказать вам огромное спасибо за ваш труд. Не мог долгое время начать заниматься, но благодаря вашим урокам стал обучаться программированию. Вы объясняете все просто и доступно. Самое главное все понятно и написано живым языком. Благодарен от души:)
    Решил задание:
    http://pastebin.ru/A6H3wYsJ

    ОтветитьУдалить
    Ответы
    1. Решили, но не полностью и есть недочеты.
      1. Размерность массива должен вводить пользователь, а не задавать её в программе.
      2. Забыли про выравнивание по центру окошка.
      3. Крайне неоптимально, три вложенных цикла это очень много. )))
      Стоит немножко подумать и переделать. )))

      Удалить
    2. Здравствуйте, переделал)
      http://pastebin.ru/9aXLrLIx
      не понял по поводу 2-го пункта, этого добиться за счет пробелов и табуляций?

      Удалить
  12. Задание спиралька!

    http://pastebin.ru/wB3Tbvzb
    #include "stdio.h"
    #include "stdlib.h"

    void spiral(int [10][10], int, int);

    int main ()
    {
    int a;
    int b;
    int arr_1[10][10] = {{0}};
    for (int i = 0; i < 10; i++){
    for (int j = 0; j < 10; j++)
    printf("%d\t",arr_1[i][j]);
    printf("\n");
    }
    printf("razmer matrici x y?\n");
    scanf("%d %d", &a, &b);

    while((0 > a || a > 10) || (0 > b || b > 10))
    {
    printf("razmer matrici zadan ne verno!\n razmer matrici?\n");
    scanf("%d %d", &a, &b);
    }
    spiral(arr_1, a, b);
    return 0;
    }

    void spiral(int arr[10][10], int a, int b)
    {

    int count = a * b;
    int numb_count = 0;
    int f;
    int j, i;
    int c, d, e, g;
    c = 0; d = 0;
    e = a; g = b;
    i = c; j = d;
    int vert_otstup = (10 - a) / 2;
    int hori_otstup = (10 - b) / 2;

    while (numb_count < count)
    {
    if (count == 1)
    {
    for ((i = c + vert_otstup) && (j = d + hori_otstup); j < g; j++)
    {
    numb_count++;
    printf("vvedite %d 4islo\n", numb_count);
    scanf("%d", &f);
    arr[i][j] = f;
    }
    }
    else
    {
    //строка
    for ((i = c + vert_otstup) && (j = d + hori_otstup); j < g + hori_otstup; j++)
    {
    numb_count++;
    printf("vvedite %d 4islo\n", numb_count);
    scanf("%d", &f);
    arr[i][j] = f;
    }
    c++;

    //столбец
    for((j = g - 1 + hori_otstup) && (i = c + vert_otstup); i < e + vert_otstup; i++)
    {
    numb_count++;
    printf("vvedite %d 4islo\n", numb_count);
    scanf("%d", &f);
    arr[i][j] = f;
    }
    g--;

    //обратная строка
    for((i = e - 1 + vert_otstup) && (j = g - 1 + hori_otstup); j >= d + hori_otstup; j--)
    {
    numb_count++;
    printf("vvedite %d 4islo\n", numb_count);
    scanf("%d", &f);
    arr[i][j] = f;
    }
    e--;

    for((i = e - 1 + vert_otstup) && (j = d + hori_otstup); i > c - 1 + vert_otstup; i--)
    {
    numb_count++;
    scanf("%d", &f);
    arr[i][j] = f;
    }
    d++;
    }
    }
    //vivod massiva
    for (int i = 0; i < 10; i++){ // 1 цикл
    for (int j = 0; j < 10 ; j++) // 2 цикл
    if(arr[i][j] == 0)
    {
    printf(" ");
    }
    else
    {
    printf("%d\t",arr[i][j]);
    }
    printf("\n");
    }
    }

    ОтветитьУдалить
    Ответы
    1. Нет, так не пойдет. Программа должна сама заполнять массив, пользователь вводит только размерность. И код очень огромный, мне это не нравится. Можно сделать проще. )

      Удалить
  13. //укоротил + самоприсваивание значение. Кажется этот варинат краше прежнего)
    http://pastebin.ru/t7cT1Qjk
    #include "stdio.h"

    void spiral(int [10][10], int, int);

    int main ()
    {
    int a;
    int b;
    int arr_1[10][10] = {{0}};

    printf("razmer matrici x y?\n");
    scanf("%d %d", &a, &b);

    spiral(arr_1, a, b);
    return 0;
    }

    void spiral(int arr[10][10], int a, int b)
    {

    int count = a * b;
    int numb_count = 0;
    int j, i;
    int c, d, e, g;
    int a_ots = (10 - a) / 2;
    int b_ots = (10 - b) / 2;
    c = a_ots; d = a_ots;
    e = a + b_ots; g = b + b_ots;
    i = c; j = d;

    while (numb_count = d; j--)//обратная строка
    {
    numb_count++;
    arr[i][j] = numb_count;
    }
    e--;
    for((i = e - 1) && (j = d); i > c - 1; i--)//обратный столбец
    {
    numb_count++;
    arr[i][j] = numb_count;
    }
    d++;
    }
    //vivod massiva
    for (int i = 0; i < 10; i++){ // 1 цикл
    for (int j = 0; j < 10 ; j++) // 2 цикл
    if(arr[i][j] == 0)
    {
    printf("\t");
    }
    else
    {
    printf("%d\t",arr[i][j]);
    }
    printf("\n");
    }
    }

    ОтветитьУдалить
    Ответы
    1. Где-то ошибка. ввожу 5 8 ничего не выводит. )))

      Удалить
  14. Добрый день!
    У меня возник вопрос, вот я беру ваш код:
    #include "stdio.h"
    int main (){
    int arr [2][4] = {{1,2,4},{3,4}};
    for (int i=0; i<2; i++){ // 1 цикл
    for (int j=0; j<4; j++) // 2 цикл
    printf("%d\t",arr[i][j]);
    printf("\n");
    }
    return 0;
    }
    он у меня не компилируется, и говорит что не объявлены i и j. Почему?

    ОтветитьУдалить
  15. Ответы
    1. Хочу оценить лаконичность, но то, что вы залили свой код, как обычный текст мне очень мешает. Сделайте отправку использую опцию C++ или С

      Удалить
    2. вроде нажимал как формать СИ...алгоритм работает на четырех частях цикла фор,,,после первого цикла еще добавил if (side_1==1) break; так как при вводе матрицы в одну строчку и два столбика,вместо "1,2" было "3,2" http://pastebin.ru/76UFuXmR

      Удалить
    3. Плохо, т.к. не выполнено задание.
      1. Заполнять массив должна отдельная функция, а у вас это делается внутри программы.
      2. Программа зациклена, а должна отработать всего один раз.
      3. Если код, который высвечивается в окне "Исходный текст", это то, как вы его написали, то вам стоит задумать над форматированием (отступы там и т.д.).
      Поработайте над этим.)

      Удалить
    4. еще было б неплохо указывать в заданиях приблизительный курс и семестр в универах где попадаются подобные задачи (задача...например курс первый семестр первый)чтоб хоть как то ориентироватся и понимать какого уровня пишут проги например на лаблаторных или дипломных

      Удалить
    5. http://pastebin.ru/mNpcUlg9 прочитал вверху у кого то там что у него в матрице 7х3 например ошибка была, проверил и у меня тоже...уже исправил, лаконично не вышло, надо было вставить по if в каждый фор)))) остальное не вышло))))сделать отдельную функцию пока))................но у меня возник вопрос, почему в языке Си нельзя делать большие матрицы??? например 800х800....ошибка вылетает....если например 700х700 оно считает конечно , но недоходит до конца и тоже вылетает...максимум что посчитало в спиральку это 500х500.......в чем дело??? например я несмогу в загрузить в массив изображение в 1000х1000 пикселов???

      Удалить
    6. Все задачи в курсе не превосходят уровня 1 семестра 1 курса.
      Я забыл еще упомянуть, что у вас очень много составных операторов {}. Не понимаю зачем их столько много.

      Дело в том, что память под массив выделяется на стеке, поэтому когда вы задаете очень большой размер, для него не хватает памяти и всё слетает. Выход: динамические массивы, глобальные массивы.

      Сможете, только для этого не используют массивы обычно.Есть специальные библиотеки для работы с изображениями. Вам не придется заботиться о массиве 1000х1000. Хранить 1 пиксель в 4 байтах это расточительство.

      Удалить
  16. Требуется заполнить массив размера N × N единичками по спирали (начиная с верхнего левого угла по часовой стрелке, см. пример).

    Входные данные
    С клавиатуры вводится число N (нечетное, натуральное и не превышающее 50).

    Выходные данные
    Требуется вывести на экран построенную спираль.

    Примеры
    Входные данные
    7
    Выходные данные
    1111111
    0000001
    1111101
    1000101
    1011101
    1000001
    1111111

    ОтветитьУдалить
  17. Не могу понять как найти центральную точку чтобы от неё начать ставить

    ОтветитьУдалить
  18. #include
    int main(int argc, char *argv[])
    {int n,i,j,b;
    printf("Vedity razmer masyva nechytnoe chislo do 50\n");
    scanf("%d",&n);
    if(n>0&&n<50&n%2)
    {
    int a[n][n];
    for(i=0;i<n;i++)
    {
    for(j=0;j<n;j++)
    {
    a[i][j]=0;

    printf(" %d ",a[i][j]);
    }
    printf("\n");
    }
    }
    else
    printf("Warning\n Chislo n ili nechetnoe ili bolishe 50\n");
    return 0;
    }

    ОтветитьУдалить
  19. Как сделать 2-х мерный массив, но что бы количество столбцов и строк вводились самостоятельно.
    Определить количество строк в которых есть "0". И сортировать строки от минимального до максимального.

    ОтветитьУдалить
    Ответы
    1. создай переменные для считывания коль-ва строк и столбцов, после создай динамический массив с помощью указателей

      int **mass = new int*[a];
      for (int i=0;i<a;i++ )
      ____{
      ________mass[a]=new int[b];
      ____}
      а после методом перебора(пузырька или как-то так админ его называл) более тяжелые елементы на дно

      Удалить
  20. как передать в функцию двумерный и более массив.... статичный и динамичный?

    ОтветитьУдалить
  21. в данном случае я не смог вывести всё одной формулой как в принципе и решить задание в целом
    может позже

    ОтветитьУдалить
  22. //Заполнение 2мерного массива по спирали
    #include
    #include

    using namespace std;

    void Funciklar( int **Mas, int sizeY, int sizeX )
    {
    ____int Summ = sizeX * sizeY;
    ____int CorrectY = 0;
    ____int CorrectX = 0;
    ____int Count = 1;
    ____while( sizeY > 0 )
    ____{
    ________for ( int y = 0; y < 4; y++ )
    ________{
    ____________for ( int x = 0; x < ( ( sizeX < sizeY ) ? sizeY : sizeX ); x++ )
    ____________{
    ________________if ( y == 0 && x < sizeX - CorrectX && Count <= Summ )
    ________________Mas[y + CorrectY][x + CorrectX] = Count++;
    ________________if ( y == 1 && x < sizeY - CorrectY && x != 0 && Count <= Summ )
    ________________Mas[x + CorrectY][sizeX - 1] = Count++;
    ________________if ( y == 2 && x < sizeX - CorrectX && x != 0 && Count <= Summ )
    ________________Mas[sizeY - 1][sizeX - (x + 1)] = Count++;
    ________________if ( y == 3 && x < sizeY - ( CorrectY + 1 ) && x != 0 && Count <= Summ )
    ________________Mas[sizeY - (x + 1)][CorrectY] = Count++;
    ____________}
    ________}
    ________sizeY--;
    ________sizeX--;
    ________CorrectY += 1;
    ________CorrectX += 1;
    ____}
    }

    int main()
    {
    ____setlocale(0,"");
    ____int x;
    ____int y;
    ____cout<<"Введите размерность матрицы X и Y\n";
    ____cin>>x>>y;
    ____cout<<"Матрица с размером "<<x<<"х"<<y<<endl;
    ____//создание
    ____int **matrix=new int*[x];
    ____for (int i=0;i<x;i++)
    ____{
    ________matrix[i]=new int[y];
    ____}
    ____//заполнение
    ____Funciklar(matrix, x, y);
    ____//вывод
    ____for(int a=0;a<x; a++)
    ____{
    ________for(int b=0;b<y;b++)
    ________{
    ____________cout<<matrix[a][b]<<"\t";
    ________}
    ________cout<<endl;
    ____}
    ____for (int i=0; i<x;i++)
    ____{
    ________delete[] matrix[i];
    ____}
    ____delete[] matrix;
    ____return 0;
    }
    Решил вернуться к заданию, тернарные функции упрощают жизнь....
    Если серьезно то код практически копирован из интернета.... щас уже лень завтра буду разбирать

    ОтветитьУдалить
  23. я так похвастаться
    друг на 2 курсе учится дал задание с матрицами на выполнение
    это конечно не по спирали заполнить но
    //Матрица и манипуляции
    #include
    #include
    #include
    #include
    #include
    #include

    using namespace std;

    void zapolnenie(int **matrix, int *sizeX, int *sizeY)
    {
    ____cout<<"Хотите ввести данные вручную? y | n \nВ ином случае данные будут взяты из файла "<>yn;
    ____}while((strncmp(strlwr(yn),"y",1)!=0) && (strncmp(strlwr(yn),"n",1)!=0) );
    ____//выбор ввода

    ____if(strncmp(strlwr(yn),"y",1)==0)//если Y
    ____{
    ________for(int i=0; i<*sizeX; i++, cout<>*znach;
    ________________cout<<"matrix["<<i<<"]["<<ii<<"]="<<*znach;
    ________________matrix[i][ii]=*znach;
    ________________delete znach;
    ____________}
    ________}

    ________fin.close();
    ____}
    ____cout<<"Матрица исходник"<<endl;
    ____for (int i=0; i<*sizeX; i++, cout<<endl)
    ____{
    ________for (int ii=0; ii<*sizeY; ii++)
    ________{
    ____________cout<<"\t["<<i<<"]["<<ii<<"]="<<matrix[i][ii];
    ________}
    ____}//ввод из файла

    }//Ввод данных в матрицу(либо вручную, либо из файла)
    void copy_tran (int **matrix, int **matrixT, int *sizeX, int *sizeY)
    {
    ____for (int i=0;i<*sizeX; i++)
    ____{
    ________for (int ii=0; ii<*sizeY; ii++)
    ________{
    ____________matrixT[ii][i]=matrix[i][ii];
    ________}
    ____}
    ____cout<<"Транспорированая матрица"<<endl;
    ____for (int i=0; i<*sizeY; i++, cout<<endl)
    ____{
    ________for (int ii=0; ii<*sizeX; ii++)
    ________{
    ____________cout<<"\t["<<i<<"]["<<ii<<"]="<<matrixT[i][ii];
    ________}
    ____}
    }//передача значений в транспорированую копию
    int **multipl (int **matrix, int **matrixT, int *sizeX, int *sizeY)
    {
    ____int **matrixM;// создание перемноженого массива
    ____matrixM=new int*[*sizeY];
    ____for (int i=0; i<*sizeY; i++)
    ____{
    ________matrixM[i]=new int[*sizeY];
    ____}
    ____//заполнение и вывод
    ____cout<<"Произведение матрицы на транспорированую мартрицу"<<endl;
    ____int *summ=new int;
    ____for (int i=0;i<*sizeX; i++, cout<<endl)
    ____{
    ________for (int j=0; j<*sizeX; j++)
    ____________{
    ____________for (int p=0; p<*sizeY; p++)
    ____________{
    ________________*summ=(matrix[i][p]*matrixT[p][j]);
    ____________}
    ____________matrixM[i][j]=*summ;
    ____________cout<<"\t["<<i<<"]["<<j<<"]="<<matrixM[i][j];
    ____________*summ=0;
    ________}
    ____}
    ____return matrixM;
    }
    int main()
    {
    ____srand(time(NULL));
    ____setlocale(LC_ALL, "rus");
    ____int *sizeX=new int, *sizeY=new int, **matrix, **matrixT;
    ____cout<<"Введите размеры матрицы = ";
    ____cin>>*sizeX>>*sizeY;
    ____cout<<endl;

    ____matrix=new int *[*sizeX];
    ____for (int i=0; i<*sizeX; i++){
    ________matrix[i]=new int [*sizeY];
    ____}//оригинал

    ____matrixT=new int *[*sizeY];
    ____for (int i=0; i<*sizeY; i++){
    ________matrixT[i]=new int [*sizeX];
    ____}//транспонир

    ____zapolnenie(matrix, sizeX, sizeY);//заполнение
    ____copy_tran(matrix, matrixT, sizeX, sizeY);//копирование данных
    ____multipl (matrix, matrixT, sizeX, sizeY);//умножение матриц
    ____return 0;
    }

    суть такова есть матрица которую нужно траспарировать и помножить на оригинал

    ОтветитьУдалить
    Ответы
    1. размеры матрицы задаю я сам, при этом во всю юзаю указатели уже( блин удалить матрицы забыл.
      я уже коснулся классов, круть я решаю практические задания 2 курса, и я сам до этого дошёл
      в действительности чем больше начинаешь знать тем проще пытаешься выполнить задание

      Удалить

Примечание. Отправлять комментарии могут только участники этого блога.