Этапы создания программного продукта. 


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



ЗНАЕТЕ ЛИ ВЫ?

Этапы создания программного продукта.



Оглавление.

 

Этапы создания программного продукта. 5

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

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

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

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

Функция main. 16

Блоки кода. 17

Комментарии. 17

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

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

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

Типы данных. 22

Функции. 23

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

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

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

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

Понятие, объявление и определение. 31

Ключевое слово typedef. 32

Виды компоновки программ: 32

Область видимости. 33

Пространство имён. 34

Оператор разрешения области видимости. 36

Пространство имён – namespace. 36

Инструкции. 37

Инструкции условий. 38

Инструкции цикла. 39

Инструкции безусловного перехода. 40

Препроцессор. Заголовочные файлы. Директивы препроцессора. 41

Указатели. 45

Арифметика указателей. 46

Связь массивов и указателей. 50

Двумерные массивы. 51

Трёхмерные массивы. 52

Массивы указателей. 52

Динамическое распределение памяти. 53

Управление памятью. Оператор new и delete. 53

Оператор new и массивы. 54

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

Ссылки. 56

Функции. 58

Определение функции (реализация). 60

Вызов inline функции. 61

Указатели на массивы в качестве параметров функции. 65

Значения аргументов функций по умолчанию. 65

Переменное число параметров функции. 67

Функции стандартной библиотеки. 68

Виды возвращаемых значений и механизмы их формирования. 69

Проблемы при возвращении ссылки или указателя. 70

Ключевое слово const. 71

“Перегрузка” имён функции. 71

Возможный конфликт при использовании параметров по умолчанию. 73

Рекурсивные функции. 73

Структуры Си. 74

Структуры и функции. 77

 


Этапы создания программного продукта.

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

  Постановка задачи

Документирование

  ¯
  Проектирование
  ¯
  Оценка риска
  ¯
  Верификация
  ¯
  Кодирование
  ¯
  Тестирование
  ¯
  Уточнения
  ¯
  Производство
  ¯
  Сопровождение

 

Рис. 1. Этапы создания программного продукта.

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

 

 

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

 

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

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

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

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

Рис. 2. Декомпозиция задачи на подзадачи.

 

Рис. 3. Файловая декомпозиция.

 

Разбиение на файлы позволяет:

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

2) уменьшить общее количество времени создания нового загрузочного модуля компилятором.

Но между файлами возникают взаимодействия, поэтому программист обязан за ними следить.

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

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

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 бит

 

Ключевое слово typedef.

typedef тип синоним типа,

typedef unsigned char BYTE;
BYTE var8;
#if defined(_win32)
typedef int int32;
#else
typedef long int 32;
#endif
int32 i=1 - 32 разряда памяти

Область видимости.

{

int i;
}
//i=1

File scope – область видимости для переменной не {} будет видна только в этом файле

#include…
int z;
void main()
{
z=10;       

}


Область видимости переменной.

--- namespace;
---function scope;
---void f1(void)
{
label1:
}
void f2(void)
{
label1:
}
---class scope
---область видимости имён параметров прототипа функции.

 

Скрытие имени переменной.

int ix; //глобальная

void Func ()

{

int ix; //локальная

ix=2;

{

    int ix; //локальная

    ix=3;

}

}


Инструкции.

Инструкции – идут по порядку, содержат имена, разделители.

   инструкция

                         имя               оператор       разделители    

                                                                     (частей инструкции)

                                                                                TAB     пробел

 

Типы инстр.

 Для чего она

Примечание

составная инструкция

группа интср. 

{} может не содержать ни

 

(заключ. В {})

одной инструкции

инструкция объявления

имя переменной

Вводит новое имя в новые

 

(нового типа)

области видимости

 

Последова-тельность операторов,

может содержать арифм.

инструкция выражения

операндов, действ. 

выражения, логич. выраж.,

 

над ними

вызов ф-ии

пустая инструкция

;

 

инструкция выбора

if, else, switch

 

инструкция цикла

do, while, for

while (усл.) инструкция

инструкция безусловного

continue, go to, return,

 

перехода

break

 


Инструкции условий.

If, if – else

if (условие) {true инструкция}

[ else {false инструкция}] – не обязательно

If (x!=0) … if (x)

Переключатель switch

switch (выражение)

{

case конст. _1:

…//

break;

case конст. _2:

…//

break;

default:

}

 Существенно:

1) В скобках switch находится выражение, которое в итоге сводится к целому типу (switch переводит к целому типу).

2) Точки, куда передаётся управление, помечены ключевым словом case. Каждой такой метке сопоставляется константа (типа int) для сравнения со значением, вычисленным в скобках.

3) Обычно использование case предполагает, что будет выполняться вся ветвь программы, следующая за операндом. Для прекращения обработки case выражений, используется функция break, которая передаёт управление на закрывшуюся скобку.

switch (выражение)

{

case 5;

cout<<5;

case 4;

cout <<4;

}

 Выражение default будет выполняться, если не совпало ни одно условие.

switch (выр-е)

{

case 5;

{

    int iX;

}

break;

}

Инструкции цикла.

While.

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

while (условие продолжения цикла) {операторы}

Замечание: С помощью while очень легко создать бесконечный цикл.

while (int i=1) {}

break – выход из бесконечных цикла

if(getch()=’_’) break;}

do… while

 do тело цикла while (условие продолжения)

 

For

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

for ([инициализирующая инструкция];[выражение 1, условие]; [выражение 2])

{ тело цикла;}

for (index=0, index <10, index ++)

 Условие продолжения цикла с оператором for вычисляется на каждой итерации, поэтому не стоит компилировать вычисление сложения выражения.

 Лучше выражение вычислять один раз до начала цикла.

for (…; r<x*y*z; r++) => for (…,r<R; r++)

{}

 В любой части цикла могут быть несколько выражений, они должны быть разделены “,”, а не “;”.

for (i=0, j=0; i<100; i++, j++)

Тело цикла может быть пустым.

 

Указатели.

  Указатель – переменная, содержащая адрес другого объекта си программы.

 Если переменная содержит адрес некоторого другого объекта, то говорят, что переменная указывает на этот объект.

Виды указателей

на объект                  на функции       

                               -указатели

                               -базовые типы

                               -на массивы

                               -struct, union, class…

int * pn; //объявим указатель на тип данных int

int *pn;   то же

int* pn;   самое

 

Замечание:

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

2.  При представлении выше объявления указателя, выделяется память для переменной типа указателя. Но сам указатель пока никуда не указывает. Рекомендуется проводить инициализацию указателя во время объявления.

int a;

int b=10;

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

int *p; //глобальная

{

  int * p1; //локальная

  static int * p2; //статическая

}

Арифметика указателей.

 

int * p2;

p2=pn;

pn++;

pn=pn+sizeof(int);

p2=pn+5;

p2=pn+5*sizeof(int)

if (pn==p2)

 Существует вид указателя на объекты любого типа:

void *;

void * pvoid;

int n;

char c;

int * pn;

pvoid=&h; // OK

pvoid=&c; //OK

pvoid=pn; //OK

reinterpret_cast

double d=99.99;

int n=d; //d=99

int n=0x12345;

char c=n;

int *pn=&n;

char *pc=reinterpret_cast

<char*> (&n);

Массивы.

 

Свойства массивов:

1. В памяти расположена совокупность упорядоченных элементов данных (последовательно).

2. Данные должны быть одного и того же типа.

3. Данные занимают непрерывно линейную область памяти.

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

5. Доступ к отдельным элементам массива может осуществляться по имени массива и индексу (порядковый №) элемента или с помощью оператора <<*>> разыменовывания.

Инициализация массива.

int ar1[10][5];

main ()

{

static char ar2[100];

float ar3[3][4][5];

}

Явная инициализация.

int ar4[3]={1,2,3};

char cAr[2]={‘A;B’};

char cAr1[2]={“AB”};

int nAr[2][2]={{1;1},{2;2}};

char cstring[2][80]={“ Первая строка ”,” Вторая строка ”};

 
80


 

2
п

е

р

в

а

я

_

с

т

р

о

к

а

в

т

о

р

а

я

_

с

т

р

о

к

а

 

 Можно объявить одномерный массив без указания числа элементов.

int nAr[][3]={{1,2,3},{2,3,4},…{7,5,8}} //не указано количество строк

 

Обращение к элементу массива. Оператор [].

 

 Доступ к отдельным элементам массива может выполняться с помощью индексов (они нумеруются с 0, а не с 1). Индекс может быть любым целым выражением.

 

char Ar[10];

char c=Ar[0];

c=Ar[g];

c=Ar[i];    //i-int

c=Ar[i+g-k]; // c=Ar[3.48]; ERROR!!

float b;

c=Ar[(int)b]; //приводит к типу int (может быть потеря данных)

size of – количество памяти, которое занимает массив

char ar[]=”abc”;

size_t n=sizeof(ar)/sizeof(char)



Поделиться:


Читайте также:




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

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