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

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

Войти
Регистрация
Восстановить пароль
 
Relike
6 / 6 / 0
Регистрация: 24.04.2013
Сообщений: 260
#1

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

21.12.2013, 03:06. Просмотров 558. Ответов 10
Метки нет (Все метки)

Дан двумерный массив A размера mXn. Перевернуть каждую его третью строку.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2013, 03:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перевернуть строки в матрице (C++):

Перевернуть строки в матрице - C++
в чем ошибка? не переворачивает нужную строку. #include <iostream> #include <cstdlib> using namespace std; int main() { ...

Найти количество простых чисел в массиве. Перевернуть все нечетные строки матрицы. Перевернуть каждое четное слово в строке - C++
Ребята помогите разобраться в коде программы, написав подробные комменты к данной проге. Спасибо! Постановка задачи 1. Используя...

Вводятся 2 строки. Перевернуть обе строки, склеить и вывести - C++
Помогиет с заданием! Вводятся 2 строки. Перевернуть обе строки, склеить и вывести. 1)тип string Код: #include<iostream> ...

Перевернуть строки на 90 градусов - C++
Вам заданы несколько строчек текста (сначала количество строчек, потом сами строчки). Вам надо перевернуть строки на 90 градусов как в...

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

Строки. Перевернуть первое слово. - C++
перевернуть первое слово в строке по С++. помогите, за 30 минут нужно сделать !!!((

10
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;
}
1
Relike
6 / 6 / 0
Регистрация: 24.04.2013
Сообщений: 260
21.12.2013, 09:53  [ТС] #3
Что-то не работает...
0
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
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;
}
0
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;
}
Попробуй так
1
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;
}
Блин, вот вроде как привильно, но не переворачивает. В чем ошибка?
0
MrGluck
Модератор
Эксперт CЭксперт С++
7496 / 4611 / 694
Регистрация: 29.11.2010
Сообщений: 12,620
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;
    }
}
2
Relike
6 / 6 / 0
Регистрация: 24.04.2013
Сообщений: 260
23.12.2013, 06:14  [ТС] #8
MrGluck, Извините, я не понимаю того как вы пишите...нас так-вот учили...
0
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
23.12.2013, 13:52 #9
Цитата Сообщение от MrGluck Посмотреть сообщение
Ничего, что разница между first и last всегда const и first никогда last не догонит
Опечатка...
Цитата Сообщение от MrGluck Посмотреть сообщение
будет падение при n не кратном 3
Не понимаю я почему тут должно быть падение. Судя по http://en.cppreference.com/w/cpp/concept/RandomAccessIterator
C++
1
2
3
4
5
if ( n >= 0 )
   while(n--) ++r;
else
   while(n++) --r;
return r;
Для указателей это не проблема, так как мы просто ставим указатель на недоступную область памяти но не обращаемся к ней.

Добавлено через 4 минуты
Я еще могу понять если это касается связного списка, где std::next проходиться по узлам списка и на концах будет ссылаться на недоступную область памяти и получение следующего итератора будет невозможным.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7496 / 4611 / 694
Регистрация: 29.11.2010
Сообщений: 12,620
23.12.2013, 15:29 #10
Цитата Сообщение от outoftime Посмотреть сообщение
Не понимаю я почему тут должно быть падение.
так там же просто сдвиг идет на n позиций в нужную сторону без проверки, перешли ли мы за грань или нет.
А мы эту самую грань можем и перескочить.
Дело в том, что std::end указывает не просто на "недоступную область памяти", а на специфический кусок, который идет сразу же за последним элементом. А тут получается на просто какой-то неизвестный участок памяти, но т.к. он не идет за последним элементом, то все ок, продолжаем работать. Думаю, этот момент с проверкой принципиален ввиду реализации итератора end. В любом случае, перескакивать тут просто не красиво, а учитывая, что дело имеем с RandomAccessIterator, то и проверить можно через < и >, миниатюрнейшая оптимизация смысла не имеет.
0
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
23.12.2013, 15:54 #11
MrGluck, увидел, я проверял на неравенство....
0
23.12.2013, 15:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2013, 15:54
Привет! Вот еще темы с ответами:

Перевернуть все нечетные строки матрицы - C++
Перевернуть все нечетные строки матрицы (Использовать функции).

Перевернуть все четные строки матрицы - C++
1.Двумерный массив (Перевернуть все четные строки матрицы.) 2.работа со строками (Удалить каждое четное слово из строки.)

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

Перевернуть все нечётные строки матрицы - C++
Тема: Функции и массивы в С++ Задание: Перевернуть все нечётные строки матрицы Название темы, конечно, впечатляет, но в другой раз...


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

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

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