пʼятниця, 29 вересня 2017 р.

11 клас С++ Лекція 1

C  + +           Л Е К Ц І Я   1.1
Программа печати сообщения “Hello World!” имеет вид:

#include <stdio.h>
void main(void)
{
 printf("Hello World!\n");
}

Для использования функций ввода-вывода следует подключить библиотеку стандартного ввода-вывода (STanDart Input-Output). Библиотека подключается ключевым словом include, перед которым ставится символ #.
Строки в языке Си выделяются двойными кавычками (в Паскале – одинарными). Символ перевода курсора на новую строку имеет вид ‘\n’. При помощи функции printf в программе выводится строка "Hello World!", после чего производится перевод курсора на новую строку.
После компиляции программы на языке Си операционная система вызывает функцию main. Слово main являет ключевым – оно является именем функции, которая вызывается операционной системой при старте программы. Функция main обязана присутствовать в любой программе Си, так как она является точкой входа в программу.
Открывающаяся и закрывающаяся скобки { … } в Си являются аналогом begin .. end в Паскале.

ПЕРЕМЕННЫЕ И ИХ ОБЪЯВЛЕНИЯ

Переменные представляют собой область памяти для хранения данных. Имя переменных называют идентификатором.

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

Объявление переменных происходит в операторе описания, состоящем из спецификации типа и списка имён переменных, разделённых запятой. В конце оператора должна стоять точка с запятой.
Например, объявить две целочисленные переменные x, y и одну символьную c можно следующим образом:
int x,y;
char c;

ФОРМАТ ВВОДА-ВЫВОДА. ВЫЧИСЛЕНИЕ СУММЫ ДВУХ ЧИСЕЛ

Для форматированного ввода-вывода данных пользуются функциями scanf и printf. Первый аргумент функций содержит формат ввода-вывода. Далее следуют вводимые (выводимые) переменные. Следующая таблица представляет формат ввода-вывода элементарных типов данных в Си:

описание типа
тип
формат
целочисленный, 4 байта
int
%d
целочисленный, 8 байт
__int64
%I64d
целочисленный, 8 байт
long long
%lld
действительный, 4 байта
float
%f
действительный, 8 байт
double
%lf
символьный, 1 байт
char
%c
строка, массив символов
char[], строка
%s

Оператор присваивания в языке Си имеет вид знака равенства ‘=’.
Операторы в языке Си разделяются знаком ‘;’.
Комментарии в языке Си выделяются символами /* … */.
Комментарии до конца строки следуют после символов //.

Пример 1. Инициализируем переменные i (целое), j (вещественное), c (символьное) соответственно значениями 4, 5,4, ‘A’ и выведем их на экран. В дальнейшем операции ввода-вывода будем комментировать, указывая вводимые и выводимые значения.

#include <stdio.h>
int i = 4;
double j = 5.4;
char c = 'A';
void main(void)
{
  printf("%d %lf %c\n", i, j, c);  // 4 5.400000 A
}

Символьным переменным можно присваивать не только символы, но и значения от 0 до 255. В таком случае переменная будет принимать значение того символа, ASCII код которого ей присвоен. Значения символьных переменных можно выводить как символы (используя формат вывода %c) или как числа – ASCII коды символов (используя формат вывода %d).
Напоминание! Сокращение ASCII расшифровывается как American Standart Code for Information Interchange.

Пример 2. Присвоим символьной переменной с значение 65 и выведем ее, используя форматы %c и %d. Напомним, что ASCII код символа ‘A’ равен 65.

#include <stdio.h>
char c = 65;
void main(void)
{
  printf("%c %d\n", c, c);  // A 65
}

Упражнение 1. Напишите программу, которая выведет на экран строку из четырех символов, ASCII коды которых соответственно равны 3, 4, 5 и 6.
#include <stdio.h>
char c1 = 3;c2=4;c3=5;c4=6;
void main(void)
{
  printf("%c %c %c %c\n", c1, c2, c3,c4); 
}

Пример 3. Рассмотрим программу, которая вводит два целочисленных числа a и b, вычисляет их сумму в переменной res и выводит на печать пример в формате
«слагаемое + слагаемое = сумма»
В качестве второго аргумента функции scanf следует передавать адреса переменных. Адрес переменной x обозначается &x.

#include <stdio.h>
int a, b, res;
void main(void)
{
  scanf("%d %d",&a,&b);                    // a = 3, b = 5
  res = a + b;
  printf("%d + %d = %d\n", a, b, res);     // 3 + 5 = 8
}

Операции ввода-вывода можно также выполнять при помощи потоковых бесформатных функций cin и cout библиотеки <iostream.h> (тільки в C++). Но они работают значительно медленнее, чем prinf и scanf (прийшло з мови С). Поэтому для выполнения операций ввода-вывода рекомендуется пользоваться библиотекой <stdio.h>.

Пример. Перепишем программу из примера 2.3.3. вычисления суммы двух чисел с использованием функций cin и cout:

#include <iostream.h>
int a, b, res;
void main(void)
{
  cin >> a >> b;          // a = 3, b = 5
  res = a + b;
  cout << res << endl;    // 8
}


Упражнение 2. Напишите программу, которая по заданным двум действительным числам a и b находит и выводит значение выражения a2 + b2.
#include <stdio.h>
     #include <math.h>
int a, b, res;
void main(void)
{
  scanf("%d %d",&a,&b);                   
  res = a*a + pow (b,2);
  printf("%lf ^2 + %lf ^2 = %d\n", a, b, res);    
}

2.6. БИТЫ. БАЙТЫ. СЛОВА
Битом называется единица информации. В одну ячейку памяти размером 1 бит можно занести два значения: 0  или 1.
Байтом называется ячейка памяти, состоящая из 8 битов.
Словом называется ячейка памяти, состоящая из двух байт или 16 битов.
Двойным словом называется ячейка памяти, состоящая из четырех байт или 32 битов.
 В языках программирования различают, как правило, знаковые и беззнаковые типы данных. Беззнаковые типы данных хранят только неотрицательные значения, знаковые могут содержать как положительные, так и отрицательные числа.
 Беззнаковые типы данных. В трех битах можно хранить значения от 0 до 7:
 содержимое 3 битов
значение
000
0
001
1
010
2
011
3
100
4
101
5
110
6
111
7

В n битах можно хранить числа от 0 до 2n – 1. Например, в беззнаковом байте можно записать любое число от 0 до 255, а в беззнаковом двойном слове – число от 0 до 232 – 1 = 4294967295.
 При выводе десятичных значений переменных беззнаковых типов вместо %d (decimal) пользуются %u (unsigned).
Знаковые типы данных. Старший бит знакового типа данных отвечает за знак числа. Число является положительным, если бит равен 0 и отрицательным, если бит равен 1. Например, в трех битах можно хранить знаковые значения от -4 до 3:
 содержимое 3 битов
значение
011
3
010
2
001
1
000
0
111
-1
110
-2
101
-3
100
-4
 В n битах можно хранить знаковые числа от -2n-1 до 2n-1 – 1. Например, в байте можно записать любое число от -128 до 127, в двойном слове – число от -231 = -2147483648 до 231 – 1 = 2147483647.
Целочисленный тип int в языке Си четырехбайтовый, поэтому переменные типа int могут хранить значения в промежутке [-231; 231 – 1] = [-2147483648; 2147483647].
Целочисленный тип long long в языке Си восьмибайтовый, поэтому переменные типа long long могут хранить значения в промежутке [-263; 263 – 1] = [-9223372036854775808; 9223372036854775807].
Пример 4. Если к максимальному целочисленному значению прибавить 1, то получится наименьшее целочисленное значение. Аналогично если из наименьшего значения типа int вычесть 1, то получится  наибольшее значение типа int.
#include <stdio.h>
int i = 2147483647;
void main(void)
{
  printf("%d %d\n", i, i + 1);  // 2147483647 -2147483648
  i++;
  printf("%d %d\n", i, i - 1);  // -2147483648 2147483647
}
 Константы INT_MIN и INT_MAX, объявленные в библиотеке <limits.h>, соостветственно равны наименьшему и наибольшему значению, которое может принимать переменная типа int.
Упражнение 3. Вывести значения переменных INT_MIN, INT_MAX и их сумму.
#include <stdio.h>
#include <limits.h>
int i = INT_MIN, j = INT_MAX, sum;
void main(void)
{
  printf("Min Value:%d \nMax Value: %d\n", i, j);
 // Min Value: -2147483648
  // Max Value: 2147483647
  sum = i + j;
   printf("Summa: %d \n", sum);
}
Пример. Выведем наибольшее и наименьшее значение восьмибайтового целочисленного знакового типа  long long. Для того чтобы число имело тип long long, а не int, после него следует писать суффикс LL. Например, значение (1LL << 63) – 1 будет иметь тип long long и равняться 9223372036854775807 =2^63-1 , а (1 << 63) – 1 будет типа int и равняться -1 (значение 1 << 63 при вычислении на 32 битах равно нулю, потому что слищком большое и не поместится в 32 бита).
#include <stdio.h>
long long i;
int j;
void main(void)
{
  i = (1LL << 63) - 1;
    j = (1 << 63) - 1;
  printf("max long long i =: %lld\n  min long long: i + 1 = %lld\n",i,i+1);
  // max long long: i = 9223372036854775807 = 2 ^ 63 - 1
  // i + 1 = -9223372036854775808 = -2 ^ 63
  printf("int j =: %d\n", j);
  // int j = -1
}
Пример. Выведем наибольшее значение беззнаковых 32 и 64 – битовых целочисленных типов (потому что 0 - наименшее беззнаковое число, а менше его -1 - и берется наибольшее беззнаковое число соот ветственного типа).
#include <stdio.h>
unsigned int i = -1;
unsigned long long j = -1;
void main(void)
{
  printf("%u %llu\n",i,j);
  // 4294967295 = 2 ^ 32 - 1, 18446744073709551615 = 2 ^ 64 - 1
}
Пример. Выведем восьмеричное, десятичное и шестнадцатиричное представление числа 255. Шестнадцатиричное представление чисел можно выводить как прописными (%x), так и заглавными (%X) буквами.
#include <stdio.h>
int i = 255;
void main(void)
{
  printf("%o %d %x %X\n",i,i,i,i);
  // 377 255 ff FF

}

Двовимірні масиви

Двовимірні масиви

Двовимірний масив (матриця) – це вектор векторів, тобто кожен елемент вектора є вектором. Всі елементи матриці є одного типу.

Розмірність матриці 3´4 означає, що матриця містить 3 рядки і 4 стовпці.

Ім'я одержує вся матриця, наприклад А. Елементи матриці описують двома індексами. Елемент A[i,j]  міститься на перетині  i-рядка і  j-стовпця, тобто перший індекс визначає рядок, а другий стовпець. (Наприклад, елемент A[2, 4j] міститься на перетині 2-ого рядка і 4-ого стовпця.)
Елементи, для яких i=j, називаються діагональними елементами матриці.

Опис матриці з дійсними елементами, яка містить 4 рядки та 7 стовпців:
I спосіб: var А : array [1 . . 4, 1 . . 7] of real;
II спосіб: type mas= array [1 . . 4, 1 . . 7] of real;
                var А:mas;

Література : Руденко, Речич, Потієнко “Інформатика. 9 клас” ст. 184-186.

Задача

Ввести матрицю розмірністю 5´7 з цілими елементами, знайти суму елементів матриці, всі додатні елементи матриці замінити на 1 і вивести змінену матрицю.

Program pr2;
var А : array [1 . . 4, 1 . . 7] of real;
       I,j:integer; s:real;
Begin

for i:=1 to 4 do
  for j:=1 to 7 do
     begin
         read (a[i,j]);
         s:=s+ a[i,j];
    end;
   write(s);

for i:=1 to 4 do
  for j:=1 to 7 do
      if a[i,j]>0 then a[i,j]:=1;

for i:=1 to 4 do
  begin
       for j:=1 to 7 do   write (a[i,j]);
       writeln;
  end
end.

Д/з №1
1. Ввести матрицю розмірністю 4´3 з цілими елементами, знайти суму і кількість всіх додатних елементів матриці.
2. Знайти суму та кількість елементів матриці А розміру n´m, які належать проміжку [c,d].
3. Ввести матрицю розмірністю 4´3 з цілими елементами, знайти максимальний елемент матриці.

Д/з №2
1.    Ввести матрицю A розмірністю n´m з дійсними елементами. Всі додатні елементи замінити на максимальний елемент цієї матриці.
2.    Ввести матрицю розмірністю n´m з цілими елементами. Просумувати всі додатні елементи матриці в кожному рядку окремо. Вивести у вигляді: номер рядка - сума.
3.    Ввести матрицю А розмірністю 4´7 з цілими елементами.  Порахувати кількість рядків, в яких всі елементи від'ємні.


вівторок, 12 вересня 2017 р.

Одновимірні масиви

Одновимірні масиви

         Масив — це структурований тип даних, який складається з фіксованого числа елементів, що мають однаковий  тип.

Загальний вигляд опису змінних типу масив можна представити у вигляді:
Var <змінна>: array [<тип індексів >] of <базовий тип >.

Приклад:  var V: array [1..20] of Real;   -масив містить 20 дійсних елементів.
Доступ до елементів масиву V здійснюється через їхні індекси: v[1], v[2], v[5].

Розмірність пам’яті, яка виділяється для представлення масиву, залежить від кількості та типу його елементів. Всі елементи масиву розміщуються в оперативній пам’яті суцільно один за одним.

Приклад: Ввести масив з n дійсних чисел (наприклад, n=10). Знайти суму додатніх елементів масиву. Всі від’ємні елементи масиву замінити на 1. Вивести новоутворений масив.
Program  vector;
Const n=10;
Var  a: array [1..n] of real; i: integer, S:real;
begin
for i:=1 to n do
    readln (a[i]);

s:=0;
for i:=1 to n do
     if  a[i]>0 then s:=s+ a[i];
write(s);

for i:=1 to n do
     if  a[i]<0 then  a[i]:=1;

for i:=1 to n do
     writeln(a[i]);

{Деякі оператори циклу можна об’єднати}
end.


Д/з: 1
1.     Ввести масив з 10 дійсних елементів, знайти мінімальний елемент масиву та його індекс.
2.     Ввести масив з n цілих елементів, знайти кількість елементів рівних числу k.
3.     Ввести масив з n дійсних елементів, всі елементи, що належать проміжку [-10;5] замінити на 1. Вивести новоутворений вектор.



Д/з: 2
1.     Поміняти місцями максимальний і мінімальний елементи вектора.
2.     Ввести масив з n дійсних елементів, якщо всі елементи вектора додатні, то обчислити суму квадратів елементів вектора, інакше максимальний елемент вектора.
3.     Сформувати вектор, елементами якого є числа Фібоначчі: 1,1,2,3,5,8,13,… (кожне наступне є сумою двох попередніх)



пʼятниця, 8 вересня 2017 р.

Цикли

Цикли

У мові Pascal розрізняють три оператори циклу:
              1) з передумовою;
              2) з післяумовою;
              3) з параметром.
У більшості задач потрібно здійснювати багаторазове виконання однієї дії. Частина коду, що багаторазово повторюється, називається циклом.
В циклах відбувається перевірка деякої умови і в залежності від результату цієї перевірки відбувається або вихід з циклу, або повторення виконання тіла циклу. Якщо перевірка умови відбувається перед виконанням блоку операторів, то такий цикл називається циклом з передумовою (цикл "while"), а якщо перевірка проводиться після виконання тіла циклу, то це цикл з післяумовою (цикл "repeat").
Причому тіло циклу з післяумовою завжди виконується хоча б один раз, а тіло циклу з передумовою може жодного разу не виконатися.
1.       Цикл з передумовою    While <логічний вираз> do <оператор>;
Оператор після do буде виконуватися доки логічний вираз приймає істинне значення (True). Його істинність перевіряється щоразу перед черговим повторенням оператора циклу, який буде виконуватися доти, поки логічне вираз істинний. Як тільки логічний вираз приймає значення неправда (False), здійснюється перехід до оператора, наступного за while.
Істинність виразу перевіряється до виконання оператора, тому якщо логічний вираз із самого початку буде мати значення неправда (False), то оператор не виконається жодного разу. Варто пам'ятати, що після ключового слова do дозволяється використовувати тільки один оператор. Якщо потрібно виконати кілька операторів, то використовується складений оператор (begin ….. end;).
Приклад:
 X:=10;
While x>0 do x:=x-1;

            2.   Оператор циклу з післяумовою відрізняється від попередньою тим, що:
1)умова перевіряється після одного виконання операторів тіла циклу (таким чином гарантується хоча б одне виконання тіла циклу);
2) критерій припинення циклу полягає в тому, що значення логічного виразу приймає значення істинне; а якщо значення хибне, то даний цикл повторюється. Тіло циклу повторюється до тих пір, поки умова не стане істинна.
            Repeat
                        <серія операторів>
            Until   <логічний вираз>;
Приклад:
 X:=10;
Repeat   x:=x-1; write(‘x=’,x) until x=0;

3. Оператор циклу з параметром використовується в тих випадках, коли число повторень циклу може бути визначене перед початком циклу. Крім цього цикли з параметром дозволяють задавати автоматично зміну значень деякої змінної і використовувати це значення в тілі циклу.
For <змінна>:=<початкове значення> to <кінцеве значення> do <оператор>;
For <змінна>:=<кінцеве значення> downto <початкове значення> do <оператор >;
Діапазон задає зміну значень змінної і кількість повторень тіла циклу. Діапазон–це відрізок з одного із впорядкованих типів. Якщо між виразами стоїть службове слово (to), то значення змінної буде зростати в процесі роботи; при (downto) – спадати. <змінну> називаються лічильником або параметром циклу.
Приклад:
For x:=10 downto 1 do  write(‘x=’,x);
При використанні даного оператора слід пам’ятати:
1)      параметр циклу повинен мати впорядкований тип;
2)      початкове і кінцеве значення діапазону повинні мати такий тип, як і параметр циклу ;
3)  після закінчення циклу значення параметру циклу рівне кінцевому виразу діапазону.



Приклади використання циклів
Приклад 1. Обчислити суму
WHILE
REPEAT
FOR
Фрагмент програми обчислення суми:
i:=1;S:=0;
while i<=10 do
  begin
    S:=S+i;
    i:=i+1;
  end;


i:=1;S:=0;
repeat
    S:=S+i;
    i:=i+1;
until i>10;



S:=0;
For i:=1 to 10 do
  S:=S+i;


Приклад 2.  Протабулювати функцію y=sin x, де х є [0,2П] з кроком П/2.

x:=0;
while x<=2*pi do
  begin
    y:=sin(x);
    writeln(y);
    x:=x+pi/2;
  end;
x:=0;
repeat
    y:=sin(x);
    writeln(y);
    x:=x+pi/2;
until x>2*pi


Приклад 3. Ввести 8 цілих чисел і знайти їх суму.

s:=0;
i:=1;
while i<=8 do
  begin
    read(a);
    s:= s+a;
    i := i+1;
  end;
   s:=0;
 i:=1;
 repeat
    read(a);
    s:= s+a;
    i := i+1;
 until i>8;

s:=0;
for i:=1 to 8 do 
  begin
    read(a);
    s:= s+a;
  end;


Д.з.  Виконати задачі трьома операторами циклу.

1. Ввести 10 дійсних чисел. Знайти суму і кількість тих, що належать проміжку [-10,10].
2. Ввести 8 цілих чисел. Знайти максимальне число.