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

Заполнение двумерного массива без вложенных циклов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Бородатый Админ
1 / 1 / 0
Регистрация: 17.11.2012
Сообщений: 27
17.11.2012, 02:27     Заполнение двумерного массива без вложенных циклов #1
Даны два числа n и m. Создайте двумерный массив int A[n][m], заполните его таблицей умножения A[i][j]=i*j и выведите на экран. При этом нельзя использовать вложенные циклы, все заполнение массива должно производиться одним циклом, например, for(i=0;i<n*m;++i).
Как такое можно реализовать? Нужно каким-то образом плясать от индекса, как мне кажется, но вот как?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.11.2012, 02:27     Заполнение двумерного массива без вложенных циклов
Посмотрите здесь:

C++ Заполнение двумерного массива
C++ Заполнение двумерного массива.
C++ Наименьшее общее кратное для массива(с использованием вложенных циклов)
заполнение двумерного массива C++
C++ Заполнение двумерного массива
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,902
Записей в блоге: 2
Завершенные тесты: 1
17.11.2012, 02:31     Заполнение двумерного массива без вложенных циклов #2
Цитата Сообщение от Бородатый Админ Посмотреть сообщение
Как такое можно реализовать? Нужно каким-то образом плясать от индекса, как мне кажется, но вот как?
Если это действительно массив, то (pArray+N*M-1) будет последним элементом.
Бородатый Админ
1 / 1 / 0
Регистрация: 17.11.2012
Сообщений: 27
17.11.2012, 02:34  [ТС]     Заполнение двумерного массива без вложенных циклов #3
Цитата Сообщение от Croessmah Посмотреть сообщение
Если это действительно массив, то (pArray+N*M-1) будет последним элементом.
Ну да, и что с того? Это и в задании указано: for(i=0; i<n*m; ++i)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,902
Записей в блоге: 2
Завершенные тесты: 1
17.11.2012, 02:35     Заполнение двумерного массива без вложенных циклов #4
Цитата Сообщение от Бородатый Админ Посмотреть сообщение
Ну да, и что с того? Это и в задании указано: i<n*m
ну тогда в чем проблема?
Бородатый Админ
1 / 1 / 0
Регистрация: 17.11.2012
Сообщений: 27
17.11.2012, 02:37  [ТС]     Заполнение двумерного массива без вложенных циклов #5
Croessmah, в самом заполнении массива. Как заполнить двумерный массив, не используя вложенный цикл? Этого я и не могу придумать. Нам нужно как-то определять второй индекс для текущего элемента a[i][j], хотя у нас только один счетчик есть (i)
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.11.2012, 02:48     Заполнение двумерного массива без вложенных циклов #6
Бородатый Админ, да обычным делением и остатком. Все просто.

Добавлено через 1 минуту
C++
1
2
    for(int i=0;i<n*m;++i)
        A[i/n][i%m] = (i/n)*(i%m);
Добавлено через 6 минут
Хотя, для неквадратной, не сработает, имхо. Не проверял. Надо изменить.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,902
Записей в блоге: 2
Завершенные тесты: 1
17.11.2012, 02:52     Заполнение двумерного массива без вложенных циклов #7
как вариант:
C++
1
2
3
    for(int i=0;i<N*M;++i){
        *(*p+i)=(i/N)*(i%M);
    }
Добавлено через 53 секунды
Цитата Сообщение от Vourhey Посмотреть сообщение
Хотя, для неквадратной, не сработает, имхо. Не проверял. Надо изменить.
Почему не сработает? Должен.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.11.2012, 02:57     Заполнение двумерного массива без вложенных циклов #8
Букву перепутал:
C++
1
A[i/m][i%m] = (i/m)*(i%m);
Должно быть

Добавлено через 20 секунд
Цитата Сообщение от Croessmah Посмотреть сообщение
Почему не сработает? Должен.
Не-не, я ошибся в расчете по строкам
Бородатый Админ
1 / 1 / 0
Регистрация: 17.11.2012
Сообщений: 27
17.11.2012, 03:08  [ТС]     Заполнение двумерного массива без вложенных циклов #9
Цитата Сообщение от Vourhey Посмотреть сообщение
A[i/m][i%m] = (i/m)*(i%m);
Если использовать
C++
1
2
3
4
5
6
7
for(i=0; i<n*m; i++) {
    a[i/m][i%m] = (i/m)*(i%m);
    if(!(i%m))
      cout << a[i/m][i%m] << "\n";
    else
      cout << a[i/m][i%m] << " ";
    }
То получается каша:
http://savepic.su/2933250.png
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,902
Записей в блоге: 2
Завершенные тесты: 1
17.11.2012, 03:12     Заполнение двумерного массива без вложенных циклов #10
Цитата Сообщение от Бородатый Админ Посмотреть сообщение
Если использовать
C++
1
a[i/m][i%m] = (i/m)*(i%m);
замените на
C++
1
a[i/n][i%m] = (i/n)*(i%m);
Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
 
#define N 15
#define M 15
 
int main(){
    int p[N][M];
    for(int i=0;i<N*M;++i){
        *(*p+i)=(i/N)*(i%M);
    }
    
    for(int i=0;i<N;++i){
        for(int j=0;j<M;++j){
            cout.width(4);
            cout<<p[i][j];
        }
        cout<<endl;
    }
    //system("pause");
    return 0;
}
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.11.2012, 03:16     Заполнение двумерного массива без вложенных циклов #11
Цитата Сообщение от Croessmah Посмотреть сообщение
замените на
Код C++
1
a[i/n][i%m] = (i/n)*(i%m);
Не надо. Это у него в коде ошибка.

Добавлено через 1 минуту
Цитата Сообщение от Бородатый Админ Посмотреть сообщение
Если использовать
Код C++
1
2
3
4
5
6
7
for(i=0; i<n*m; i++) {
* * a[i/m][i%m] = (i/m)*(i%m);
* * if(!(i%m))
* * * cout << a[i/m][i%m] << "\n";
* * else
* * * cout << a[i/m][i%m] << " ";
* * }
То получается каша:
http://savepic.su/2933250.png
Каша у тебя получается, потому что выводишь неправильно.

C++
1
2
3
4
5
6
7
8
9
10
11
    int n=5, m=5;
    int A[5][5];
    for(int i=0;i<n*m;++i)
        A[i/m][i%m] = (i/m)*(i%m);
 
    for(int i=0;i<n;++i)
    {
        std::cout<<std::endl;
        for(int j = 0;j<m;++j)
            std::cout<<std::setw(4)<<A[i][j];
    }
Скомпилируй и проверь сам. Эх, если б админы такими были...
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,902
Записей в блоге: 2
Завершенные тесты: 1
17.11.2012, 03:17     Заполнение двумерного массива без вложенных циклов #12
Цитата Сообщение от Vourhey Посмотреть сообщение
Не надо. Это у него в коде ошибка.
тьфу ты блин, точно =))) вообще уже голова не варит, нам же от ширина измерения танцевать то надо.
Бородатый Админ
1 / 1 / 0
Регистрация: 17.11.2012
Сообщений: 27
17.11.2012, 03:24  [ТС]     Заполнение двумерного массива без вложенных циклов #13
Всё, теперь порядок, работает.

Vourhey, Croessmah, спасибо за помощь

Еще только один вопрос:
что означает *(*p+i) в коде Croessmah?
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.11.2012, 03:25     Заполнение двумерного массива без вложенных циклов #14
Цитата Сообщение от Бородатый Админ Посмотреть сообщение
что означает *(*p+i) в коде Croessmah?
Почитай про арифметику указателей.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,902
Записей в блоге: 2
Завершенные тесты: 1
17.11.2012, 03:26     Заполнение двумерного массива без вложенных циклов #15
Цитата Сообщение от Бородатый Админ Посмотреть сообщение
что означает *(*p+i) в коде Croessmah?
элемент массива в результате смещения от p[0][0] до i
Бородатый Админ
1 / 1 / 0
Регистрация: 17.11.2012
Сообщений: 27
17.11.2012, 03:36  [ТС]     Заполнение двумерного массива без вложенных циклов #16
Цитата Сообщение от Croessmah Посмотреть сообщение
элемент массива в результате смещения от p[0][0] до i
Ух ты, то есть с помощью такой конструкции мы можем к любому элементу многомерного массива обратиться используя только один адрес? То есть например a[2][3] == *(a+15) ?
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.11.2012, 03:39     Заполнение двумерного массива без вложенных циклов #17
Цитата Сообщение от Бородатый Админ Посмотреть сообщение
многомерного массива обратиться используя только один адрес?
Не всегда так. Зависит от того, как "массив" лежит в памяти. Потому что они могут быть по-разному инициализированы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2012, 03:41     Заполнение двумерного массива без вложенных циклов
Еще ссылки по теме:

C++ Вычислить сумму следующего ряда без вложенных циклов
Заполнение двумерного массива C++
Заполнение двумерного массива C++

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,902
Записей в блоге: 2
Завершенные тесты: 1
17.11.2012, 03:41     Заполнение двумерного массива без вложенных циклов #18
Цитата Сообщение от Бородатый Админ Посмотреть сообщение
элементу многомерного массива
Массивы могут быть только линейные, все остальное - это имитация многомерности разными способами.
Цитата Сообщение от Бородатый Админ Посмотреть сообщение
*(a+15)
звезду забыли одну.
Yandex
Объявления
17.11.2012, 03:41     Заполнение двумерного массива без вложенных циклов
Ответ Создать тему
Опции темы

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