Задача на перестановку символов в строке

условие:
Пусть даны две строки str1 и str2. Необходимо выяснить, можно ли из str1 путём перестановки литер получить строку str2. Напишите подпрограмму, которая решала бы указанную задачу.

вот код:

#include "stdio.h"
#define _USE_MATH_DEFINES
#include "math.h"
#include "string"
#include "conio.h"
#include "iostream"
using std::cout;
using std::cin;

void main()
{	setlocale(LC_ALL, "Russian");

 char str1[256], str2[256];						// объявление строк и переменных
 int n = 0, m = 0, x;
		cout << "введите строку1";
			cin >> str1;
		cout << "введите строку2";
			cin >> str2;

		while(m <= 256 || n <= 256){         // цикл по проверке наличия одинаковых символов
				 m = 0; // тут цикл сбивается при наличии в строке нескльких одинаковых символов
			if(str1[n] = str2[m]){		//если Nный символ строки1 = Mному символу строки2, то n+1 -
				n++;                   // - то е. берется следующий,(N+1)ный, символ строки1
			}
			else 
				m++;        //иначе (N)ный символ строки1 сравнивается с (M+1)ным символом строки2
			if (str1[n<=256] != str2[m<=256]){   // если ни один из 256 символов строки1 неравен -
                                                     //  -  ни одному символу строки2, х=0, выпад из цикла
				x = 0;
				break;
			}
		else
			x = 1;		// иначе х = 1, цикл продолжается до выполнения своего условия
		}

	if (x = 0){
		printf("невозможно выполнить перестановку - есть разные символы");
	}
	else 
		n = 0;

		while(m <= 256 || n <= 256){        // цикл по перестановке 
			  m = 0;
			if(str1[n] != str2[m]){    //если Nный символ строки1 не равен Mному символу строки2, то M+1
				m++;
			}
			else 
				m = n; 
				n++;  // иначе m переставляется на место n, и берется след. символ строки1
				}
		cout << str1 ;  // вывод видоизменененной строки2 и исходной строки1
		cout << str2;
	getch () ;
       return ;

	delete str1, str2;

} 

код не работает, т.к. он явно кривой.
сейчас переделываю задачу - программа состоит из нескольких функций - это уже другая история.
но - почему конкретно не работает этот код?

в каком смысле "не работает" ?
приведи код ошибки.

перепешите комментарии так чтобы не приходилось прокручивать код в горизонтальном направлении. это очень неудобно ,а если листинг будет в два раза длиннее - то невозможно.

baton's picture

да выдает фигню какую то на выходе .
при построении есть ошибка - "error C4716: outputArray: должна возвращать значение"

З.Ы. сообщение переписал, постараюсь этот косяк более не допускать

код вообще запускается или нет?
надпись =

введите строку1

появляется в консоли?

baton's picture

да. и вторую строку считывает.
а потом выдает несуществующие иероглифы или введенные цифры вперемешку (если вводились цифры)

когда ошибка выводится - то на какой строке она относится (укажите номер в соответствии с нумерацией выше)? (два раза кликните по ошибке - и посмотрите куда установится курсор)
на будущее - эти вещи =

  1. код ошибки
  2. строка

говорятся сразу - заранее.

вы сами писали эту программу?
парой слов прокомментируйте каждую операцию (в коде)

baton's picture

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

vedro-compota's picture

так, смотрю))

_____________
матфак вгу и остальная классика =)

vedro-compota's picture

что это за экзотическое условие =

if (str1[n<=256] != str2[m<=256]){ 

?

_____________
матфак вгу и остальная классика =)

baton's picture

ну.... номер члена стоки...
по замыслу оно должно означать следующее: член строки1 номером не больше 256 не равен члену строки2 другим номером не больше 256.
да, я в курсе своего низкого уровня умственного развития, но че мне делать-то?
как правильно задать условие цикла?

vedro-compota's picture

проще всего организовать проверку наличие разных символов двумя вложенными циклами while. почему вы не выбрали такой способ?

_____________
матфак вгу и остальная классика =)

baton's picture

хорошо, можно и так. но для перестановки членов необходим поиск ОДИНАКОВЫХ элементов - был вариант переставлять их сразу по мере поиска и прекращать поиск и перестановку только при достижении условия цикла либо при обнаружении уникального символа.

но как этот поиск одинаковых элементов правильно организовать - его ж все равно делать?

baton's picture

вообще возможна реализация этой задачи в одну функцию???
я параллельно думаю над тем как ее запилить через несколько функций, но там возникает та же проблема с поиском.

vedro-compota's picture

член строки1 номером не больше 256 не равен члену строки2 другим номером не больше 256.

ээээй! "номером не больше" )))))))
то есть вы предлагаете интерпретатору самому осуществить перебор массива символов?????
то есть не просто перебор - а ещё и остановится во время когда выполнится указанное вами условие -
проще говоря вы накладываете ограничение на множество - а это си++ ну никак не поддерживает на уровне опереторов!
вы можете проверять только значения конкретных символов (точнее -конкретных элементов массива - или конкретных переменных) !

чтобы проверить - есть ли в двух строках различные символы - кстати - просто одинаковости - не достаточно

поэтому предлагаю перенести обсуждение сюда (я обновлю ту страницу через некоторое время - пока она неполная)

_____________
матфак вгу и остальная классика =)