Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Кафедра математического обеспечения компьютерных систем

Поиск

 

В. С. Макогон, И. Н. Лисицына

 

 

Задачи и упражнения по программированию на языке С/С++

 

Учебное пособие

 

 

Одесса

"???????"

 


 

 

Оглавление

 

Введение…………………………….………………….......………..…..….……….... 4

1. Структура программ на языке C/C++…..…………………….………...… 8

2. Базовые средства языка С/С++ ………………………… ……………….……. 11

3. Операторы управления программой. Базовые управляющие структуры..34

4. Программирование алгоритмов линейной структуры………………………. 55

5. Программирование разветвляющихся алгоритмов (оператор if)……… 66

6. Программирование разветвляющихся алгоритмов (оператор switch)… 70

7. Программирование алгоритмов циклической структуры……………… 76

8. Итерационные циклы.................................................................................. 106

9. Программирование алгоритмов с использованием функций................. 112

10.Программирование алгоритмов с использованием массивов…………. 146

11.Символьные переменные и строки. Обработка строк………………..… 181

12.Указатели………………………………………………………….……… 222

13.Структуры.. ………………………………………………….…………... 271

14.Файлы. Потоковый ввод-вывод………………………………………….. 282

Литература………………………………………………………….……… 328

 

 


Аннотация

 

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

С/С++ - мощный и гибкий язык программирования, который позволяет создавать компактные и эффективные программы. В пособии рассмотрены основные типы данных, базовые управляющие конструкции языка, используемые в рамках структурного программирования; рассмотрены массивы, строки, функции, указатели, структуры, файлы; даны рекомендации по стилю и технологии программирования; приводится подробный разбор и анализ типовых примеров.

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

Для широкого круга пользователей, не имеющих специальной подготовки в области программирования, студентов младших курсов и “продвинутых” школьников.

 


Введение

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

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

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

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

С другой стороны, язык С/С++ имеет ряд качеств, присущих языку низкого уровня. В нём реализованы многие операции, непосредственно исполняемые большинством микропроцессоров. Отметим в первую очередь доступ к регистрам микропроцессора, поразрядные логические операции, операции сдвигов и развитой механизм указателей на переменные и функции. Указатель – переменная, предназначенная для хранения машинного адреса некоторой переменной или функции. Поддерживается арифметика указателей, что позволяет осуществлять непосредственный доступ и работу с адресами памяти так же легко, как на языке ассемблера. (Использование указателей позволяет создавать высокоэффективные программы, однако требует от программиста особой осторожности.)

Во многих случаях программы, написанные на языке С/С++, сравнимы по скорости выполнения и объёму занимаемой памяти с программами, написанными на языке ассемблера; при этом они более наглядны и просты в сопровождении.

В 1983 г. Бьярн Страуструп на основе языка С создал язык С++ (первоначальное название – “С с классами”). С++ – это более совершенный С. Всё, что вы узнаете о языке С, вполне применимо и к С++. Дополнительно язык С++ позволяет создавать и эффективно использовать новые типы данных (так называемые классы) и построенное на их основе объектно – ориентированное программирование (ООП).

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

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

Установление чёткой взаимозависимости между данными и методами их обработки в ООП ведёт к большей целостности данных и значительно повышает надёжность программ по сравнению с традиционным процедурно – ориентированным программированием.

В настоящее время любая операционная система не может считаться полноценной, если в её составе нет компилятора языка С/С++.

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

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

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

Язык С/С++ не имеет встроенных операторов для управления вводом-выводом, процессами, памятью и т.п. Все эти задачи обеспечиваются набором функций библиотеки языка, которая поставляется в составе системы программирования. Программист может воспользоваться предоставляемыми функциями или разработать собственные функции для решения прикладных и системных задач. В составе библиотеки имеются функции для выполнения таких задач, как управление каталогами; управление файлами; ввод и вывод; управление процессами; распределение памяти; поиск и сортировка; операции над строками; буферизация ввода-вывода; проверка и преобразование данных; получение системного времени; математические функции; вызовы операционной системы. Имеются разделы библиотеки для операций над числами с плавающей точкой; библиотеки работы с экраном и клавиатурой; библиотеки графических функций и др.

Логически к библиотеке функций относятся также файлы включения или заголовочные файлы (имена этих файлов имеют часто расширение. h), которые содержат в виде фрагментов на языке С/С++ определение символических констант, стандартных типов, глобальных переменных, используемых функциями, а также объявления стандартных функций библиотеки (прототипы). Кроме того, некоторые функции библиотеки языка реализованы как макроопределения, т. е. они заменяются макрорасширениями при обработке их препроцессором во время компиляции программ, и поэтому они тоже находятся в файлах включения.

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

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

 

В каждом разделе приводятся необходимые теоретические сведения и подробные решения с комментариями нескольких типовых задач. Обсуждаются различные технические приёмы составления программ; поэтому нередко одна и та же задача решается несколькими способами. Анализ решённых задач поможет в написании собственных программ, в освоении полезных технических приёмов и приобретении определённого стиля программирования.

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

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

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

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

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

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

Все программы были отлажены и протестированы в режиме консольных приложений интегрированной среде разработки Borland C++ Builder 6, Visual Studio.NET 2008 и 2010. Это обстоятельство следует учитывать при использовании некоторых библиотечных функций (clrscr(), gotoxy(), sleep()), которые были использованы нами, но могут отсутствовать на других платформах (например, в компиляторах gcc и g++ операционной системы Linux).

 

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

 

 

1. Структура программ на языке C/C++.

 

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

Программа на языке С/С++ состоит из одной или нескольких программных единиц – функций. Одна из них (и, быть может, единственная) имеет имя main() и именно с неё начинается выполнение программы. Другие функции активизируются их вызовом из функции main() или из других функций.

Каждая функция содержит заголовок и тело или блок (описания данных и операторы). Формально блок определяется как любая последовательность предписаний языка, заключённая в фигурные скобки {}.

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

Будем пока рассматривать случай, когда программа содержит только функцию main(). Обычно в начале программы (до заголовка функции main()) располагаются так называемые препроцессорные (см. ниже ) команды #include <…>, которые обеспечивают подключение к тексту программы т. н. «заголовочных» (header) файлов, в которых содержится описание стандартных средств (типов, констант, функций и др.), необходимых для работы программы. В частности, для подключения средств ввода-вывода языка С++ используется команда препроцессора

 

#include <iostream.h> или #include <iostream>

 

а если в программе используются функции ввода-вывода языка С, то потребуется команда

 

#include <stdio.h> или #include <cstdio>

 

Для определения глобальных констант можно использовать препроцессорное утверждение #define. Например, команды:

 

# define PI 3.14159

# define DEZL ”C++ - это круто”

 

определяют вещественную константу PI и константу-строку DEZL соответственно.

Другой способ определения именованных констант – применение описателя const:

 

const float PI = 3.14159;


Рассмотрим пример программы, которая по заданному радиусу окружности R вычисляет по известным формулам C=2 R, S= R2 длину окружности С и площадь круга S.

Программе предшествует комментарий, заключенный в пары символов /* и */. Однострочные комментарии начинаются двумя символами // и не имеют завершающих символов.

 

 

/*

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

*/

#include <stdio.h>

#include <iostream.h>

#include <conio.h>

const double PI=3.14159;

#define DEZL "C++ - это круто!"

void main()

{

char name[15]; int r;

double c, s;

clrscr();

cout<<DEZL<<endl;

cout<<"Как тебя зовут? "; cin>>name;

cout<<"Привет, "<<name<<endl;

cout<<name<<", введи радиус ==>";

cin>>r;

c= 2*PI*r; s=PI*r*r;

cout<<" Площадь круга = "<<s<<'\n';

cout<<" Длина окружности = "<<c<<'\n';

getch();

}

 

Результат работы программы:

 

C++ - это круто!

Как тебя звать? Децл

Привет, Децл

Децл, введи радиус ==> 3

Площадь круга = 28.27431

Длина окружности = 18.84954

 

Дадим некоторые пояснения. В программе используется ввод-вывод данных в стиле языка С++. Здесь cin и cout – так называемые объекты класса iostream. Стандартному объекту cout с помощью операции << (вывод в поток) передаётся то, что мы хотим выдать на экран. Для вывода нескольких элементов используется цепочка таких операций. Для перехода на новую строку экрана можно использовать вывод символа ‘\n’, либо так называемый манипулятор endl (end line, то есть конец строки).

Ввод осуществляет стандартный объект cin и операция чтения >> (ввод из потока), спра­ва от которой указывается переменная, в которою передаётся вводимое значение. В процессе ввода числовых данных последовательность символов, изображающих число, авто­матически преобразуется во внутреннее представление согласно типу переменной (целое или вещественное). Для ввода нескольких величин в объекте cin используется цепочка опе­раций >>.

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

Стандартная функция clrscr() (всреде Borland C++ Builder)производит очистку экрана, а функция getch() в данном контексте приостанавливает выполнение программы до нажатия любой клавиши.

 

 

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

Затем модифицированный текст программы поступает на вход компилятора, который анализирует его, выявляет синтаксические и даже некоторые семантические ошибки и в случае отсутствия ошибок строит объектный модуль с расширением. obj. Наконец, компоновщик или редактор связей на основе объектного модуля строит исполняемый модуль (файл с расширением. exe), подключая к нему другие объектные модули и, в первую очередь, функции стандартных библиотек (например, стандартные функции ввода-вывода данных, математические функции и др).

 

 


 

 

2. Базовые средства языка С/С++



Поделиться:


Последнее изменение этой страницы: 2016-12-16; просмотров: 490; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.200.161 (0.009 с.)