Кыргызский государственный технический

КЫРГЫЗСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ

УНИВЕРСИТЕТ им. И. Раззакова

ФАКУЛЬТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ

Кафедра «Программное Обеспечение Компьютерных Систем»

СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ

МЕТОДИЧЕСКИЕ УКАЗАНИЯ К ВЫПОЛНЕНИЮ ПРАКТИЧЕСКИХ И ЛАБОРАТОРНЫХ РАБОТ

Для студентов подготовки бакалавров по кредитной технологии обучения по направлению710400 «Программная инженерия»

Бишкек - 2012

РАССМОТРЕНО ОДОБРЕНО

На заседании кафедры Методическим советом ФИТ

«Программное обеспечение

Компьютерных систем»

Прот. №14 от 28.02.2012г. Прот. № от..2012г.

УДК 004.432

Составитель – Макиева З.Д.

Структурное программирование: методические указания к выполнению лабораторных работ /Кырг. гос. техн. ун-т, Бишкек, 2012, 64 с.

По учебному плану для студентов бакалавров по кредитной технологии обучения по направлению710400 «Программная инженерия» дисциплина «Структурное программирование» изучается два семестра. Первый семестр состоит из 18 часов лекций, 18 часов практических и 18 часов лабораторных занятий. Второй семестр - 18 часов лекционных и 36 часов лабораторных занятий. Первая часть методических указаний посвящена материалу, изучаемому в первом семестре, соответственно вторая часть – материалу, изучаемому во втором семестре.

В первой части рассматривается структурное программирование на языке С++. как запустить приложение Visual C++, как выполняется ввод и вывод в С++, изучили управляющие структуры: структуры выбора (операторы if, if/else: switch), структуры повторения (операторы for, while, do/while), объявление и использование одномерных и двумерных массивов. Рассмотрели различие между множественной инициализацией в цикле for и вложенными циклами for.

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

Библиогр. 10 названий.

Рецензент канд. техн.наук, доцент Тен И.Г.

Введение

Устройство ЭВМ основано на принципах двоичной арифметики, где для представления чисел используются всего две цифры - 0 и 1. Программирование в кодах ЭВМ требует досконального знания системы команд машины и большого внимания, кроме того, процесс программирования в кодах малоэффективен.

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

Языки, которые требуют предварительного перевода, называются языками высокого уровня. Считается, что эти языки в определённом смысле более близки к естественному языку. Использование языков высокого уровня значительно повышает эффективность программирования по сравнению с обычным кодированием. В настоящее время существует высокая мотивация к изучению языка программирования высокого уровня С++, так как он реализует передовые принципы программирования и широко используется во всем мире. В 1972 году Денисом Ритчи был создан язык С, который первоначально использовался для разработки ОС Unix. Язык С не зависит от аппаратных средств и позволяет создавать программы переносимые на большинство компьютеров, что привело к его широкому применению. В начале 80-х Бьярн Страустрап разработал расширенный язык С, т.е. С++, который позволяет программировать в стиле языка С и в стиле объектно-ориентированного программирования.

Лабораторная работа №1.

Лабораторная работа № 2

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

 
  кыргызский государственный технический - student2.ru

Для реализации разветвляющихся алгоритмов используется условный оператор “if”. Оператор “if” имеет две формы записи:

1) if (<условие>) <оператор>;

2) if (<условие>) <оператор1>; else <оператор2>;

Рассмотрим первый вид if (<условие>) <оператор>;

Проверяется условие, если оно истинно, то выполняется “оператор”, иначе программа идет далее вниз по тексту.

кыргызский государственный технический - student2.ru Пример: Дано вещественное число. Если оно отрицательно, то вывести его абсолютное значение.

#include <iostream>

#include <сmath>

using namespace std;

int main() {

double a;

cin>>a;

if (a<0)

cout<<fabs(a)<<endl;

return 0;

}

кыргызский государственный технический - student2.ru Теперь рассмотрим второй вид

if (<условие>) <оператор1>; else <оператор2>;

кыргызский государственный технический - student2.ru Здесь проверяется условие, если оно истинно, то выполняется “оператор1”, иначе выполняется «оператор2», далее программа идет вниз по тексту.

Пример: Даны два целых числа.

Вывести наименьшее из них.

#include <iostream>

using namespace std;

int main() { int a, b;

cin>>a>>b;
if(a <b) cout<<”minimum=”<<a<<endl;
else cout<<”minimum=”<<b<<endl;

return 0;
}

Большинство операторов языка С++ в соответствии с синтаксисом могут выполнить только один оператор. В случае если по условию задачи требуется выполнить несколько операторов, они должны быть заключены в фигурные скобки {}. Операторы идущие после блока if, заключённые в фигурные скобки называются ”телом” оператора if.

Имеется более короткий способ записи условного оператора:

(<условие>)?<оператор1>:<оператор2>;

Проверяется условие, если оно истинно, то выполняется “оператор1”, иначе “оператор2”. Применение данного оператора приводит к получению более компактного машинного кода.

Пример: Даны 2 действительных числа. Найти наибольшее из этих 2-х чисел.

#include <iostream>

кыргызский государственный технический - student2.ru using namespace std;

int main() {

double x, y, max;

cin>>x>>y;

max=(x>y)?x:y;

cout<<”max=”<<max<<endl;

return 0;

}

Для записи условия используют логические операции: >(больше), <(меньше), >=(больше или равно), <=(меньше или равно), = =(равно), !=(не равно) и логические операторы && (логическое и), || (логическое или), ! (отрицание). Условие может принимать 2 значения: true(истина) или false(ложь).

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

Таблица истинности
x y x&&y x||y !x

Логический оператор “&&” (и) даёт истинное значение логического выражения только в том случае, когда оба операнда этого оператора являются истинными. Например: if ((x==5)&&(y==5)) – это выражение буден истинным только в том случае, когда x=5 и y=5.

Логический оператор “||” (или) даёт истинное значение логического выражения в том случае, когда хотя бы один из операндов этого оператора является истинным. Например: if ((x==5)||(y==5)) – это выражение буден истинным в том случае, когда или x=5 или y=5.

Логические операции так же как и арифметические операции имеют приоритет выполнения. Логические операции ( >, <, <=, >=) имеют больший приоритет, чем логические операторы ( ! , || , &&).

Пример использования логических операторов:

кыргызский государственный технический - student2.ru Даны 3 действительных числа. Проверить правильно ли выполняется следующее соотношение: кыргызский государственный технический - student2.ru a<b<c;

#include <iostream>

using namespace std;

int main() { double a, b, c;

cin>>a>>b>>c;

if ((a<b)&&(b<c))

cout<<”Yes”;

else

cout<<”No”;

return 0;}

Оператор множественного выбора “switch”

В некоторых случаях использование оператора “if” может привести к возникновению конструкций с большим количеством вложений, значительно усложняющих восприятие программы. Для решения этой проблемы, предусмотрен оператор “switch”, который позволяет рассматривать сразу несколько условий.

switch (<выражение>) {

case <первое_значение>: <оператор>; break;

case <второе_значение>: <оператор>; break;

case <n-oe_значение>: <оператор>; break;

default: <оператор>; break;

}

Выражение, заданное в скобках оператора “switch” сравнивается со значениями, указанными за операторами “case”. В случае совпадения значений выражения, выполняется оператор в строке соответствующего оператора “case”. Будут выполняться все строки программы после выбранного оператора “case” до тех пор, пока не закончится тело блока оператора “switch” или не повстречается оператор “break”. Выполнение оператора “break” приводит к выходу из оператора “switch”. Если “break” отсутствует, то управление передаётся следующему оператору “case” или оператору “default”. Если ни одно из значений операторов “case” не совпадает с выражением, то выполняются строки программы, стоящие после оператора “default”. Наличие оператора “default” не обязательно. В случае его отсутствия и несовпадения выражения ни с одним из значений, будет выполнен оператор стоящий после блока оператора “switch”.

Примечание: выражение оператора switch может быть только целочисленного типа или типа char.

Пример: Требуется написать программу, которая по введённой оценке определяет статус учащегося. Решим задачу двумя способами для сравнения.

Программа с использованием вложенных конструкций if/else   Программа с использованием оператора switch  
кыргызский государственный технический - student2.ru #include <iostream.h> main() { int mark; cout<<”Enter mark – ”; cin>>mark; if (mark==5) cout<<”Excellent\n”; else if (mark==4) cout<<”Good\n”; else if (mark==3) cout<<”Satisfy\n”; else cout<<”Bad\n”; return 0; }   кыргызский государственный технический - student2.ru #include <iostream.h> main() { int mark; cout<<”Enter mark - ”; cin>>mark; switch (mark) { case 5: cout<<”Excellent\n”; break; case 4: cout<<”Good\n”; break; case 3: cout<<”Satisfy\n”; break; default: cout<<”Bad\n”; } return 0; }  

Выполнить на ЭВМ и оформить в тетради задания для самостоятельной работы.

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

1. Даны действительные числа x и y (x!=y). Меньшее из них заменить полусуммой чисел, а большее – удвоенным произведением.

2. Если сумма 3 действительных чисел x,y,z <1, то наименьшее из этих чисел заменить полусуммой двух других, в противном случае заменить меньшее из x и y полусуммой двух оставшихся значений.

3. Дано действительное число а. Вычислить f(a), если

кыргызский государственный технический - student2.ru

4. Даны действительные числа a, b, c. Найти корни квадратного уравнения ax2+bx+c=0, в противном случае ответом должно служить сообщение, что корней нет.

5. Даны действительные числа x, y, z. Выяснить, существует ли треугольник с длинами сторон x, y, z.

6. Даны три действительных числа. Возвести в квадрат те из них, значения которых неотрицательны.

7. Даны действительные числа. Выбрать из них, те которые принадлежат интервалу [1,3].

8. Программа запрашивает у пользователя «Сколько Вам лет?» . Вы вводите положительное число до 100. Программа должна выдать полный ответ « Вам Х (или лет или года или год).

9. Даны действительные числа a, b, c.Удвоить эти числа, если a³b³c, и заменить их абсолютными значениями, если это не так.

10. Дано натуральное число n (n³9999). Является ли это число палиндромом (перевертышем) с учетом четырех цифр, как , например, числа 2222, 6116, 0440 и т.д.

Лабораторная работа № 3

Операторы цикла

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

- тела цикла, т.е. операторов повторяющихся несколько раз;

- начальных значений;

- модификации (изменения) параметра цикла

- проверки условия продолжения цикла.

Один проход цикла называется итерацией. В С++ для удобства, а не по необходимости существует три типа операторов цикла. Это оператор цикла с предусловием while, оператор цикла с постусловием do/while и оператор цикла for. Поставленную задачу можно решить любым из них. Рассмотрим их подробнее.

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

 
  кыргызский государственный технический - student2.ru

Форма записи оператора:

while (< условие>) { <операторы>};

кыргызский государственный технический - student2.ru Пример: Вычислить значения функции y=x2+5, если xÎ[0,5] с шагом 1.

#include <iostream>

using namespace std;

int main() {

int x, y;

кыргызский государственный технический - student2.ru x=0;

while (x<=5)

{

y=x*x+5;

cout<<”x=”<<x<<”y=”<<y <<endl;

x++;

}

return 0; }

кыргызский государственный технический - student2.ru При использовании оператора цикла с постусловием “do/while”условие проверяется после выполнения тела цикла, это гарантирует выполнение цикла хотя бы один раз, даже если условие всегда ложно.

Форма записи оператора цикла с постусловием “do/while”:

do

{<операторы>}

while(<условие>);

Пример: Вычислить произведение целых чисел от 1 до 5.

кыргызский государственный технический - student2.ru #include <iostream>

using namespace std;

int main() {

int p, i;

кыргызский государственный технический - student2.ru p=1; i=1;

{

p*=i;

i++;

} while (i<=5);

cout<<p<<endl;

return 0;

}

Оператор цикл for работает следующим образом:

1) Присваивается начальное значение счётчику цикла, т.е инициализируется счётчик цикла.

2) Выполняется проверка значения счётчика. Если результат проверки равен значению “true”, то сначала выполняется тело цикла, а за тем операция над счётчиком (приращение, уменьшение и т.д.).

Форма записи оператора цикла

for (<инициализация_счётчика>;<проверка>;<операция_над_счётчиком>) операторы;

Пример:

Вычислить значение функции кыргызский государственный технический - student2.ru для всех значений “х” в диапазоне xÎ [a;b], где a- нижняя граница диапазона, b- верхняя граница диапазона.

кыргызский государственный технический - student2.ru #include <iostream>

#include <cmath>

using namespace std;

int main() {

int a,b,x;

cin>>a>>b;

double y;

for (x=a; x<=b; x++)

{

y=2 * pow ( x, 2);

cout<<”y=”<<y<<endl;

}

return 0;

}

Множественная инициализация счётчика цикла for

Синтаксис оператора цикла for позволяет инициализировать несколько переменных счётчиков, проверять сложное условие продолжения цикла и последовательно выполнять несколько операций над счётчиками цикла. Если присваиваются значения нескольким счётчикам или выполняются операции с несколькими счётчиками, то они записываются последовательно, и разделяются запятыми.

кыргызский государственный технический - student2.ru кыргызский государственный технический - student2.ru for ( i=0, j=0 ;i<3 && j<3; i++, j++ ) cout<<i<<j<<endl;

       
  кыргызский государственный технический - student2.ru
   
Операция над счётчиком
 

Результатом этого фрагмента программы будет вывод чисел в виде:

Вложенные циклы “for”

Цикл, организованный внутри тела другого цикла, называется вложенным циклом. В этом случае внутренний цикл полностью выполняется на каждой итерации (шаге) внешнего цикла.

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

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

cout << i << j << endl;

Результатом этого фрагмента программы будет вывод чисел в виде:

Счётчик цикла может быть как целого, так и вещественного типа. В качестве выражения изменения счётчика цикла может быть использовано сложное арифметическое выражение.

for ( i=0.5; i<100; i/5+10)

Синтаксис цикла “for” позволяет определять счётчик цикла одновременно с его инициализацией.

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

Выполнить на ЭВМ и оформить в тетради задания для самостоятельной работы.

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

1.Вычислить значение функции кыргызский государственный технический - student2.ru при х изменяющемся от 1 до 20 с шагом 0.5.

2. Вычислить значение функции кыргызский государственный технический - student2.ru при х изменяющемся от 0 до 16 с шагом 2.

3. Вычислить значение функции

кыргызский государственный технический - student2.ru

a=0.3, n=10, i изменяется от 1 до 10 с шагом 1.

4. Вычислить значение функции

кыргызский государственный технический - student2.ru

a=2.6, b=5, x изменяется от 0 до 10 с шагом 0.5

5. Найти сумму и произведение последовательности 10 целых чисел от 1 до 10.

Использовать оператор do…while

6. Вычислить кыргызский государственный технический - student2.ru .

Использовать оператор while

7. Дано действительное число а. Найти среди чисел кыргызский государственный технический - student2.ru первое большее а.

Использовать оператор do…while

8. Даны натуральное n и действительное х. Вычислить кыргызский государственный технический - student2.ru .

Использовать оператор for

9. Дано натуральное n. Вычислить:

a. кыргызский государственный технический - student2.ru

b. кыргызский государственный технический - student2.ru ;

c. кыргызский государственный технический - student2.ru ; n -корней

d. кыргызский государственный технический - student2.ru

10. Дано натуральное n. Найти кыргызский государственный технический - student2.ru , где

х11=1; xi=0.3xi-1; yi=xi-1+yi-1, i=2,3,… Использовать оператор do…while

11. (Песня «Двенадцать дней рождества»)Напишите программу, использующую повторение и структуры switch для печати текста песни «Двенадцать дней рождества». Одна структура switch должна использоваться для печати дня («Первый», «Второй» и т.д.). Другая структура switch должна использоваться для печати остальной части каждого куплета (возможно проще иметь дело с более знакомой песней того же типа «Двенадцать негритят»).

12. Рассчитайте значение πна основании бесконечного ряда

π =4-4/3+4/5-4/7+4/9-4/11+...

Напечатайте таблицу, которая покажет, как значение π аппроксимируется одним членом этого ряда, двумя членами, тремя и т.д. Сколько членов ряда потребовалось для получения значения 3.14? 3.141? 3.1415? 3.14159?

13. Напишите программу, которая читает пять чисел (каждое между 1 и 30). Для каждого просчитанного числа ваша программа должна напечатать строку, содержащую соответствующее число смежных звездочек. Например, если ваша програм­ма прочла число 7, она должна напечатать *******.

14. Напишите программу, которая напечатает следующий ромб. Вы можете использовать операторы вывода, которые печатают или одну звездочку (*), или один пробел. Максимально используйте повторение (с вложенными структурами for) и минимизируйте число операторов вывода.

*

***

*****

*******

*********

*******

*****

***

*

Лабораторная работа №4

Одномерные массивы

Массив– набор однотипных объектов имеющих общее имя и отличающихся местоположением в этом наборе. Элементы массива занимают один непрерывный участок памяти компьютера и располагаются последовательно друг за другом. Нумерация элементов в массиве начинается с 0 и заканчивается n-1 элементом, где n-количество элементов массива.

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

Синтаксис описания одномерного массива:

<Тип элементов массива> <имя_массива>[<количество элементов>];

Например:

int a[5];

Массив из 5 целочисленных элементов, имя массива – а, занимает непрерывный участок памяти размером 20 байтов, нумерация начинается с 0 и заканчивается 4.

кыргызский государственный технический - student2.ru

Одновременно с описанием массива можно инициализировать его элементы.

1) int a[5]={ 5, 8, 1, 3, 2 };

2) int a[]={ 5, 8, 1, 3, 2};

Во втором случае компилятор сам определит количество элементов массива по списку значений и выделит соответствующее количество памяти.

Также элементы массива можно инициализировать следующим образом: а[0]=5; a[1]=8; и т.д.

Для работы с массивами используются операторы цикла.

for ( i=0; i<5; i++) cin>>a[i]; //Ввод массива

for ( i=0; i<5; i++) cout<<a[i]; //Вывод массива

Стандартные алгоритмы обработки одномерных массивов

1. Поиск суммы и произведения массива:

#include <iostream>

using namespace std;

кыргызский государственный технический - student2.ru int main() { int A[5], Sum=0, P=1,i;

for (i=0;i<5;i++) cin>>A[i];

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

Sum+=A[i]; P*=A[i]; }

cout<<”Sum=”<<Sum<<”\nP=”<<P<<endl;

return 0; }

2. Поиск минимального элемента массива:

кыргызский государственный технический - student2.ru #include <iostream>

using namespace std;

int main() {

int A[100], n, i, min;

cin>>n;

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

cin>>A[i];

min=A[0];

for (i=1; i<n; i++)

if (A[i]<min)

min=A[i];

cout<<min<<endl;

return 0;

}

3. Поиск максимального элемента массива:

#include <iostream>

using namespace std;

int main( ) {

кыргызский государственный технический - student2.ru int A[100], n, i, max;

cin>>n;

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

cin>>A[i];

max=A[0];

i=1;

do {

if (A[i]>max)

max=A[i];

i++;

while (i<n);

cout<<max<<endl;

return 0; }

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

1. Даны температуры воздуха за неделю. Определить среднюю температуру воздуха за неделю и сколько раз температура опускалась ниже 0 градусов.

2. Даны натуральные числа N, a0, a1,…., a(N-1). Определить количество членов последовательности имеющих четные порядковые номера и являющихся нечетными числами.

3. Определить является ли данная последовательность убывающей (во избежание лишних проверок использовать оператор break) .

9. Информация о количестве выпавших в течение недели осадках задана в виде массива. Определить общее количество осадков за неделю.

10. Информация о температуре воздуха за месяц задана в виде массива. Определить, сколько раз температура опускалась ниже 0 градусов.

11. Дан массив чисел. Определить, сколько в нем пар одинаковых соседних элементов.

12. Дан массив чисел. Найти наибольший элемент, поставить его первым.

Лабораторная работа № 5

Двумерные массивы

В предыдущей лабораторной работе мы рассматривали одномерные массивы, но существуют многомерные массивы. Например, двумерный массив int v[3][7] можно представить как три массива типа int по 7 элементов в каждом. Представим его в виде матрицы размером 3х7:

  0-ой столбец   1-ый столбец 2-ой столбец 3-ий столбец 4-ый столбец 5-ый столбец 6-ой столбец
0-ая строка v[0][0] v[0][1] v[0][2] v[0][3] v[0][4] v[0][5] v[0][6]
1-ая строка v[1][0] v[1][1] v[1][2] v[1][3] v[1][4] v[1][5] v[1][6]
2-ая строка v[2][0] v[2][1] v[2][2] v[2][3] v[2][4] v[2][5] v[2][6]

Нумерация строк и столбцов начинается с 0 и заканчивается n-1. Первый индекс – номер строки, второй индекс - номер столбца.

Объявление двумерного массива:

<тип элементов> массива <имя > [количество строк][количество столбцов];

Например: int A[5][6];

Вместе с объявлением можно проинициализировать:

int A[2][3]={{1,2,3},{4,5,6}};

или int A[2][2]={1, 2, 3, 4};

Ввод двумерного массива c клавиатуры:

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

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

cin>>A[i][j];

Вывод двумерного массива в виде таблицы:

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

{

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

cout<<A[i][j]<<” “;

cout<<endl;

}

Алгоритм транспонирования двумерного массива

Дана матрица

кыргызский государственный технический - student2.ru кыргызский государственный технический - student2.ru

Получить транспонированную

матрицу

кыргызский государственный технический - student2.ru

#include <iostream>

using namespace std;

int main() {

int A[3][3],B[3][3],i,j;

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

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

cin>>A[i][j];

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

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

B[i][j]=A[j][i];

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

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

cout<<A[i][j]<<” “;

cout<<endl;

}

return 0;

}

Массивы символов

Форма записи: char Array[10];

Статический массив – массив, в котором конкретное число элементов.

Для каждого массива символов существует символ конца строки – ‘\0’, поэтому память под массив символов нужно выделять на один элемент больше.

Инициализация массива символов:

char Array[]={‘f’,‘i’,‘r’,‘s’ ,‘t’,‘ ’,‘c’,‘o’,‘u’,‘r’,‘s’,‘e’,’\0’};

Обязательный элемент для символьного массива

char Array[]=”first course”; //Это упрощённая запись доступная в С++

В этом случае компьютер автоматически вычислит размер конец строки.

Один символ занимает один бит памяти.

Если такую строку вводить при помощи оператора “cin”, то будет введено только первое слово “first”, так как оператор “cin”, воспринимает пробел как окончание строки, после чего прекращается ввод данных.

Функция get()

Для ввода строки, обычно используется функция “get()”, в которой необходимо указать 2 аргумента.

cin.get(<аргумент1>,< аргумент2>);

аргумент1 – имя строковой переменной для записи входных данных.

аргумент2 – целое число, указывающее размер строковой переменной.

{

char Array[80];

cout<<”Enter the string:\n”;

cin.get(Array,80);

cout<<Array<<endl;

return 0;

}

//Array[0] – 1-ый символ. Array[78] - 79-ый символ. Array[79] – ноль-символ (0)

Функция getline()

cin.getline(<аргумент1>,< аргумент2>);

аргумент1 – имя строковой переменной для записи входных данных.

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

Считывание строки завершается, как только количество считанных символов строки станет равным аргумент2, даже если считывание не достигло конца строки.

В отличие от функции “get()”, функция “getline()” считывает и удаляет из строки символ разрыва строки “\n”, функция “get()” воспринимает этот символ как разделитель, и оставляет его в строке

Массивы строк (в виде 2-мерного массива)

char name[5][20]; // 5 строк по 20 символов

cout<<”Введите 5 имён, по одному в строке:\n”;

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

cin.getline(name[i],20);

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

cout<<name[i]<<endl;

Функции обработки символов из библиотеки <ctype.h>

Функция Назначение
isdigit(символ) Возвращает значение “истина”, если символ является цифрой и значение “ложь” в противном случае. isdigit(<имя символьной переменной>); isdigit(‘<символ>’);
isspace(символ) Возвращает значение “истина”, если символ является пробелом или символом новой строки и значение “ложь” в противном случае. isspace(<имя символьной переменной>); isspace (‘символ >’);
isupper(символ) Возвращает значение “истина”, если символ записан в верхнем регистре и значение “ложь” в противном случае. isupper(<имя символьной переменной>); isupper(‘символ >’);
islower(символ) Возвращает значение “истина”, если символ записан в нижнем регистре и значение “ложь” в противном случае. islower(<имя символьной переменной>); islower (‘символ >’);
isalpha(символ) Возвращает значение “истина”, если символ является буквой и значение “ложь” в противном случае. isalpha(<имя символьной переменной>); isalpha(‘символ >’);
toupper(символ) Возвращает символ в верхнем регистре. char symbol; symbol=toupper(‘<символ в нижнем регистре>’); symbol=toupper(<имя символьной переменной в нижнем регистре>);
tolower(символ) Возвращает символ в нижнем регистре. char symbol; symbol=tolower(‘<символ в верхнем регистре>’); symbol=tolower(<имя символьной переменной в верхнем регистре>);

Пример:

Прочитать предложение до точки и вывести его на экран. Заменить все пробелы символом *.

#include <iostream.h>

#include <ctype.h>

main() {

char symbol;

do {

cin.get(symbol); // Функция “get()” Работает как с 1 так и с 2-я параметрами

if (isspace(symbol))

cout<<”*”;

else cout<<symbol;

}

while (symbol!=’.’);

return 0;

}

Примечание: при считывании 1-го символа, функция “get()” работает с одним параметром.

Функции преобразования строк из библиотеки <string.h>

Функция Описание
strlen(<строка>) Возвращает целое число равное длине строки (символ конца строки не учитывается).
strcat(<строка1>,<строка2>) Добавляет значение “строка2” в конец “строка1”.
strcpy(<строка1>,<строка2>) Копирует символы из “строка2” в конец “строка1” и при этом не проверяет, достаточно ли место в “строка1” для копирования символов.
strncpy(<строка1>,<строка2>,<кол-во символов>) Копирует не более “n” символов из <строка2> в <строка1>.
strcmp(<строка1>,<строка2>) Сравнивает <строка1> с <строка2>, если они равны, возвращает значение “ложь”.

Функции преобразования строки в число из библиотеки <stdlib.h>

Функция Описание
atoi(<строка>) Функция преобразования строки в число типа “int”.
atol(<строка>) Функция преобразования строки в число типа “long”.
atof(<строка>) Функция преобразования строки в число типа “double”.

Функция “getch()” из библиотеки <conio.h>

Функция “getch()” ожидает нажатия клавиши “Enter”.

Пример:

#include <iostream.h>

#include <conio.h>

main() {

getch();

return 0;

}

Генерация случайных чисел

Для генерации случайных чисел используется функция “rand()”, которая находится в библиотеке <stdlib.h>. Эта функция генерирует случайные числа от 0 до RAND_MAX. Константа RAND_MAX находится в библиотеке <stdlib.h> и равна 32767. В реальных задачах, такой диапазон значений практически не используется и для того, чтобы получить другой диапазон значений используется операция масштабирования.

Формула масштабирования имеет следующий вид: n=a+rand()%b;

a – величина сдвига, которая равна первому числу в требуемом диапазоне целых чисел.

b – масштабируемый коэффициент, который равен ширине требуемого диапазона целых чисел.

Например, если требуется сгенерировать целые числа в диапазоне от 0 до 5, то форма записи будет выглядеть следующим образом: n=rand()%6;

n=1+rand()%6 - будет генерировать числа в диапазоне от 1 до 6.

Пример:

#include <iostream.h>

#include <stdlib.h>

main() {

int Array[10];

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

Array[i]=rand()%6; // Заполняет массив числами от 0 до 5

cout<<Array[i]<<endl;

}

return 0;

}

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

Функция “rand()” генерирует псевдослучайные числа. Эта характеристика функции является очень важной при отладке программы, т.е. позволяет доказать, что программа работает должным образом (Так как программа должна возвращать одни и те же значения, при одинаковых входных данных).

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

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

Рандомизация осуществляется при помощи функции “srand()”, которая так же находится в библиотеке <stdlib.h>.

Функция “srand()” получает аргумент типа “unsigned int”, и при каждом запуске “srand()” задаёт начальное число, которое используется функцией “rand()” для генерации случайных чисел.

Пример:

#include <iostream.h>

#include <stdlib.h>

main() {

unsigned int k;

cin>>k;

srand(k);

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

cout<<rand()%6<<endl;

return 0;

}

Для того, чтобы генерировать случайные числа, не вводя каждый раз новое число, используемое как начальное число, можно в качестве аргумента функции “srand()” использовать системное время компьютера.

srand(time(NULL));

Функция “time()” из библиотеки <time.h>, возвращает текущее время в секундах. Это время преобразуется в без знаковое целое число, которое используется как начальное значение в генерации случайных чисел.

#include <iostream.h>

#include <time.h>

#include <stdlib.h>

{

srand(time(NULL));

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

cout<<rand()%6;

return 0;

}

Часть 2.

Лабораторная работа 1

Функции

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

Функции являются основой модульного программи­рования (составления программ из модулей). Существует несколько причин для построения программ с использованием функций.

Во-первых, подход «разделяй и властвуй» делает разработку программ более управляемой. Вторая причина — повторное использование программных кодов,т.е. использование существующих функций как стандартных блоков для создания новых программ. Повторное использование — основной фак­тор развития объектно-ориентированного программирования. При проду­манном присвоении имен функций и корректном их описании программа может быть создана быстрее из стандартизированных функций, соответ­ствующих определенным задачам. Третья причина — желание избежать в программе повторения каких-то фрагментов. Код, оформленный в виде функции, может быть выполнен в разных местах программы простым вы­зовом этой функции.

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

Для использования функции ее надо объявить, определить и конечно вызвать.

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

Синтаксис прототипа:

Тип_функции имя_функции ( [тип параметр1, тип параметр2,…] );

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

Существуют 3 способа объявления функции:

Наши рекомендации