ПОМОГИТЕ ПОЖАЛУЙСТА

На изученном вами языке программирования составьте программу для замены в данном тексте всюду: части ДЕТЕКТИВ на часть РОМАН

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

Ответ учителя по предмету Информатика

Вот исходник. заменишь строку и искомые слова.

/*

*

*   Программа решает задачу:  Дана строка символов. Группы символов,

*   разделенные пробелами (одним или несколькими) и не содержащие пробелы

*   внутри себя, будем называть словами.

*   Заменить в строке слова S на слова W ( S, W — заданы).

*  

*   

*/

//—————————————————————————

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <ctype.h>

#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] = ‘?’;

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;

}

//—————————————————————————

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Похожие вопросы от пользователей