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

Перевернуть строки в матрице - C++

Восстановить пароль Регистрация
 
Relike
 Аватар для Relike
6 / 6 / 0
Регистрация: 24.04.2013
Сообщений: 260
21.12.2013, 03:06     Перевернуть строки в матрице #1
Дан двумерный массив A размера mXn. Перевернуть каждую его третью строку.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Amandosov
Знаток
156 / 156 / 65
Регистрация: 18.11.2012
Сообщений: 411
Записей в блоге: 2
21.12.2013, 08:10     Перевернуть строки в матрице #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
28
29
#include <iostream>
 
using namespace std;
int main()
{
    int n,m;
    int a[100][100];
    int buf;
    cin>>m>>n;
    for(int i=0;i<m;i++)
    for(int j=0;j<n;j++)
    cin>>a[i][j];
 
    for(int i=2;i<m;i+=3)
    for(int j=0;j<n/2;j++)
    {
      buf=a[i];
      a[i]=a[n-i-1];
      a[n-i-1]=buf;
    }
    
    for(int i=0;i<m;i++)
    {
        cout<<endl;
        for(int j=0;j<n;j++)
        cout<<a[i][j]<<' ';
    }
   return 0;
}
Relike
 Аватар для Relike
6 / 6 / 0
Регистрация: 24.04.2013
Сообщений: 260
21.12.2013, 09:53  [ТС]     Перевернуть строки в матрице #3
Что-то не работает...
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
21.12.2013, 10:16     Перевернуть строки в матрице #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <iterator>
#include <algorithm>
 
template<size_t N, size_t M>
void revert(int (&a)[N][M]) {
    for (auto it = std::begin(a); it != std::end(a); it += 3)
        for (int *first = *it, *last = *it + M - 1; first < last; )
            std::iter_swap(first++, last++);
}
 
int main(int argc, char *argv[])
{
    const int n = 10, m = 10;
    int a[n][m];
    
    revert(a);
 
    return EXIT_SUCCESS;
}
Amandosov
Знаток
156 / 156 / 65
Регистрация: 18.11.2012
Сообщений: 411
Записей в блоге: 2
21.12.2013, 11:16     Перевернуть строки в матрице #5
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
#include <iostream>
using namespace std;
int main()
{
* * int n,m;
* * int a[100][100];
* * int buf;
* * cin>>n>>m;
* * for(int i=0;i<m;i++)
* * for(int j=0;j<n;j++)
* * cin>>a[i][j];
for(int i=2;i<m;i+=3)
* * for(int j=0;j<n/2;j++)
* * {
* * * buf=a[i];
* * * a[i]=a[n-i-1];
* * * a[n-i-1]=buf;
* * }
for(int i=0;i<m;i++)
* * {
* * * * cout<<endl;
* * * * for(int j=0;j<n;j++)
* * * * cout<<a[i][j]<<' ';
* * }
* *return 0;
}
Попробуй так
Relike
 Аватар для Relike
6 / 6 / 0
Регистрация: 24.04.2013
Сообщений: 260
23.12.2013, 02:45  [ТС]     Перевернуть строки в матрице #6
Amandosov, не работает...

Добавлено через 12 часов 58 минут
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
#include <iostream>
#include <cstdlib> 
using namespace std;
int main()
{
    int m, n, **a, i, j, s;
    cout<<"vvedite kol-vo strok "; cin>>m;
    cout<<"vvedite kol-vo stol-v "; cin>>n;
    a = new int *[m];
    for(i=0;i<m;i++){
        a[i] = new int[n]; 
        }
    for(i = 0; i<m; i++){
        for(j = 0; j<n; j++){
            cout<<"a["<<i+1<<"],["<<j+1<<"] = "; cin>>a[i][j];
            }
        }
    for(i=0;i<m;i++, cout<<"\n"){
        for(j=0;j<n;j++,cout<<"\t"){
            cout<<a[i][j];
            }
        }
    for(i=2; i<m; i=i+3){
        for(j=0;j<n;j++){
            s = a[i][j];
            a[i][j] = a[i][n-1-j];
            a[i][n-1-j] = s;
            }
        }
    cout<<"\nitog :\n";
        for(i=0;i<m;i++, cout<<"\n"){
        for(j=0;j<n;j++,cout<<"\t"){
            cout<<a[i][j];
            }
        }
system("pause");
return 0;
}
Блин, вот вроде как привильно, но не переворачивает. В чем ошибка?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
23.12.2013, 03:12     Перевернуть строки в матрице #7
Цитата Сообщение от outoftime Посмотреть сообщение
first < last; )
* * * * * * std::iter_swap(first++, last++);
Ничего, что разница между first и last всегда const и first никогда last не догонит

Добавлено через 1 минуту
И что здесь
Цитата Сообщение от outoftime Посмотреть сообщение
for (auto it = std::begin(a); it != std::end(a); it += 3)
будет падение при n некратном 3?

Добавлено через 5 минут
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>
#include <iterator>
#include <algorithm>
 
template<size_t N, size_t M>
void revert(int (&a)[N][M]) {
    for (auto it = std::begin(a); it < std::end(a); it += 3)
        for (int *first = *it, *last = *it + M-1; first < last;
            std::iter_swap(first++, last--) );
}
 
int main()
{
    const int n = 10, m = 10;
    int a[n][m];
    for (int i=0; i < n; i++)
        for (int j=0; j < m; j++)
            a[i][j] = i*m + j;
 
    revert(a);
 
    for (int i=0; i < n; i++)
    {
        for (int j=0; j < m; j++)
            std::cout << a[i][j] << " ";
        std::cout << std::endl;
    }
}
Relike
 Аватар для Relike
6 / 6 / 0
Регистрация: 24.04.2013
Сообщений: 260
23.12.2013, 06:14  [ТС]     Перевернуть строки в матрице #8
MrGluck, Извините, я не понимаю того как вы пишите...нас так-вот учили...
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
23.12.2013, 13:52     Перевернуть строки в матрице #9
Цитата Сообщение от MrGluck Посмотреть сообщение
Ничего, что разница между first и last всегда const и first никогда last не догонит
Опечатка...
Цитата Сообщение от MrGluck Посмотреть сообщение
будет падение при n не кратном 3
Не понимаю я почему тут должно быть падение. Судя по http://en.cppreference.com/w/cpp/con...AccessIterator
C++
1
2
3
4
5
if ( n >= 0 )
   while(n--) ++r;
else
   while(n++) --r;
return r;
Для указателей это не проблема, так как мы просто ставим указатель на недоступную область памяти но не обращаемся к ней.

Добавлено через 4 минуты
Я еще могу понять если это касается связного списка, где std::next проходиться по узлам списка и на концах будет ссылаться на недоступную область памяти и получение следующего итератора будет невозможным.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
23.12.2013, 15:29     Перевернуть строки в матрице #10
Цитата Сообщение от outoftime Посмотреть сообщение
Не понимаю я почему тут должно быть падение.
так там же просто сдвиг идет на n позиций в нужную сторону без проверки, перешли ли мы за грань или нет.
А мы эту самую грань можем и перескочить.
Дело в том, что std::end указывает не просто на "недоступную область памяти", а на специфический кусок, который идет сразу же за последним элементом. А тут получается на просто какой-то неизвестный участок памяти, но т.к. он не идет за последним элементом, то все ок, продолжаем работать. Думаю, этот момент с проверкой принципиален ввиду реализации итератора end. В любом случае, перескакивать тут просто не красиво, а учитывая, что дело имеем с RandomAccessIterator, то и проверить можно через < и >, миниатюрнейшая оптимизация смысла не имеет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2013, 15:54     Перевернуть строки в матрице
Еще ссылки по теме:

Найти количество простых чисел в массиве. Перевернуть все нечетные строки матрицы. Перевернуть каждое четное слово в строке C++
C++ Вводятся 2 строки. Перевернуть обе строки, склеить и вывести
Перевернуть все нечетные строки матрицы C++

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

Или воспользуйтесь поиском по форуму:
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
23.12.2013, 15:54     Перевернуть строки в матрице #11
MrGluck, увидел, я проверял на неравенство....
Yandex
Объявления
23.12.2013, 15:54     Перевернуть строки в матрице
Ответ Создать тему
Опции темы

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