Задача на перестановку символов в строке
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
- 33256 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
что это за экзотическое
что это за экзотическое условие =
if (str1[n<=256] != str2[m<=256]){?
_____________
матфак вгу и остальная классика =)
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 номером не
ээээй! "номером не больше" )))))))
то есть вы предлагаете интерпретатору самому осуществить перебор массива символов?????
то есть не просто перебор - а ещё и остановится во время когда выполнится указанное вами условие -
проще говоря вы накладываете ограничение на множество - а это си++ ну никак не поддерживает на уровне опереторов!
вы можете проверять только значения конкретных символов (точнее -конкретных элементов массива - или конкретных переменных) !
чтобы проверить - есть ли в двух строках различные символы - кстати - просто одинаковости - не достаточно
поэтому предлагаю перенести обсуждение сюда (я обновлю ту страницу через некоторое время - пока она неполная)
_____________
матфак вгу и остальная классика =)