powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Массивы и функции
11 сообщений из 11, страница 1 из 1
Массивы и функции
    #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
Массивы и функции
    #39723217
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чтобы немного упростить задачу, советую n = n % m, чтобы не гонять матрицу кругами.

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

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

И так далее, ты можешь оформить функциями всё, что тебе кажется уместным.
...
Рейтинг: 0 / 0
Массивы и функции
    #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
Массивы и функции
    #39723775
Gomn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gomn,
void Down(int *a, int m, int n, int &nmin, int buf) нашел первую ошибку: надо было int **a
...
Рейтинг: 0 / 0
Массивы и функции
    #39723777
Gomn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GomnGomn,
void Down(int *a, int m, int n, int &nmin, int buf) нашел первую ошибку: надо было int **a
во втором voide тоже, прога запустилась, но возникла проблемка: сразу как вожу 1 или 2 прога прерывается
...
Рейтинг: 0 / 0
Массивы и функции
    #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
Массивы и функции
    #39724010
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть же уже готовые ф-и для сдвигов, которые из 1 2 3 4 5 сделают 34512
rotate() , например
https://ru.stackoverflow.com/questions/32205/Циклический-сдвиг-массива
...
Рейтинг: 0 / 0
Массивы и функции
    #39724224
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если надо поизвращаться с функциями, то я бы ещё обмен данными между двумя переменными из Right и Down вынес бы в отдельную функцию.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Массивы и функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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