Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Массивы и функции / 11 сообщений из 11, страница 1 из 1
25.10.2018, 22:50
    #39723152
Gomn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массивы и функции
Помогите пожалуйста решить проблему: мне нужно переделать следующий код так чтоб он был написан через функции, это рабочий код, и вон задания к нему:
Осуществить циклический сдвиг элементов прямоугольной матрицы на п элементов
вправо или вниз (в зависимости от введенного режима), п может быть
больше количества элементов в строке или столбце.
Код: plaintext
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.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
#include "stdafx.h"
#include <iostream>
#include <cstdlib> 
#include <ctime>  
#include <iomanip>
#include <Windows.h>
#include <math.h>
using namespace std;
int main()
{
	setlocale(0, "rus");
	srand(time(NULL));
	int i, j, n, m, k, l, nmin, mmin, q = 0, buf;
	cout << "Введите размерность матрицы: " << endl;
	cout << "Введите количество строк: n =  ";
	cin >> n;
	cout << "Введите количество столбцов:  m = ";
	cin >> m;
	cout << "Введите количество циклов сдвига:  l =  ";
	cin >> l;
	cout << "Нажмите 1-сдвиг вниз, 2-сдвиг вправо: q = ";
	cin >> q;
	int **a = new int*[n];
	for (i = 0; i < n; i++)
		a[i] = new int[m];
	cout << "Введите элементы массива: " << endl;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			a[i][j] = rand() % 100;
			cout << setw(4) << a[i][j];
		}
		cout << endl;
	}
	if (q == 0)
		cout << "Вы не ввели направление сдвига " << endl;
	else
	{
		for (k = 0; k < l; k++)
		{
			if (q == 1)
			{
				for (i = n - 1; i > 0; i--)
				{
					nmin = i - 1;
					for (j = 0; j < m; j++)
					{
						buf = a[i][j];
						a[i][j] = a[nmin][j];
						a[nmin][j] = buf;
					}
				}
			}
			if (q == 2)
			{
				for (j = m - 1; j > 0; j--)
				{
					mmin = j - 1;
					for (i = 0; i < n; i++)
					{
						buf = a[i][j];
						a[i][j] = a[i][mmin];
						a[i][mmin] = buf;
					}
				}
			}
		}
		cout << endl;
		cout << "Сдвинутая матрица: " << endl;
		for (i = 0; i < n; i++)
		{
			for (j = 0; j < m; j++)
				cout << setw(4) << a[i][j];
			    cout << endl;
		}
	}
	delete[] a; 
	system("pause");
	return 0;
}
...
Рейтинг: 0 / 0
26.10.2018, 05:24
    #39723217
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массивы и функции
чтобы немного упростить задачу, советую n = n % m, чтобы не гонять матрицу кругами.

во-вторых, в чём, собственно, проблема, что не получается или непонятно?
...
Рейтинг: 0 / 0
26.10.2018, 07:21
    #39723232
Gomn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массивы и функции
CEMb, надо же две функции по отдельности создавать или можно одну?
...
Рейтинг: 0 / 0
26.10.2018, 07:25
    #39723233
Gomn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массивы и функции
void or int?
...
Рейтинг: 0 / 0
26.10.2018, 11:47
    #39723373
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массивы и функции
GomnCEMb, надо же две функции по отдельности создавать или можно одну?
void or int?
Не, погоди, для начала надо понять как и зачем .

Функции используют для выполнения одинакового кода с разными параметрами.
Я смотрю в код, и мне в глаза кидается сразу один фрагмент, точнее два одинаковых.
Код внутри циклов выполняет одну работу - меняет 2 значения местами, занимает три строчки. Почему бы его не вынести в отдельную функцию?

И так далее, ты можешь оформить функциями всё, что тебе кажется уместным.
...
Рейтинг: 0 / 0
26.10.2018, 18:13
    #39723732
Gomn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массивы и функции
CEMb, вот так? можете подкорректировать код(если не правильно)
Код: plaintext
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.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
/*Вариант 13.
Выполнить задания четвертого семинара (<<Двумерные массивы>>),оформив каждый пункт задания в виде функции. 
Все необходимые данные для функций должны передаваться им в качестве параметров. 
Использование глобальных переменных в функциях не допускается. */

#include "stdafx.h"
#include <iostream>
#include <cstdlib> 
#include <ctime>  
#include <iomanip>
#include <Windows.h>
#include <math.h>
using namespace std;
/* Функция смещение вниз */
void Down(int *a, int m, int n, int &nmin, int buf)
{
	for (int i = n - 1; i > 0; i--)
				{
					nmin = i - 1;
					for (int j = 0; j < m; j++)
					{
						buf = a[i][j];
						a[i][j] = a[nmin][j];
						a[nmin][j] = buf;
					}
				}
}
/* Функция смещение вправо */
void Right(int *a, int m, int n, int &mmin, int buf)
{ 
	for (int j = m - 1; j > 0; j--)
	{
					mmin = j - 1;
					for (int i = 0; i < n; i++)
					{
						buf = a[i][j];
						a[i][j] = a[i][mmin];
						a[i][mmin] = buf;
					}
				}
}
int main()
{
	setlocale(0, "rus");
	srand(time(NULL));
	int i, j, n, m, k, l, nmin, mmin, q = 0, buf;
	cout << "Введите размерность матрицы: " << endl;
	cout << "Введите количество строк: n =  ";
	cin >> n;
	cout << "Введите количество столбцов:  m = ";
	cin >> m;
	cout << "Введите количество циклов сдвига:  l =  ";
	cin >> l;
	cout << "Нажмите 1-сдвиг вниз, 2-сдвиг вправо: q = ";
	cin >> q;
	int **a = new int*[n];
	for (i = 0; i < n; i++)
	a[i] = new int[m];
	cout << "Введите элементы массива: " << endl;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			a[i][j] = rand() % 100;
			cout << setw(4) << a[i][j];
		}
		cout << endl;
	}
	if (q == 0)
		cout << "Вы не ввели направление сдвига " << endl;
	else
	{
		for (k = 0; k < l; k++)
		{
			if (q == 1)
			{
				Down(a,m,n,nmin buf);
			}
			
			if (q == 2)
			{
				Right(a,m,n,mmin,buf);
			}
		cout << endl;
		cout << "Сдвинутая матрица: " << endl;
		for (i = 0; i < n; i++)
		{
			for (j = 0; j < m; j++)
				cout << setw(4) << a[i][j];
			    cout << endl;
		}
	}
	delete[] a; 
	system("pause");
	return 0;
    }
}
...
Рейтинг: 0 / 0
26.10.2018, 20:26
    #39723775
Gomn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массивы и функции
Gomn,
void Down(int *a, int m, int n, int &nmin, int buf) нашел первую ошибку: надо было int **a
...
Рейтинг: 0 / 0
26.10.2018, 20:28
    #39723777
Gomn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массивы и функции
GomnGomn,
void Down(int *a, int m, int n, int &nmin, int buf) нашел первую ошибку: надо было int **a
во втором voide тоже, прога запустилась, но возникла проблемка: сразу как вожу 1 или 2 прога прерывается
...
Рейтинг: 0 / 0
27.10.2018, 23:01
    #39723960
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массивы и функции
Gomnможете подкорректировать код(если не правильно)


В первом приближении:

1. Вы не освобождаете память выделенную по указателям массива a
2.
Код: plaintext
1.
2.
if (q == 0)
		cout << "Вы не ввели направление сдвига " << endl;



а если q == 3?

3.
Код: plaintext
1.
void Down(int *a, int m, int n, int &nmin, int buf)



Для чего buf в качестве параметра?

и т.д., ваш рефакторинг ни о чем
...
Рейтинг: 0 / 0
28.10.2018, 11:07
    #39724010
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массивы и функции
есть же уже готовые ф-и для сдвигов, которые из 1 2 3 4 5 сделают 34512
rotate() , например
https://ru.stackoverflow.com/questions/32205/Циклический-сдвиг-массива
...
Рейтинг: 0 / 0
29.10.2018, 05:23
    #39724224
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Массивы и функции
Если надо поизвращаться с функциями, то я бы ещё обмен данными между двумя переменными из Right и Down вынес бы в отдельную функцию.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Массивы и функции / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]