Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Решенные оветы на теорию Си.docx
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
167 Кб
Скачать
☆

1. Достоинства, отличительные особенности и сравнительная характеристика языка программирования Си.

ДОСТОИНСТВА ЯЗЫКА СИ

  1. современный язык:

  • включает в себя те управляющие конструкции, которые рекомендуются теоретическим и практическим программированием.

  • его структура побуждает программиста использовать в своей работе нисходящее проектирование, структурное программирование и пошаговую разработку модулей

  • результат такого подхода - надежная и читаемая программа.

  1. эффективный язык. Его структура позволяет наилучшим образом использовать возможности современных ЭВМ. На языке Си программы отличаются компактностью и быстротой исполнения.

  2. переносимый, или мобильный, язык: программа, написанная на Си для одной вычислительной системы, может быть перенесена с небольшими изменениями (или вообще без них) на другую. Если модификации необходимы, то они могут быть сделаны путем простого изменения нескольких элементов в "головном" файле, который сопутствует главной программе.

  3. мощный и гибкий язык (два излюбленных слова в литературе по вычислительной технике). Например, большая часть мощной и гибкой операционной системы (ОС) UNIX написана на языке Си. Речь идет о компиляторах и интерпретаторах других языков, таких, как Фортран, АПЛ, Паскаль, Лисп, Лого и Бейсик. Поэтому, когда вы используете компилятор с Фортрана в системе UNIX, результирующая объектная программа в конечном счете получается с помощью некоторой программы, написанной на языке Си. Кроме того, программы, написанные на Си, используются для решения физических и технических проблем и даже для производства мультипликационных фильмов.

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

  5. удобный язык: достаточно структурирован, чтобы поддерживать хороший стиль программирования.

Сравнительная характеристика языков С и С++

C++ — это объектно-ориентированный язык программирования, фундаментом которого является С. Язык С — это подмножество C++ и, следовательно, C++ — надмножество С.

В общем случае, компилятор C++ можно использовать для компиляции программы, написанной на С. Поскольку C++ основан на стандарте С89, при написании программы С, рассчитанной на компилятор C++, допускается использование только тех возможностей языка, которые предусмотрены в С89.

При написании программы на С, рассчитанной на компилятор C++, необходимо правильно указывать расширение файла, содержащего текст программы. Согласно действующему соглашению, файлы программ, написанных на С имеют расширение .С, а написанных на C++ — .СРР. Присвоение расширения .СРР файлу программы, написанной на С, недопустимо, потому как эти языки все же существенно отличаются друг от друга, и компилировать программу на С так, будто это программа на C++, нельзя. Расширение .С указывает транслятору на то, что он должен компилировать программу, написанную именно на С.

Си

Си++

Delphi

Java

Объектное ориентирование

+

+

+

+

Создание объектов на стеке

+

+

+/-

-

Инструкция goto

+

+

+

-

Поддержка try/catch

-

+

+

+

Инструкции break без метки

+

+

+

+

Инструкции break c меткой

-

-

-

+

Многомерные массивы

+

+

+

+

Динамические массивы

-

+

+

+

2. Особенности отладки программ в среде Visual C++ Studio .NET.

3. Этапы разработки программы на языке Си в среде Visual C++ Studio .NET.

4. Основные принципы и подходы структурного программирования:.

5. Идеология модульного программирования, уровни абстракции.

6. Базовые структуры управления, сквозной структурный контроль.

7. Модульное программирование. Структура модуля. Законы видимости

идентификаторов.

Суть модульного программирования состоит в разбиении сложной задачи на некоторое число более простых подзадач и составлении программ для решения достаточно независимо друг от друга. Модульность является одним из основных принципов построения программных проектов. В общем случае модуль - отдельная функционально законченная программная единица, некоторым образом идентифицируемая и объединяемая с другими, средство определения логически связанной совокупности объектов, средство их выделения и изоляции. Модуль является средством декомпозиции не только структур управления, но и структур данных. Этому в значительной мере способствовало развитие понятия "тип данных".

Модуль является единицей компиляции, хранения, а также единицей проектирования и раздельной разработки программного проекта коллективом разработчиков. Таким образом, модуль понимается как средство определения логически связанной совокупности объектов, средство их выделения и изоляции.

Создание модулей и использование их объектов в программах является одним из приемов экономичного программирования что обуславливается следующими обстоятельствами.

Во-первых, в модуле обычно определяются объекты, являющиеся носителями базовых понятий некоторой "предметной" области, так что модуль задает контекст этой предметной области. Поэтому программы, которые будут выполнять различные алгоритмы обработки в этой области, смогут воспользоваться готовыми и, что важно, одинаковыми определениями базовых объектов.

Во-вторых, и модули, и использующие их программы компилируются независимо (модуль должен быть откомпилирован раньше использующей его программы). Благодаря этому время компиляции большой программы использующей готовые модули, существенно сокращается, что важно при отладке программ, когда приходится их компилировать многократно.

Третьим важным свойством модуля является то, что он скрывает, "инкапсулирует" представление и реализацию экспортируемых им объектов, так что их возможные изменения в модуле (при его настройке или адаптации к новым аппаратным возможностям) не требуют никаких переделок пользовательских программ.

Все модули используют мнемонические имена для определяемых ими объектов (констант, переменных, типов и подпрограмм), что облегчает понимание их назначения и запоминание, удовлетворяет требованию наглядности текста программ.

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

Модуль является одним из средств, облегчающих верификацию программ. Модуль, как средство создания абстракции, выделяет спецификацию и локализует сведения о реализации.

Модули служат также целям создания проблемно-ориентированного контекста и локализации машинной зависимости.

Концепция модульного программирования

Концепцию модульного программирования можно сформулировать в виде нескольких понятий и положений:

  • Функциональная декомпозиция задачи - разбиение большой задачи на ряд более мелких, функционально самостоятельных подзадач - модулей. Модули связаны между собой только по входным и выходным данным.

  • Модуль - основа концепции модульного программирования. Каждый модуль в функциональной декомпозиции представляет собой "черный ящик" с одним входом и одним выходом. Модульный подход позволяет безболезненно производить модернизацию программы в процессе ее эксплуатации и облегчает ее сопровождение. Дополнительно модульный подход позволяет разрабатывать части программ одного проекта на разных языках программирования, после чего с помощью компоновочных средств объединять их в единый загрузочный модуль.

  • Реализуемые решения должны быть простыми и ясными. Если назначение модуля непонятно, то это говорит о том, что декомпозиция начальной или промежуточной задачи была проведена недостаточно качественно. В этом случае необходимо еще раз проанализировать задачу и, возможно, провести дополнительное разбиение на подзадачи. При наличии сложных мест в проекте их нужно подробнее документировать с помощью продуманной системы комментариев. Этот процесс нужно продолжать до тех пор, пока действительно не удастся добиться ясного понимания назначения всех модулей задачи и их оптимального сочетания.

  • Назначение всех переменных модуля должно быть описано с помощью комментариев по мере их определения.

Структура модуля.

СписокИнструкцийПрепроцессора

СписокОператоров

Макроопределение

Оператор

Оператор

Оператор

Оператор

#define Идентификатор СтрокаЛексем

ОбъявлениеПеременной

ОбъявлениеФункции

ОпределениеФункции

ОпределениеФункции

#define IdHello "Hello…"

int *pIntVal[5];

/*

Объявлена переменная типа массив указателей размерности 5 на объекты типа int с именем pIntVal.

*/

СпецификаторОбъявления Описатель;

СпецификаторОбъявления Описатель ТелоФункции

СпецификаторОбъявления Описатель ТелоФункции

#define IdHello "Hello…"

int *pIntVal[5];

int Описатель (СписокОбъявленийПараметров);

float Описатель (СпецификаторОбъявления Имя ) ТелоФункции

unsigned int MyFun2 (int Param1, ...) СоставнойОператор

#define IdHello "Hello…"

int *pIntVal[5];

int MyFun1 (

СпецификаторОбъявления ,

СпецификаторОбъявления АбстрактныйОписатель Инициализатор,

);

float MyFun2 (СпецификаторОбъявления ИмяОписатель)

ТелоФункции

unsigned int MyFun3 (int Param1, ...) {СписокОператоров}

#define IdHello "Hello…"

int *pIntVal[5];

int MyFun1 (float, int *[5] = pIntVal);

/*

Объявление функции. В объявлении второго параметра используется

абстрактный описатель - он описывает нечто абстрактное, а, главное,

безымянное, вида *[5]. Судя по спецификатору объявления int,

расположенному перед описателем, "нечто" подобно массиву указателей

на объекты типа int из пяти элементов (подробнее о массивах после).

И эта безымянная сущность инициализируется с помощью инициализатора.

*/

float MyFun2 (char chParam1)

{

СписокОператоров

}

unsigned int MyFun3 (int Param1, …)

{СписокОператоров}

#define IdHello "Hello…"

int *pIntVal[5];

int MyFun1 (float, int *[5] = pIntVal); // Объявление функции.

// Определены две функции…

float MyFun2 (char chParam1)

{

extern int ExtIntVal;

char *charVal;

}

unsigned int MyFun3 (int Param1, …)

{

const float MMM = 233.25;

int MyLocalVal;

}

Итак, наш программный модуль представляет собой множество инструкций препроцессора и операторов. Часть операторов играет роль объявлений. С их помощью кодируется необходимая для транслятора информация о свойствах объектов. Другая часть операторов является определениями и предполагает в ходе выполнения программы совершение разнообразных действий (например, создание объектов в различных сегментах памяти).

После трансляции модуля предложения языка преобразуются во множество команд процессора. При всём различии операторов языка и команд процессора, трансляция правильно написанной программы обеспечивает точную передачу заложенного в исходный текст программы смысла (или семантики операторов). Программист может следить за ходом выполнения программы по операторам программы на C++, не обращая внимания на то, что процессор в это время выполняет собственные последовательности команд.

С процессом выполнения программы связана своеобразная система понятий. Когда говорят, что в программе управление передаётся какому-либо оператору, то имеют в виду, что в исполнительном модуле процессор приступил к выполнению множества команд, соответствующих данному оператору.