
- •Часть 1
- •18 Сентября 2012 г., протокол № 1
- •Предисловие
- •§ 1. Основные понятия программы
- •1.2. Директива препроцессора #include
- •Структура программы
- •Комментарии
- •Ключевые слова, идентификаторы, переменные
- •§ 2. Ввод, вывод
- •§ 3. Выражения
- •3.1. Константы
- •Непосредственно записать в выражении;
- •3.2. Операции и их приоритет
- •3.3. Операции отношения и логические операции
- •3.4. Операция присваивания
- •§ 4. Программирование ветвлений
- •4.1. Оператор if
- •4.2. Тернарная операция
- •4.3. Оператор выбора switch
- •Г л а в а 2 циклы
- •§ 1. Оператор while
- •§ 2. Оператор break
- •§ 3. Оператор do … while
- •§ 4. Оператор for
- •Г л а в а 3 Введение в массивы
- •§ 1. Основные понятия
- •§ 2. Способы определения массивов
- •§ 3. Вывод массива. Функции printf и cprintf
- •§ 4. Типы задач при работе с массивами
- •Упражнения и тесты
- •Г л а в а 4 модульное программирование. Функции
- •§1. Функции без результатов. Параметры-значения
- •1.1. Примеры. Правила оформления и вызова функций
- •Формальные и фактические параметры
- •Передача параметров по значению
- •§ 2. Функции типа void с результатами
- •2.1. Вычислeниe бeсконeчных сумм
- •2.2. Что такое ссылочный тип
- •2.3. Параметры ссылочного типа
- •§ 3. Функции, отличные от void. Оператор return
- •§ 4. Область действия имён. Локальные и глобальные имена
- •§ 5. Встраиваемые (inline) функции
- •§ 6. Параметры по умолчанию
- •§ 7. Перегрузка функций
- •7. Сравнение функций типа void и отличных от типа void.
- •Г л а в а 5 введение в объектно-оРиентированное программирование
- •§ 1. Первое знакомство с ооп
- •§ 2. Класс. Поля и методы класса
- •§ 3. Создание объектов. Конструктор
- •Упражнения и тесты
- •Оглавление
- •3.1. Константы …………………………………………….………..….........…8
- •Упражнения и тесты …….………………..………………………….…………....19
- •Методы программирования:
- •Лекции, примеры, тесты
- •Пособие для студентов механико-математического факультета
- •В двух частях
- •Часть 1
§ 2. Оператор break
Оператор break используется, во-первых, для прерывания работы оператора switch и, во-вторых, для выхода из любого из трёх циклов.
Во втором варианте геометрической задачи (см. пример 4) используется так называемый вечный цикл. В этом случае в качестве выражения после while используется единица, которая всегда соответствует истине. Поэтому чтобы программа не зациклилась, выход из такого цикла осуществляется с помощью специального оператора break. Заметим, что вместо единицы можно записать true или любую ненулевую константу.
float x,y; int K1=0, K3=0;
while (1) { cin>>x>>y; if(x==0 && y==0) break;
/* Вышли из цикла, управление передали на оператор cout, записанный после тела цикла, то есть после закрывающей фигурной скобки while */
if (x>=0 && y>=0) K1++; else if (x<=0 && y<=0) K3++; }
cout<<"K1="<<K1<<" K3="<<K3;
§ 3. Оператор do … while
Ту же программу (см. пример 1) для сравнения напишем с помощью другого оператора цикла:
int mult, to, RES=1;
cout<<"Mult="; cin>>mult;
cout<<"To="; cin>>to;
do RES*=mult; // или RES=RES*mult;
while (RES< to);
cout<<"\nResult= "<<RES;
Общий вид оператора цикла с постусловием такой:
do { оператор1;
оператор2; …
операторN;
} while (выражение);
Сначала выполняется тело цикла, а затем вычисляется и проверяется значение выражения. Если оно, как и в первом операторе, истинно (не равно нулю), то операторы, записанные между ключевыми словами do и while, повторяются. В противном случае цикл прекращается. Заметим, что аналогичный оператор языка Pascal repeat … until работает по-другому; если выражение после until истинно, цикл прекращается.
Как в С++, так и в Pascal, в отличие от while повторяющаяся часть обязательно выполнится хотя бы один раз. В нашем примере, даже если введём, например, отрицательное значение to и mult=2, цикл do … while выполнится один раз, то есть RES станет равным 2, и выйдем из цикла. Этим и отличаются два казалось бы похожие операторы цикла.
Вторая особенность оператора do … while в том, что значения переменных выражения не обязательно надо определять до цикла, это можно сделать и внутри его.
§ 4. Оператор for
Такой оператор есть практически во всех языках программирования, но в C++ он имеет больше возможностей.
Пример 5. Вывести кубы целых чисел от 1 до 100. В каждой строке экрана выводить по 10 пар число и его куб. Первый вариант с помощью while:
int k=1; while (k<=100)
{ cout<< k <<” “<< k*k*k;
if (k%10==0) cout<<endl; k++; }
Этот цикл можно записать по–другому, используя оператор цикла for:
int k; for (k=1; k<=100; k++)
{ cout<< k <<” “<< k*k*k;
if (k%10==0) cout<<endl; }
Этот вариант работает аналогично предыдущему, но первый вариант более понятный и естественный.
Общий вид оператора цикла for следующий:
for (выражение1; выражение2; выражение3)
{ оператор1; оператор2; …
операторK; }
В первом выражении записываются одна или несколько разделённых запятой операций присваивания для установки начальных значений переменным (в примере 1 — переменной k). Эта часть выполняется один раз вне данного цикла, то есть в цикле не повторяется. Начальные значения можно определить до оператора for, и тогда выражение1 может отсутствовать, но символ “;” обязательно записывается. Поэтому пример 5 можно записать и так:
int k=1; for (; k<=100; k++)
{ cout<< k <<” “<< k*k*k;
if (k%10==0) cout<<endl; }
Наоборот, в первом выражении может быть несколько присваиваний, разделённых “запятой”. Примеры будут приведены позже.
Второе выражение, как правило, является логическим, но не обязательно, и определяет условие, при истинности которого цикл продолжается. Если условий несколько, они соединяются логическими операциями (&&, ||, !). Если выражение не логическое, то цикл продолжается, если его значение не равно нулю. Вычисление и проверка этого выражения, в отличие от первого, повторяется каждый раз перед выполнением тела цикла. Поэтому если в самом начале оно ложно, код цикла может вообще не выполняться. Это выражение также может отсутствовать, но символ “точка с запятой” в таком случае записывается обязательно. Второе выражение заголовка оператора for может также отсутствовать. Тогда условие выхода из цикла, противоположное тому, которое было в заголовке for, можно записать внутри тела цикла, а выход осуществляется с помощью break. Для примера 5 это может выглядеть таким образом:
int k; for (k=1; ; k++)
{ if (k>100) break; cout<< k <<” “<< k*k*k;
if (k%10==0) cout<<endl; }
С помощью третьего выражения заголовка цикла изменяется значение одной или нескольких переменных через запятую. Она, как и вторая часть, повторяется и может также отсутствовать. В последнем случае символ “;” сохраняется, а изменение переменных можно записать в теле цикла. Можно записать ещё один вариант примера 5:
int k; for (k=1; k<=100; )
{ cout<< k <<” “<< k*k*k;
if (k%10==0) cout<<endl; k++; }
Благодаря такой возможности изменение значений параметров цикла (в нашем примере k) можно выполнять не обязательно после всех повторяющихся операторов, а в любом месте тела цикла.
Отметим другие особенности оператора for.
Могут отсутствовать все три выражения заголовка цикла for (см. пример 1 следующей главы, вариант 5). Например, ввод символов с клавиатуры до символа “.” (см. пример 3) можно записать так:
for ( ; ; ) { ch=getchar(); if (ch==’.’) break; }
Наоборот, может отсутствовать тело цикла. Его можно записать в третьей части заголовка ( см. пример 1 следующей главы, варианты 3, 4). И только в этом случае после заголовка оператора for записывается символ “;”. Это можно использовать, например, для создания задержки при выполнении программы: for (t=0; t<10000; t++);
Параметр цикла не обязательно должен быть целым, символьным и перечисляемым, как в Pascal. Можно использовать и переменную вещественного типа.
Какой бы из рассмотренных выше вариантов не выбрали, в заголовке оператора for в круглых скобках всегда записываются две точки с запятой независимо от наличия любого из трёх выражений. Запятых может быть любое разумное количество или они могут отсутствовать. Пример суммирования всех элементов массива в следующей главе подводит итог всему сказанному.
Упражнения и тесты
1. Дана программа:
main() { int r=1, a=200, b=2;
do { r*=b; cout<<r<<" "; } while (r<a);
getch(); return 0; }
а) что будет выведено?
b) как будет работать программа, если вместо r<a записать r>=a?;
c) проанализировать результат, если изменить порядок операторов
do { cout<<r<<" "; r *= b; } while (r<a);
2. Что будет выведено, если введём 4 9 6 11 -1?
main() { int m;
do { cin>>m; if (m==-1) break;
switch (m) {
case 1: case 2: case 3: cout<< 2;
case 4: case 5: cout<< 3; break;
case 6: case 7: case 8: cout<< 4;
case 9: case 10: cout<< 5; break;
default: cout<< "Error"; }
} while (1);
return 0; }
3. Что будет выведено?
int r=1, a=200, b=2;
while (r<a)
{ r*=++b; cout<<r<<" ";
}
cout<<endl<<b;
4. Что будет выведено?
int r=1, a=200, b=2;
do { r*=++b; cout<<(r++)<<" " ;
} while (r<a);
cout<<endl<<(++b);
5. Что будет выведено, если ввести 0 2 2 0 2 2 1 -5 1000 2 1000 1000
float x, y; cin>>x>>y;
while (!(x==1000 && y== 1000)) //1
{ r= !(x>1 || y<=0) ? ++x: y--;
cout<<x<<” “<<y<<” “<<r; cin>>x>>y; }
6. Дан код::
float x,y; cin>>x>>y;
while (x!=1000 && y!= 1000) //1
{ cout<<(y<x*x || y>3? x/y : x%y)<<" "; cin>>x>>y; }
Что будет выведено, если ввести 0 2 2 0 2 2 1 -5 1000 2?
Сравнить два заголовка цикла while двух последних упражнений.
7. Цикл for(I=10; I>0; I– –) cout << I*I<<” “;
записать с помощью a) while; б) do…while.
8. Сравнить оператор for в С++ и Pascal.
9. Записать номера правильных утверждений:
1) В операторе while значения всех переменных, записанных в выражении в круглых скобках, должны быть определены до входа в цикл.
2) В операторе do … while значения всех переменных, записанных в выражении в круглых скобках после ключевого слова while, должны быть определены до входа в цикл.
3) Пусть в цикле оператора while нет break. Тогда значения всех переменных, используемых в выражении в круглых скобках после ключевого слова while, должны меняться в теле цикла так, чтобы на каком-нибудь этапе выражение стало ложным.
4) Пусть в цикле оператора while нет break. Тогда значения всех переменных, используемых в выражении в круглых скобках после ключевого слова while, должны меняться в теле цикла так, чтобы на каком-нибудь этапе выражение стало истинным.
5) Пусть в цикле оператора while нет break. Тогда значения некоторых переменных, используемых в выражении в круглых скобках после ключевого слова while, должны меняться в теле цикла так, чтобы на каком-нибудь этапе выражение стало ложным.
6) Тело оператора while выполняется всегда, как минимум, один раз.
7) Тело оператора do … while выполняется всегда, как минимум, один раз.
Задачи
1. Запрограммировать простой калькулятор на четыре арифметических действия: сложение, вычитание, умножение, деление.
main() { float x, y, res; char c;
/* c — Однобайтная переменная символьного типа */
bool er; /* er — Однобайтная переменная логического типа со значением true (1) или false (0) */
cout<<"For EXIT the first number=1000 \n";
while (1) { er=false; cout<<"\nThe first number: "; cin>>x;
if (x == 1000) break;
cout<<"Operation: "; cin>>c;
/* или c=getchar(); или c=getch(); или c=getche(); (см. гл 5) */
cout<<" The second number:"; cin>>y;
switch (c)
{ case '+': res=x+y; break;
case '*': case '.': res=x*y; break;
case '–': case '_': res=x-y; break;
case '/': if (y!=0) res=x/y; else er=true; break;
default: er=true; } // The end of switch
if(er) cout<<" ERROR\n";
else cout<<x<<c<<y<<"="<<res<<endl;
} // The end of while
return 0; } // The end of main
2. Ввести координаты точек плоскости до тех пор, пока не введем точку с координатами (1000, 1000). Массивы не использовать. Найти количество точек, принадлежащих области из первой или третьей четверти, ограниченной окружностями радиуса 2 и 1 c центром в начале координат.
int main()
{ int k=0; float x,y; cout<<"x=1000, y=1000 --- exit\n"; cin>>x>>y;
while ( ! (x == 1000 && y==1000) )
{ if (( x*x+y*y <= 4 && x*x+y*y >= 1)
&& ( x>0 && y>0 || x<0 && y<0)) k++;
cin>>x>>y; /* Ввели координаты точки в цикле. */ }
cout<<k;
getch(); return 0; }
3. Вывести квадраты чисел от 11 до 99 по 10 чисел в строке.
// Вариант 1
cout<<'\n'; for ( int i=11; i<=99; i++)
cout<<i*i<< (i% 10 == 0? '\n' : ' ');
// Вариант 2
cout<<endl; for ( int i=11; i<=99; i++)
printf("%6d%c", i*i, i%10 ==0? '\n':' ');
// Вариант 3
cout<<endl; for (int i=11; i<=99; i++)
{ printf("%6d",i*i);
/*if (i%10= =0) cout<< '\n'; else cout<<' '); или*/
if (!(i%10)) cout<< '\n'; else cout<<' '; }
4. Последовательно ввести значения вещественного x, пока не введем 1000. Для каждого из них вычислить r= sin(x), если 0 < x < ; r = x3, если – <= x < 0; r = x2, если x < –2* или x > 2*; r = 0 — в остальных случаях.
#define Pi 3.1459
int main() { float x=0, r; cout<<"1000 -- exit"<<endl;
cout<<" x y\n";
while (x!=1000)
{ gotoxy(2, wherey()); cin>>x;
if (x>0 && x<Pi) r=sin(x);
else if (x<0 && x>=–Pi ) r=x*x*x;
else if (x<–2*Pi || x>2*Pi) r=x*x; else r=0;
gotoxy(20, wherey()-1); cout<<r<<endl;
} return 0; }
Для заданного целого n в одном цикле вычислить n! и 2n.
main() /* По умолчанию int main() */
{ int p=1, fact=1, n, b=2; cout<<"n<17 n= "; cin>>n;
for (int i=1; i<=n; i++) { p=p*b; fact=fact*i; }
cout<<b<<" ^ "<<n<<"="<<p<< endl;
cout<<n<<"! = "<<fact<<endl;
getch(); return 0; }
6. Найти наибольшую цифру целого десятичного числа:
main() { int a, maxdig=0;
cout<<"\na="; cin>>a; a=abs(a);
while (a) { int d= a%10; if (d>maxdig) maxdig = d; a = a/10; }
cout<<"The max digit: "<<maxdig;
getch(); return 0;}
Вычислить бесконечную сумму ряда
с заданной точностью. Считать, что требуемая точность достигнута, если очередное слагаемое по модулю станет меньше, чем заданная точность .
int main() { double x ,y=1., g=1., i, e;
cout<<"x="; cin>>x; cout<<"Epsilon="; cin>>e;
for (i=1; fabs(g)>e; i+=2) { g*=(-1)*x*x/(i*(i+1)); y=y+g; }
cout<<”y=”<< y; getch(); return 0; }
Уровень А
1.
Для заданного n
вычислить
.
Вычислить приближенно значение бесконечной суммы
с
точностью ,
используя следующие операторы: a)
for;
b)
while;
c)
do
… while.
Вывести таблицу значений функции y =
при изменении x от u до v с шагом h = (v – u)/(n – 1), если u, v, n заданы.
Определить, является ли целое число простым.
Для натурального числа найти первую и последнюю цифры.
Уровень B
Определить, является ли целое число симметричным, т. е. таким числом, которое одинаково читается слева направо и справа налево (палиндром, перевертыш). Например, числа 123321, 202, 9889, 5555, 8 — палиндромы.
Перевести целое число из 10-тичной системы счисления в 16 с.с.
Перевести целое число из десятичной системы счисления в двоичную.
Найти приближенно, с точностью до 0,001, минимум функции
на отрезке [u, v ].
Найти
,где
=
–функция, a, b — отрезок изменения х, целое n задано. Массив x не формировать.
Вычислить y=
с заданной погрешностью , используя следующую формулу:
Вычисления прекращаем, если
.