Задача на перестановку символов в строке
Primary tabs
условие:
Пусть даны две строки 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; }
код не работает, т.к. он явно кривой.
сейчас переделываю задачу - программа состоит из нескольких функций - это уже другая история.
но - почему конкретно не работает этот код?
- Log in to post comments
- 31253 reads
yii-primer
Wed, 01/09/2013 - 18:30
Permalink
в каком смысле "не работает"
в каком смысле "не работает" ?
приведи код ошибки.
yii-primer
Wed, 01/09/2013 - 18:30
Permalink
перепеши комментарии так
перепешите комментарии так чтобы не приходилось прокручивать код в горизонтальном направлении. это очень неудобно ,а если листинг будет в два раза длиннее - то невозможно.
baton
Wed, 01/09/2013 - 19:15
Permalink
не работает
да выдает фигню какую то на выходе .
при построении есть ошибка - "error C4716: outputArray: должна возвращать значение"
З.Ы. сообщение переписал, постараюсь этот косяк более не допускать
yii-primer
Wed, 01/09/2013 - 19:20
Permalink
код вообще запускается или
код вообще запускается или нет?
надпись =
появляется в консоли?
baton
Wed, 01/09/2013 - 19:22
Permalink
да. и вторую строку считывает
да. и вторую строку считывает.
а потом выдает несуществующие иероглифы или введенные цифры вперемешку (если вводились цифры)
yii-primer
Wed, 01/09/2013 - 19:23
Permalink
когда ошибка выводится - то
когда ошибка выводится - то на какой строке она относится (укажите номер в соответствии с нумерацией выше)? (два раза кликните по ошибке - и посмотрите куда установится курсор)
на будущее - эти вещи =
говорятся сразу - заранее.
yii-primer
Wed, 01/09/2013 - 19:27
Permalink
вы сами писали эту программу?
вы сами писали эту программу?
парой слов прокомментируйте каждую операцию (в коде)
baton
Wed, 01/09/2013 - 19:42
Permalink
сам.
да, программу писал я сам.
за меня писать некому.
сейчас прокомментирую код в первом сообщении
vedro-compota
Wed, 01/09/2013 - 21:14
Permalink
так, смотрю))
так, смотрю))
_____________
матфак вгу и остальная классика =)
vedro-compota
Wed, 01/09/2013 - 21:38
Permalink
что это за экзотическое
что это за экзотическое условие =
?
_____________
матфак вгу и остальная классика =)
baton
Wed, 01/09/2013 - 21:46
Permalink
ну.... номер члена стоки...
ну.... номер члена стоки...
по замыслу оно должно означать следующее: член строки1 номером не больше 256 не равен члену строки2 другим номером не больше 256.
да, я в курсе своего низкого уровня умственного развития, но че мне делать-то?
как правильно задать условие цикла?
vedro-compota
Wed, 01/09/2013 - 21:43
Permalink
проще всего организовать
проще всего организовать проверку наличие разных символов двумя вложенными циклами while. почему вы не выбрали такой способ?
_____________
матфак вгу и остальная классика =)
baton
Wed, 01/09/2013 - 21:49
Permalink
хорошо, можно и так. но для
хорошо, можно и так. но для перестановки членов необходим поиск ОДИНАКОВЫХ элементов - был вариант переставлять их сразу по мере поиска и прекращать поиск и перестановку только при достижении условия цикла либо при обнаружении уникального символа.
но как этот поиск одинаковых элементов правильно организовать - его ж все равно делать?
baton
Wed, 01/09/2013 - 21:53
Permalink
вообще возможна реализация
вообще возможна реализация этой задачи в одну функцию???
я параллельно думаю над тем как ее запилить через несколько функций, но там возникает та же проблема с поиском.
vedro-compota
Wed, 01/09/2013 - 22:03
Permalink
член строки1 номером не
ээээй! "номером не больше" )))))))
то есть вы предлагаете интерпретатору самому осуществить перебор массива символов?????
то есть не просто перебор - а ещё и остановится во время когда выполнится указанное вами условие -
проще говоря вы накладываете ограничение на множество - а это си++ ну никак не поддерживает на уровне опереторов!
вы можете проверять только значения конкретных символов (точнее -конкретных элементов массива - или конкретных переменных) !
чтобы проверить - есть ли в двух строках различные символы - кстати - просто одинаковости - не достаточно
поэтому предлагаю перенести обсуждение сюда (я обновлю ту страницу через некоторое время - пока она неполная)
_____________
матфак вгу и остальная классика =)