Этапы прохождения задачи на компьютере

Лекция 2

Технология решения задачи на компьютере

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

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

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

Спецификациями называют полное н точное описание функций (действий) и ограничений разрабатываемого программного продукта.

Этан постановки задачи заканчивается разработкой технического задания с принятием основных проектных решений.

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

Проектирование общей структуры программы. Задача разбивается на отдельные фрагменты, выбирается вид интерфейса с пользователем.

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

Запись алгоритма на языке программирования (кодирование). Этот этап включает в себя выбор языка программирования; уточнение способов организации данных; запись алгоритма на выбранном языке. Программа позволяет реализовать алгоритм на компьютере.

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

Оформление документации на программный продукт и сопровождение программы.

Интегрированная среда разработки

Для кодирования и отладки программы современные системы программирования представляют собой интегрированную среду разработки IDE (Integrated Development Environment).и предоставляют пользователям удобные средства разработки программ:

· транслятор (компилятор или интерпретатор);

· компоновщик;

· средства создания и редактирования текстов программ;

· библиотеки стандартных подпрограмм и функций;

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

· "дружественную" к пользователю диалоговую среду;

· многооконный режим работы;

· встроенную справочную службу;

Будем использовать либо свободно распространяемую программную среду DEV- C++. В консольном окне по умолчанию используется кодировка С P 866. В редакторе кодов среды разработки DEV-C++ используется кодировка CP 1251. Кодировки разные. Для устранения этой проблемы, в программу добавляют команду, изменяющую кодировку консоли. Команда system (“ chcp 1251 ”).

Либо, в операционной системе unix будем работать со средой разработки С ode:: Blocks (компилятор MinGW)/

Язык программирования СИ

Основу языка положил язык Combined Programming Language (CPL) — язык программирования. Это совместная разработка Кембриджского и Лондонского университетов. Сейчас этот язык не используется из-за его сложности.  Его наследником стал язык BCPL(Basic Combined Programming Language) — язык программирования, разработанный Мартином Ричардсом в 1966 году в Кембриджском университете. Изначально он предназначался для написания компиляторов для других языков.

Язык Си был разработан для операционной системы Unix и реализован в этой системе Деннисом Ритчи в 1972 году. Язык Си входит в десятку наиболее востребованных языков программирования.

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

В классификации языков программирования по уровням, занимает промежуточное положение, в нем присутствуют черты языков и низкого, и высокого уровня (но больше черт ЯВУ).

Язык C часто называют языком среднего уровня. Это означает, что он объединяет элементы языков высокого уровня с функциональностью ассемблера.

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

В то же время язык можно отнести к языкам сравнительно "низкого уровня". Си может работать с битами и  байтами и адресами.

В самом языке нет стандартных средств ввода/вывода (наподобие read и write), нет встроенных механизмов обращения к файлам. Эти операции высокого системного уровня выполняются явным вызовом определенных функций.

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

В настоящее время известно множество реализаций языка С. Чтобы одна и та же программа могла работать на машинах различной аппаратной конфигурации, различные реализации должны соответствовать одному стандарту. Американский национальный институт стандартов ( ANSI ) разработал и в 1989 году принял стандарт ANSI С, который поддерживается современными компиляторами (С89, С99, С11).

Достоинства:

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

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

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

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

Мобильный язык. Это означает, что программа, написанная на Си для одной вычислительной системы, может быть перенесена на другую (на другие компьютеры различных архитектур, от 8-разрядных микропроцессоров до суперкомпьютеров).

Недостатки.

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

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

Тем не менее, Си–эффективный язык, пригодный для широкого класса задач. Язык СИ не содержит объектов. С++ является объектно-ориентированным.

Принципы программирования в языке Си основаны на понятии функции. Функция в Си аналогичны подпрограммам в других языках, например, функциям и процедурам в Паскале.

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

Структура программы на языке Си (примерный вид программы)

< Директивы препроцессора>

< Объявление глобальных данных >

< Объявление прототипов пользовательских функций или самих функций >

Главная функция main :

< int > main ( < void>)              // Заголовок гл. функции

{

< Операторы объявления *(локальные)

< Исполняемые операторы (инструкции, команды, действия)>

return 0;

}

Текст между фигурными скобками называется телом функции.

При написании программ используются элементы языка:

- идентификаторы,

- данные (переменные и константы),

- комментарии .

Рассмотрим пример программы на языке Си вычисления площади треугольника по формуле Герона.

Пример

//Пример программы вычисления площади треугольника

#include <stdio.h>   //директивы препроцессора

#include <math.h>

int main ( void ) //заголовок функции

{

double a , b , c , p , s ;         //Объявление переменных

printf (“Введите длины сторон треугольника\ n ”);// вывод на экран пояснительного текста

scanf (“% lf % lf % lf ”, & a , & b , & c ); //считывание исходных данных с клавиатуры

p=(a+b+c)/2;

s=sqrt(p*(p-a)*(p-b)*(p-c));

printf (“Площадь S =% lf ”, s ); ”);// вывод на экран результатов работы программы

return 0;//передача управления в точку вызова. Свидетельствует о том, что нет ошибок.

}

Программа, написанная на ЯВУ, не может быть непосредственно выполнена процессором. Предварительно ее нужно перевести на машинный язык. Это делают специальные программы-переводчики – трансляторы. Задача программиста подготовить текст программы на языке программирования, а транслятор подготовит программу к выполнению.

Транслятор – программа, осуществляющая перевод текста программы с языка программирования на машинный язык. В зависимости от способа перевода трансляторы подразделяются на компиляторы и интерпретаторы. Компилятор (compiler – составитель, собиратель) переводит на машинный язык всю программу и создает законченный ее вариант на машинном языке, который затем и выполняется, а интерпретатор (interpreter – истолкователь, устный переводчик) переводит каждый оператор, и по мере перевода операторы выполняются процессором. В процессе перевода программы на машинный язык транслятор выявляет ошибки в программе, т.е. выполняет диагностику ошибок.

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

Этапы прохождения задачи на компьютере

1. Исходный текст программы (Source code), написанный на языке программирования, может быть создан либо в редакторе среды программирования, либо в любом редакторе, поддерживающем ту же кодировку и должен быть сохранен в файле на диске.

2. В языке Си есть еще один подготовительный (промежуточный) этап – этап препроцессорной обработки. На этом этапе подключаются библиотечные файлы, в которых находятся прототипы определенных функций (например, в файле stdio находятся прототипы функций ввода/вывода). Этот этап еще называют 1-м этапом компиляции. Результатом является программа, разбитая на лексемы.

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

3. Следующий этап - сборка, или компоновка программы. На этом этапе главная функция связываются с вызываемыми функциями. Этим занимается специальная программа-компоновщик (редактор связей, linker), который собирает все объектные коды в полноценный исполняемый код.

Результат компоновки – исполняемый код программы ( Executable code ). Этот файл можно использовать для запуска программы на выполнение. Для выполнения исполняемый код будет загружен в оперативную память, где станет доступен процессору.

Рассмотрим более подробно приведенный выше пример программы вычисления площади треугольника .

Программа становится более понятной, если она снабжена комментариями. В этой программе это строки перед директивами препроцессора и перед функциями ввода/вывода:

Комментарии – это часть программы, которая игнорируется компилятором и служит для пояснения исходного текста. В языке программирования Си можно использовать 2 вида комментариев:

/* многострочный комментарий */

Или

// однострочный комментарий.

Но следует помнить, что однострочный комментарий в стандарте не прописан.

До трансляции программы в Си осуществляется так называемое лексическое преобразование. Выполняются директивы препроцессора, заданные в программе строками, которые начинаются с символа #. Работа препроцессора, по сути, является первым этапом компиляции. Строки, начинающиеся с символа #, не являются операторами языка, это директивы препроцессора.

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

Наиболее часто используются директивы:

# include, которая включает все содержимое заданного файла в компилируемый код

# define , заменяющая некоторый идентификатор в тексте программы на последовательность символов.

Если файл является стандартной библиотекой и находится в папке, которая указана в опциях компилятора, имя файла заключается в угловые скобки <>, например, <stdio.h>. В рассмотренной программе строка # include < stdio . h > является указанием компилятору включить в программу информацию о стандартной библиотеке ввода/вывода. Строка: #include <math.h> - является указанием компилятору включить в программу информацию о математических функций.

Если же файл (например, пользовательский файл с именем func), который необходимо подключить к программе, находится в текущем каталоге проекта, он указывается в кавычках - # include " func . cpp ". Если там файл не найден, то будет осуществляться поиск там же, где находятся стандартные библиотеки (или по правилам, зависящим от реализации). Для файла, находящегося в другом каталоге необходимо в кавычках указать полный путь.

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

int main (void) – заголовок главной функции. Тип void обозначает пустое множество значений, т.е. у функции нет аргументов. Он используется как тип возвращаемого значения, когда функция не возвращает результат.

Return 0 – это оператор, который завершает выполнение функции и возвращает результат работы функции в точку вызова этой функции.

Значение, возвращаемое главной функцией программы, используется ОС. Функция возвращает нулевое значение, если программа выполнена без ошибок.

Для программирования на языке СИ нужен компилятор. Большинство компиляторов позволяют компилировать программу и на СИ, и на СИ++. Обычно используют интегрированную среду разработки (IDE – Integrated Development Environment). Это редактор кодов, отладчик, компилятор и другие полезные утилиты.

Любой язык образуют 3 его составляющие: алфавит, синтаксис и семантика.

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

- прописные и строчные буквы латинского алфавита (A…Z, a…z);

- цифры (0…9);

- знаки арифметических операций +,-,*,/,%;

- вспомогательные символы (), ., ,, ;.:,[], {}, <,>, =,_,$,&,….

- составные символы <=, >=, ==, !=, \n,\t… &&.

Синтаксис – набор правил языка, по которым из символов алфавита строятся слова.

Программа строится из отдельных команд. Каждая команда завершается точкой с запятой - ;. Инструкциилоки), относящиеся к одной команде, заключаются в фигурные скобки {}. После них точка с запятой не ставится.

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

Из символов языка, в соответствии с синтаксисом и семантикой, строятся слова (лексемы).

В тексте на любом естественном языке можно выделить четыре основных элемента: символы, слова, словосочетания и предложения.

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

Лексемы — единицы текста программы, которые при компиляции воспринимаются, как единое целое и по смыслу не могут быть разделены на более мелкие элементы (или Л – синтаксически неделимая конструкция, имеющая определенный смысл для компилятора).

Лексемы образуются из символов, выражения — из лексем и символов, а операторы — из символов, выражений и лексем.

Лексемы отделяются пробелом или символом табуляции, или переводом строки.

В Си различают 6 типов лексем:

- идентификаторы,

- ключевые слова,

- строковые литералы,

- константы,

- знаки (символы) операций

- разделители (ограничители),

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

Например, s и S , Alfa и alfa - два различных имени. Первым символом идентификатора не может быть цифра. Пробелы внутри имен не допускаются. Идентификатор не должен совпадать с ключевыми словами. Длина идентификатора по стандарту не ограничена, но некоторые компиляторы и компоновщики налагают на нее ограничения.

Ключевые (зарезервированные, служебные) слова - это слова, которые имеют специальное значение для компилятора. Их нельзя использовать в качестве пользовательских идентификаторов. В стандарте предусмотрено 32 ключевых слов.

Ключевые слова в Си можно условно разбить на группы: базовые типы данных: int , char , double , float,

модификаторы (signed, unsigned, long, short),

операторы (if, for, while, break, switch, continue, do, case, defalt, return, else, goto, sizeof).

Еще: default, auto, register, static, externl, volatile, enum, union, struct,typedef).

Базовые типы данных (кроме типа void) могут иметь различные модификаторы, которые записываются перед идентификатором типа при объявлении типа. Модификаторы используются для изменения значения длины базового типа, для более рационального использования памяти. Список модификаторов типов: signed, unsigned, long, short. Модификаторы signed, unsigned, long и short могут применяться к целочисленным типам. К символам можно применять signed и unsigned. long может применяться к типу double. Например, базовый тип int может быть модифицирован каждым из этих спецификаторов (short int).

Литералы – это постоянные фиксированные значения, которые не могут быть изменены в программе.

В СИ принято называть литералами только строковые константы. Остальные будем называть просто константами. В качестве них могут выступать числовые константы (целые и вещественные) и символьные.

Целочисленные константы реализуются в виде значений типа int (например,15 -5 ).

Действительные константы по умолчанию относятся к типу double (например, 45.6,  -5, 1 e -5 ).

Символьные константы заключаются в одинарные ковычки (например,‘A’, ‘5’) Они реализуются в виде значений типа int (запоминается код символа).

Строковые литералы (“stroka”) заключаются в двойные кавычки. Они реализуются (представляют собой) в виде массива символов (в конце такого массива записывается нуль-символ).

Лексемы разделяются друг от друга разделителями.

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

Разделители: пробелы, символы табуляции (\ t ), перевода строки (\ n )

Операции используются для выполнения действий между операндами.

Все операции в языке СИ имеют приоритет и направление выполнения.

Операции 1 ранга имеют наивысший приоритет выполнения. Операции одного ранга имеют одинаковый приоритет, и если их в выражении несколько, то они выполняются в соответствии с правилами ассоциативности либо слева на право, либо справа налево.

Приоритеты всех операций, определенных в языке С:


Дата добавления: 2020-11-27; просмотров: 98; Мы поможем в написании вашей работы!

Поделиться с друзьями:




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