Алгоритмические языки
и программирование.
2 семестр
МГТУ им. Н.Э. Баумана
Факультет Информатика и системы управления
Кафедра Компьютерные системы и сети
Лектор: д.т.н., проф.
Иванова Галина Сергеевна
1
Структура курса
Лекции – Особенности программирования на С++ в среде разработки
Microsoft Visual Studio 2008
Практики (17-19 – Delphi, 20-29 – C++ 2008):
ИУ6-21 – четверг
830-1150;
ИУ6-22 – суббота
ИУ6-23 – понедельник
830-1150;
1200-1525
РК1: динамические структуры данных (9 неделя);
РК2: иерархии классов (14 неделя);
ДЗ1: практики 17-23 с отчетами (8 неделя)
Зачет (кафедральный) по практикам.
Экзамен (результат идет в диплом):
1 – С++;
2 – Сравнение возможностей С++ и Delphi;
3 – Задача (снимается по результатам рейтингов)
2
Литература
1.
2.
3.
4.
5.
Подбельский В.В. Язык С++: Учеб. пособие. – М.: Финансы и
статистика, 2006.
Иванова Г.С., Ничушкина Т.Н., Пугачев Е.К. Объектноориентированное программирование. Учеб. для вузов. – М.: Изд-во
МГТУ им. Н.Э. Баумана, 2007.
Агабеков Л.Е., Иванова Г.С. Программирование на С++. Часть 1.
Средства процедурного программирования. Учебное пособие. –
М.: МГТУ, 1997. – В электронном виде.
Агабеков Л.Е., Иванова Г.С. Программирование на С++. Часть 2.
Средства объектно-ориентированного программирования.
Учебное пособие. – М.: МГТУ, 1996. – В электронном виде.
Иванова Г.С., Ничушкина Т.Н. Консольные приложения С++ в среде
Microsoft Studio 2003 (Visual C++): Методические указания по
выполнению лабораторных работ. – М.: МГТУ им. Н.Э. Баумана,
2008. – 13 с. – В электронном виде.
3
История создания С++
BCPL (1967)
Си - 1972 Денис Ритчи
(1989 Стандарт ANSI,
1999 Новый стандарт)
С++
(начало работы:1979-й год
автор: Бьерн Страуструп)
Standard С++
(1998)
Java
Первоначальное название «С with Classes».
Основное достоинство – наличие
большого количества специальных средств и механизмов,
упрощающих написание сложных системных программ.
Основной недостаток –
незащищенный синтаксис, который часто не позволяет точно
идентифицировать ошибку на
этапе компиляции программы.
C#
4
Глава 1 Скалярные типы
данных. Основные
операторы С++
МГТУ им. Н.Э. Баумана
Факультет Информатика и системы управления
Кафедра Компьютерные системы и сети
Лектор: д.т.н., проф.
Иванова Галина Сергеевна
5
1.1 Алфавит языка. Структура программы
Алфавит языка С++ включает:
1) латинские буквы;
2) арабские цифры: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9;
3) шестнадцатеричные цифры: 0..9, а..f или A..F;
4) специальные символы: + - * / = ; { } и т. д.;
5) служебные слова: do, while, for, if, else и т. д.
В отличие от Паскаля С++ различает строчные и прописные буквы.
6
Структура консольной программы
Консольная программа на С++ включает:
<Команды препроцессора>
[<Объявление типов, переменных и констант>]
[<Объявления (прототипы) функций>]
<Описание функции main()>
[<Описания других функций>]
Нотация:
<...> – означает
некоторую конструкцию С++;
[<...>] – означает, что
присутствие конструкции в операторе не
обязательно
В С++ все программы/подпрограммы называются функциями.
Функция main() – основная программа, всегда имеющая имя main,
принимающая управление от операционной системы и возвращающая его ей. Присутствие этой функции (или функции WinMain() –
для Windows) является обязательным.
Команды препроцессора – команды, выполняемые перед компиляцией программы, могут использоваться для подключения необходимых библиотек.
7
Описание функции
<Тип результата или void> <Имя функции> ([<Список параметров>])
{[ < Объявление локальных переменных и констант >]
<Операторы>
}
Если функция возвращает скалярное значение, то первое слово
описания содержит его тип. Если функция не возвращает значения,
т.е. фактически является процедурой, то указывают void – «пустой»
тип.
Независимо от наличия или отсутствия параметров скобки после
имени функции должны быть указаны обязательно. При отсутствии
параметров в скобках может быть указано void
{...} – операторные скобки, ограничивающие тело функции – аналог
begin ... end Паскаля
8
Сравнение программ, написанных на Паскале и С++
Turbo Delphi (консольный режим):
Program primer;
{$APPTYPE CONSOLE}
Microsoft Visual C++ - Пример Ex1_01:
#include
Uses SysUtils;
Var
Var
A:integer=18;
B:integer=24;
C:integer;
Function Nod(A,B:integer):integer;
Begin
while A<>B do
if A>B then A:=A-B
else B:=B-A;
Nod:=A;
End;
Begin
C:=Nod(A,B);
Writeln(‘Nod=‘, C);
End.
int a=18,
b=24,
c;
Команда
препроцессора
- подключение
библиотек
Объявление
переменных
int nod(int a,int b)
Описание
{
функции
while (a!=b)
if (a>b) a=a-b;
else b=b-a;
return a;
}
int main()
Основная
{
функция
c=nod(a,b);
printf("nod=%dn", c);
return 0;
9
}
1.2 Фундаментальные типы данных
1. Интегральные типы
Имя типа
Размер ,
байт
Интервал
значений
1
-128..127
0..255
short или _int[16] [signed] short
unsigned short
2
-32768..32767
0..65535
[int] или long или [signed] [int]
_int[32]
unsigned [int]
[signed] long
unsigned long
4
-231.. 231-1
0.. 232-1
long long или
_int[64]
8
-263.. 263-1
0.. 264-1
1
false (0), true(1)
char или _int[8]
bool
Подтипы
[signed] char
unsigned char
[signed] long long
Unsigned long long
Для совместимости с С по-прежнему считается: 0 – false; не 0 – true.
10
2. Вещественные типы
Тип
Размер,
байт
Значащих
цифр
Минимальное
положительное
число
Максимальное
положительное
число
float
4
6
1.175494351е-38
3.402823466е38
double
(long
double)
8
15
2.2250738585072014
е-308
1.797693134862318
e308
3. Неопределенный («пустой») тип void
Нельзя объявлять значения типа void, этот тип используется только
при объявлении:
нетипизированных указателей;
функций, не возвращающих значений (процедур).
11
1.3 Объявление переменных и констант
Формат:
[<Изменчивость>] [<Тип>]<Список идентификаторов>[=<Значение>];
где <Изменчивость> – описатель возможности изменения значений:
const – константа,
volatile – независимо меняющаяся переменная,
без указания – обычная переменная
<Тип> – описатель типа: int, char, float, double и т.д.;
<Список идентификаторов> – список имен переменных или констант;
<Значение> – начальное значение переменной или значение
константы.
Примеры:
а) int a, b;
// две целые переменные
б) float c=1.05, d; // инициализированное и неинициализ. значения
в) const unsigned char letter=‘a’; // константа – код буквы «a»
г) const a=15; // целая константа 15 – тип int – по умолчанию !
12
Перечисляемый тип
Используется для объявления совокупности поименованных целых
констант.
Формат:
enum {<Ид>[=<Целое>] [,<Ид>[<>]…]}
<Список переменных>;
Пример:
Имя
переменной
enum {SUN, MON, TUES, FRI=5, SAT} day;
SUN =0, MON = 1, TUES = 2, FRI=5, SAT=6
Константы присваиваются, начиная с нуля или с указанного значения.
13
Объявление типа
Появилось только в С++.
Формат:
typedef <Описание типа> <Имя объявляемого типа>;
Примеры:
Имя
нового типа
1) typedef unsigned int word;
2) typedef enum {false, true} boolean;
Имя
нового типа
14
1.4 Стандартные функции ввода/вывода
1 Форматный ввод /вывод
Ввод:
int scanf(<Форматная строка>,
<Список адресов переменных>);
// возвращает количество значений или EOF(-1)
Вывод:
int printf(<Форматная строка>, <Список выражений>);
где <Форматная строка> - строка, которая помимо символов содержит
спецификации формата вида для выводимых значений:
%[-] [<Целое 1>] [.<Целое 2>] <Формат>
«-» - выравнивание по левой границе,
<Целое 1> - ширина поля вывода;
<Целое 2> - количество цифр дробной части вещественного числа;
<Формат> - определяется специальной литерой.
15
Спецификации формата
d - целое десятичное число;
u - целое десятичное число без знака;
o - целое число в восьмеричной системе счисления;
x - целое число в шестнадцатеричной системе счисления (% 4x - без
гашения незначащих нулей);
f - вещественное число;
e - вещественное число в экспоненциальной форме;
c - символ;
p - указатель (адрес);
s - символьная строка.
Кроме этого, форматная строка может содержать:
n - переход на следующую строку;
n hhh - вставка символа с кодом ASCII hhh (код задается в
шестнадцатеричной системе счисления);
%% - печать знака %.
16
Примеры форматного ввода/вывода
а) i=26;
printf ("%-6d%% %o %xn", i, i, i);
26%321A
б) scanf(”%d
%d”,&a,&b);
Вводимые значения:
1) 24
28
2) 24
28
в) scanf("%d,%d",&a,&b);
Вводимые значения: 24,28
г) scanf("%s",name);
Вводимые значения: Иванов Иван
Результат ввода: name="Иванов"
17
2 Ввод/вывод строк
Ввод:
char* gets(<Строковая переменная>);
// возвращает копию строки или NULL
Вывод:
int puts (<Строковая константа или переменная>);
Примеры:
а) puts("Это строка");
Результат: Это строка
б) gets(st);
Вводимые значения:
Иванов Иван
Результат:
st ="Иванов Иван"
18
3 Ввод/вывод символов
Ввод символа:
int getchar(); // возвращает символ или EOF
Вывод символа:
int putchar(<Символьная переменная или константа>);
Примеры:
а) ch=getchar( );
б) putchar(’t’);
19
1.5 Операции
Арифметические:
+ – сложение;
- – вычитание;
* – умножение;
/ – деление – результат – вещественное, если хотя бы одно из
чисел – вещественное, результат – целое, если делимое и делитель –
целые,
% - остаток от деления целых чисел.
Логические: ! (не), && (и), || (или).
Логические поразрядные:
- (не), & (и), | (или), ^ (исключающее или).
Отношения:
<, >, <=, >=, = = (равно), ! = (неравно).
20
Операции (2)
Сдвиги:
<идентификатор> >> <идентификатор> - сдвиг вправо,
<идентификатор> << <идентификатор> - сдвиг влево.
Порядковые:
++<идентификатор>, <идентификатор>++
(следующее);
- -<идентификатор>, <идентификатор> - - (предыдущее).
Присваивания:
= +=
-=
*=
/=
%=
&=
^=
|=
<<=
>>=
Условная:
<Выражение1>?<Выражение2>:<Выражение3>
21
Приоритет операций
1. ( ) [ ] -> :: .
2. ! (не) + - ++ -- &(адрес) *(указатель) sizeof new delete
3. .* ->*
4. * / %
5. + - (бинарные)
6. << >>
7. < <= > >=
8. = = ! =
9. &(поразрядное и)
10. ^(исключающее или)
11. | (поразрядное или)
12. &&
13. ||
14. ?=
15. = *= /= %= += -= &= ^= |= <<= >>=
16. ,
22
1.6 Оператор «Выражение»
Формат:
<Выражение1>[,<Выражение2>,...[,<Выражение n>]...]
Примеры:
a) int a=10, b=3; float ret; ret=a/b;
b=1, c=2
б) c=1; b=c++;
в) c=1;
sum=++c;
ret=3
c=2, sum=2
г) c=a<<4;
эквивалентно с=a*16;
д) a+=b;
эквивалентно a=a+b;
е) a=b=5;
эквивалентно b=5; a=b;
ж) с=(a=5, b=a*a);
эквивалентно a=5; b=a*a; c=b;
з) a=(b=s/k)+n;
эквивалентно b=s/k; a=b+n;
и) c=(a>b)?a:b;
если a>b, то с=a, иначе с=b
23
1.7 Блок операторов
Блок операторов используется в конструкциях ветвления,
выбора и циклов, предусматривающих один оператор.
Формат:
{ <Оператор>;… <Оператор>;}
Пример:
{
f=a+b;
a+=10;
}
Точка с запятой в
отличие от Паскаля
является частью
оператора, а потому
не может опускаться
перед фигурной
скобкой.
24
1.8 Оператор условной передачи управления
if (<Выражение>) <Оператор;> [ else <Оператор;>]
Примеры:
а) if (!b)
puts("с - не определено"); // если b=0, то – ошибка,
else {c=a/b; printf("c=%dn", c);} // иначе - выводится с.
б) if ((c=a+b)!=5) c+=b;
else c=a;
в) if ((ch=getchar())==′q′)
// если в ch введено q,
puts ("Программа завершена."); // то ...
else puts ("Продолжаем работу...");
// иначе ...
г) ch=′a′;
if ((oldch=ch, ch=′b′)==′a′)puts("Это символ ′a′n");
else puts("Это символ ′b′n");
25
1.9 Оператор выбора
switch (<выражение>)
{
case <элемент>: <операторы;>
case <элемент>: <операторы;>
...
[ default : <операторы;>]
}
Пример:
switch
{ case
case
case
case
case
case
case
}
(n_day)
1:
2:
3:
4:
5: puts("Go work!"); break;
6: printf("%s","Clean the yard and");
7: puts("relax!");
26
1.10 Операторы циклов
1. Оператор цикла while
while (<Выражение>) <Оператор>
Пример Ex1_02. Вычислить при x > 1 сумму ряда S=1+1/x1/x2+1/x3-... с точностью .
#include
#include
void main(int argc, char* argv[])
{ float s, r,x,eps;
puts("Input x, eps:");
scanf("%f %f", &x, &eps);
if (x<=1) puts("Error.");
else { s=1;
r=1/x;
while (fabs(r)>eps){ s+=r; r=-r/x; }
printf("Result= %f.n", s);
}
}
27
2. Оператор цикла for
for (<Выражение1>;<Выражение2>;<Выражение3>)<Оператор>;
Эквивалентно:
<Выражение1>
while (<Выражение2>)
{<Оператор>;
<Выражение3>;
}
Пример Ex1_03. Вычислить сумму первых десяти натуральных чисел.
#include
int main(int argc, char* argv[])
{ int i,s;
for (i=1,s=0;i<=10;i++) s+=i;
printf("Sum=%dn",s);
return 0;
}
28
3. Оператор цикла do ... while
do <Оператор > while (<Выражение>) ;
Пример. Игнорировать ввод значения, выходящего за
пределы заданного интервала.
do {
printf("Введите значение от %d до % d : ",low, high);
scanf(" %d ", &a);
}
while (a
29
1.11 Неструктурные операторы передачи
управления
1. Оператор безусловного перехода goto
goto <Метка перехода>;
Пример:
again: x=y+a;
...
goto again;
30
2. Оператор досрочного завершения break
break;
Пример Ex1_04. Суммирование до 10 чисел
вводимой последовательности. При вводе
отрицательного числа работа программы
завершается.
#include
void main()
{ int s=0, i, k;
puts("Input up to 10 numbers.");
for (i=1; i<11; i++)
{
scanf("%d",&k);
if (k<0) break;
s+=k;
}
printf("Result = %d.n",s);
}
break
31
3. Оператор продолжения continue
continue;
Пример Ex1_05. Программа суммирует 10
целых положительных чисел.
#include
void main()
{ int s=0,i=1,k;
puts("Input 10 numbers.");
while(i<11)
{ scanf("%d",&k);
if (k<0) { puts("Error.");
continue;
}
s+=k; i++;
}
printf("Result = %d.n",s);
}
continue
32
Пример Ex1_06. Вывод таблицы кодов
#include
int main(int argc, char* argv[ ])
{
int i,i1,in,col;
puts("Input first and last values");
scanf("%d %d",&i1,&in);
puts("Input colon number");
scanf("%d",&col);
for(i=i1;i<=in;i++)
if (i
else printf("%c - %3d.",i,i);
return 0;
}
-32; !–33; "-34; #-35;
$-36; %-37; &-38; ′ -39.
33