Добавил:
Берегите себя и своих близких. По всем вопросам - пишите в мой вк, помогу чем смогу. Всем УЗС привет! Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

C++ программы НОВИКОВ / Панюкова Путеводитель по языку С++ Глава 1

.pdf
Скачиваний:
63
Добавлен:
25.11.2016
Размер:
375.52 Кб
Скачать

6

Введение

Законы Мэрфи: 1.Все сложнее чем кажется.

2.Все тянется, чем можно ожидать.

3.Все оказывается дороже, чем планировалось. 4. Если что то может испортиться, оно обязательно портится.

Комментарий Каллагона к закона Мэрфи: Мэрфи был оптимистом.

Это один из тысяч изданных на нашей планете учебников программирования. Он не лучше и не хуже многих других подобных книг. И, как показывает опыт преподавание дисциплины «Языки и методы программирования», каждый обучающийся подбирает себе понятную книгу. И этот выбор – индивидуален. В данном учебном пособии приводится конспект лекций по двухсеместровому курсу, который читается студентами направления 010400 «Прикладная математика и информатика» (профиль «Математическое и информационное обеспечение экономической деятельности») Южно-Уральского государственного университета.

Следует заметить, что большинство первокурсников приходит обучаться программированию с одной целью – услышать от преподавателя массу однообразных курсов «Программирование на языке…» и выбрать для себя подходящий. Однако все обучение языку программирования должен заканчиваться на первом курсе, в дальнейшем студенты совершенствуют навыки и самостоятельно изучают новые языки. Увы, но чтение на лекциях ключевых слов одного из языков, пунктов меню какой-либо среды программирования не является эффективным способом обучения. Поэтому в данном учебном пособие, с одной стороны, собран словарь и путеводитель по языку C++, в ней содержится немало «рецептов» для создания простых работающих программ. Но с другой стороны, C++ является всего лишь примером, на котором рассматриваются технологии записи алгоритмов на языке программирования. Более того, многое, в чем придется разбираться в рамках этого курса, в будущем окажется совершенно бесполезным: что-то уже прекрасно реализовано в различных библиотеках; многое в идеале легче и красивее программируется с помощью объективно-ориентированного подхода (о котором в данном учебном пособие будет рассказано только в общих чертах). Этот материал полезен для того, чтобы научиться алгоритмическому подходу, думать как программист, быстро находить ошибки и отлаживать программы.

Учебное пособие написано таким образом, что если в нем заменить все примеры и все вхождения строки «C++» на название и примеры другого

7

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

Дело в том, что язык – это только верхушка айсберга. Чтобы стать высококвалифицированным программистом, нужно быть, во-первых, прекрасным математиком, во-вторых, смелой творческой личностью и не бояться экспериментировать, отлаживать, ошибаться. На свете нет ни одного программиста, который ни разу не ошибся. Потому одной из целей изучения курса является умение быстро находить и исправлять ошибки.

Учебное пособие состоит из двух книг.

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

Во второй книге рассматриваются основы объективноориентированного подхода и простейшие примеры создания Windowsприложений в среде Visual С++ с использованием технологий .NET. Ярым противникам привязки к конкретной технологии хотелось бы заметить, что изначально эти лекции были составлены для среды визуального программирования Borland C++ Builder, а потом (в связи с некоторыми объективными причинами) были оперативно адаптированы под технологию

.NET. Это значит, что, пользуясь «рецептами» из второй части, можно облегчить себе освоение основ визуального программирования в какой-либо другой, более удобной и привычной среде (C++ Builder, KDevelop и многие другие). Большинство рассмотренных в этой части примеров являются модифицированными вариантами задач из известной книги Никиты Культина «Язык программирования в задачах и примерах» (где вместо строки «Язык программирования» можно подставить практически все, что угодно). Книги Н. Культина [6,7], несомненно, являются неплохим сборником рецептов для начинающих. Однако, как показала практика, для полноценной работы, а не воспроизведения готовых примеров, требуются более детальные пояснения о работе объектных механизмов, нежели имеющиеся в книге комментарии.

8

В учебном пособии содержится также практикум для студентов (18 вариантов), охватывающих весь теоретический курс, а также олимпиадные задачи "для продвинутых" [3], собранные из задачников разных лет, и ставшие уже классикой программирования. Большинство задач заимствовано из книг [11] и [16] (для работы с консольными приложениями) и книги [7] - для работы с GUI - приложениями.

Данная книга может быть хорошо дополнена и другими учебниками по программированию. Стоит, правда, заметить, что нет среди них самого лучшего. Как нет и самого лучшего преподавателя. Точнее, самым лучшим преподавателем для Вас являетесь Вы сами. Можно найти книгу, написанную максимально близко к особенностям восприятия процесса программирования именно Вами. И для каждого человека такая книга индивидуальна. Не стоит новичку без подготовки читать книги Бьерна Страуструпа. Возможно, найдётся во всем мире несколько талантливых новичков, которые постигнут программирование, прочитав эту книгу. Для остальных подобное испытание может напрочь отбить желание заниматься программированием. Мы же, начиная изучать иностранный язык (английский, немецкий, французский…)не хватаемся сразу за книгу с пометкой "Продвинутый уровень"! Мы же, первый раз в жизни встав на горные лыжи, не бежим покорить олимпийскую трассу! И ученик автошколы после первого занятия по вождению никогда не станет чемпионом по дрифту! А если вспомнить, как мы учились читать на родном языке? И таких примеров из жизни можно привести много.

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

9

Глава 1. Элементы структурного программирования

1.1 История языка С++

Язык С (читается как "С") создан в начале 70-х годов 20 века, когда Кен Томпсон и Дэннис Ритчи из Bell Labs разрабатывали операционную систему UNDS. Сначала они создали часть компилятора С, затем использовали её для компиляции остальной части компилятора С и, наконец, применили полученный в результате компилятор для компиляции UNIX. Операционная система UNIX первоначально распространялась в исходных кодах на языке С среди университетов и лабораторий, а получатель мог откомпилировать исходный код на С и машинный код с помощью подходящего компилятора.

Предшественником С является язык В ("Би"), созданный Кэном Томпсоном, который в свою очередь имеет корни в языке Мартина Ричардсона BCPL. Язык BCPL был создан в 1967 году как язык для написания компиляторов и программного обеспечения операционных систем. Кен Томпсон предусмотрел много возможностей в своем языке В для создания ранних версий операционной системы Unix и Bell Ladoratories в 1970 году на компьютере DEC PDP-7. Языки BCPL и B были языками без определения типов данных : каждый элемент данных занимал одно "слово" в памяти и время обработки элемента данных, например, как целого или действительного числа падало на плечи программиста.

По сравнению с BCPL, С был улучшен путём добавления типов данных определённой длины. В отличие от других языков высокого уровня, С мог работать с адресами памяти напрямую с помощью указателей и ссылок. Поскольку С сохранил способность прямого доступа к аппаратному обеспечению, его часто относят к языкам среднего уровня или в шутку называют "мобильным языком ассемблера".

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

10

Широкое распространение языка С на различных типах компьютеров (иногда называемых аппаратными платформами) привело, к сожалению, к появлению большого числа диалектов языка. Они были похожи, но не совместимы друг с другом. Это было серьезной проблемой для разработчиков программ, которые можно было бы выполнять на нескольких платформах. Стало ясно, что необходима стандартная версия С. В 1983г. ANSI (Американский Национальный Комитет Стандартов) сформировал технический комитет X3J11 для создания стандарта языка С (чтобы «обеспечить недвусмысленное и машинно-независимое определение языка»). В 1989 стандарт был утвержден. ANSI скооперировался с ISO (Международной Организацией Стандартов), чтобы стандартизовать язык C в международном масштабе; совместный стандарт был опубликован в 1990 году и назван ANSI/ISO 9899:1990. Этот стандарт совершенствуется до сих пор и поддерживается большинством фирм разработчиков компиляторов.

Бьерн Страуструп высвободил объектно-ориентированный потенциал языка С путем перенесения возможностей классов Simula 67 в С. Первоначально новый язык носил имя "С с классами" и только потом стал называться C++. Язык C++ достиг популярности, будучи разработанным в Bell Labs, позже он был перенесен в другие индустрии и корпорации. Сегодня это один из наиболее популярных языков программирования в мире. Но следует заметить, что С++ наследует как хорошие, так и плохие стороны языка С.

Бьерн Страуструп писал: «Я придумал С++, записал его первоначальное определение и выполнил первую реализацию. Я выбрал и сформулировал критерии проектирования С++, разработал его основные возможности и отвечал за судьбу предложений по расширению языка в комитете по стандартизации С++. Язык С++ многим обязан языку С, и язык С остается подмножеством языка С++ (но в С++ устранены несколько серьезных брешей системы типов С). Я также сохранил средства С, которые являются достаточно низкоуровневыми, чтобы справляться с самыми критическими системными задачами. Язык С, в свою очередь многим обязан своему предшественнику, BCPL; кстати, стиль комментариев // был взят в C++ из BCPL. Другим основным источником вдохновения был язык Simula67. Концепция классов (с производными классами и виртуальными функциями) была позаимствована из него. Средства перегрузки операторов и возможность помещения объявлений в любом месте, где может быть записана инструкция, напоминает Algol68. »

Название С++ выдумал Рик Массити. Название указывает на эволюционную природу перехода к нему от C. "++" - это операция инкремента в C. Чуть более короткое имя C+ является синтаксической ошибкой; кроме того, оно уже было использовано как имя совсем другого языка. Знатоки семантики C находят, что C++ хуже, чем ++C. Названия D язык не получил, поскольку он является расширением С и в нем не делается попыток исцеляться от проблем путем выбрасывания различных

11

особенностей… Изначально C++ был разработан, чтобы автору и его друзьям не приходилось программировать на ассемблере, C или других современных языках высокого уровня. Основным его предназначением было сделать написание хороших программ более простым и приятным для отдельного программиста. Плана разработки C++ на бумаге никогда не было; проект, документация и реализация двигались одновременно. Разумеется, внешний интерфейс C++ был написан на C++. Никогда не существовало "Проекта C++" и "Комитета по разработке C++". Поэтому C++ развивался и продолжает развиваться во всех направлениях, чтобы справляться со сложностями, с которыми сталкиваются пользователи, а также в процессе дискуссий автора (Б. Страуструпа) с его друзьями и коллегами.

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

Хотя язык программирования С++ справедливо называют продолжением С и любая работоспособная программа на языке С будет поддерживаться компилятором С++, при переходе от С к С++ был сделан весьма существенный скачок. Язык С++ выигрывал от своего родства с языком С в течение многих лет, поскольку многие программисты обнаружили, что для того, чтобы в полной мере воспользоваться преимуществами языка С++, им нужно отказаться от некоторых своих прежних знаний и приобрести новые, а именно: изучить новый способ концептуальности и решения проблем программирования. Перед тем как начинать осваивать С++, Бьерн Страуструп и большинство других программистов, использующих С++ считают изучение языка С необязательным.

C++ в настоящее время считается господствующим языком, используемым для разработки коммерческих продуктов, 90% игр пишутся на С++.

Одной из быстро развивающихся областей программирования – интернет, во всем его разнообразии. Именно по этой причине разработчики компиляторов начали искать универсальный язык программирования, чтобы воплотить в единую систему все подключенные к сети приборы, будь то суперкомпьютеры или какие-нибудь холодильники с автоматическим заказом закончившихся продуктов. Именно для таких целей в 1991 году компания Sun Microsystems финансировала внутрикорпоративный исследовательский проект под кодовым названием «Green». В результате работы был создан язык на основе языка С и С++, который его создателем, Джеймсом Гослингом (James Gosling), был назван "Oak", в честь дуба, растущего за окном здания Sun. Позже было обнаружено, что язык

12

программирования с названием Oak уже существует. Когда группа разработчиков фирмы Sun зашла в меcтное кафе, было предложено имя Java, и оно закрепилось за языком.

Однако проект столкнулся с несколькими трудностями. Рынок интеллектуальных бытовых электронных приборов (На который ориентировались разработки)развивался не так быстро, как ожидали разработчики. Но благодаря порыву популярности WWW в 1993 году разработчики Sun увидели непосредственный потенциал использования для создания Web-страниц с так называемым динамическим содержимом

(dynamic content)

Sun официально объявила о языке Java на торгово-промышленной выставке в мае 1995 года, где проект привлек большое внимание. В июне 2000 года компания Microsoft анонсировала платформу .NET и новый язык программирования получивший название С# (читается «Си шарп»). С# - это строго типизированный объектно-ориентированный язык, призванный обеспечить оптимальное сочетание удобства, простоты, выразительности и производительности. Платформа .NET основана на использовании общей среды пополнения кода CLR (Common Language Runtime), подобной виртуальной Java-машине и набора библиотек, доступных для ряда языков программирования. Независимо от того, какой язык используется в процессе разработки, программа компилируется в промежуточный код IL (Intermediate Language). С# и .NET в некотором смысле являются «родственными душами»: некоторые свойства языка специально разрабатывались, что бы обеспечить комфортную работу в среде .NET, в то же время и некоторые свойства .NET специально закладывались для поддержки С#, хотя .NET способна использовать многие языки программирования. Язык С# разрабатывался с учетом опыта многих предшествующих ему языков программирования, но в первую очередь, конечно, С++ и Java. Родителями С# стали Андерс Хейлсберг получивший известность, как автор Delphi, и Скотт Уилтамусс.

1.2.Структурное программирование

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

Основными критериями качества считались:

-узко понимаемая эффективность;

-компактность.

13

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

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

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

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

Так, например, Бьерн Страуструп говорит о важности хорошо структурированных программ: «Вы можете написать небольшую программу (<1000 строк), использую грубую силу и нарушая все правила хорошего стиля. Для программы большого размера вы не сможете этого сделать. Если структура программы, состоящей из 100000 строк плоха, вы обнаружите, что новые ошибки появляются с той же скоростью, с которой исправляются старые. С++ разрабатывался таким образом, чтобы предоставить возможность структурировать большие программы, и чтобы один человек мог работать с большим объемом кода».

Бьерн Страуструп слишком оптимистично говорит о программах в 100 тыс. строк. Если бы программа в несколько сотен строк кода была написана с помощью грубой сила и против принципов структурного и объектноориентированного программирования, произошло бы то же самое.

Сразу же возникает вопрос, который задают некоторые студенты на первой лекции «А как написать самую лучшую программу!». В качестве ответа придется отметить следующее. Не существует единственного

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

Да, не существует таблетки от всех болезней. Но можно научиться лечить каждый недуг в отдельности. То же самое касается и программ. Несмотря на отсутствие единственного «рецепта успеха», можно научиться писать хороший код, понятный участникам проекта, эффективный, оптимальный, позволяющий получить надежную программу.

14

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

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

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

Обычно технология структурного программирования формулируется в виде следующих «заповедей»:

нисходящее проектирование; пошаговое проектирование;

структурное проектирование (программирование без goto); одновременное проектирование алгоритма и данных; модульное проектирование; модульное, нисходящее, пошаговое тестирование;

Одним словом, структурное программирование – модульное нисходящее пошаговое проектирование и отладка алгоритма и структур данных.

1.3 Алгоритмизация вычислительных процессов

Решение задач на компьютере основано на понятии алгоритма. Введем следующие определения.

Алгоритмизация – это процесс построения алгоритма решения задачи, результатом которого является выделение этапов процесса обработки данных, формальная запись содержания этих этапов и определение порядка их выполнения.

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

Исполнитель алгоритма – человек либо устройство, способное выполнить некоторые определенные предписания.

Построение алгоритма – основное понятие математики. Математическая теория алгоритмов примыкает к математической логике.

Синонимы алгоритма – инструкция, рецепт, метод решения. Программа – это алгоритм, записанный на языке программирования и

предназначенный для исполнения компьютером.

Не любое предписание является алгоритмом. Например, не являются алгоритмами утверждения:

15

Действуй по обстоятельствам!

Пойди туда, не знаю куда, принеси то, не знаю что!

Эти инструкции не точны и не указывают конкретной последовательности действий.

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

Общие свойства алгоритмов:

1.Определенность – однозначность результатов при заданных исходных данных.

2.Дискретность – расчлененность на определенные элементарные

действия

3.Результативность – через некоторое конечное число шагов алгоритм выдает результат

4.Массовость – алгоритм дает результат для любых исходных данных из некоторого их множества

Данные – это факты и идея, представленные в формализованном виде, позволяющем передавать или обрабатывать эти факты и идеи с помощью некоторого процесса.

Данные бывают двух типов:

Проблемные – данные, которые обрабатываются программой (числовые, логические, символьные, строковые).

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

Данное любого типа является элементной (скалярной) величиной. Данное, представляемое набором скалярных величин – составное.

Множество целых и рациональных чисел бесконечны в математике. В компьютерной арифметике эти множества ограничены. Например, множество целых чисел ограничено ±.

Данные можно подразделить и на константы и переменные. Константы – данные, которые нельзя переопределить, т. е. изменить в

процессе выполнения алгоритма ( π, е,…)

Переменные – данные, значения которых порождаются и изменяются в процессе исполнения алгоритма (промежуточные, выходные данные).

Для ссылки на переменную ей нужно дать имя.

Таким образом, данное характеризуется следующими параметрами: имя; тип; значение.

Соседние файлы в папке C++ программы НОВИКОВ