!!! МЕТОДИЧКА_Срр_Часть1. Учебнометодическое пособие предназначено для студентов, изучающих дисциплину Программирование
Скачать 2.01 Mb.
|
Объявление переменных Язык С++ требует явного объявления всех переменных используемых в программе вместе с указанием соответствующих им типов. Объявления переменной имеет следующий формат: <спецификатор типа> имя_1, имя_2, ..., имя_n; спецификатор типа – одно или несколько ключевых слов, определяющие тип объявляемой переменной. В языке С++ имеется стандартный набор типов данных, используя который можно сконструировать новые (уникальные) типы данных; имя_1, имя_2, имя_n – идентификаторы, соответствующие именам переменных. Стандартные типы данных В таблице 3.1 приведены ключевые слова, которые определяют диапазон значений и размер области памяти, выделяемой под переменные целого типа. Таблица 3.1. Целые типы данных Тип Размер памяти в байтах Диапазон значений char 1 от -128 до 127 int 2 от -32768 до 32767 short 2 от -32768 до 32767 long 4 от -2 147 483 648 до 2 147 483 647 unsigned сhar 1 oт 0 до 255 unsigned int 2 от 0 до 65535 unsigned short 2 от 0 до 65535 unsigned long 4 от 0 до 4 294 967 295 Например: unsigned int n; int b,f2,f3; int c; long d; Отметим, что тип char используется для представления символа. Значением объекта типа char является код (размером 1 байт), соответствующий представляемому символу. Для представления символов русского алфавита, модификатор типа идентификатора данных имеет вид unsigned char, так как коды русских букв превышают величину 127. В языке С++ не определено представление в памяти и диапазон значений для идентификаторов типа int и unsigned int. Размер памяти для переменной с модификатором типа int определяется длиной машинного слова, которое имеет различный размер на разных компьютерах. Например, на 16-ти разрядных ЭВМ размер слова будет равен 2-м байтам, а на 32-х разрядных машинах - 4-м байтам, это соответствует типам short или long в зависимости от архитектуры используемой машины. Это означает, что одна и та же программа может правильно работать на одном компьютере и не работать на другом. Восьмеричные и шестнадцатеричные константы также могут иметь модификатор unsigned, для этого необходимо указать префикс u или U после константы. Константа без этого префикса считается знаковой. Например: 0xA8C (int); 01756l (long); 0xF7u (unsigned int); Данные вещественных типов В таблице 3.2 приведены типы данных, используемые для представления чисел с плавающей точкой. Таблица 3.2. Вещественные типы данных Тип Размер памяти в байтах Диапазон значений float 4 3.4E-38 ... 3.4E+38 double 8 1.7E-308 ... 1.7E+308 long double 10 3.4E-4932 ... 3.4E+4932 Типы double и long double кроме более широкого числового диапазона отличаются большей точностью. Примеры: float f, a, b; double x,y; Записывая арифметические выражения на языке С++, необходимо помнить и о еще одной особенности этого языка, делающей его универсальным – возможности преобразования типов. Преобразования типов Представим себе следующий оператор присваивания: int ival = 0; // обычно компилируется с предупреждением ival = 3.145 + 3; В результате переменная ival получит значение 6 (при складывании литералов разных типов – 3.145 типа double и 3 типа int). Язык C++ обычно не может сразу выполнить данную операцию, так как ему сначала необходимо привести операнды к одному типу. Для этих целей были введены правила преобразования арифметических типов, суть которых заключается в переходе от операндов меньшего типа к большему во избежание потери точности вычислений. В данном примере целое число 3 приводится к типу double, и только после этого производится сложение. Подобные преобразования осуществляются автоматически и называются неявным преобразованием типов данных. В результате сложения двух чисел уже одного типа double получится число 6.145, которое тоже будет иметь тип double. Присвоение этого числа переменной ival, которая имеет тип int, приведет к автоматическому отбрасыванию дробной части числа (а не округлением). Таким образом, 6.145 превращается в 6, и этот результат присваивается переменной ival. Такое преобразование приводит к потере точности, поэтому большинство компиляторов выдают соответствующее предупреждение. Так как компилятор не округляет числа при преобразовании double в int, при необходимости мы должны позаботиться об этом сами. Например: double dva1 = 8.6; int iva1 = 5; ival += dva1 + 0.5; // преобразование с округлением При желании мы можем произвести явное преобразование типов: // инструкция компилятору привести double к int ival = static_cast< int >( 3.145 ) + 3; В этом примере дается явное указание компилятору о приведении величины 3.145 к целому типу. Ниже представлены правила неявного и явного преобразования типов данных (как в первом и во втором примерах соответственно). Явные и неявные преобразования типов в С++. Правила неявного преобразования. Операции преобразования типа: float a=1; float b; b=a+(int)2.1; В языке С используется автоматическое приведение типа при вычислениях (при вычислениях с различными типами данных): int a=1; float b; b=a+2.1; //В результате: 3.1 Правила: 1) тип char приводится к short; 2) short – к int; 3) signed – к unsigned; 4) все целые типы преобразуются к long, а long – к unsigned long; double f; unsigned char ch; unsigned long m; int I; f*(I+ch/m) Результат операции в скобках приводится к double перед умножением. Явное приведение типа. Правила: 1) целое со знаком преобразуется к более короткому целому со знаком путем усечения старших бит: Unsigned char ch; ch=()65535 ↓ 255 Целое со знаком преобразуется к более длинному целому со знаком путем размножения знаков. 2) при преобразовании целого со знаком к целому без знака, целое число со знаком преобразуется к размеру целого без знака и результат интерпретируется как целое без знака. Unsigned char ch1; //Пример описания. В других языках такого нет. char ch2=-1; ch1=ch2 ↓ 255 3) преобразование целого со знаком к плавающему типу происходит без потери информации, за исключением случая преобразования типа long к float, тогда точность может быть частично потеряна. 4) целое без знака преобразуется к более длинному целому со знаком путем расширения нулем. 5) когда целое без знака преобразуется к целому со знаком того же размера, битовый шаблон не изменяется, однако значение, которое оно представляет, изменяется, если знаковый бит установлен. Unsigned short A1=65535; short A2=; A2=A1; A2 ↓ .1 6) величина типа float преобразуется к double без изменения значений. Величины double, преобразованные к float, представляются точно, если это возможно. 7) при преобразовании величины с плавающей точкой к целым типам они сначала преобразуются к типу long, при этом дробная часть отбрасывается, а затем величины типа long преобразуются к требуемому типу. Если значение слишком велико для long, то результат будет не определён (отбрасывается младшая часть мантиссы). Операции инкремента и декремента Операции ++ и – – это операции инкремента и декремента. Операция инкремента увеличивает значение операнда на единицу. Операция декремента уменьшает значение операнда на единицу. Например, следующий оператор: х = х + 1; с применением операции инкремента можно записать в таком виде: х++; Аналогично, оператор х = х – 1; эквивалентен оператору х– –; Эти операции отличаются тем, что они могут быть записаны как в постфиксной форме, когда символ операции следует за операндом, как в приведенных примерах, так и в префиксной форме, когда он предшествует операнду. В приведенных примерах применение любой из этих форм не имеет никакого значения. Однако, когда операции инкремента/декремента являются частью более сложного выражения, проявляется внешне незначительное, но важное различие между этими двумя формами. В префиксной форме значение операнда увеличивается или уменьшается до извлечения значения для использования в выражении. В постфиксной форме предыдущее значение извлекается для использования в выражении, и лишь после этого значение операнда изменяется. Например: х = 42; у = ++х; В этом случае значение у устанавливается равным 43, как и можно было ожидать, поскольку увеличение значения выполняется перед присваиванием значения х переменной у. Таким образом, строка у=++х эквивалентна следующим двум операторам: х = х + 1; y = х; Однако если операторы записать как х = 42; у = х++; значение переменной х извлекается до выполнения операции инкремента, и поэтому значение переменной у равно 42. Конечно, в обоих случаях значение переменной х установлено равным 43. Следовательно, строка у=х++; эквивалентна следующим двум операторам: у = х; х = х + 1; В заключении вопрос: почему язык программирования получил название С++, а не ++С? Задачи для индивидуального решения (пользуясь оператором switch): 1. По номеру y (y > 0) некоторого года определить с – номер его столетия. Учесть, что, к примеру, началом XXI столетия был 2001, а не 2000 год. 2. Даны произвольные числа a, b, c. Если нельзя построить треугольник с такими длинами сторон, то выдать соответствующее сообщение; если можно, то напечатать какой он: равносторонний, равнобедренный, разносторонний. 3. По введенному номеру месяца выдать на экран сообщение о времени года и названии введенного месяца. Например: 1 – январь, зима. 4. Даны a и b. Напечатать максимальное и минимальное значения выражений с указанием формул, по которым производились вычисления. 5. Составить программу, которая при вводе символа с клавиатуры выводит «цифра», если введена цифра; «латинская буква» при вводе латинской буквы и «не цифра и не латинская буква» во всех остальных случаях. Вариант 1 1. По введенному времени и известному расписанию занятий вывести сообщение о том, что это: пара (с указанием ее номера) или перемена. Вариант 2 1. По введенному номеру месяца вывести на экран сообщение о номере квартала. Вариант 3 1. Составить программу, которая по введенному году и номеру месяца определяет число дней в этом месяце. Вариант 4 1. При вводе с клавиатуры символа: + вывести сообщение «сложение»; − вывести сообщение «вычитание»; * вывести сообщение «умножение»; / вывести сообщение «деление» с указанием формулы и примера с конкретными значениями, введенными с клавиатуры. Вариант 5 1. Составить программу, которая при вводе символа "{" или "}" выводит сообщение «фигурная скобка»;. при вводе "[" или "]" – «квадратная скобка»; при вводе "(" или ")" – «круглая скобка»; в остальных случаях – сообщение «не скобка». Вариант 6 1. Даны произвольные числа a, b и c. Присвоить максимальное из них переменной a, минимальное - переменной с, среднее - переменной b. Вариант 7 1. Составить программу, которая при вводе оценки в виде цифры выводит оценку в виде слова: 5 – отлично, 4 – хорошо, 3 – удовлетворительно, 2 – неудовлетворительно. Вариант 8 1. Составить программу, которая выводит введенный возраст человека с добавлением слов «год», «года», «лет» (41 год, 3 года, 20 лет). Вариант 9 1. По введенному номеру квартала вывести на экран, какие месяцы входят в этот квартал. Вариант 10 1. Составить программу, которая по введенному номеру дня недели выдает его название. Например, 1 – понедельник. Лабораторная работа №4 Программирование циклических алгоритмов Цель работы: изучить циклические конструкции в языке С++, научиться составлять программы решения задач с использованием циклов. Общие сведения Алгоритм является циклическим, если он содержит многократное выполнение одних и тех же операторов при различных значениях промежуточных данных. Число повторений этих операторов может быть задано в явной (цикл с известным числом повторений) или неявной (цикл с неизвестным заранее числом повторений) форме. В ходе выполнения работы необходимо рассмотреть различные варианты организации циклов и особенности их использования. Цикл с известным заранее числом повторений (оператор for) Оператор for – является наиболее распространенным способом организации циклов и имеет следующий вид: for (выражение 1; выражение 2; выражение 3) оператор ; Выражение 1 устанавливает начальное значение переменной, управляющей циклом. Выражение 2 определяет условие, при котором тело цикла будет выполняться. Выражение 3 задает условие изменения переменной, управляющей циклом после каждого выполнения тела цикла. Схема выполнения оператора for: 1. вычисляется выражение 1. 2. вычисляется выражение 2. 3. если значения выражения 2 отлично от нуля (истина), выполняется тело цикла, вычисляется выражение 3 и осуществляется переход к пункту 2, если выражение 2 равно нулю (ложь), то управление передается на оператор, следующий за оператором for. Особенностью данного цикла является то, что проверка условия всегда выполняется в начале цикла. Это значит, что тело цикла может ни разу не выполниться, если условие выполнения сразу будет ложным. Пример: int a,b; for (a=1; a<=10; a++) b=a*a; В этом примере вычисляются квадраты чисел от 1 до 10 включительно. Возможности оператора for позволяют использовать несколько переменных для управления циклом. Пример: int t, b; char string[100], tmp; for (t=0, b=100; t < b; t++, b--) { tmp=string[t]; string[b]=tmp;} В данном примере показана запись строки символов в обратном порядке. Для управления циклом здесь используются две переменные t и b записанные через запятую и выполняемые последовательно. Еще одним вариантом использования оператора for является бесконечный цикл. Для организации такого цикла используется пустое условное выражение, а для выхода из цикла применяется дополнительное условие и оператор break. Пример: for (;;) { ... ... break; } Так как в языке Си оператор может быть пустым, значит и тело оператора for также может быть пустым. Такая форма оператора может быть использована для организации поиска. Пример: for (i=0; t[i]<10 ; i++); В данном примере переменная цикла i принимает значение номера первого элемента массива t, значение которого больше 10. Цикл с предусловием (оператор while) Оператор while называется циклом с предусловием и имеет следующий вид: while (выражение) оператор; В качестве выражения можно использовать любое выражение языка Си, а в качестве тела любой оператор, в том числе пустой или составной. Схема выполнения оператора while следующая: 1. вычисляется выражение. 2. если выражение истинно, то выполняется тело оператора while, если ложно, то выполнение цикла заканчивается. 3. процесс повторяется с пункта 1. Так же как и в цикле со счетчиком for, в операторе while вначале происходит проверка условия. Поэтому оператор while удобно использовать в ситуациях, когда тело оператора не всегда нужно выполнять. Внутри операторов for и while допускается использовать локальные переменные, которые должны быть объявлены с определением соответствующих типов. Цикл с постусловием (оператор do while) Оператор цикла do while называется оператором цикла с постусловием и используется в тех случаях, когда тело цикла необходимо выполнить хотя бы один раз. Формат оператора имеет следующий вид: do тело while (выражение); Схема выполнения оператора do while: 1. выполняется тело цикла. 2. вычисляется выражение. 3. если выражение ложно, то выполнение оператора do while заканчивается и выполняется следующий по порядку оператор. Если выражение истинно, то выполнение оператора продолжается с пункта 1. Чтобы прервать выполнение цикла до того, как условие станет ложным, можно использовать оператор break. Операторы while и do while могут быть вложенными. Пример: int i,j,k; i=0; j=0; k=0; do {i++; j--; while (k < i) k++; } while (i<30 && j<-30); Использование операторов цикла рассмотрим на следующем примере. Пример 1: На промежутке от 1 до M найти все числа Армстронга. Натуральное число из n цифр называется числом Армстронга, если сумма его цифр, возведенных в n-ю степень, равна самому числу. Например, десятичное число 153 – число Армстронга, потому что: 1³ + 5³ + 3³ = 153. Другие примеры начальных чисел Армстронга в десятичной системе счисления: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, …. Числа 153, 370, 371 и 407 имеют специальное название – числа Армстронга (в честь математика, который их впервые исследовал). Строгое математическое определение таково: n-значное число называется числом Армстронга, если оно равно сумме n-ых степеней своих цифр. n Числа Армстронга n Числа Армстронга 3 153; 370; 371; 407 8 24678050; 24678051; 88593477 4 1634; 8208; 9474 9 146511208; 472335975; 534494836; 912985153 5 54748; 92727; 93084 10 4679307774 6 548834 11 32164049650; 32164049651; 40028394225; 42678290603; 44708635679; 49388550606; 82693916578; 94204591914 7 1741725; 4210818; 9800817; 9926315 14 28116440335967 Этапы решения задачи: 1. Математическая модель: x [1;M], x= = 2. Составим блок схему программы (рисунок 4.1). Рис. 4.1. Алгоритм решения задачи 3. Распишем составные части блока «Находим все числа Армстронга на заданном промежутке и печатаем их» (рисунок 4.2). Рис. 4.2. Алгоритм решения основного блока задачи 4. Опишем блок «Подсчитываем сколько цифр в числе i» (рисунок 4.3) Рис. 4.3. Алгоритм подсчета количества цифр в числе i 5. Опишем блок «Проверяем, является ли i числом Армстронга» (рисунок 4.4) Рис. 4.4. Алгоритм проверки числа Армстронга Дальнейшая детализация не требуется, запишем блок-схему целиком (рисунок 4.5). Рис. 4.5. Общая схема вычисления числа Армстронга Дальнейшей детализации не требуется, переведем программу на язык С++. #include #include { int i,k,s,p,n, M; cout<<"Vvedite M:"; cin>>M; for (i=1; i<=M; i++) { s=0; k=i; n=0; while (k!=0) { k=k/10; n=n+1; } k=i; while (k!=0) { p=k%10; k=k/10; if (p!=0) s=int(s+exp(n*log(float (p)))); } if (s==i) cout<} return 0; } Реализовав данную программу в интегрированной среде программирования, получим результирующее окно, представленное на рисунке 4.6. Рис. 4.6. Окно выполнения задачи |