Главная Случайная страница


Полезное:

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


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Операция явного (преобразования) приведения типа





Существует две формы: каноническая и функциональная:

1). (имя_типа) операнд;

2). имя_типа (операнд).

(int) a //каноническая форма

int (a) //функциональная форма

Операндом может быть имя типа или имя объекта.

 

Выражения

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

Приоритеты операций в выражениях приведены в таблице 2.8.

 

Таблица 2.8 – Приоритеты операций в выражениях

Ранг Операции
  () [ ] ->.
  ! ~ - ++ -- & * (тип) sizeof тип()
  * / % (мультипликативные бинарные)
  + - (аддитивные бинарные)
  << >> (поразрядного сдвига)
  < > <= >= (отношения)
  ==!= (отношения)
  & (поразрядная конъюнкция «И»)
  ^ (поразрядное исключающее «ИЛИ»)
  | (поразрядная дизъюнкция «ИЛИ»)
  && (конъюнкция «И»)
  || (дизъюнкция «ИЛИ»)
  ?: (условная операция)
  = *= /= %= -= &= ^= |= <<= >>= (операция присваивания)
  , (операция запятая)

 

Контрольные вопросы

1. Из каких элементов состоит естественный язык? Что является аналогами этих элементов в С++?

2. Что такое лексема? Привести примеры лексем в языке С++.

3. Что такое идентификатор? Правила записи идентификаторов.

4. Что такое константа? Как константа обрабатывается компилятором?

5. Какие типы констант существуют в С++. Привести примеры констант разных типов.

6. К какому типу относятся константы 192345, 0х56, 0хСВ, 016, 0.7865,.0045, ‘c’, “x”, one, “one”, 5, 5.?

7. Что такое тип данных?

8. Чем отличаются типы данных: float и double, char и wchar_t, int и short int?

9. Чем отличаются типы данных int и unsigned int?

10. Перечислить все типы данных, которые существуют в C++. Сколько места в памяти занимают данные каждого типа?

11. На что влияет количество памяти, выделяемое для данных определенного типа?

12. Что такое переменная? Чем объявление переменой отличается от ее определения? Привести примеры определений и объявлений.

13. Что такое класс памяти? Какие классы памяти существуют в С++? Привести примеры объявлений и определений переменных разных классов памяти.

14. Что такое выражение? Из чего состоит выражение?

15. Что такое операнд?

16. Какие операции можно применять к целочисленным данным? К вещественным данным? К символьным данным?

17. Что такое отношение?

18. В каком случае отношение считается ложным, а в каком – истинным?

19. Какие операции называются унарными? Привести примеры.

20. Какие операции называются бинарными? Привести примеры.

21. Что такое тернарная операция? Привести пример.

22. Какая разница между постфиксной и префиксной операцией инкремента (декремента)?

23. Какие операции присваивания существуют в С++?

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

25. Что такое леводопустимое значение? Привести пример.

26. Чему будет равно значение выражений:

int z=x/y++; если int x=1, y=2;

int w=x%++y, если int x=1, y=2;

int a=++m+n++*sizeof(int); если int m=1, n=2;

float a=4*m/0.3*n; если float m=1.5; int n=5;

int ok=int(0.5*y)<short(x)++; если int x=10, y=3;


Ввод и вывод данных

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

Для ввода/вывода данных в стиле Си используются функции, которые описываются в библиотечном файле stdio.h.

 

3.1. Форматированный вывод

int printf (строка формата, список аргументов);

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

printf (“Значение числа Пи равно %f\n”, pi);

Строка формата может содержать

1. обычные символы – они просто выводятся на экран;

2. спецификации формата;

3. управляющие символы.

Спецификации формата указывают, какого типа выводимое значение и в каком виде оно должно выведено.

%[флаги][ширина][.точность][размер]тип    
В таблице 3.1 приведены спецификаторы типа. Общий вид этих спецификаций таков:

 

Таблица 3.1 – Спецификаторы типа

символ
%d целое десятичное число (данные типа int)
%i целое десятичное число (данные типа int)
%e десятичное число в виде x.xx e+xx
%E десятичное число в виде x.xx E+xx
%f десятичное число с плавающей запятой xx.xxxx
%F десятичное число с плавающей запятой xx.xxxx
%o восьмеричное число
%s строка символов
%u беззнаковое десятичное число
%x шестнадцатеричное число
%X шестнадцатеричное число
%% символ %
%p указатель
%n указатель

Кроме того, к командам формата могут быть применены модификаторы l и h, что будет означать ввод или вывод данных с типом «long…» или «short…» (табл. 3.2).

Таблица 3.2 – Модификаторы типа

%ld long int
%hu short unsigned
%Lf long double

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

Таблица 3.3 – Флаги

Знак Название знака Значение В отсутствие этого знака Примечание
- дефис выводимое значение выравнивается по левому краю в пределах минимальной ширины поля по правому  
+ плюс всегда указывать знак (плюс или минус) для выводимого десятичного числового значения только для отрицательных чисел  
  пробел помещать перед результатом пробел, если первый символ значения не знак Вывод может начинаться с цифры. Символ + имеет больший приоритет, чем пробел. Используется только для десятичных числовых значений.
# октоторп «альтернативная форма» вывода значения   см. ниже
  ноль дополнять поле до ширины, указанной в поле ширина управляющей последовательности, символом 0 дополнять пробелами Используется для типов d, i, o, u, x, X, a, A, e, E, f, F, g, G. Для типов d, i, o, u, x, X, если точность указана, этот флаг игнорируется. Для остальных типов поведение не определено.

Точность вывода

В спецификаторе формата, после символа % может быть указана точность (число цифр после запятой). Точность задаётся следующим образом: %.n <код формата>, где n – число цифр после запятой, а <код формата> – один из кодов приведённых выше.

Например, если мы хотим вывести значение переменной x =10.356943 с точностью до 3-х цифр после запятой, то мы должны написать:

{

float x=10.356943;

printf("%.3f",x);

}

Результат:10.356

Ширина поля

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

{

float x=10.356943;

printf("%8.3f", x);

}

результат будет выглядеть так: 10.356

Дополнение ширины символами

Для наглядности заполним неиспользованные места поля нулями. Для этого нужно поставить перед шириной поля символ 0.

{

float x=10.356943;

printf("%08.3f", x);

}

Результат:
0010.356

Сдвиг к левому краю

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

{

float x=10.356943;

printf(“%-8.3f”, x);

}

Результат:10.356__

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

Таблица 3.4 – Управляющие символы функции printf

\f Новая страница, перевод страницы
\n Новая строка, перевод строки
\t Горизонтальная табуляция
\v Вертикальная табуляция
\" Двойная кавычка
\' Апостроф
\\ Обратная косая черта
\0 Нулевой символ, нулевой байт
\a Сигнал
\N Восьмеричная константа
\xN Шестнадцатеричная константа
\? Знак вопроса

 

Так, например, вызвав функцию следующим образом:

{

printf(“переход \ n на новую строку”);

}

результат будет таким:

 

переход

на новую строку

 

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

 

Предостережение: необходимо следить за совпадением типов и количества переменных и форматов вывода.

Рассмотрим несколько примеров невыполнения этого предостережения.

· Количество форматов вывода меньше, чем количество переменных

{

int a=5, x=10;

printf(“%i”, a, x);

}

результат: 5

· Количество форматов вывода больше, чем количество переменных

{

int a=5, x=10;

printf(“%i %i %i”, a, x);

}

результат: 5 10 *любое число*

· Формат вывода не совпадает с типом переменной

{

int a=12;

printf(“%f”, a);

}

Результат: будет выводиться число, полученное при интерпретации целого числа 12 как float. То есть, в данном случает это будет 12*2^(-127). Но так как это значение очень близко к нулю, на экран будут выведены нули.

 

3.2. Форматированный ввод данных

Для ввода данных используют функцию scanf.

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

Например, следующий ниже фрагмент программы считывает целочисленное значение в переменную а типа int.

{

int a;

scanf (“%i”, &a);

}

Cтрока в кавычках – это формат ввода. В ней перечислены один или несколько форматов ввода данных. Формат данных указывается спецификаторами формата. Спецификатор формата начинается с символа %, за которым следует код формата (табл. 3.5).

 

Таблица 3.5 – Спецификаторы формата

символ
%d целое десятичное число (данные типа int)
%i целое десятичное, восьмеричное (если начинается с нуля) или шестнадцатеричное (начинается с 0х или 0Х) число (данные типа int)
%e десятичное число в виде x.xx e+xx
%E десятичное число в виде x.xx E+xx
%f десятичное число с плавающей запятой xx.xxxx
%F десятичное число с плавающей запятой xx.xxxx
%o восьмеричное число
%s строка символов
%u беззнаковое десятичное число
%x шестнадцатеричное число
%X шестнадцатеричное число
%% символ %
%p указатель
%n указатель

 

Кроме того, к командам формата могут быть применены модификаторы l и h, что будет означать ввод или вывод данных с типом «long…» или «short…» (табл. 3.6).

Таблица 3.6 – Модификаторы типа

%ld long int
%hu short unsigned
%Lf long double

 

Следующий пример показывает, как установить ширину поля считывания. В нашем примере ширина поля равна пяти символам. Если мы введем строку с большим количеством символов, то все символы после 5-го будут отброшены. Обратим внимание на вызов функции scanf. Знак & не стоит перед именем массива s так как имя массива s является адресом первого элемента массива.

{

char s[20];

scanf(“%5s”, s);

}

Таким образом, если мы введем с клавиатуры строку «программирование», в массив s будет занесено только «прогр».

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

Если в строке форматирования встретился символ, отличный от разделителя, то функция scanf прочитает и отбросит его, т.е. такие символы ожидаются совпадающими с очередными символами входного потока. Например, если в строке форматирования встретится %d, %d, то функция scanf сначала прочитает целое значение, затем прочитает и отбросит запятую и, наконец, прочитает еще одно целое. Если запятой не окажется между вводимыми числами, функция scanf завершит работу после ввода первого числа. Функция возвращает количество введенных элементов.

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

 

3.3. Чтение строк

scanf читает символы до тех пор, пока не встретится какой-либо разделитель. Читаемые символы помещаются в символьный массив, на который указывает соответствующий аргумент, а после введенных символов еще добавляется символ конца строки ('\0'). Разделителем может быть пробел, разделитель строк, табуляция, вертикальная табуляция или подача страницы. Данную ситуацию можно обойти, обозначив обрабатываемое функцией множество. Читаемые символы будут помещаться в массив символов, который указан аргументом, соответствующим набору сканируемых символов. Этот набор определяется следующим образом: все те символы, которые предстоит сканировать, помещают в квадратные скобки. Непосредственно перед открывающей квадратной скобкой должен находиться знак %. Например, следующий набор сканируемых символов дает указание scanf() сканировать только символы X, Y и Z: %[XYZ].

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

Так, при выполнении следующего фрагмента

{

char s[100];

scanf(“%[A-Z ]s”, &s);

printf(“%s”, s);

}

При вводе с клавиатуры строки «A B C!1DE» в массив s будет занесено «A B C» (замечательно то, что здесь пробел указан в квадратных скобках, и он включается в строку, тогда как по умолчанию при использовании спецификатора s в строку вводятся символы входного потока до первого пробельного символа).

Также можно указать символы, которые будут являться разделителями. Например, если мы хотим сделать разделителем символ #, то мы запишем это в с ледующем виде: %[^#].

Так, при выполнении следующего фрагмента

{

char s[100];

scanf(“%[^#]s”, s);

printf(“%s”, s);

}

При вводе с клавиатуры строки «абвг#пр» в массив s будет занесено «абвг».

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

{

int a, b;

scanf(“%i%*f%i”, &a, &b);

}

Входная строка: 45 2.34 67

В данном примере 2.34 считается по спецификатору %f, но не будет запомнено.

 

Предостережения:

1. Аргументы функции scanf должны быть указателями. Несомненно, наиболее распространенная ошибка состоит в написании: scanf("%i", a); вместо scanf("%i", &a);

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

scanf("%d%d", &a); // куда записывать второе введенное число?

scanf("%d%d", &a, &b, &c); // не задан формат для переменной c

scanf("%f%f", &a, &b); //нельзя вводить целые переменные по

вещественному формату

 

Контрольные вопросы

1. Что такое форматная строка? Что содержит форматная строка функции printf? Что содержит форматная строка функции scanf?

2. Что такое спецификация преобразования? Привести примеры спецификаций преобразования для различных типов данных.

3. Что будет выведено функцией printf("\nСреднее арифметическое последовательности чисел равно: %10.5f \nКоличество четных элементов последовательности равно%10.5d ",S/n,k);?

4. Как записать вывод результатов из вопроса 3 с помощью операции <<?

5. Как выполнить ввод переменных х и у, где x типа long int, а у типа double с помощью функции scanf? С помощью операции >>?

 


4. Операторы языка Си++

4.1. Базовые конструкции структурного программирования

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

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

Ветвление – задает выполнение одного из двух операторов, в зависимости от выполнения какого либо условия.

Цикл – задает многократное выполнение оператора.

Следование Ветвление Цикл
 

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

В С++ оператором считается то, что заканчивается символом «;». В частности, int f; – это оператор объявления. Используются следующие операторы языка:

· Пустой

· Составной (блок)

· Выражение

· Условный

· Выбора

· Цикл с предусловием

· Цикл с постусловием

· Пошаговый цикл

· Перехода

· Разрыва

· Продолжения

· Возврата

· Выхода из программы

4.2 Пустой оператор

Записывается как«;». Используется там, где синтаксис языка требует наличияоператора, а по логике программы никаких действий не требуется. Это может быть ветвь в условном операторе или тело цикла. Пустой оператор может оказаться полезным и как носитель метки. Примеры:

1 ) int a=12, b=3,c=a;

if (a<b)

;

else c=b;// с будет равно 3

 

2) int i;

for (i=0; i<n && a[i]==0; ++i)

;

После выполнения этого цикла i будет индексом первого ненулевого элемента массивa a.

3) if (k==0)

goto nothing;

 

nothing:;

 

4.3 Составной оператор (блок)

Это ноль или более операторов в фигурных скобках. Допускается (и является обычным в С++) описание переменных, тогда эти переменные будут локальными для блока, т.е. область существования и область видимости их будут ограничены лишь этим блоком.

Составной оператор используется в качестве ветви в операторе ветвления, в качестве тела цикла, а также как самостоятельный фрагмент программы.

Например:

1) if(a>b){

int t=a;

a=b;

b=t;

}// обмен значениями переменных a и b

2) for(int i=0; a[i]!=0; ++i){

sum+=a[i];

++kol;

}

printf(“average: %f\n”,(float)sum/kol);// среднее арифметическое элементов массива, расположенных до первого нулевого элемента.

3) { char*s1=”abcd”;

char*s2=”af”;

printf(“\nTest 1\n”);

printf(“strcmp(\”%s\”,\”%s\”)=%i\n”,strcmp(s1,s2);

}

{ char*s1=”af”;

char*s2=”abcd”;

printf(“\nTest 2\n”);

printf(“strcmp(\”%s\”,\”%s\”)=%i\n”,strcmp(s1,s2);

}

// Тестирование функции strcmp

4.4. Оператор «выражение»

Любое выражение, заканчивающееся точкой с запятой, рассматривается как оператор, выполнение которого заключается в вычислении этого выражения. Частным случаем выражения является пустой оператор «;».

Примеры:

i++;

a+=2;

x=a+b;

printf(“Hello”);// т.к. printf возвращает целое значение, то это тоже выражение.

 

4.5. Составные операторы

К составным операторам относят собственно составные операторы и блоки. В обоих случаях это последовательность операторов, заключенная в фигурные скобки. Блок отличается от составного оператора наличием определений в теле блока. Например:

{

n++; // это составной оператор

summa+=n;

}

{

int n=0;

n++; // это блок

summa+=n;

}

Операторы выбора

Операторы выбора – это условный оператор и переключатель.

1. Условный оператор

Условный оператор имеет полную и сокращенную форму. Сокращенная форма:

if (выражение-условие)

оператор;

В качестве выражения-условия могут использоваться арифметическое выражение, отношение и логическое выражение. Если значение выражения-условия отлично от нуля (т. е. истинно), то выполняется оператор. Например:

if (x<y&&x<z)

min=x;

Полная форма

if (выражение-условие)

оператор1;

else оператор2;

Если значение выражения-условия отлично от нуля, то выполняется оператор1, при нулевом значении выражения-условия выполняется оператор2. Например:

if (d>=0){

x1=(-b-sqrt(d))/(2*a);

x2=(-b+sqrt(d))/(2*a);

printf(“\nx1=%f x2=%f\n”, x1, x2);

}

else printf(“\nРешения нет\n”);

2.Переключатель определяет множественный выбор.

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

{

case константа1: оператор1;

case константа2: оператор2;

...........

[default: операторы;]

}

При выполнении оператора switch, вычисляется выражение, записанное после switch, оно должно быть целочисленным. Полученное значение последовательно сравнивается с константами, которые записаны следом за case и тоже должны быть целочисленными. Допускаются константные выражения, можно использовать в них операцию sizeof. При первом же совпадении выполняются операторы, помеченные данной меткой. Если выполненные операторы не содержат оператора перехода, то далее выполняются операторы всех следующих вариантов до варианта default, пока не появится оператор перехода или не закончится переключатель. Это называют эффектом проваливания.

Если значение выражения, записанного после switch, не совпало ни с одной константой, то выполняются операторы, которые следуют за меткой default. Метка default может отсутствовать.

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

Пример:

#include <stdio.h>

void main()

{

int i;

printf(“\nEnter the number:");

scanf(“%i”,&i);

switch(i)

{

case 1:printf("\nthe number is one");

case 2:printf("\n%i*%i=%i",i,i,i*i);

case 3: printf("\n%i*%i=%i”",i,i,i*i);break;

case 4: printf("\n%i is very beautiful!",i);

default:printf("\nThe end of work");

}

}

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

1. При вводе 1 будет выведено:

The number is one

2*2=4

3*3=9

2. При вводе 2 будет выведено:

2*2=4

3*3=9

3. При вводе 3 будет выведено:

3*3=9

4. При вводе 4 будет выведено:

1 is very beautiful!

5. При вводе всех остальных чисел будет выведено:

The end of work

Рекомендация: ставьте break в конце каждой группы операторов, включая и ту, что находится перед default. Это поможет вам избежать ошибок в случаях расширения программы добавления в нее новых ветвей.

Предостережение: не забывайте ставить пробел между служебным словом case и константой выбора, иначе получите метку оператора case..:

 

Операторы циклов

Различают:

1. итерационные циклы;

2. арифметические циклы.

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

В итерационных циклах известно условие выполнения цикла.

 


4.7.1.Цикл с предусловием

while (выражение-условие)

оператор

В качестве <выражения-условия> чаще всего используется отношение или логическое выражение. Если оно истинно (или не равно 0), то тело цикла выполняется. Выполнение продолжается до тех пор, пока выражение-условие не станет ложным. Выход из цикла осуществляется, если

- стало ложным выражение условия;

- в теле цикла выполнился оператор break;

- в теле цикла выполнился оператор return.

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

Примеры:

1) while (a!=0){

printf(“%i”,&a);

s+=a;

}

2) int i=0; // вводятся символы в строку s, ввод заканчивается символом «.»

while ((s[i++]=getchar())!=’.’)

;

s[i]=’\0’;

Обратите внимание на внутреннюю скобку в условии, она обязательна, т.к. операция присваивания имеет низкий приоритет.

Рекомендации по стилю: если тело цикла не содержит операторов, ставьте пустой оператор «;» на отдельной строке, так его лучше видно, фрагмент лучше для чтения и понимания. Не привыкайте ставить «;» после заголовка цикла (в той же строке), вызванные этим ошибки трудно обнаруживаются.

1) while(1){

if(a[i]<0)

break;

if(a[i]>1000)

break;

sum+=a[i++];

if(i>=n)

break;

}

Рекомендации по стилю: не используйте слишком сложные условия цикла; можно вместо этого сделать бесконечный цикл (while(1)) и несколько выходов из него. (В примере выше условие не было слишком сложным, фрагмент лишь демонстрирует несколько выходов из бесконечного цикла)

Цикл с постусловием

do{

операторы

}while (выражение-условие);

Рекомендация: настоятельно рекомендуется использовать фигурные скобки и последний while помещать в той же строке, где и закрывающая фигурная скобка. Это окажет вам значительную поддержку при чтении и анализе программы. Т.к. слова do и while сами ограничивают тело цикла с постусловием, то в синтаксисе языка охватывающие фигурные скобки допускается опускать.

Первый вход в цикл безусловен. Далее тело цикла выполняется до тех пор, пока выражение-условие истинно.

Пример:

1). do{ //вычисляется сумма введенных чисел, 0 – признак конца ввода

scanf(“%i”,&a);

s+=a;

}while(a!=0);

2) Реакция на ответ:

char c;

do{

printf (“Enter yes(y) or no(n): “);

scanf(“%c”,&c);

}while(c!=’y’ && c!=’n’);

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

 

Цикл с параметром

for (выражение1;выражение2;выражение_3)

оператор;

Правила выполнения (семантика):

- вычисляется выражение1; оно может содержать присваивание значений некоторым переменным, в том числе ввод значений, другие действия, связанные с подготовкой к выполнению тела цикла;

- вычисляется выражение2, приводится к логическому типу и проверяется;

- если выражение2 истинно,

то

- выполняется оператор (тело цикла);

- вычисляется выражение3 (здесь происходит подготовка к следующей итерации цикла);

- выполняется переход к вычислению выражения2;

- иначе цикл завершает свою работу

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

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

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

Замечание: в языке С /C++ цикл for может иметь одну переменную цикла или несколько, может вообще их не иметь.

Примеры использования цикла с параметром.

1). Изменение параметра от 1 до 9 с шагом 1:

for (int n=1; n<10; ++n)

printf(“2*%i=%i\n”, i, 2*i);

2). Изменение параметра с шагом -2:

int summa=0;

for (int n=101; n>0; n-=2)

summa+=i;

3). Возможность проверять условие отличное от условия, которое налагается на число итераций:

for (num=1;num*num*num<216; num++)

{ тело цикла }

4) Коррекция может осуществляться не только с помощью сложения или вычитания:

for (d=100.0; d<150.0;d*=1.1)

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

for (x=1;y<=75;y=5*(x++)+10)

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

5). Можно использовать несколько переменных цикла:

for (int i=0,j=n-1; i<j; ++i, --j){

int tmp=a[i];

a[i]=a[j];

a[j]=tmp;

} //перевернули массив а

6) вечный цикл

for(;;)

;

7) варианты вычисления корня квадратного из x по итерационной формуле:

Yi=Yi-1+(X/Yi-1-Yi-1)/2, Y1=1 с точностью до eps

a) double delta=eps+eps;//для первого входа

double y=1;

for (; fabs(delta)<eps;){

delta=(x/y-y)/2;

y+=delta;

}

b) double y=1;

for (double delta=(x/y-y)/2; fabs(delta)<eps;)

y+=delta;

c) double y=1, delta;

for (; fabs(delta=(x/y-y)/2)<eps; y+=delta)

;

Рекомендаця: как и в случае цикла while, помещайте точку с запятой на отдельной строке, если тело цикла пустое.

 

4.8. Операторы перехода

 

Операторы перехода выполняют безусловную передачу управления.

1). break – оператор разрыва, приводит к немедленному выходу из самого внутреннего охватывающего цикла или конструкции switch.

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

Пример:

// ищет сумму чисел вводимых с клавиатуры до тех пор, пока не будет введено 100 чисел или 0

for(s=0, i=1; i<=100; ++i){

scanf(“%i”,&x);

if (x==0) break; // если ввели 0, то суммирование заканчивается

s+=x;

}

 

2). continue – переход к следующей итерации цикла. Он используется, когда тело цикла содержит ветвления, помогает уменьшить вложенность блоков

Пример:

// сложная обработка положительных чисел

for (; x!=0;){

scanf(“%i”, &x);

if (x<=0)

continue;

//обработка

}

3). Оператор goto

имеет формат: goto метка;

В теле той же функции должна присутствовать конструкция: метка: оператор;.

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

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

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

Ограничения по применению:

Нельзя передавать управление внутрь операторов if, switch и циклов. Нельзя переходить внутрь блоков, содержащих инициализацию, на операторы, которые стоят после инициализации. Пример:

int k;

goto m;

...

{

int a=3,b=4;

k=a+b;

m: int c=k+1;

...

}

В этом примере при переходе на метку m не будет выполняться инициализация переменных a, b и k.

4). Оператор return – оператор возврата из функции. Он всегда завершает выполнение функции и передает управление в точку ее вызова. Вид оператора:

return [выражение];


5. Примеры решения задач с использованием основных операторов Си++

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

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

Решение задач по программированию предполагает ряд этапов:

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

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

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

4) Разработайте алгоритм. Определите действия, выполняя которые можно будет получить требуемые результаты, используя исходные данные. Полезно выполнить алгоритм «вручную» и убедиться в его пригодности и корректности.

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

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

7) Протестируйте программу. Этот этап является очень трудоемким. По оценкам некоторых специалистов, полное тестирование составляет 70% трудозатрат на разработку программы. Здесь придется разработать систему тестов и проверить правильность выполнения программы в каждой конкретной ситуации.

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

1) тестирование классов входных данных, т. е. набор тестов должен содержать по одному представителю каждого класса данных:

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

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

1) Тестирование команд. Набор тестов должен обеспечивать прохождение каждой команды не менее одного раза.

2) Тестирование ветвей. Набор тестов в совокупности должен обеспечивать прохождение каждой ветви не менее одного раза. Это самый распространенный критерий в практике программирования.

 


Date: 2016-11-17; view: 668; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.005 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию