Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Помогите написать программу, которая будет превращать двумерный массив в одномерный

Ответить
Настройки темы
C/C++ - Помогите написать программу, которая будет превращать двумерный массив в одномерный

Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: png Безымянный.png
(7.3 Kb, 8 просмотров)
Собственно, задача заключается в том, что бы превратить двумерный массив (он должен быть динамическим и пользователь вводит каждый элемент) в одномерный путём считывания его элементов по часовой стрелке (как на картинке). Размерность задаётся пользователем, впрочем, как и элементы. Так вот, проблема именно с этим считыванием. Как его сделать правильно?? Я пробовал с помощью строк (string), но ничего не получилось (хотя, казалось бы, учёл всё что можно). Прошу помощи! Вот мой код:

Код: Выделить весь код
#include<iostream>;
#include<cstring>

using namespace std;

int main(){
	int m,n;
	float provnch=0.25,provch=0.75,prov1,prov2;
	string str1;
	cin>>m;
	cin>>n;
	char**arr1=new char *[m];						//Задаём двумерный массив. Он должен быть квадратным!! Да, я знаю что не сделал условие, мол, если пользователь
	for (int i=0;i<m;i++) arr1[i]=new char [n];		//введёт разное число строк и столбцов, но то для экономии времени. Так что считаем эту матрицу квадратной (m=n).
	for (int i=0;i<m;i++) for (int j=0;j<n;j++) cin>>arr1[i][j];
	for (int i=0;i<m;i++){
		for (int j=0;j<n;j++) cout<<arr1[i][j]<<" ";
		cout<<endl;
	}
	prov1=(m-1)*0.5+0.25;
	prov2=(m-2)*0.5+0.75;
	for (int f=0,g=0,v=-2,d=-1,q=-2,p=1,x=0,y=0;1;m--,n--,x++,y++,p++,q++,d++,v++,g++,f++){ //Эта куча счётчиков нужна для корректного осуществления поворотов.
		for (int j=f;j<n;j++){					//Если вы сами проследите за всем процессом на листочке бумаги, то убедитесь, что всё с этими счётчиками верно.
			str1.push_back(arr1[x][j]);
			if (provnch==prov1) break;
		}
		for (int i=p;i<m;i++) {             //4 цикла означают 4 поворота (ведь нам надо по часовой стрелке квадратный массив, значит - всего 4 поворота)
			str1.push_back(arr1[i][n-1]);   //Общий цикл нужен для корректировки этих поворотов (что бы не попадали прошлые символы снова) и для пары общих счётчиков
		}
		for (int j=n+q;j>d;j--){
			str1.push_back(arr1[m-1][j]);
			if (provch==prov2) break;
		}
		for (int i=m+v;i>g;i--){
			str1.push_back(arr1[i][y]);
		}
		provnch++; //Эти 2 последние переменные - вообще отдельная тема. Просто если вы попробуете провести операцию, которую требуют в задаче, то заметите, что для этого
		provch++; //надо обрезать выполнение главного цикла (так как всё доходит до последнего элемента и что бы дальше не щло выполнение иначе будут ошибки).
	}             //Собственно, я думал, что ошибка из-за этого. Сделал эти 2 переменные - всё равно не работает. Кстати, почему эти переменные имеют именно такой вид?
system ("pause"); //Если посмотреть "на бумаге", как должна работать прога, то можно заметить, что остановка должна осуществляться на х.25 итерации(для нечётных m и n)
return 0; //и на х.75 итерации (для чётных), где х - количество целых итераций. Ну тип я так записал дробь. 1.25(для 3х3), 2.75(для 6х6). Если нарисовать эти матрице на листочке, и сделать то, о чём требуют в задаче, то вы поймёте о чём я.
}
Посмотрите, что не так. Или предложите иной способ решения, только с использованием только массивов и строк (никаких доп файлов, доп функций и т.д., так как это ещё не изучали). Ещё раз -- хелп ми плизз!

Отправлено: 22:25, 15-10-2015

 

Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Normandez, параметрически то задачку решить не пробовали?
Разбить квадраты на подквадраты?
Забудьте, что у вас спираль.
Считайте значения по периметру. Просто по периметру, по часовой стрелке.
Затем уменьшите размер квадрата на 1 и считайте еще раз.

Это куча счетчиков - явная ошибка (я даже следить за ней не буду)
И уберите работу со строками - вас об этом не просят. Массив - значит массив.
Для удобства возьмите числа (все что не оговорено явно, трактуется в пользу студента).

Ах, да. Самое главное - дайте переменным нормальные названия!
i, j, k - по умолчанию счетчики. Остальное назвать полными именами.
Цитата:
f=0,g=0,v=-2,d=-1,q=-2,p=1,x=0,y=0;1;m--,n--,x++,y++,p++,q++,d++,v++,g++,f++
Это просто адовый треш. аж в глазах рябит.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Это сообщение посчитали полезным следующие участники:

Отправлено: 10:52, 16-10-2015 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибки за идею. Действительно, так должно быть проще (через считывание по периметрам). Попробую

Отправлено: 22:05, 16-10-2015 | #3


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Цитата lxa85:
Разбить квадраты на подквадраты?
Забудьте, что у вас спираль.
Считайте значения по периметру. Просто по периметру, по часовой стрелке.
Затем уменьшите размер квадрата на 1 и считайте еще раз. »
Думал тоже, первый вариант решения, наподобии задачки с поиском выхода из лабиринта, тоже обход по периметру(закон поиска пути гласит, из любого лабиринта есть выход если следовать строго по прямой держась за одну из сторон стены). А потом подумал, с обходом по подквадратам проще ведь действительно. Только уменьшается размер квадрата не на 1, а на 2, т.к. допустим у нас размер квадарата 5, то внутренний подквадрат будет не 4, а 3, т.к. минусуются внешние две границы. На примере, внешний квадрат # со сторонами 5, внутренний квадрат * со стороной 3 и ещё один - со стороной 1
Код: Выделить весь код
# # # # #
# * * * #
# * - * #
# * * * #
# # # # #

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 15:16, 17-10-2015 | #4


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Drongo:
закон поиска пути гласит, из любого лабиринта есть выход если следовать строго по прямой держась за одну из сторон стены »
Не «по прямой», а «не отрывая руку». И только в строго определённом случае.

Отправлено: 19:57, 17-10-2015 | #5


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Цитата Iska:
Не «по прямой», а «не отрывая руку». »
Да, спасибо за уточнение. Определённый случай только один - когда второго выхода нет, ты всегда вернёшься к точке от которой начал

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 20:59, 17-10-2015 | #6


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Drongo:
Определённый случай только один - когда второго выхода нет, ты всегда вернёшься к точке от которой начал »
Первое не совсем верно. Входов/выходов может быть и несколько. Я про другое.

Лабиринт — Википедия:
Цитата:
Считается, что если проходить лабиринт, касаясь только одного из краев стенок лабиринта, то этот лабиринт обязательно будет пройден, хотя это не всегда верно: в лабиринте с несвязанными стенами этот способ может не сработать.
Т.е., например, вот такой случай:
Скрытый текст

Будем ли мы пользоваться правилом правой руки или левой руки — выход мы не найдём.

Но второе — что в этом случае мы, рано или поздно, вернёмся в исходную точку — совершенно верно.

Отправлено: 22:15, 17-10-2015 | #7


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Цитата Iska:
в лабиринте с несвязанными стенами этот способ может не сработать. »
В условии задачи о лабиринте, которую я решал когда-то, отсчёт начинался от точки входа, а не с середины, т.к. прежде чем попасть на середину нужно туда войти\дойти через вход. В данном случае пример сравним с двумя окружностями (можно было не заморачиваться углами), большая окружность с входом и выходом и маленькая в середине без входов и выходов, к которой приложи хоть правую хоть левую руки ты будешь идти по кругу. И по существу этот пример некорректен, чтобы, попасть к такой несвязаной стене, нужно оторвать руку от другой стены, т.е. иметь заведомо не правильную точку отсчёта. Как-то так.

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 23:14, 17-10-2015 | #8


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Дело в том, что как вход, так и выход, могут быть где угодно, не только во внешней стене. Достаточно только представить, что вход и выход — не на плоскости, а в пространстве.

Вот скажем, была такая игрушка:
Скрытый текст

где надо было провести шарик с внешней окружности к центру — помните?

Отправлено: 02:45, 18-10-2015 | #9


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Цитата Iska:
Дело в том, что как вход, так и выход, могут быть где угодно, не только во внешней стене. Достаточно только представить, что вход и выход — не на плоскости, а в пространстве. »
Эти условия не для правила правой\левой руки.

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 13:24, 18-10-2015 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Помогите написать программу, которая будет превращать двумерный массив в одномерный

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
C/C++ - Помогите отсортировать двумерный массив (С++) Luda-tin Программирование и базы данных 4 15-05-2012 08:57
C/C++ - [решено] Помогите исправить (двумерный массив) на С++ Luda-tin Программирование и базы данных 2 13-05-2012 22:53
Разное - Помогите с задачей на одномерный массив Ksyha2121 Тест-форум 0 01-12-2011 20:44
Assm - [решено] одномерный массив в ассемблере igor7 Программирование и базы данных 7 03-06-2010 22:51
Помогите написать на Delphi маленькую программу! ИМХО, будет интересна многим! AlexKan Автоматическая установка Windows 2000/XP/2003 10 24-08-2006 19:48




 
Переход