Этапы получения программного кода 


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



ЗНАЕТЕ ЛИ ВЫ?

Этапы получения программного кода



Получение из исходного кода исполняемого модуля программы, проходит несколько этапов:

1) Формирование исходного кода в текстовом редакторе.

2) Предварительная обработка текста процессором.

3) Компиляция объектного файла.

4) Компоновка и сборка исполняемого файла.

5) Отладка (добавляется отладочная информация).

Функциональная декомпозиция

Функция – первый уровень абстракции программирования (один и тот же код работает с разными наборами данных), при этом решаются две задачи:

1) улучшается структура текста программы;

2) функция является средством, позволяющим избежать дублирования кода

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

Пример функциональной декомпозиции изображен на следующей схеме:

main () {… вызов f1 () вызов f4 () } f1 () {… вызов f2 () вызов f3 () }   f4 () { } f2 () {… }   f3 () {… }

 

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

 

Алгоритм программы

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

Ниже приведены графические обозначения (обозначения на блок-схемах) ОАС.

Структура “следование” Полная развилка Неполная развилка
Цикл с предусловие (цикл ПОКА) Цикл с постусловием (цикл ДО) Цикл с параметром

На схемах СЕРИЯ обозначает один или несколько любых операторов; УСЛОВИЕ есть логическое выражение (ЛВ) (если его значение ИСТИНА, переход происходит по ветви ДА, иначе — по НЕТ). На схеме цикла с параметром использованы обозначения: ПЦ — параметр цикла, НЗ — начальное значение параметра цикла, КЗ — конечное значение параметра цикла, Ш — шаг изменения параметра цикла.

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

В примерах мы будем использовать запись алгоритмов с помощью блок-схем и словесное описание.

Линейные алгоритмы

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

Пример 1. Пешеход шел по пересеченной местности. Его скорость движения по равнине v1 км/ч, в гору — v2 км/ч и под гору — v3 км/ч. Время движения соответственно t1, t2 и t3 ч. Какой путь прошел пешеход?

1. Ввести v1, v2, v3, t1, t2, t3. 2. S1:= v1 * t1. 3. S2:= v2 * t2. 4. S3:= v3 * t3. 5. S:= S1 + S2 + S3. 6. Вывести значение S. 7. Конец.

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

Пример 2. Дано натуральное трехзначное число n, в записи которого нет нулей. Составить алгоритм, который возвращает значение ИСТИНА, если верно утверждение: "число n кратно каждой своей цифре", и ЛОЖЬ — в противном случае.

1. Ввести число n 2. A:= n mod 10 {разряд единиц} 3. B:= n div 100 {разряд сотен} 4. C:= n div 10 mod 10 {десятки} 5. L:= (n mod A=0) and (n mod B=0) and (n mod C=0) 6. Вывод L 7. Конец

На приведенной выше схеме DIV и MOD соответственно операции деления нацело и получения остатка от целочисленного деления. В фигурных скобках записаны пояснения (комментарии) к операторам.

Развилка

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

Пример 1. Вычислить значение функции

1. Ввести x. 2. Если x£–12, то y:=–x2 3. Если x<0, то y:=x4 4. y:= x–2 5. Вывести y 6. Конец

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

Пример 2. Дано натуральное число n. Если число нечётное и его удвоение не приведет к выходу за 32767 (двухбайтовое целое число со знаком), удвоить его, иначе — оставить без изменения.

Чтобы удовлетворить условию удвоения, число n должно быть нечетным и меньше 16384.

1. Ввести число n 2. Если число n нечетное и меньше 16384, то n:= n * 2 3. Вывод n 4. Конец

Рассмотренный пример иллюстрирует неполную развилку. Также следует отметить, здесь логическое выражение, являющееся условием, содержит 2 операнда.

Циклы

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

Пример 1. Подсчитать количество нечетных цифр в записи натурального числа n.

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

1. Ввести число n 2. K:= 0 {подготавливаем счётчик} 3. Если n = 0, переход к п. 7 4. Если n mod 10 mod 2 = 1, то K:= K +1 5. n:= n div 10 6. Переход к п. 3 7. Вывод K 8. Конец

Задача решена двумя способами. Слева решение оформлено с использованием цикла с предусловием, справа — с постусловием.

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

Вычислить при n>2 сумму тех ее членов, которые больше заданного числа e.

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

1. Ввести e 2. S:= 0 3. A:= 1/4 4. n:= 3 5. Сравнить А с e. Если A>=e, переход к п. 10 6. S:= S + A 7. A:= (n-1)/(n*n) 8. n:= n + 1 9. Переход к п. 5 10. Вывод S 11. Конец

В рассмотренных выше примерах количество повторений заранее неизвестно. В первом оно зависит от количества цифр в записи натурального числа, во втором — от числа e.

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

Пример 3. Найти произведение первых k натуральных чисел, кратных трём.

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

1. Ввод k 2. P:= 1 {здесь накапливаем произведение} 3. T:= 0 {здесь будут числа, кратные 3} 4. I:= 1 5. Если I > k, переход к п. 10 6. T:= T + 3 7. P:= P * T 8. I:= I + 1 9. Перейти к п. 5 10. Вывод P 11. Конец

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

Функция main

main - основная функция языка си. Для языка си характерна следующуя специфика:

1) Каждая программа на С обязательно имеет функцию с именем main

2) Имя main может быть только у одной функции

3) Тело программы заключено в лексеммы: «{» - начало программы, «}» – выход из программы (корректный)

Для различных версий компиляторов языка си могут быть применены различные виды главной функции main:

- main – С, С++

- wmain и tmain – Visual Studio (с поддержкой Unicode)

- WinMain –Windows программирование

В языке С имеет различие написание маленьких и заглавных букв

Завершение программы происходит в случаях:

1) достижения окончания функции main – лексема «}»;

2) по выполнению return – инструкции из main;

3) вызов функции exit() из любой функции программы;

4) вызов функции abort() из любой функции программы.

при этом в случаях 1, 2 и 3 – имеется корректный выход, 4 – некорректный выход из программы.

 

Блоки кода

Блок кода – несколько строк, заключённые в фигурные скобки.

Если внутри блока кода содержится другой блок кода, то он называется составной инструкцией.

Внутри каждого блока кода могут быть объявлены данные, локальные для данного блока.

Комментарии

Существуют два возможных способа создания коментариев:

1) // комментированный текст - простой комментарий (действует на 1 строку)

2) /* комментированный текст */ комментарий действует на весь блок заключенный между набором символов "/*" и "*/".

 

Рекомендации:

- комментарии должны быть;

- плохой комментарий хуже, чем его отсутствие;

- не стоит комментировать очевидное;

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

- хорошим тоном считается комментировать начало файла.

 

 

Базовые понятия языка Си.

Ключевые слова Cи - слова, зарезервированные только для использования компилятором языка Си.

примеры:

#include
#define
if, for, while, int, float, char…

 

Идентификаторы – используются для присвоения имён объектам.

 

Специфика присвоения имён.

1) Идентификатор С++ состоит из последовательности букв и цифр. [a-z], [A-Z], [0-9], _.

2)  Первый символ должен быть буквой.

3)  _ - подчёркивание равно букве, но имена, начинающиеся с “_”, обычно зарезервированы для специфических нужд среды или использования стандартных библиотек.

4) Компилятор различает символы в верхнем и нижнем регистре. Например, fool и FOOL – разные переменные.

5) Для некоторых компиляторов есть ограничения для количества символов в имени (С – 31 символ). В количестве имён нельзя использовать ключевые слова С.

6) В качестве имён нельзя использовать ключевые слова С

7) Чем шире область использования, тем осмысленнее должны быть имена

8) Согласно Венгерской нотации рекомендуется в имени указывать тип переменной

 

примеры:

Примеры правильных имён Примеры неправильных имён
hello Hello this_is_very_long_var _u_name   a var1 my.var1 char $my _TYPE

Ключевые слова Си

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

Список ключевых слов:

auto, double, int, struct, break, else, long, switch, case, enum, register, typedef, char, extern, return union, const, float, short, unsigned, continue, for, signed, void, default, goto, sizeof, while, do, if, static, volatile.

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

Понятие lvalue и rvalue.

Для того, чтобы отличать выражения, обозначающие объекты, от выражений, обозначающих только значения были введены понятия lvalue и rvalue. Определение lvalue использовается для обозначения выражений, которые могли стоять слева от знака присваивания (left-value); им противопоставлялись выражения, которые могли находиться только справа от знака присваивания (right-value).

Характерные случаи использования lvalue и rvalue:

rvalue:

- Выражения, обозначающие временные объекты. В частности, результат вызова функций, возвращающих объекты не по ссылке; результат встроенных операций +, -. *, / и т.п.; явное создание временной переменной int() или C(); преобразования не к ссылочным типам и т.д.

- Результат встроенной операции взятия адреса (&) — rvalue типа указатель.

- Результат встроенных постфиксных операций ++, --.

- Литералы за исключением строковых.

- Константы перечислений.

lvalue:

- Выражения, непосредственно обозначающие объект, non-modifiable в случае const-квалификации. Например, имя переменной, параметра функции и т.п.

- Выражения ссылочных типов. non-modifiable в случае const-квалификации. В частности, результат вызова функций, возвращающих объекты по ссылке; выражения, состоящие из имен ссылочных переменных; операции преобразования к ссылочному типу и т.д.

- Результат встроенной операции разыменования (*) — lvalue указуемого типа; non-modifiable в случае const-квалификации.

- Результат встроенных префиксных операций ++, --.

- Имя функции — non-modifiable lvalue; может быть преобразовано к rvalue «указатель на функцию».

- Имя массива — non-modifiable lvalue; может быть преобразовано к rvalue «указатель на первый элемент массива».

- Строковые литералы — non-modifiable lvalue; может быть преобразовано к rvalue «указатель на char/wchar_t».

 

Типы данных.

Типы данных. В языке Си имеются два существенно различных типа данных: int- целый и float - вещественный(с плавающей точкой). Из них можно создавать еще два типа: char - символьный, double - вещественный с двойной точности.

Следует различать тип данных и модификатор типа.

Имеются следующие базовые типы:

- • char (символьный) – занимает 1 байт (8 бит) памяти

- • int (целый) – 2 байта

- • float (вещественный) – 4 байта

- • double (вещественный с двойной точностью) – 8 байт

- • void (пустой тип)

К модификаторам относятся:

- • unsigned (беззнаковый)

- • signed (знаковый)

- • short (короткий)

- • long (длинный)

Тип данных и модификатор типа определяют:

- - формат хранения данных в оперативной памяти (внутреннее представление данных)

- - диапазон значений в пределах которого может изменяться переменная

- - операции которые могут выполняться над данными соответствующего типа

Итак, к данным целого типа относятся следующие типы:

char, int, long int (2 байта), short int (4 байта). Модификаторы signed и unsigned могут предшествовать любому целому типу, но они не обязательны. Они указывают, как интерпретируется старший бит переменной. По умолчанию все переменные целого типа считаются signed, т.е. левый бит интерпретируется как знак.

К вещественным типам данных (с плавающей точкой) относятся:

float, double, long double (10 байт).

 

Функции

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

Функции могут возвращать значение. Это значение может быть использовано далее в программе.

Использование функций позволяет:

- улучшить структуру текста программы;

- избежать дублирования кода.

 

Существует два типа функций:

1) прямые (выполняют ряд действий и передают управление вызывающей функции);

2) рекурсивные (многократно вызывают "сами себя").

Пример рекурсивной функции:

int Factorial (int a)
{
if(a==a)
{
    return 1;
}
else
{
     int fact a=a factorial(a-1);
     return fact;
}
}

 


 Блоки кода программы.

Блоки кода служат для логического разделения областей программы. Блок кода выделяется в тексте фигурными скобками:

{

Блок кода

}

Могут содержать в себе вложенные Блоки кода.

{

Блок кода

{

Блок кода 1

}

}

 

Можно объявить данные или переменные, и они будут локальные (нельзя использовать вне блока).

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

Операторы языка C.

Арифметические операторы + - * …

1.1) % - остаток от целочисленного деления
int x=1, y=2, z;
z=x/y; //z=0
z=x%y; //z=1
z=3%5; //z=2

  1.2) Инкремент – увеличение числа на единицу.
 Декремент – уменьшение числа на единицу.

  x=1;
y=x++; (y=x+1)
y++; (y=y+1)

префиксная запись y=x++
постфиксная запись y=++x

1) Оператор присваивания
x=выражение
a=b=c=d
a=(b=(c=d))

Логические операторы

true (!=0)
false (0)

3.1) Операторы отношения
<, <=, >=, >, = =,!=
3.2) Логические операторы
!, &&, //

(и) (или)
if(year>14&&year<18)
if(t>36.7|| t<36 || p>140)

Тернарный оператор

Тернарный оператор «?:» является сокращенной формой конструкции if…else. Он получил такое имя потому, что включает в себя три операнда. Оператор вычисляет условие и возвращает одно значение в случае, если условие верно, и другое значение, если условие неверно. Синтаксис оператора:

условие? значение_истина: значение_ложь

Здесь условие — это выражение типа Boolean, значение_истина представляет собой значение, которое возвращается, если условие равно true, и значение_ложь возвращается в противном случае.

 

4) Оператор запятая “, ”
Группирует несколько выражений там, где компилятор ожидает одно.


1) int a=1, b=2, c;
c=a,b; // с =1
c=(a,b); //c=2
c=a++,b++; //c=1, a=2, b=3


2) if(std::cin>>x, x>0)
//вычисляет все, но формируется последняя

char symbol;
symbol=‘A’;
printf(“%c”, symbol);
char symb 1[10];
symb 1[0]=’s’;
symb 1[1]=’t’;
symb 1[2]=’u’;
symb 1[3]=’d’;
………………

Данные

 

Данные могут быть:

 

1) целые числа;

2) числа с плавающей точкой(арифметические типы данных). Служат для выполнения вычислений;

 

int float double unsigned short long

3) символы и строки;

char char[]

4) логические;

bool

Символьные данные (литералы) – символ, пара символов или три символа,     заключенные в кавычки.

 

ASCII (7-и битная кодировка)
0-127 символов
KOI-8
UNICODE 65535 символов

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

const char[]

                                                 Перечисление.
enum
my_action =0
//плюс
             =1
//минус
             =2
//умножить
             =3
//делить

1)enum Action

{
plus, //0
minus, //1
multiply, //2
division, //3
};
my_action = plus, //
автоматически присваивает значение

2)enum Action
{
  plus=5,
  minus=3,
  multiply=2,
  division=1,
};


3)enum Action
{
   plus=5, //5
   minus, //6
   multiply, //7
   division, //8
};

int m=7;
if(m>minus)
{
    true
}

Базовые типы данных.

Типы данных

       базовые                                                                  производные

 

Базовые

целые
bool                                                                                              
void                                                                                              
плавающие                                                                                       

char (1)
short(2)
long(4)

int (системно зависим)
_int n
(n=8,16,32,64)
long long (8)

Плавающая точка:
float (4)
double (8)
long double (8)

Производные

1) простые - указатель, ссылка

2) составные - класс(class), структура(structure), объединение(union), массив(array)

3) sizeof(_)

либо выражение, либо тип данных
sizeof(char) = =1
double d;
sizeof(d) //= =8

 

y=300*sin(x)

 

    int            double

Неявное приведение типов производит компилятор автоматически по правилу:
”Полученное в результате вычисления выражение приводится к типу слева от знака равенства.”.

Явное приведение типов.
y=300*(int)sin(x); //неверно!!!


y=(int)(300*sin(x));

float var1;
cin>>var1;
if(var1!= (int)var1)                   
проверка на тип данных
{
// не целое
}

 

Файловый ввод - вывод.

 

1) infile = fopen(“имя”, w);
“Z:\\...\\myfile.txt”;

 

2) myfile.txt
*.vcproj
*sln
..\\ на уровень выше.

 

Булевые переменные (тип BOOL).

True =1                                                                                                                           False=0
ex.:
bool b=(x<=y);
//b=5 – ошибка
int n=b;
(неявное приведение к типу int)

Старый BOOL – 4 бита
Сейчас BOOL – 1 бит

 



Поделиться:


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

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