Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2013, 13:31   #1
hellomatz
 
Регистрация: 31.01.2013
Сообщений: 4
По умолчанию Реализовать Функцию, Которая "тиражирует" Строку на Си (C)

1. Реализуйте функцию со следующим прототипом:

int autoStringMultiply(AutoString *string, unsigned multiplier);

Данная функция "тиражирует" строку, адресуемую string, multiplier раз. В случае
успеха возвращается 0, в противном случае -- -1.



В качестве решения принимается файл с именем solution.c, в котором записываются
решения всех заданий. (Соответствующие фрагменты кода помечаются комментариями,
указывающими, к какому заданию относится конкретный фрагмент.)

Файл main.c содержит директиву #include "solution.c", определение функции main,
типов AutoString и TextFileDrawer, а так же функций их размещения и освобождения
в памяти (и некоторых других полезных вспомогательных функций). Внутри функции
main разрешается поместить код, проверяющий, по мнению студента,
работоспособность реализованных функций.

Студент получает 0 баллов за задание, если компилятор gcc, запущенный с опциями
-std=c99 -pedantic -Wall, в процессе компиляции файла main.c выдает ошибки
(errors), относящиеся к строкам, соответствующим данному заданию. Оценка за
задание снижается на 1 балл, если в процессе компиляции возникают предупреждения
(warnings), относящиеся к строкам, соответствующим данному заданию.

Для получения максимального балла за задание, реализованные функции должны:

* соответствовать своему прототипу;

* верно модифицирует соответствующие структуры данных, переданные по ссылке
в качестве аргументов, в соответствии с заданием;

* выделяет не более и не менее необходимого объема памяти с помощью функции
malloc или аналогов, если это предполагается по заданию;

* использует realloc там, где это более предпочтительно;

* освобождает требуемую память с помощью функции free и только ее, если это
предполагается по заданию;

* эффективно использует функции memcpy, memmove, strstr и т.п. вместо циклов.

* проверяет входные аргументы на допустимость (включая возможность переполнения
в ходе выполнения арифметических операций), где это возможно, и игнорирует
свой вызов в случае некорректных аргументов;

* проверяет значения, возвращаемые вызываемыми функциями, и прекращает работу
в случае ошибки, сохраняя целостность данных;

* в случае успеха возвращает 0, в противном случае -- -1.

* не содержит иных побочных эффектов.

Если хотя бы один из этих пунктов нарушается хотя бы для одного набора входных
значений, оценка снижается как минимум на 1 балл. В случае несоответствия
определения функции прототипу или нарушения каких-либо пунктов для существенного
диапазона аргументов, оценка снижается как минимум на 2 балла.

* Дополнительные требования:

** если значение string->native_string равно NULL, данная строка должна
трактоваться как пустая;

** любое значение string->native_string, не равное NULL, должно быть массивом
символов, размещенным в динамической области памяти (только если оно не
const), последний элемент которого -- терминальный символ '\0'.
hellomatz вне форума Ответить с цитированием
Старый 06.02.2013, 14:01   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

1) Где описание AutoString?
2) Где описание TextFileDrawer?
3) Что значит "тиражирует"? Приписывает в конец существующей?

А так система ограничений замечательная, мой респект автору задания.
Abstraction вне форума Ответить с цитированием
Старый 07.02.2013, 01:56   #3
hellomatz
 
Регистрация: 31.01.2013
Сообщений: 4
По умолчанию

1. Описание библиотеки AutoString

AutoString — это библиотека, предоставляющая функции для работы с так называемыми «автоматическими строками», автоматически управляющими памятью, необходимой для их хранения. Тип AutoString определяется следующим образом:
typedef struct AutoString {
char *restrict native_string;
size_t size;
} AutoString;

Поле native_string хранит указатель на динамическую область памяти, в которой хранится массив символов, представляющий соответствующую строку (включая терминальный символ '\0) или NULL для пустой строки. Поле size хранит размер строки.

Для типа AutoString const допускается значение поля native_string с типом char const *, а так же ссылающееся не на динамическую область памяти. Соответственно, допускается использование литералов следующего вида:
(AutoString const) { .native_string = "123", .size = 3 }
2. Функции autoStringAllocate и autoStringRelease

Функция autoStringAllocate определена следующим образом:
AutoString *autoStringAllocate(char const *native_string)
{
AutoString *string = malloc(sizeof(AutoString));
if (!string)
return NULL;

string->size = strlen(native_string);

string->native_string = malloc(string->size + 1);
if (!string->native_string) {
free(string);
return NULL;
}

strcpy(string->native_string, native_string);

return string;
}

Данная функция конструирует автоматическую строку из обычной. Создается копия строки, размещенная в динамической области памяти. Если возникли проблемы с выделением памяти, возвращается NULL. В противном случае возвращается указатель на проинициализированную структуру AutoString.

Автоматические строки, созданные с помощью функции autoStringAllocate, хранятся в динамической области памяти. Для освобождения ресурсов используется функция autoStringRelease, определенная следующим образом:
void autoStringRelease(AutoString *string)
{
if (string) {
if (string->native_string)
free(string->native_string);
free(string);
}
}
3. Функция autoStringMultiply

Функция autoStringMultiply(AutoString *string, unsigned multiplier) тиражирует содержимое string->native_string multiplier раз. Функция возвращает -1, если в итоге может получится слишком длинная строка или были проблемы с выделением дополнительной памяти. При этом строка *string не меняется. В случае успеха возвращается 0.

Если native_string аргумента указывает с NULL, после вызова функции autoStringMultiply он будет указывать на пустую строку (состоит из одного единственного терминального символа).

Реализация функции выглядит так:
int autoStringMultiply(AutoString *string, unsigned multiplier)
{
if (!(string->size <= SIZE_MAX / multiplier))
return -1;

char *native_string = realloc(string->native_string, string->size *
multiplier + 1);
if (!native_string)
return -1;
string->native_string = native_string;

native_string += string->size;
while (--multiplier > 0) {
memcpy(native_string, string->native_string, string->size);
native_string += string->size;
}
*native_string = '\0';

string->size *= multiplier;

return 0;
}

Сначала осуществляется проверка допустимости увеличения размера строки в multiplier раз (значение поля size не может превосходить SIZE_MAX). Затем осуществляется попытка выделить необходимый объем памяти. Далее необходимое количество раз происходит копирование с помощью функции memcpy исходной строки в нужную позицию, сдвигаемую каждую итерацию вправо на string->size байт. Наконец, в конце хранимой строки ставится терминальный символ, а так же обновляется значение поля size.
hellomatz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввести строку и после каждого символа "q" ставить "**" karamzin Паскаль, Turbo Pascal, PascalABC.NET 2 25.11.2012 02:57
Создать класс "Фигура", от него наследованием создать 3 класса ("треугольник", "четырехугольник", "окружность") funnyy Помощь студентам 3 17.10.2012 17:40
Pascal ABC строки - программа, которая каждую встреченную букву "б" заменяет сочетанием "ку" (использовать модули) Raigo Помощь студентам 6 17.05.2012 15:35
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. воваава Помощь студентам 3 01.12.2011 12:50
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04