ПОМОГИТЕ ПОЖАЛУЙСТАНа изученном вами языке программирования составьте программу для замены в данном тексте всюду: части ДЕТЕКТИВ на часть РОМАННапример, текст ДЕТЕКТИВ БЕЗ ПОГОНИ - ЭТО НЕ ДЕТЕКТИВдолжен стать таким:РОМАН БЕЗ ПО...

ПОМОГИТЕ ПОЖАЛУЙСТА На изученном вами языке программирования составьте программу для замены в данном тексте всюду: части ДЕТЕКТИВ на часть РОМАН Например, текст ДЕТЕКТИВ БЕЗ ПОГОНИ - ЭТО НЕ ДЕТЕКТИВ должен стать таким: РОМАН БЕЗ ПОГОНИ - ЭТО НЕ РОМАН, а из текста НЕ МОГУ ЗАСНУТЬ БЕЗ ДЕТЕКТИВА должен получиться текст НЕ МОГУ ЗАСНУТЬ БЕЗ РОМАНА.
Гость
Ответ(ы) на вопрос:
Гость
Вот исходник. заменишь строку и искомые слова. /* * *   Программа решает задачу:  Дана строка символов. Группы символов, *   разделенные пробелами (одним или несколькими) и не содержащие пробелы *   внутри себя, будем называть словами. *   Заменить в строке слова S на слова W ( S, W - заданы). *   *    */ //--------------------------------------------------------------------------- #include #include #include #include #define bool int #define true 1 #define false 0 #define MAX(x, y) (((x) > (y)) ? (x) : (y)) #define SPACE ' ' // Подпрограмма определяет, является ли группа символов словом. bool isWordc (const char*const str, const char*const begin, int len); //--------------------------------------------------------------------------- #pragma argsused int main(int argc, char* argv[]) {         const char*const def_str = "Ехал   грека   через реку , видит грека – в реке рак. Сунул грека  руку в реку, рак за руку греку – цап! рекурсия рукавицы"; const char* S[] =                          { "грека", "реку", "руку", "рак",  "ААА" }; const char* W[sizeof(S) / sizeof(char*)] = { "ААА",   "поле", "ногу", "мышь", "Грека" };         const int countS = sizeof(S) / sizeof(char*);         int i, offset, delta, isWord;         char* pos; char* str = (char*)malloc(strlen(def_str)+1); if (!str) return 1; memcpy(str, def_str, strlen(def_str)+1); for ( i = 0; i < countS; ++i) { pos = str; while ((pos = strstr(pos, S[i])) != NULL) { // Группы символов, разделенные пробелами, будем называть словами.                        if (isWordc(str,pos,strlen(S[i])) == true) { if (strlen(S[i]) != strlen(W[i])) {                                         // При разной длине - компенсируем разницу, т.е при замене рак на раковина не должны портиться другие данные. delta = strlen(S[i]) - strlen(W[i]); if (delta < 0) { offset = pos - str; str = (char*)realloc(str, strlen(str) + 1 - delta ); if (!str) return 1; str[strlen(str) - delta] = '\0'; pos = str + offset; memmove(pos - delta, pos, strlen(pos)); } memset(pos, SPACE, MAX(strlen(W[i]), strlen(S[i]))); // Замена "грека" на "АА" = "АА___" } strncpy(pos, W[i], strlen(W[i])); } pos += strlen(S[i]); } }     free(str);         return 0; } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- // Подпрограмма определяет, является ли группа символов словом. bool isWordc(const char*const str, const char*const begin, int len) {      bool lhs,rhs;  // ( рак и раковина разные слова.)      // Приведение к (unsigned char) необходимо т.к. функции isspace и ispunct делают проверку (A>-1 && A<=255).      lhs = (begin == str); // Исключаем выход за границы.      lhs = lhs || (isspace((unsigned char) *(begin - 1))  || ispunct((unsigned char) *(begin - 1)));      rhs =         isspace((unsigned char) *(begin + len))|| ispunct((unsigned char) *(begin + len));      return lhs && rhs; } //---------------------------------------------------------------------------
Гость
// PascalABC.NET 3.2, сборка 1374 от 10.01.2017 // Внимание! Если программа не работает, обновите версию! begin   var s:=ReadlnString('>');   s:=s.Replace('ДЕТЕКТИВ','РОМАН'); s.Println end. Примеры > ДЕТЕКТИВ БЕЗ ПОГОНИ - ЭТО НЕ ДЕТЕКТИВ РОМАН БЕЗ ПОГОНИ - ЭТО НЕ РОМАН > НЕ МОГУ ЗАСНУТЬ БЕЗ ДЕТЕКТИВА НЕ МОГУ ЗАСНУТЬ БЕЗ РОМАНА
Не нашли ответ?
Ответить на вопрос
Похожие вопросы