Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

chast1

.pdf
Скачиваний:
16
Добавлен:
10.06.2015
Размер:
499.82 Кб
Скачать

В С++ определены следующие операции:

& - поразрядная конъюнкция битовых представлений операндов (AND) | - поразрядная дизъюнкциябитовых представлений операндов (OR) ^ - поразрядное исключение (XOR)

Каждый бит результата определяется по соответствующим битам операнда

Таблица истинности

Пример применения этих операций.

В ASCII коды строчных и прописных букв отличаются только тем,что в кодах строчных букв пятыйбит =1, следовательно чтобы преобразовать строчную букву в прописную следует сбросить пятый бит в первом операнде (сделать равным 0)

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

Конкретно таким числом будет 223(10)

Проиллюстрируем соответствующее действие char c1='a', c2;

c2=c1&223;

cout<<c2<<ebdl;

Появится А на экране

В двоичном представлении

Аналогично с помощью операции "или" можно преобразовать прописные в строчные.Для этого нужно использовать маску у которой все разряды кроме пятого заняты 0.

__________________________________________________________________________________

9.Операции доступа к данным.Запятая в качестве операции.Условная операция (тернарная).

__________________________________________________________________________________

Далее рассмотрим самые ходовые операции.

[] - операция индексации.Используется для доступа к отдельным элементам массива по индексу. Операндами этой операции является имя массива, индекс элемента массива указываемый в квадратных скобках

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

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

Запятая в качестве операции

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

Пример int p=3;//(1)

double x, x=1.2;//(2) x=(p++, z=z+1, z+p);//(3)x=6.2

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

Если скобки убрать,получится синтаксически правильная конструкция, но семантически это другая последовательность действий.

x=p++,z=z+1, z+p;//x=3

Возможна иная,без применения () строчка (3), полностью сохраняющая семантику алгоритма, но использующая другой синтаксис:

p++,z=z+1,x=z+p;//(3')х=6.2

Данная операциябинарная т.к. кахдый данный запятой сопоставляется левый и правый операнд. Указывает порядок обращения к операндам (с лева на право)

Условная операция (тернарная)

Синтаксис операции: <выражение1>?<выражение2>:<выражение3>

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

В любом случае его значение интерпретируется как логическое. Если оно =0, то этоfalse,если не равно 0,то это true.

Если значение первого операнда true, то результатом будет значение второго операнда,а иначе третьего. Типы второго и третьего операндов могут быть разными.

Пример

i=(i<n)?++i:1;//в зависимости от текущего значения iэта переменная или увеличит свое значение на 1 или станет равным 1.

____________________________________________________________________________________

10.Структурное программирование.Типовые элементы структурного программирования.

_________________________________________________________________________________

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

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

Поскольку строчки в программе обусловливаются по приимуществу оператором goto то структурное программирование часто называют "программированием без goto".

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

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

-следований -ветвлений -повторений

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

-[] (прямоугольник)некоторыйблок обработки данных

-<> (ромбик) разветвление в процессах зависимости от истностного знначения, записанного в нем логического выражения

--> передача управления к следующему по порядку вычисленияблоку обрпботки данных или к разветвлению

Следование

(рис 5.1)

Таким образом этот типовой элемент представляетсобой последовательность блоков S1...Sk которые выполняются в порядке их записи в тексте программы.

Ветвление.

(рис 5.2)

В зависимости от значения В выполнится либо блок S1, либо блок S2.

Повторение типа "делать...пока..."

(рис 5.3)

Выполнение блока S выполняется пока логическое выражение В=true.

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

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

Влюбом языке программирования рассмотренныевыше типовые конструктивные элементы реализуются как операторы и совокупности операторов. Среди операторов выдеояют последовательновыполняемые операторы и управляющие операторы (условные операторы,циклы, переключатели,операторы передачи управления).Общим синтаксическим признаком операторов в тексте программы на С++ является то, что запись оператора заканчивается ; исключение составляет сосотавной оператор,он заканчивается } .

____________________________________________________________________________________

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

_________________________________________________________________________________

Условный оператор и его синтаксис. if(<выражение>)<оператор1>[;else<оператор2>];

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

случае его значение интерпретируется как логическое. Если выражение возвращает true , то выполняется оператор1,а иначе:

- в полной форме условного оператора выполняется оператор2.

- в сокращенной управление сразу передается оператору сразу после(;).

Вкачестве операторов нельзя использовать определения и объявления. Обрати вниманиена то, что

<оператор1> и <оператор2> это каждый раз один оператор, поэтому , если в данной ветви вычислительного процесса необходимо совершитьмного действий, реализуемые многими операторами, то их нужно объединять в составной оператор,при этом внутри составного оператора допустимы и определения и объявления.

if(x!=0) {y=2; z=1}else{int w=3; y=1; z=2}

Допустимые вложеные условные операторы т.е. <оператор1> или <оператор2> сами могут быть условными операторами. Поскольку во вложенных условных операторах возможна неоднозначная интерпретация последовательности действий то в языке С++ принято следующее правило всегда применяемое по умолчанию:

Каждое else соответствует ближайшему к нему предшествующемуif.

z=0;

if (x==1) if (y==1) z=1; else z=2;

Здесь если х=1 то в зависимости от значения у, z получит значение 1 или 2. Если же х!= 1 то вложенный условный оператор вообще выполнятьсяне будет. Иначе говоря приведенная выше последовательность операторов эквивалентна такой:

z=0;

if (x==1) {if (y==1) z=1; else z=2;}

Распространенная ошибка:

вместо операции сравнения (==) пишут операцию присваивания (=)

if(x=2)<оператор1>;//(*)

Сложность этой ошибки в том,что она смысловая, а не формальная,т,е. формально,это допустимая конструкция и компилятор ее пропустит, однако функционировать будет совсем не так, как если бы условие было бы записано правильно (х==1). В строке(*) сначала будет выполнено присваивание, затем, поскольку выражение (х=2) возвратит true,то оператор1 выполнится, это значит, что он будет выполнятся всегда.

_________________________________________________________________________________

12.Переключатель.

________________________________________________________________________________

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

Синтаксис.

switch(<переключающее веражение>)

{

case<константное выражение1>:<последовательность операторов1>; case<константное выражение2>:<последовательность операторов2>;

...

case<константное выражение n>:<последовательность операторов n>;; [defanlt:<последовательность операторов>;]

}//конец переключателя

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

<переключающее выражение> и <константные выражение> должны иметь целый тип. Все константные выражени доолжны иметь разные значения. частьв [] может отсутствовать.

case<константное выражение> - меткопереключателя (отличать от обычных меток) Любая последовательность операторов может бытьпомечена несколькими метками.

Case 4 : case 5 : x=1; y=2;

Логика работы оператора.

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

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

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

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

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

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

switch (i)

{

case 0 : case 1 : x=11 ; y=111 ; break; case 3 : x=22 ; y=222 ; break;

case 4 : x=33 ; y=333 ; break; default : x=44 ; y=444;

}

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

Пример. switch (i)

{

double x=1.2;// В эту строку вычислительный процесс не войдет никогда case1 : int k=3;// это ветвь сработает только если переменная i=1

case2 : x=3.3 ; k=2;// попытка работать с переменной х,которая неопределенна и можетбыть с переменной к.

}

__________________________________________________________________________________

13.Циклспредусловием (while)

__________________________________________________________________________________

структурная схема

Форма оператора while(<условие>)<тело цикла>

В общем случае арифметическое выражение которое интерпретируется как логическое.

<тело цикла> - оператор. Тело не может быть определением или объявлением,но в тоже время может быть блоком внутри которого могут быть и определения и объявления.

Последовательность работы операторов:

После входа в оператор рассчитывается условие выражения. Если true то выполняется тело после чего начинается новая итерация повторно вычисляющаявыражение. Если выражение false, то работа цикла завершается.

Пример

Требуется найти наименьшее целое неотрицательное К. 3^К>=M. М - заданное вещественное число.

int k=0;//начальное значение искомого показателя степени к double y=1;//текущее значение функции y=3^k при к=0 double M;

cin>>M;//ввод значения с клавиатуры

while (y<M);//если М<1 то тело цикла не выполнится ни разу и искомое значение к=0

{

k=k+1;//наращиваем значение показателя y=y*3;//очередное значение 3^k, пример экономного расчета

}//после выхода из вычислительного процесса к будет иметь правильное значение.

__________________________________________________________________________________

14.Циклспостусловием (do...while)

__________________________________________________________________________________

схема

Форма оператора

do<тело цикла>while(<условие>);

На тело цикла и условие распространяются те же требования что и в операторе с предусловием.

Последовательность работы оператора:

После входа в оператор выполняется тело цикла, затем рассчитывается условие выражения. Если true начинается новая итерация, если false - работа цикла завершена.

Тело цикла выполняется хоть 1 раз в отличие от while.

e^x=1+x+(x^2/2!)+(x^3/3!)+(x^4/4!)+...+(x^n/n!)+... (1)

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

Фрагмент программы double x;//аргумент функции

double DEL;//максимально допустимая погрешность экспоненты doyble Ri;//оценка остаточного члена ряда

double xt;//текущее значение очередного члена ряда int k=0;//начальное значение счетчиков члена ряда

xt=1;//переменной xt придаем значение нулевого члена ряда cin>>x>>DEL;//вводим с клавиатуры необходимые значения double y=0;//начальное значение суммы ряда

do

{

y=y+xt;//оператор последовательного суммирования членов ряда.

k=k+1'//наращивание счетчика членов ряда xt=xt*(x/k);//это значение к-того члена ряда

Ri=y*xt;//максимальная оценка остаточного члена ряда Тейлор. задает текущую погрешность работы экспоненты

}

while (Ri>DEL);//цикл будет работать пока погрешность больше допустимой cout<<"x="<<x<<" y="<<y<<" k="<<k<<endl;

cout<<" y точно="<<exp(x)<<endl;//для сравнения выводим точный результат получаемый с помощью библиотечной функции

_________________________________________________________________________________

15.Циклспараметром (for)

_________________________________________________________________________________

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

Формат оператора

for(<инициализатор цикла>;<условие (выражение)>;<модификатор (выражение)>)<тело цикла>

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

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

выражение < условия> в цикле for строится по тем же принципам, что и в других циклах,т.е. его значение интерпретируется, как логическое. Если выражениеусловие пусто, то следующая за (;) сохраняется и полагается,что значение пустого выражения = true (по умолчанию).

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

Тело цикла должно быть отдельным оператором. Это может быть блок или пустой оператор.

Логика работы for:

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

2.Вычисляется выражение условие. Если его значение = false, то работа цикла завершается. иначе:

-в начале выполняется тело цикла,затем -выражение модификатор

-далее цикл выходит на очередную итерацию,которая начинается с вычисления выражения условия.

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

for ( ; ; ) ; //Возникает бесконечный цикл.

пример.

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

Вычислите суммы квадратов первых к членов натурального ряда.

1 вариант. int i,k,S;

for (i=1,S=0, k=5; i<=k; i++) S+=i*i// В этом вариантеинициализатор содержит последовательность трех операторов,побочным эффектом которых является инициализация счетчика цикла (i), сумматора(S) и переменной к,задающей длину ряда. основная вычислительная операция вынесена в тело цикла.

2.вариант.

int i=0, k=0,s=0;

for ( ; i<k; ) s+=++i*i// В этом варианте инициализатор отсутствует,все инициализации проведены доцикла. Отсутствует модификатор, необходимая модификация параметра i осуществляется, как побочная. В связи с формой этого оператора изменили выражение условия, знак неравенства стал строгим.

3 вариант. int i,k,s=0;

for (int i=1,k=s; i<=k; s+=i++ *i);// в этом варианте инициализатором является определение двух однотипных переменных i и k,т.е. переменные i и k локально переопределяются в цикле, тем самым действие внешних переменных i и k внутри цикла подавляется. Крометого здесь тело цикла пусто. основные вычислительные действия проводятся в выражении модификаторе.

Вопрос: почему s не целесообразно определять внутри цикла? Значение останется внутри цикла и не выведется наэкран.

_________________________________________________________________________________

16.Указатели.Виды указателей.Связь указателейс типами языка c++.Синтаксисопределения указателей.Операция разыменования операций.

__________________________________________________________________________________

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

Рассмотрим этот факт на простом примере переменной базового типа. double x=1.23;

Оно означает,что в процессе обработки программа компилятор выделит область памяти, соответствующую double (8 байт) и инициализируетее числом 1.23, после этого можно обратится к указанной области памяти подставив в какое-то выражение имя переменной или использовав ее в качестве L-значения.

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

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

В c++ различают три вида указателей:

-указатели на объекты (область памяти, в которой может хранится значения)

-указатель на функции

-указатели на void (тип,который не имеет значений)

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]