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

Язык программирования C++. Скалярные стандартные типы данных. Основные операторы языка. Учебный практикум к курсу «Практикум на ЭВМ»

.pdf
Скачиваний:
0
Добавлен:
15.08.2026
Размер:
806 Кб
Скачать

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

Оператор цикла с предусловием (while) имеет следующий формат:

while (<выражение>) <оператор>;

Выражение определяет условие повторения тела цикла, представленного простым или составным оператором. Выполнение оператора начинается с вычисления выражения. Если оно истинно (true), то выполняется оператор цикла. Затем вновь вычисляется выражение и т. д. Выполнение оператора цикла прекращается, как только на очередном шаге выражение примет значение ложь (false).

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

Пример. Дано натуральное число n. Определить количество и сумму цифр числа.

#include <iostream.h> int main()

{

int n, m, count, sum_dig; printf(“введите n \n”); scanf(“%d”, &n); count=sum_dig=0; m=n;

while (m>0) { sum_dig=sum_dig + (m%10);

count++; // count= count +1; m=m/10;

}

printf(“ count=%d sum_dig=%d\n”, count, sum_dig); return 0;

}

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

(1)

с точностью ε. Считать, что требуемая точность достигнута, если очередное слагаемое по модулю меньше ε, т. е. | an | < ε.

Точным значением функции еx является сумма бесконечного ряда (1). Так как невозможно

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

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

21

соотношение, позволяющее выражать следующее слагаемое суммы через предыдущее:

an+1 = q*an

(2).

Для определения множителя q воспользуемся формулой общего члена ряда. Имеем

 

an = xn / n! ,

an+1 = xn+1 / (n+1)! ,

отсюда

q = an+1 / an = x/(n+1) .

Рекуррентное соотношение (2) принимает вид

 

an+1 = x/(n+1)*an

,

где n = 0, 1, 2, …… и начальное значение слагаемого a0 =1.

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

достижению точности, т. е. когда очередное слагаемое | a | < ε.

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

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

#include <iostream.h> Int main()

{

int n;

float x, a, sum, eps; printf(“введите х\n”); scanf(“&f”, &x);

printf(“введите точность eps\n”); scanf(“&f”, &eps);

a=1; n=0; sum=0; while(fabs(a) >= eps)

{

a = x *a/(n+1); sum = sum + a; n++;

}

printf(“ значение функции ех = %f\n”, sum); return 0;

}

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

Оператор цикла с постусловием (do while) имеет следующий формат:

do <оператор> while (<выражение>);

Оператор цикла с постусловием do while работает аналогично оператору цикла с предусловием while. Различие заключается в том, что в операторе while проверка выражения производится до выполнения тела цикла, в то время как в операторе do while - после. Это означает, что оператор, по крайней мере, один раз выполняется всегда.

Пока выражение имеет значение true, выполняется тело цикла. Цикл завершается, когда выражение станет равным false.

22

Пример.

Написать программу нахождения числа Фибоначчи, не превосходящего

 

заданного натурального числа N.

 

Числа Фибоначчи получаются с помощью рекуррентных соотношений:

 

f0 = f1 = 1, fi = fi-1 + fi-2, i >= 2, fi - целое число.

int main()

 

{

 

int f0, f1, f2, N; printf(“введите N \n”); scanf(“%d”, &N);

f0 = f1 = 1; do

f2=f0 + f1;

f0 = f1; f1=f2; while (f2 < N); printf(“%d\n”, f1); return 0;

}

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

Оператор цикла с параметром имеет следующий формат:

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

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

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

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

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

Пример. Дано натуральное число N. Написать программу вычисления суммы

S=1+ 1/2 + 1/3 +1/4 + … + 1/N .

// вычисление суммы S=1+ 1/2 + 1/3 +1/4 + … +1/N для натурального числа N

#include <iostream.h> int main( )

{

int i, N; float s=0;

printf(“введите N \n”);

23

for ( i=1; i<=N; i++) s=s + 1.0 / i;

printf(“s=%d\n”, s); return 0;

}

Составной оператор

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

Составной оператор имеет следующий формат:

{<оператор_1>; <оператор_2>; … <оператор_n>; }

ирассматривается как одна программная единица.

Оператор break

Оператор break применяется в двух случаях. Во-первых, в операторе switch с его помощью прерывается выполнение последовательности case. Во-вторых, оператор break используется для досрочного выхода из цикла, в этом случае управление передается оператору, следующему за оператором цикла.

Оператор break вызывает выход только из того цикла, в теле которого он находится. Например, программа

#include <iostream.h> int main ( )

{

int i, count;

for ( i=0; i< 5; i++)

{

count = 1; while (1)

{

printf(“%d ”, count); count++ ;

if ( count == 10) break;

}

}

}

5 раз выводит на экран числа от 1 до 9. В данном случае оператор break передает управление внешнему циклу for.

Оператор continue

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

24

Оператор return

Оператор возврата из функции return завершает выполнение функции и передает управление в точку ее вызова.

Оператор return имеет следующий формат:

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

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

Закрывающаяся фигурная скобка } также вызывает выход из функции. Выход программы на нее эквивалентен оператору return без значения. В этом случае функция, тип которой отличен от void, возвращает неопределенное значение.

9. Функция exit()

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

void exit(int <код_возврата>);

Значение переменной <код_возврата> передается вызвавшему программу процессу, обычно в качестве процесса выступает операционная система. Нулевое значение кода возврата обычно используется для указания нормального завершения работы программы. Другие значения указывают на характер ошибки. Функция exit() объявлена в заголовочном файле <stdlib.h>.

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

// простейший калькулятор

#include <iostream> #include <stdlib.h> using namespace std; void menu()

{

int a,b, r; char op; while (1)

{

printf(“ введите пункт меню 0, 1, +, -, *, /, %\n”); scanf(“%с”, &op);

switch (op)

{

case ‘0’: printf(“ введите операнды a, b \n”); scanf(“%d%d”, &a, &b); break;

case ‘+’: r = a + b; break;

25

case ‘-’: r = a - b; break; case ‘*’: r = a * b; break; case ‘/’: r = a / b; break; case ‘%’: r = a % b; break; case ‘1’: exit(0);

}

printf(“результат=%d\n”, r);

}

}

int main()

{

Menu(); return 0;

}

10.Типы данных, определяемые пользователем

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

Переименование типов (typedef)

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

typedef <тип> < новое_ имя> [<размерность>];

Например:

typedef unsigned int UINT;

Введенное новое имя, можно использовать таким же образом, как и имена стандартных типов:

UINT i, j, k;

Структуры

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

26

Структура представляет определяемый пользователем тип данных, который имеет следующий формат:

struct <имя_типа>

{

<тип_1> <элемент_1>; <тип_2 > <элемент_2>;

…………………………

<тип_n > <элемент_n >;

};

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

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

truct Bask

 

{

 

 

char fam [30];

// фамилия

char name [20];

// имя

int rost;

// рост в см

float ves;

// вес в кг

int count;

// количество забитых мячей

};

 

 

Bask

man;

// переменная

Bask

mas [12];

// массив из 12-и элементов

Bask *ps=new Bask;

// указатель на структуру

Bask *pm= new Bask[n];

// массив структур

Доступ к полям структуры осуществляется с помощью операций выбора (точка для переменной и -> для указателя), например:

strcpy(man.fam, “Иванов”);

man.count=5;

man.ves=80;

strcpy(mas[1].name, “Дмитрий”);

mas[i].ves=95;

mas[2*i].count=3;

ps->rost = 190;

pm[2].count=2;

(*(pm+2)).count=2;

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

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

27

Ввод/вывод структур, как и массивов, выполняется поэлементно

scanf(“%s%s%d%f%d”, man.fam, man.name, &man.rost, &man.ves, &man.count); printf(“%s %s %d %f %d\n”, man.fam, man.name, man.rost, man.ves, man.count);

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

Bask man = { “Иванов”, “Дмитрий”,

190,

80,

3

};

или

Bask man = { “Иванов”, “Дмитрий”, 190, 80, 3 };

Пример. На вход программе подаются сведения о студентах некоторого вуза. В первой строке сообщается количество студентов N (не более 400). Каждая из следующих строк имеет формат:

<фамилия> <имя> <курс> <стипендия>

Все данные в строке разделяются одним пробелом. Фамилия состоит не более, чем из 20 символов, имя - не более, чем из 15. Курс –целое число от1 до 5, стипендия – целое число. Написать программ, которая будет выводить фамилии и имена всех студентов, имеющих максимальные стипендии на каждом курсе.

//

#include <iostream> using namespace std; struct Student

{

char fam[21]; char name [16]; int kurs;

int stip;

};

const int M=400; int mane()

{

int i, N;

int max_stip [5]={0}; Student mas[M]; scanf(“%d”, &N); for(i=0; i<N; i++)

{

scanf(“%s%s%d%d”, mas[i].fam, mas[i].name, &mas[i].kurs, mas[i].step); if(mas[i].stip > max_stip[mas[i].kurs-1])

max_stip[mas[i].kurs-1] = mas[i].stip;

}

28

for(i=0; i<5; i++)

{

printf(“Курс %d\n”, i+1);

for(j=0; j<N; j++)

if(mas[j].kurs == i+1 && mas[j].stip == max_stip[i+1]) printf(“%s %s\n”, mas[j].fam, mas[j].name);

}

return 0;

}

11. Задания для самостоятельной работы

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

2.Даны координаты трех точек на плоскости. Если они могут быть вершинами треугольника, то определить его вид (разносторонний, равнобедренный, равносторонний) и вычислить площадь.

3.Дано натуральное число n. Найти количество и сумму цифр числа.

4.Дано натуральное число n. Определить, является ли оно палиндромом, т.е. читается ли число слева направо и справа налево одинаково.

5.Дано натуральное число n. Определить, является ли оно степенью числа 3.

6.Вычислить наибольший общий делитель двух натуральных чисел.

7.Найти сумму всех чисел Фибоначчи, которые меньше 1000. Числа Фибоначчи

получаются

с

помощью

следующих

рекуррентных

соотношений:

f0 = f1 = 1, fn = fn-1 + fn-2, n >= 2 ,

fn – целое.

 

 

8.Дано натуральное число n. Выбросить из записи этого числа цифры 3 и 7, оставив прежним порядок остальных цифр. Например, из числа 3 171 507 377 должно получиться число 1150.

9. Дан прямоугольник, длины которого a и b - натуральные числа. На сколько квадратов, стороны которых выражены натуральными числами, можно разрезать данный прямоугольник, если от него отрезать каждый раз квадрат максимально возможной площади?

10. Дано натуральное число n. Вычислить сумму следующего вида:

S=1*2 + 2*3*4 + … + n* … *2*n.

11.Даны натуральные числа m и n (m > n). Написать программу вычисления величины

B = m(m-1)(m-2) … [m - (n-1)].

12. Дано натуральное число n. Получить сумму, тех чисел вида i3 – 3*i*n2 + n (i=1, 2, …, n), которые являются утроенными нечетными числами.

29

13.Даны натуральные числа n, a1, a2, …, an. Определить количество членов ai последовательности a1, a2, …, an, удовлетворяющих условию 2i < ai < i!.

14.Даны натуральное число n, целые числа a1, a2, …, an. Получить сумму положительных четных и количество отрицательных членов последовательности a1, a2, …, an. Выдать сообщение, если последовательность не содержит положительных четных или отрицательных чисел.

15.Дано натуральное число n и последовательность вещественных чисел x1, x2, … , xn. Найти длину наименьшего отрезка числовой оси, содержащего числа x1, x2, … , xn.

16.Дано натуральное число n и последовательность вещественных чисел x1, x2, … , xn. Логической переменной А присвоить значение true, если наименьший элемент последовательности принадлежит отрезку [0.5, 3.0] и значение false в противном случае. В программе организовать ввод по одному числу из последовательности.

17.Дано натуральное число n и последовательность целых чисел x1, x2, … , xn. Найти наибольшее среди отрицательных чисел этой последовательности или выдать сообщение, что нет таких чисел. В программе организовать ввод по одному числу из последовательности.

18.Дано вещественное число х. Написать программу вычисления значения функции

у=sin(х) = х – х3/3! + х5/5! – х7/7! +… с точностью ε. Считать, что требуемая точность достигнута, если очередное слагаемое по модулю меньше ε, т.е. |an| < ε.

19.Дано вещественное число х (x>0). Написать программу вычисления значения функции у = sqrt(х) с точностью ε, пользуясь итерационным методом Ньютона

yn+1

=

yn

+ 0.5(x/yn – yn)

n

= 0, 1,

2,

В

качестве

начального

приближения

принять

y0

=1.

Считать,

что

требуемая точность достигнута,

если

очередная

поправка

vn=0.5*(x/yn - yn) по модулю меньше ε, т.е. |vn| < ε.

20.Написать программу нахождения первых 10 простых чисел.

21.Даны натуральное число n и вещественные числа x1, y1, x2, y2, …, xn,yn. Рассматривая пары xi, yi как координаты точек на плоскости, определить радиус наименьшего круга с центром в начале координат, внутрь которого попадают все эти точки.

22.Написать программу нахождения всех автоморфных чисел на отрезке [m, n], (m<n). Автоморфным называется целое число, которое равно последним цифрам своего квадрата. Например, 52=25, 252=625.

23.Дана последовательность из N шестизначных натуральных чисел. Написать программу печати и подсчета «счастливых» номеров в заданной последовательности. Номер называется «счастливым», если сумма первых трех цифр равна сумме последних трех цифр.

24.Дано натуральное число n и последовательность целых чисел x1, x2, … , xn. Логической переменной А присвоить значение true, если числа образуют знакочередующуюся последовательность, и значение false в противном случае.

30

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