/* * * Программа решает задачу: Дана строка символов. Группы символов, * разделенные пробелами (одним или несколькими) и не содержащие пробелы * внутри себя, будем называть словами. * Заменить в строке слова S на слова W ( S, W - заданы). * * */
Периметр – это сумма длин всех сторон. Периметр помещения можно узнать, сложив длину всех стен. Пример: Вычислим периметр комнаты размером 5х6 м. Сложим длину всех стен в комнате – и получим 22 м. Сколько всего полотнищ нужно для оклеивания помещения? Для этого нужно разделить периметр на ширину рулонов. Это позволит узнать, какое количество обойных полос нужно на помещение. Пример: Периметр нашей комнаты – 22 м, а ширина обоев составляет 1,06 м. Разделим 22 на 1,06 – и получим 20,75. Округляем результат в большую сторону – и получаем 21 полотнище. На сколько полотнищ хватит одного рулона? Чтобы посчитать число полных полотнищ в одном рулоне разделим длину рулона на высоту потолка. Пример: Длина обойного рулона обычно составляет 10 м. Высота нашей комнаты – 2,75 м. Мастера рекомендуют прибавлять к высоте потолка дополнительный запас в 10 см. для удобства поклейки. Таким образом, значение высоты нашего потолка составит 2,85 м. Если разделить длину рулона (10 м) на это число (2,85 м), то мы получим 3 полных полосы из одного рулона обоев. Сколько рулонов обоев понадобится? Чтобы узнать, сколько рулонов потребуется для одного помещения надо разделить число всех полотнищ в этом помещении на полное число полотнищ, которые получаются из одного рулона. Пример: В нашем случае расчет будет таким: 21 (число полотнищ) делим на 3 (полотнища из одного рулона) и получаем 7 рулонов обоев шириной – 1,06 м, длиной – 10 м.
Если вы клеите обои с крупным рисунком, то вам потребуется следить за аккуратной подгонкой полос для ровного совпадения узора. Это актуально для обоев с большими геометрическими рисунками, изображениями растений и других крупных форм. Здесь нужно учитывать раппорт - расстояние, через которое повторяется одинаковый рисунок. Вам необходимо сосчитать, сколько раппортов приходится на одну длину полотнища. Чем крупнее раппорт, тем большее количество рулонов вам потребуется для оклеивания просторных помещений. Размер раппорта указывается на этикетке обоев. На этикетке вы найдете один из указанных
/*
*
* Программа решает задачу: Дана строка символов. Группы символов,
* разделенные пробелами (одним или несколькими) и не содержащие пробелы
* внутри себя, будем называть словами.
* Заменить в строке слова 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] = '\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;
}
//
Пример:
Вычислим периметр комнаты размером 5х6 м. Сложим длину всех стен в комнате – и получим 22 м.
Сколько всего полотнищ нужно для оклеивания помещения?
Для этого нужно разделить периметр на ширину рулонов. Это позволит узнать, какое количество обойных полос нужно на помещение.
Пример:
Периметр нашей комнаты – 22 м, а ширина обоев составляет 1,06 м. Разделим 22 на 1,06 – и получим 20,75. Округляем результат в большую сторону – и получаем 21 полотнище.
На сколько полотнищ хватит одного рулона?
Чтобы посчитать число полных полотнищ в одном рулоне разделим длину рулона на высоту потолка.
Пример:
Длина обойного рулона обычно составляет 10 м. Высота нашей комнаты – 2,75 м. Мастера рекомендуют прибавлять к высоте потолка дополнительный запас в 10 см. для удобства поклейки. Таким образом, значение высоты нашего потолка составит 2,85 м. Если разделить длину рулона (10 м) на это число (2,85 м), то мы получим 3 полных полосы из одного рулона обоев.
Сколько рулонов обоев понадобится?
Чтобы узнать, сколько рулонов потребуется для одного помещения надо разделить число всех полотнищ в этом помещении на полное число полотнищ, которые получаются из одного рулона.
Пример:
В нашем случае расчет будет таким: 21 (число полотнищ) делим на 3 (полотнища из одного рулона) и получаем 7 рулонов обоев шириной – 1,06 м, длиной – 10 м.
Если вы клеите обои с крупным рисунком, то вам потребуется следить за аккуратной подгонкой полос для ровного совпадения узора. Это актуально для обоев с большими геометрическими рисунками, изображениями растений и других крупных форм. Здесь нужно учитывать раппорт - расстояние, через которое повторяется одинаковый рисунок. Вам необходимо сосчитать, сколько раппортов приходится на одну длину полотнища. Чем крупнее раппорт, тем большее количество рулонов вам потребуется для оклеивания просторных помещений. Размер раппорта указывается на этикетке обоев. На этикетке вы найдете один из указанных