Слайд 1Алгоритмические языки и программирование.
2 семестр
МГТУ им. Н.Э. Баумана
Факультет
Информатика и системы управления
Кафедра Компьютерные системы и сети
Лектор: д.т.н., проф.
Иванова Галина Сергеевна
Слайд 2Структура курса
Лекции – Особенности программирования на С++ в среде разработки
Microsoft Visual Studio 2008
Практики (17-19 – Delphi, 20-29 – C++
2008):
ИУ6-21 – четверг 830-1150;
ИУ6-22 – суббота 830-1150;
ИУ6-23 – понедельник 1200-1525
РК1: динамические структуры данных (9 неделя);
РК2: иерархии классов (14 неделя);
ДЗ1: практики 17-23 с отчетами (8 неделя)
Зачет (кафедральный) по практикам.
Экзамен (результат идет в диплом):
1 – С++;
2 – Сравнение возможностей С++ и Delphi;
3 – Задача (снимается по результатам рейтингов)
Слайд 3Литература
Подбельский В.В. Язык С++: Учеб. пособие. – М.: Финансы и
статистика, 2006.
Иванова Г.С., Ничушкина Т.Н., Пугачев Е.К. Объектно-ориентированное программирование.
Учеб. для вузов. – М.: Изд-во МГТУ им. Н.Э. Баумана, 2007.
Агабеков Л.Е., Иванова Г.С. Программирование на С++. Часть 1. Средства процедурного программирования. Учебное пособие. – М.: МГТУ, 1997. – В электронном виде.
Агабеков Л.Е., Иванова Г.С. Программирование на С++. Часть 2. Средства объектно-ориентированного программирования. Учебное пособие. – М.: МГТУ, 1996. – В электронном виде.
Иванова Г.С., Ничушкина Т.Н. Консольные приложения С++ в среде Microsoft Studio 2003 (Visual C++): Методические указания по выполнению лабораторных работ. – М.: МГТУ им. Н.Э. Баумана, 2008. – 13 с. – В электронном виде.
Слайд 4История создания С++
Первоначальное название -
«С with Classes».
Основное достоинство – наличие большого количества специаль-ных средств
и механизмов, упрощающих написание слож-ных системных программ.
Основной недостаток – незащищенный синтаксис, кото-рый часто не позволяет точно идентифицировать ошибку на этапе компиляции программы.
Си - 1972 Денис Ритчи
(1989 Стандарт ANSI,
1999 Новый стандарт)
С++
(начало работы:1979-й год
автор: Бьерн Страуструп)
Standard С++
(1998)
BCPL (1967)
Java
C#
Слайд 5МГТУ им. Н.Э. Баумана
Факультет Информатика и системы управления
Кафедра Компьютерные системы
и сети
Лектор: д.т.н., проф.
Иванова Галина Сергеевна
Глава 1
Скалярные типы данных. Основные операторы С++
Слайд 61.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 и т. д.
В отличие от Паскаля С++ различает строчные и прописные буквы.
Слайд 7
В С++ все программы/подпрограммы называются функциями.
Функция main() – основная
программа, всегда имеющая имя main, принимающая управление от операционной системы
и возвращаю-щая его ей. Присутствие этой функции (или функции WinMain() – для Windows) является обязательным.
Команды препроцессора – команды, выполняемые перед компиля-цией программы, могут использоваться для подключения необхо-димых библиотек.
<Команды препроцессора>
[<Объявление типов, переменных и констант>]
[<Объявления (прототипы) функций>]
<Описание функции main()>
[<Описания других функций>]
Структура консольной программы
Консольная программа на С++ включает:
Нотация:
<...> – означает некоторую конструк-цию С++;
[<...>] – означает, что присутствие конструк-ции в операторе не обязательно
Слайд 8Описание функции
Если функция возвращает скалярное значение, то первое слово описания
содержит его тип. Если функция не возвращает значения, т.е. фактически
является процедурой, то указывают void – «пустой» тип.
Независимо от наличия или отсутствия параметров скобки после имени функции должны быть указаны обязательно. При отсутствии параметров в скобках может быть указано void
{...} – операторные скобки, ограничивающие тело функции – аналог begin ... end Паскаля
<Тип результата или void> <Имя функции> ([<Список параметров>])
{[ < Объявление локальных переменных и констант >]
<Операторы>
}
Слайд 9Сравнение программ, написанных на Паскале и С++
Turbo Delphi (консольный режим):
Program
primer;
{$APPTYPE CONSOLE}
Uses SysUtils;
Var A:integer=18;
B:integer=24;
Var
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.
Microsoft Visual C++ - Пример Ex1_01:
#include
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=%d\n", c);
return 0;
}
Команда
препроцессора - подключение библиотек
Объявление
переменных
Основная
функция
Описание
функции
Слайд 101.2 Фундаментальные типы данных
1. Интегральные типы
Для совместимости с
С по-прежнему считается: 0 – false; не 0 – true.
Слайд 11 2. Вещественные типы
3. Неопределенный («пустой») тип void
Нельзя объявлять
значения типа void, этот тип используется только при объявлении:
нетипизированных
указателей;
функций, не возвращающих значений (процедур).
Слайд 121.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 – по умолчанию !
Слайд 13Перечисляемый тип
Используется для объявления совокупности поименованных целых констант.
Формат:
enum {[=] [,[]…]}
;
Пример:
enum {SUN, MON, TUES, FRI=5, SAT} day;
Константы присваиваются, начиная
с нуля или с указанного значения.
Имя
переменной
SUN =0, MON = 1, TUES = 2, FRI=5, SAT=6
Слайд 14Объявление типа
Появилось только в С++.
Формат:
typedef ;
Примеры:
1)
typedef unsigned int word;
2) typedef enum {false, true} boolean;
Имя
нового типа
Имя
нового типа
Слайд 151.4 Стандартные функции ввода/вывода
1 Форматный ввод /вывод
Ввод:
int scanf(,
<Список адресов переменных>);
// возвращает количество значений или EOF(-1)
Вывод:
int printf(<Форматная строка>, <Список выражений>);
где <Форматная строка> - строка, которая помимо символов содержит спецификации формата вида для выводимых значений:
%[-] [<Целое 1>] [.<Целое 2>] <Формат>
«-» - выравнивание по левой границе,
<Целое 1> - ширина поля вывода;
<Целое 2> - количество цифр дробной части вещественного числа;
<Формат> - определяется специальной литерой.
Слайд 16Спецификации формата
d - целое десятичное число;
u - целое десятичное число
без знака;
o - целое число в восьмеричной системе счисления;
x -
целое число в шестнадцатеричной системе счисления (% 4x - без гашения незначащих нулей);
f - вещественное число;
e - вещественное число в экспоненциальной форме;
c - символ;
p - указатель (адрес);
s - символьная строка.
Кроме этого, форматная строка может содержать:
\n - переход на следующую строку;
\n hhh - вставка символа с кодом ASCII hhh (код задается в шестнадцатеричной системе счисления);
%% - печать знака %.
Слайд 17Примеры форматного ввода/вывода
а) i=26;
printf ("%-6d∪∪∪%%∪ %o∪ %x\n", i,
i, i);
б) scanf(”%d %d”,&a,&b);
Вводимые
значения: 1) 24 28 2) 24↵
28
в) scanf("%d,%d",&a,&b);
Вводимые значения: 24,28
г) scanf("%s",name);
Вводимые значения: Иванов Иван
Результат ввода: name="Иванов"
26∪∪∪∪∪∪∪%∪32∪1A ↵
Слайд 182 Ввод/вывод строк
Ввод:
char* gets();
//
возвращает копию строки или NULL
Вывод:
int puts (<Строковая константа или переменная>);
Примеры:
а) puts("Это строка");
Результат: Это строка↵
б) gets(st);
Вводимые значения: Иванов Иван↵
Результат: st ="Иванов Иван"
Слайд 193 Ввод/вывод символов
Ввод символа:
int getchar(); // возвращает символ или
EOF
Вывод символа:
int putchar();
Примеры:
а) ch=getchar( );
б) putchar(’t’);
Слайд 201.5 Операции
Арифметические:
+ – сложение;
-
– вычитание;
* – умножение;
/ – деление – результат – вещественное, если хотя бы одно из чисел – вещественное, результат – целое, если делимое и делитель – целые,
% - остаток от деления целых чисел.
Логические: ! (не), && (и), || (или).
Логические поразрядные:
- (не), & (и), | (или), ^ (исключающее или).
Отношения:
<, >, <=, >=, = = (равно), ! = (неравно).
Слайд 21Операции (2)
Сдвиги:
>>
- сдвиг вправо,
- сдвиг влево.
Порядковые:
++<идентификатор>, <идентификатор>++ (следующее);
- -<идентификатор>, <идентификатор> - - (предыдущее).
Присваивания:
= += -= *= /= %= &= ^= |= <<= >>=
Условная:
<Выражение1>?<Выражение2>:<Выражение3>
Слайд 22Приоритет операций
1. ( ) [ ] ->
:: .
2. ! (не) + - ++ --
&(адрес) *(указатель) sizeof new delete
3. .* ->*
4. * / %
5. + - (бинарные)
6. << >>
7. < <= > >=
8. = = ! =
9. &(поразрядное и)
10. ^(исключающее или)
11. | (поразрядное или)
12. &&
13. ||
14. ?=
15. = *= /= %= += -= &= ^= |= <<= >>=
16. ,
Слайд 231.6 Оператор «Выражение»
Формат:
[,,...[,]...]
Примеры:
a) int a=10, b=3; float ret; ret=a/b;
б) c=1; b=c++;
в) c=1;
sum=++c;
г) c=a<<4;
д) a+=b;
е) a=b=5;
ж) с=(a=5, b=a*a);
з) a=(b=s/k)+n;
и) c=(a>b)?a:b;
ret=3
b=1, c=2
c=2, sum=2
эквивалентно с=a*16;
эквивалентно a=a+b;
эквивалентно b=5; a=b;
эквивалентно a=5; b=a*a; c=b;
эквивалентно b=s/k; a=b+n;
если a>b, то с=a, иначе с=b
Слайд 241.7 Блок операторов
Блок операторов используется в конструкциях ветвления, выбора и
циклов, предусматривающих один оператор.
Формат:
{ ;… ;}
Пример:
{
f=a+b;
a+=10;
}
Точка с запятой в отличие от Паскаля является частью оператора, а потому не может опускаться перед фигурной скобкой.
Слайд 25if () [ else ]
Примеры:
а) if (!b)
puts("с - не определено"); // если b=0, то –
ошибка,
else {c=a/b; printf("c=%d\n", 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");
1.8 Оператор условной передачи управления
Слайд 261.9 Оператор выбора
switch ()
{
case :
case <элемент>: <операторы;>
. . .
[ default : <операторы;>]
}
Пример:
switch (n_day)
{ case 1:
case 2:
case 3:
case 4:
case 5: puts("Go work!"); break;
case 6: printf("%s","Clean the yard and");
case 7: puts("relax!");
}
Слайд 271.10 Операторы циклов
1. Оператор цикла while
while ()
Пример Ex1_02.
Вычислить при x > 1 сумму ряда S=1+1/x-1/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);
}
}
Слайд 282. Оператор цикла for
for (;;);
Эквивалентно:
while ()
{;
;
}
Пример Ex1_03. Вычислить сумму первых
десяти натуральных чисел.
#include
int main(int argc, char* argv[])
{ int i,s;
for (i=1,s=0;i<=10;i++) s+=i;
printf("Sum=%d\n",s);
return 0;
}
Слайд 293. Оператор цикла do ... while
do while ()
;
Пример. Игнорировать ввод значения, выходящего за пределы заданного интервала.
do
{
printf("Введите значение от %d до % d : ",low, high);
scanf(" %d ", &a);
}
while (ahigh);
Слайд 301.11 Неструктурные операторы передачи управления
1. Оператор безусловного перехода goto
goto
;
Пример:
again: x=y+a;
...
goto again;
Слайд 312. Оператор досрочного завершения 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
Слайд 323. Оператор продолжения 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
Слайд 33Пример 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
printf("%c-%3d;%c",i,i,((i-i1+1)%col!=0)?' ':'\n');
else printf("%c - %3d.",i,i);
return 0;
}
-32; !–33; "-34; #-35;
$-36; %-37; &-38; ′ -39.