Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Visual_Studio_2010

.pdf
Скачиваний:
109
Добавлен:
03.03.2016
Размер:
5.94 Mб
Скачать

const struct ItemDatabase g_database = {

sizeof (g_databaseItems) / sizeof (g_databaseItems[0]), g_databaseItems

};

Функция main()создает и печатает счет:

int main (int argc, char* argv[])

{int codes[] = { 1234, 4719, 3814, 1112, 1111, 1111, 1234 }; struct Bill *bill = ProduceBill (&g_database, codes, sizeof

(codes) / sizeof (codes[0])); if (!bill) {

printf ("Error: out of memory while creating a bill"); return -1;

}

PrintBill (bill);

FreeBill (bill); return 0;

}

Задание

1.Произведите сборку программы и осуществите ее компиляцию.

2.Форматирование счета. Измените функцию PrintBill(), чтобы она печатала счет в соответствии с форматированием, приведенным в условии. Ширина строки счета – 40 символов.

3.Отбрасывание неизвестных товаров. Измените функцию

ProduceBill() таким образом, чтобы товары, не найденные в БД, не включались в счет.

4.Вычисление скидки. За каждые две купленные бутылки шерри (код 1234) супермаркет дает скидку $5.00 с суммы счета. Добавьте вычисление скидки по счету. Результирующий счет должен выглядеть следующим образом:

C supermarket

 

 

Dry Sherry, 1lt ..........

(x2)

$108.20

Fish Fingers .............

(x1)

$12.11

Orange Jelly .............

(x1)

$5.61

Giant Hula Hoops .........

(x1)

$13.31

Hula Hoops ...............

(x2)

$4.22

Discount .........................

 

$5.00

TOTAL ..........................

 

$138.45

5.Оптимизация поиска товара в БД. Функция FindItem() имеет слож-

ность O(N). Измените структуру БД или тело функции FindItem() таким образом, чтобы уменьшить алгоритмическую сложность поиска.

411

6.Загрузка БД из файла. Разработайте функции, выполняющие загрузку списка товаров супермаркета из CSV-файла. CSV-файлом (или файлом значений, разделенных запятыми, – Сomma-separated values) называется текстовый файл, в котором содержатся записи, состоящие из нескольких полей. При этом каждая новая строка соответствует одной записи. Поля одной записи разделяются запятыми. Если значение поля не содержит запятых, то оно записывается непосредственно. Если в значении есть запятые, то оно заключается в двойные кавычки ("). Если в такой последова-

тельности присутствует двойная кавычка, она удваивается. Имеется разновидность формата, когда все строковые значения заключаются в кавычки. Пример БД товаров в CSV-файле:

4719,"Fish Fingers",1211 5643,"Nappies",1010 3814,"Orange Jelly",561 1111,"Hula Hoops",211

1112,"Giant Hula Hoops",1331

1234,"Dry Sherry, 1lt",5401

7.Редактирование БД. Добавьте функции для добавления/удаления товаров в БД. Функция AddItem() должна добавлять описание товара в БД. При

этом если товар с таким штрихкодом уже существует в БД, он должен замещаться новым. Функция RemoveItem() должна удалять товар по его штрихкоду из БД.

8.Анализ продаж. Разработайте функцию TotalSales(), которая принимает на входе массив чеков и печатает на экране таблицу проданных товаров по всем чекам. В таблице должна присутствовать информация о названии товара, проданном количестве, сумме (возможно, с учетом скидки по соответствующим позициям).

9.Разработайте функцию AnalyzeSales(), которая принимает на входе массив чеков и печатает на экране таблицу пар товаров, которые чаще всего покупают вместе. Эта пара должна включаться в таблицу пар, если она присутствует более чем в одном чеке.

412

Приложение

УПРАВЛЕНИЕ КОНФИГУРАЦИЯМИ ПРОЕКТА В VISUAL STUDIO 2010

Любой проект в Visual Studio 2010 включает несколько самостоятельных конфигураций для компиляции разных версий программы. Конфигурацией называется набор параметров компилятора, компоновщика и библиотекаря, используемый при построении проекта. По умолчанию при создании проекта среда Visual Studio 2010 автоматически включает в него две конфигурации: Debug (отладочную) и Release (финальную). Как следует из их названий, отладочная конфигурация используется в процессе написания программы, ее тестовых запусков для обнаружения и исправления ошибок, финальная – для построения конечной версии продукта, передаваемого заказчику для промышленного использования.

При создании проекта настройки отладочной и финальной конфигураций устанавливаются в значения по умолчанию. С этими настройками выполняются следующие действия.

Debug конфигурация компилируется с включением полной символьной отладочной информации и выключением оптимизации. Оптимизация кода затрудняет процесс отладки, так как усложняет или даже полностью изменяет отношение между строками исходного кода программы и сгенерированными машинными инструкциями. Такая отладочная информация используется отладчиком Visual Studio 2010 для представления значений переменных, определения текущей выполняемой строки программы, отображения стека вызовов и т. д., т. е. для поддержки стандартных действий, выполняемых при отладке программы.

Release конфигурация не содержит никакой отладочной информации и подвергается полной оптимизации. Без отладочной информации процесс отладки программы очень затруднен. Однако при необходимости такая информация может быть создана для финальной версии программы и записана в отдельный файл с расширением .pdb. Файлы отладочной информации .pdb могут оказаться очень полезными, если позднее возникнет необходимость в отладке финальной версии программы, например при обнаружении критических ошибок в процессе ее эксплуатации на компьютерах заказчика. Файлы .pdb обычно заказчику не передаются, а сохраняются у разработчиков.

Переключение между конфигурациями можно осуществлять из панели инструментов или при помощи окна Configuration Manager (менеджер конфигураций). Для быстрого переключения конфигурации, используемой для компиляции проекта, используется стандартная панель инструментов (рис. П1).

413

Рис. П1. Переключение конфигураций из панели инструментов

Программист может в любой момент изменить настройки конфигурации проекта или, при необходимости, создать новую конфигурацию. Эти действия выполняются в окне свойств проекта. Настройки свойств проекта применяются к текущей конфигурации. Можно указать одну из созданных конфигураций проекта или выбрать All configurations, в последнем случае настройки будут применены ко всем конфигурациям одновременно. Рассмотрим основные отличия в настройках проекта для отладочной и финальной конфигураций. На рис. П2 изображено окно свойств проекта со страницей настроек оптимизации (Optimization) для отладочной конфигурации проекта. Видно, что оптимизация генерируемого машинного кода выключена (Disabled).

Рис. П2. Страница свойств Optimization для отладочной конфигурации

414

Для финальной версии проекта по умолчанию включена оптимизация по скорости выполнения программы (Optimize Speed). На рис. П3 показана страница с выбранными настройками финальной конфигурации.

Рис. П3. Страница свойств Optimization для финальной конфигурации

Кроме того, можно также генерировать компактный код (Minimize Size) и полную оптимизацию (Full Optimization), которая включает ее настройки. На рис. П4 показан список свойств закладки Optimization.

415

Рис. П4. Список свойств закладки Optimization

На странице свойств генерации кода (Code Generation) можно указать версию стандартной библиотеки языка C, которая будет использована при компиляции и компоновке проекта – настройка Runtime Library. Для отладочной конфигурации по умолчанию используется настройка Multi-threaded Debug DLL (многопоточная отладочная версия стандартной библиотеки, размещенной в динамически загружаемом модуле DLL). Эта версия библиотеки содержит отладочную информацию, а также поддерживает дополнительные проверки времени выполнения, что позволяет, с одной стороны, выполнять функции стандартной библиотеки под управлением отладчика, а с другой – находить на раннем этапе труднообнаруживаемые проблемы, такие как выход за границы массивов, неправильная работа с динамически распределяемой памятью и некоторые другие. Из-за наличия этих дополнительных проверок отладочная версия библиотеки выполняется медленнее финальной.

Для финальной версии проекта по умолчанию используется настройка Multi-threaded DLL (финальная версия стандартной библиотеки без отладочной информации, размещенной в динамически загружаемом модуле DLL). Важно помнить, что для запуска этой версии при компиляции ее с такими настройками модуль DLL стандартной библиотеки должен присутствовать в системе. Его следует предусмотреть либо при установке Visual Studio 2010, либо при помощи отдельного инсталляционного пакета Microsoft Visual C++ 2010 Redistributable Package (x86). Если же библиотеки DLL в системе нет, то скомпилированная программа не будет запущена.

416

Для исключения зависимости от отдельной DLL стандартной библиотеки значение настройки Runtime Library нужно установить в Multi-threaded (многопоточная версия стандартной библиотеки). В этом случае весь необходимый функционал будет включен непосредственно в результирующий .exe файл, который может быть запущен и исполнен независимо от того, были ли установлены файлы DLL стандартной библиотеки или нет.

На рис. П5 показана страница свойств закладки Code Generation для отладочной конфигурации.

Рис. П5. Страница свойств Code Generation для отладочной конфигурации

На рис. П6 показана страница свойств закладки Code Generation для финальной конфигурации.

417

Рис. П6. Страница свойств Code Generation для финальной конфигурации

Отладочная и финальная версии программы компилируются также с различными символами препроцессора. Для отладочной версии объявляется символ _DEBUG, для финальной – NDEBUG. Это позволяет применять директивы препроцессора для условной компиляции программы, включая или исключая некоторую функциональность в одну из версий. Обычно это используется для дополнительных проверок и отладочного вывода в отладочную версию программы. Для финальной версии такие проверки и вывод не нужны, поэтому они в нее не включаются. Например, в следующем фрагменте программы значение переменной res будет выведено на экран только в отладочной версии:

int a, b; int res; a = 10;

b = 20;

res = a + b;

#ifdef _DEBUG

printf ("res = %d", res); #endif

На рис. П7 представлена страница свойств Preprocessor для отладочной конфигурации, на рис. П8 – для финальной.

418

Рис. П7. Страница свойств Preprocessor для отладочной конфигурации

Рис. П8. Страница свойств Preprocessor для финальной конфигурации

419

В отладочной и финальной версиях также различаются форматы отладочной информации (Debug Information Format), генерируемой компилятором и сохраняемой в .pdb файле.

Для отладочной версии используется Program Database for Edit and Continue, позволяющая отлаживать и даже изменять программу, если сработала точка останова. При возобновлении выполнения программы внесенные изменения будут автоматически применены, и выполнение продолжится уже с ними. Эта возможность позволяет сократить время, необходимое на остановку и перекомпиляцию программы при нахождении и исправлении ошибок. В то же время такая настройка несовместима с настройками оптимизации, поэтому может быть использована только в отладочной версии. На рис. П9 показана страница свойств General для отладочной конфигурации.

Рис. П9. Страница свойств General для отладочной конфигурации

В финальной версии применяется настройка Program Database. Она включает генерацию .pdb файла, который может быть полезен при необходимости поиска ошибок в финальной версии продукта. Эта настройка никак не влияет на оптимизацию генерируемого кода, поэтому она может быть использована для финальной версии.

На рис. П10 показана страница свойств General для финальной конфигурации.

420

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]