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

Пример

#include <stdio.h>
#include <stdlib.h>
int main() {

int a, *b;

system("chcp 1251");

system("cls");

a=134;

b=&a;

printf("\n Значение переменной a равно %d.", a);

printf("\n Адрес переменной a равен %d.", &a);

printf("\n Данные по адресу указателя b равны %d.",*b);

printf("\n Значение указателя b равно %d.",b);

printf("\n Адрес расположения указателя b равен %d.", &b);

getchar();

return 0;
}

Результат выполнения программы:

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

 

Вопрос 2:Классы в С++:объявление, спецификаторы доступа

1)Классы

Классы в С++ определяются ключевым словом class. Они представляют собой форму структуры, у которой спецификация доступа по умолчанию – private, то есть

class s { ...}

есть сокращенная запись

struct s { private: ...}

Хотя такое определение класса и справедливо, базовым в языке С++ является понятие класса. В С++ принято считать, что структура struct – это просто класс, все члены которого общие, то есть

struct s { ...};

есть просто сокращенная запись

class s { public: ...}

Структуры необходимо использовать в тех случаях, когда сокрытие данных неуместно.
В качестве иллюстрации, представим абстрактный тип данных для комплексных чисел с помощью структуры и с помощью класса. Единственное отличие — в использовании ключевых слов: private и public.
С использованием структуры:

struct complex
{

void assign(double r, double i);

void print() { cout << real << "+"<< imag << "i"; }
private:

double real;

double imag;
};
void complex :: assign(double r, double i=0.0)
{

real = r;

imag = i;
}

С использованием структуры:

class complex
{

double real;

double imag;

public:

void assign(double r, double i);

void print() { cout << real << "+"<< imag << "i"; }
};
void complex :: assign(double r, double i=0.0)
{

real = r;

imag = i;
}

 

2)Объявление

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

 

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

  1. является прототипом функции (объявлением функции без тела функции).
  2. содержит описатель extern, но не содержит инициализатор (объекты и переменные) или основную часть функции (функции). Это означает, что определение в текущей записи преобразования не является обязательным, и предоставляет имени внешнюю компоновку.
  3. Является статическими данными-членом внутри объявления класса.

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

  1. является объявлением имени класса без последующего определения, такого как class T;.
  2. является оператором typedef.

Ниже приводятся примеры объявлений, которые также являются определениями.

// Declare and define int variables i and j.

int i;

int j = 10;

 

// Declare enumeration suits.

enum suits { Spades = 1, Clubs, Hearts, Diamonds };

 

// Declare class CheckBox.

class CheckBox : public Control

{

public:

Boolean IsChecked();

virtual int ChangeState() = 0;

};

 

К объявлениям, не являющимся определениями, относятся следующие.

 

extern int i;

char *strchr( const char *Str, const char Target );

 

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

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

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

3)Спецификаторы доступа

В С++ члены класса классифицируются в соответствии с правами доступа на следующие три кате­гории: публичные (public), частные (private) и защищенные (protected). Любая функция програм­мы имеет доступ к публичным членам. Доступ к частному члену имеют только функции-члены класса или функции-друзья класса. Защищенные члены аналогичны частным членам. Разница между ними появляется только при наследовании классов.

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

class X {
int i;
int j;
public:
void get_ij();
void put_ij();
};
class Y: public X {
int k;
public:
int get_k();
void make_k();
};

Класс Y наследует и имеет доступ к публичным функциям get_ij() и put_ij() класса X, но не имеет доступа к i и j, поскольку они являются частными членами X. Во всех случаях частные члены остаются частными, т. е. доступными только в том классе, в котором они объявлены. Таким обра­зом, частные члены не могут участвовать в наследовании.

В связи с тем, что частные члены не могут быть наследованы, возникает интересный вопрос: что если необходимо оставить член частным и вместе с тем позволить использовать его производным классам? Для таких целей имеется другое ключевое слово — protected (защищенный). Защищен­ный член подобен частному, за исключением механизма наследования. При наследовании защи­щенного члена производный класс также имеет к нему доступ. Таким образом, указав специфи­катор доступа protected, можно позволить использовать член внутри иерархии классов и запретить доступ к нему извне этой иерархии. Например:

class X {
protected:
int i;
int j;
public:
void get_ij();
void put_ij();
};
class Y: public X {
int k;
public:
int get_k();
void make_k();
};

Здесь класс Y имеет доступ к i и j, и в то же время они остаются недоступными для остальной части программы. Когда элемент объявляется защищенным, доступ к нему ограничивается, но вместе с тем можно наследовать права доступа. В отличие от этого в случае частных членов дос­туп не наследуется.

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

class my_class {
protected:
int i;
int j;
public:
void f1();
void f2();
protected:
int a;
public:
int b;
};

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

 

Билет 7

Вопрос 1:Операция цикла C.Примеры

 

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

· блока проверки условия повторения цикла

· тела цикла

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

В языке Си следующие виды циклов:

· while - цикл с предусловием;

· do...while - цикл с постусловием;

· for - параметрический цикл (цикл с заданным числом повторений).

 

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

Общая форма записи

while(выражение) {

блок операций;
}

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

Пример

int k=5;
int i=1;
int sum=0;
while(i <=k) {

sum = sum + i;

i++;
}

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

while(1) {

блок операций;
}

while — цикл с предусловием, поэтому вполне возможно, что тело цикла не будет выполнено ни разу если в момент первой проверки проверяемое условие окажется ложным.

Пример

int k=5;
int n=10;
while(k>n) {

printf(" k=%d n=%d \n", k, n);

k = k + 2;

}

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

Общая форма записи

do {

блок операций;

} while(выражение);

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

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

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

Пример. Ввести число от 0 до 10

#include <stdio.h>
#include <stdlib.h>
int main() {

int num;

system("chcp 1251");

system("cls");

do {

printf("Введите число от 0 до 10: ");

scanf("%d", &num);

} while((num < 0) || (num > 10));

printf("Вы ввели число %d", num);

getchar(); getchar();

return 0;
}

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

 

Параметрический цикл for

Общая форма записи

for (инициализация параметра; проверка условия окончания; коррекция параметра) {

блок операций;

}

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

· инициализация параметра - присваивание параметру цикла начального значения;

· проверка условия окончания - сравнение величины параметра с некоторым граничным значением;

· коррекция параметра - изменение значения параметра при каждом прохождении тела цикла.

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

Пример

#include <stdio.h>
int main() {

int num;

for(num = 1; num < 5; num++)

printf("num = %d\n",num);

getchar();

return 0;
}

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

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

#include <stdio.h>
int main() {

int num = 1;

for(; num < 5; num++)

printf("num = %d\n",num);

getchar();

return 0;
}

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

#include <stdio.h>
int main() {

int i,j;

for(i = 1, j=2; i < 5; i++, j=j+2)

printf("i = %d j = %d\n",i,j);

getchar();

return 0;
}

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

В Си допускаются вложенные циклы, то есть когда один цикл находится внутри другого:

for ( i=0; i<n; i++) { // цикл 1

for( j=0; j<n; j++) { // цикл 2

// блок операций цикла 2;

}

// блок операций цикла 1;
}

Пример: Вывести числа от 0 до 99

#include <stdio.h>
#include <stdlib.h>
int main() {

unsigned int i,j;

for(i=0; i<10; i++) {

for(j=0; j<10; j++) {

printf("%2d ",i*10+j);

}

printf("\n"); // перевод строки

}

getchar();

return 0;
}

Результат выполнения