Similar presentations:
Основы программирования. Лекция № 1
1. Основы программирования
Лекция № 1Ст. преп.
каф. ПОВТ
Масленников
Алексей
Александрович
Введение в программирование
2. Цели и задачи курса
История развития языков программированияПаттерны проектирования. Среды разработки. Процесс разработки
Основы языка C
Основы языка C++
Обзор современных языков программирования
3. Книги
4. История появления языка СИ
Язык - Си (C) появился в 1969г. Он родился в «Белл телефонлабораторис» (Bell Telefon Laboratoris) (научно-исследовательской
фирме, принадлежащей корпорации «Американ телефон энд телеграф»
(American Telephone and Telegraph), AT&T, и расположенной в Мюррейхилл, шт. Нью-Джерси) в атмосфере, которую один из участников
разработки определил как:
«благотворное пренебрежение»
5. История появления языка СИ
Никто из руководителей компании не заказывал нового языка, на негоне было особого спроса. Язык Си возник лишь как результат дружеского
соревнования внутри небольшой группы программистов лаборатории,
искавших язык, пригодный для экспериментов с новым программным
обеспечением. «Не было ни проектов, ни спецификаций, ни
требований, - вспоминал член группы, - почти все родилось просто из
обсуждений».
6. История появления языка СИ
Название «Си» (C) появилось так же случайно, как и сам язык. Оноказался преемником ранее созданного языка для внутреннего
использования, получившего название Би (B) (B, C - вторая и третья
буквы латинского алфавита).
Отчасти язык Би основывался на созданном в Кембриджском
университете языке БКПЛ (BCPL, от Basic Combined Programming
Language - базовый комбинированный язык программирования),
который в свою очередь был потомком Алгола-60.
7. Что такое язык программирования ?
Языки программирования — это всегда некоторые модели(виртуальные вычислительные машины), позволяющие наиболее
эффективно использовать возможности вычислительных средств,
существенные для конкретных областей применения.
8. Что такое язык программирования ?
Фактически, при написании программ ориентируются не навычислительную машину как таковую, а на некоторую абстрактную
модель вычислительного устройства.
9. Абстракция
Сложность задач, которые возможно решить с применением тех илииных концепций проектирования и выражающих их языков,
непосредственно связана с
уровнем абстракции
как при постановке задачи, так и в ходе ее решения.
10. Абстракция
Абстракция – это самое мощное интеллектуальное средствопознания, имеющееся в распоряжении человека. Со способностью к
абстракции связана и способность человека к творчеству.
Обнаружение общих абстракций и механизмов значительно
облегчает понимание сложных систем.
11. Абстракция
То, как мы опишем лампочку в нашей программе зависит от нашихзадач
Вариант 1
Нам важны геометрические размеры лампочки
В таком случае
Лампочка это:
некий объект, у которого есть размер
и координаты положения в
пространстве
(оно может быть 2х, 3х мерным)
12. Абстракция
То, как мы опишем лампочку в нашей программе зависит от нашихзадач
Вариант 2
Нам важны внешние свойства лампочки
В таком случае
Лампочка это:
некий объект, у которого есть цвет,
есть некоторый уровень прочности и
т.д.
13. Языки программирования и парадигмы
Парадигма – набор теорий, стандартов и методов, которые совместнопредставляют собой способ организации научного знания, способ
видения мира.
Парадигма в программировании – способ концептуализации,
который определяет, как следует проводить вычисления, и как
работа, выполняемая компьютером, должна быть структурирована и
организована.
14. Языки программирования и парадигмы
15. Языки ассемблера
Языки ассемблера позволяют избежать необходимостипрограммирования в машинном коде, поэтому ассемблеры являются
абстракцией вычислительной машины, для которой были
спроектированы.
16. Пример кода на языке ассемблера
.model tiny.code
org 100h
Begin:
mov ah, 9
mov dx, offset message
int 21h
ret
message db «Hello World!», 0Dh, 0Ah, ‘$’
end Begin
17. Пример кода на языке ассемблера
.model tiny ;модель памяти.code ;начало сегмента кода
org 100h ;отступ для PSP блока
Begin: ;метка начала программы
mov ah, 9 ;загружаем в регистр ah значение 9
mov dx, offset message ; в регистре dx указываем адрес
(смешение) сообщения
int 21h ;вызываем прерывание DOS 21
ret ; возврашаем управление
message db «Hello World!», 0Dh, 0Ah, ‘$’ ;само сообщение
end Begin;конец программы
18. Языки процедурного программирования
Языки, основанные на методологии процедурногопрограммирования, можно считать абстракциями ассемблеров.
Таким образом, язык программирования — не только выразитель
концепций проектирования, но и уровня абстракции при
представлении задач и технических средств, используемых для
решения этих задач. Развитие языков программирования — это,
прежде всего, развитие абстрактных моделей, облегчающих и
систематизирующих проектирование.
19. Языки процедурного программирования
Методология структурного императивного программированиявоплощает подход, характеризующийся принципом
последовательного изменения состояния вычислителя пошаговым
образом с поддержкой концепции структурного программирования.
Императивное программирование является первой методологией
программирования, поддержанной на аппаратном уровне и
ориентированной на класс архитектур фон Неймана.
20. Языки процедурного программирования
Примеры языков-выразителей концепций структурногоимперативного программирования: Fortran, Pascal, С, PL/1. Эти языки
основаны на парадигме процедурного программирования,
основанной на представлении программы в виде иерархии процедур
и функций.
21. Пример программы на языке C
#include <stdio.h>int main()
{
printf("Hello, world!");
getchar();
return 0;
}
22. Пример программы на языке C
#include <stdio.h>// Подключение библиотеки ввода-вывода
int main()
// Главная функция
{
printf("Hello, world!"); // Вывод сообщения
getchar();
// Задержка окна консоли
return 0;
}
23. Пример программы на языке Pascal
Program Hello_World;Begin
Write('Hello, World!');
End.
24. Языки процедурного программирования
Основная проблема процедурных языков: достигаемый ими уровеньабстракции все еще требует от программиста мышления в большей
мере в терминах вычислительной машины, чем в терминах задачи,
которую ему приходится решать. Качество проектирования
определяется в итоге тем, насколько удачно программисту удалось
установить соответствие между пространством понятий, характерных
для решаемой задачи, и набором изобразительных средств языка, не
всегда позволяющих адекватно отобразить эти понятия в рамках
машинной модели.
25. Развитие языков программирования
Развитие абстрактных моделей не всегда означало переход на болеевысокие уровни абстракции представления вычислительной машины
как исполнительного устройства. Специфические особенности
некоторых классов задач способствовали появлению альтернативных
моделей.
26. Развитие языков программирования
Примерами альтернатив моделированию вычислительной машинымогут служить концепции, реализованные в языках функционального
и логического программирования.
27. Развитие языков программирования
Пример языка функционального программирования – язык LISP,основанный на модели, характеризуемой постулатом "все задачи, в
конечном счете, могут быть сведены к работе со списками".
28. Пример программы на языке LISP
//Это JAVA ) это не LISP )public static int getMaxValue(int[] numbers) {
int answer = numbers[0];
for (int i = 1;i < numbers.length; i++){
if (numbers[i] > answer) answer = numbers[i];
}
return answer;
}
//Это тоже самое на LISP
(defun get-max-value (list)
(let ((ans (first list)))
(do ((i 1 (1+ i)))
((>= i (length list)) ans)
(when (> (nth i list) ans)
(setf ans (nth i list))))))
29. Развитие языков программирования
Пример языка логического программирования – язык Prolog,основывающийся на принципе: "все задачи могут быть сведены к
цепочке логических рассуждений". Эти языки нашли применение в
задачах искусственного интеллекта и прикладной математики.
30. Пример программы на языке Prolog
domainslist=integer*
predicates
max_list(list, integer, integer)
min_list(list, integer)
clauses
max_list ([],M,M).
max_list ([H|T],N,M):- H>N, max_list(T,H,M).
max_list ([H|T],N,M):- H<=N, max_list(T,N,M).
min_list ([H|[]],H).
min_list ([H|T],M):- min_list(T,M1), H>M1, M=H.
min_list ([H|T],M):- min_list(T,M1), H<=M1, M=M1.
goal
L=[1,5,3,-6,8,-4],L=[H|T],max_list(T,H,Max), min_list([4,3,8,6],Min)
31. Объектно-ориентированные языки программирования
Сущность объектно-ориентированного подхода:1) Он предоставляет разработчику инструмент, позволяющий описать
задачу и существенную часть реализации проекта в терминах
предметной области, а не компьютерной модели. ОО-анализ
начинается с исследования предметов реального мира, являющихся
частью решаемой задачи
32. Объектно-ориентированные языки программирования
Сущность объектно-ориентированного подхода:2) ОО-проектирование предоставляет разработчикам гибкий мощный
универсальный инструмент, не связанный с каким-то определенным
классом задач. Объектный подход зарекомендовал себя как
унифицирующая идея всей компьютерной науки, применимая не
только в программировании, но также в проектировании интерфейса
пользователя, баз данных и архитектуры компьютеров.
33. Пример программы на языке C#
using System;namespace oops
{
class customer
{
public int CustID;
public string Name;
public string Address;
customer()
{
CustID=1101;
Name="Tom";
Address="USA";
}
public void displayData()
{
Console.WriteLine("Customer="+CustID);
Console.WriteLine("Name="+Name);
Console.WriteLine("Address="+Address);
}
}
}
34. Пример программы на языке C#
class customer{
static void Main(string[] args)
{
customer obj = new customer();
obj.displayData();
Console.WriteLine(obj.CustID);
Console.WriteLine(obj.Name);
Console.WriteLine(obj.Address);
}
}
35. В чем же отличие процедурных и объектных языков
Приведем пример описания лампочки на ОО языке C#using System;
namespace ConsoleApplication
{
public class lamp
{
public double x { get; set; }
public double y { get; set; }
public string color { get; set; }
private bool enabled = false;
public lamp(string color,double xPos,double yPos)
{
this.color = color;
x = xPos;
y = yPos;
}
public void TurnOn()
{
enabled = true;
}
public void TurnOf()
{
enabled = false;
} }}
class Program
{
static void Main(string[] args)
{
lamp mylamp = new lamp("red", 10,
20);
mylamp.TurnOn();
mylamp.TurnOf();
}
}
36. В чем же отличие процедурных и объектных языков
Приведем пример описания лампочки на процедурном языке C#include <stdio.h>
struct lamp{double x;
double y;
char color[10];
bool enabled = false;};
void TurnOn(struct lamp *lRef)
{
lRef-> enabled =true;
}
void TurnOf(struct lamp *lRef)
{
lRef-> enabled =false;
}
int main()
{
lamp mylamp;
mylamp.x=10;
mylamp.y=20;
mylamp.color=“red”;
TurnOn(&mylamp);
TurnOff(&mylamp);
}
37. Переменные
Мы все время говорим «переменная», так что же это такое ?Фундаментальные объекты данных, с которыми работает программа
– это переменные и константы. Переменная имеет имя, тип и текущее
значение. Имя для переменной выбирается программистом
произвольно с учетом следующих ограничений:
длина имени не может быть более 31 символа для внутренних
переменных и более 6 символов для внешних переменных
имя должно начинаться с буквы и может состоять из букв и цифр;
знак «подчеркивание» считается буквой;
буквы в верхнем и нижнем регистре различаются;
в качестве имен не разрешается использовать зарезервированные
слова языка
38. Переменные
Каждая переменная относится к определенному типу данных.Такая принадлежность устанавливается при объявлении переменной.
Все переменные одного типа данных имеют одинаковый размер,
одинаковое «внутреннее устройство» и одинаковый набор операций,
которые можно к ним применить.
int k;
39. Типы данных
В языке Си определены следующие основные типы данных:char
- один байт, содержащий один символ
int - целое число стандартной длины (для данной системы)
float
точкой
- вещественное число одинарной точности с плавающей
double
точкой
- вещественное число двойной точности с плавающей
long
- «длинный»: long int, long double
short
- «короткий»: short int,
signed и unsigned – со знаком и без знака (знаковый разряд)
40. Типы данных
Пусть для конкретной вычислительной платформы переменные типа int имеют длину 4байта и текущее значение некоторой переменной таково:
Тогда, если считать эти байты значением переменной типа signed int, будем иметь число 1. Если же в этой области памяти хранится переменная типа unsigned int, её значением
будет 232-1 = 4 294 967 295.
41. Типы данных
42. Числовые константы
Константы, в отличие от переменных, не имеют имён. Записьконстанты в виде цепочки символов одновременно является и
значением этой константы. Для каждого типа данных существуют
свои правила записи констант.
Целочисленные константы записывают, как правило, с помощью
десятичных цифр, хотя возможна их запись в восьмеричной и
шестнадцатеричной системах:
123, 67543, 037, 07777, 0xabf7, 0XFFFF
Допускается использование суффиксов l или L (long), а также u или U
(unsigned):
123456789L, 0XFUL (это просто число 15).
43. Числовые константы
Вещественные константы содержат десятичную точку, а такжестепенную часть (экспоненту) или и то, и другое:
1234.5, 1e-2, 12.3E1, …
Такие константы имеют тип double, однако имеется возможность
записи констант float и long double :
1.2f, 23.45F, 1e-1L
44. Символьные константы
Символьная константа – это целое число, записываемое в формеодиночного символа в одинарных кавычках: 'x', '0' и т.п.
Значением символьной константы является числовое значение кода
символа.
Например, значением константы '0' является число 48. Символьные
константы могут участвовать в арифметических операциях.
45. Символьные константы
С помощью символьных констант реализованы управляющиепоследовательности
\b – возврат назад и затирание
\f – прогон страницы
\n – конец строки
\r – возврат каретки
\t – горизонтальная табуляция
\v – вертикальная табуляция
46. Строковые константы
Строковая константа – это последовательность из несколькихсимволов, заключенная в кавычки:
"Это строка", "" (а это – пустая строка)
Фактически строковая константа является массивом символов
(массивом типа char), причем в конце массива автоматически
добавляется нулевой байт (признак конца строки) и поэтому длина
массива всегда на 1 больше размера строки. Пустая строка имеет
нулевую длину и занимает в памяти 1 байт!
Нельзя путать символьные константы и строковые константы из
одного символа. Например: 'x' и "x" – это совершенно разные вещи!
47. Константы перечислимого типа
Средства языка Си позволяют программисту создавать собственныетипы данных с фиксированным множеством целочисленных
значений, причем для каждого из значений должно быть задано
некоторое имя, которое будет играть роль константы данного типа.
Такие типы называются перечислениями.
48. Константы перечислимого типа
enum boolean {FALSE, TRUE};enum months {JAN=1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV,
DEC};
enum escapes {BELL=‘\a’, BACKSPACE=‘\b’, TAB=‘\t’, NEWLINE=‘\n’,
RETURN=‘\r’};
Можно описывать переменные перечислимого типа:
enum months x;
49. Объявления переменных
Любая переменная в программе на языке Си должна быть объявленадо первого обращения к ней. При объявлении переменной
указывается её тип, имя и, возможно, начальное значение.
Переменные одно типа можно объявлять списком:
int lower, upper, step;
char c, line[1000];
char esc = ‘\\’;
int limit = MAXLINE + 1;
float eps = 1.0e-05;
50. Объявления переменных
К объявлению любой переменной можно добавить модификаторconst, который придаст этой переменной свойство “read only” (только
для чтения). Попытка присвоить такой переменной (или элементу
массива) нового значения вызовет ошибку компиляции:
const double e = 2.71828182845905;
const char msg[] = "Warning: ";
51. Функция main
В программе обязательно должна присутствовать в точности однафункция с именем main («главная» функция), т.к. запуск программы
на выполнение операционной системой производится всегда через
эту функцию (т.е. main начинает выполняться первой)
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
return 0;
}
52. Функция main
Функция main всегда имеет тип возвращаемого значения int, черезэто значение ОС уведомляется об успешности или не успешности
завершения программы (т.н. «код завершения»). А т.к. int
подразумевается «по умолчанию», то тип возвращаемого значения
для main часто не указывают
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
return 0;
}
53. Функция main
Существует две формы main:без аргументов – main() и
с аргументами – main(int argc, char *argv[])
Вторая форма main позволяет при вызове программы из командной
строки передать в нее произвольное количество строковых
аргументов.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
return 0;
}
54. Вывод на консоль
Используется функцияprintf
Прототип:
int printf(char *format, arg list ...) -выводит в стандартный поток вывода stdout список аргументов
согласно специальной форматной строке. Возвращает число
напечатанных символов.
55. Вывод на консоль
Спецификации формата(%)
c
i,d
o
x,X
Тип
Результат
char
int
int
int
один символ
десятичное число
восьмеричное число
шестнадцатиричное число
строчные/заглавные буквы
u
s
int
char *
f
e,E
double/float
"
g,G
"
%
-
unsigned int
строка
завершающаяся "\0"
формат -m.ddd...
научный формат
-1.23e002
e или f
(что из них короче)
символ %
56. Вывод на консоль
Между % и форматной буквой мы можем поставить:- (знак минус) -- выравнять влево
целое число -- ширина поля.
m.d -- m - ширина поля, d - число точек после запятой или число
символов в строке.
printf("%-2.3f\n",17.23478);
//Вывод на экран будет:
17.235
//и:
printf("VAT=17.5%%\n");
//выводит:
VAT=17.5%
57. Ввод из консоли
scanfЭта функция определена следующим образом:
int scanf(char *format, args....) -- читает из stdin и кладет прочитанные
данные по адресам, указанным в списке args. Возращает число
прочитанных данных.
Форматная строка подобна строке для printf
В scanf необходимо передавать адрес переменной или указатель на
нее.
scanf("%d",&i);
Мы можем передать также имя массива или строки, т.к, это и будет
адресом начала массива или строки.
int n;
scanf("%d",&n);
char string[80]; scanf("%s",string);
58. В общем виде структура программы C
Объявлениеглобальных
переменных
Объявление
глобальных
переменных
intint
main(список
параметров)
main(список
параметров)
{ {
последовательность
операторов
последовательность
операторов
} }
тип_возвращаемого_значения
f1(список
п п
тип_возвращаемого_значения
f1(список
{ {
последовательность
операторов
последовательность
операторов
} }
тип_возвращаемого_значения
f2(список
п п
тип_возвращаемого_значения
f2(список
{ {
последовательность
операторов
последовательность
операторов
} }
. .
. .
. .
тип_возвращаемого_значения
fN(список
п п
тип_возвращаемого_значения
fN(список
{ {
последовательность
операторов
последовательность
операторов
} }
59. В общем виде структура программы C
Любая программа на С состоит из одной или нескольких функций.Обязательно должна быть определена единственная главная функция
main(), именно с нее всегда начинается выполнение программы. В
хорошем исходном тексте программы главная функция всегда
содержит операторы, отражающие сущность решаемой задачи, чаще
всего это вызовы функций. Хотя main() и не является ключевым
словом, относиться к нему следует как к ключевому. Например, не
следует использовать main как имя переменной, так как это может
нарушить работу транслятора.
60. Ключевые слова
autodouble
int
struct
break
else
long
switch
case
enum
register
typedef
char
extern
return
union
const
float
short
unsigned
continue
for
signed
void
default
goto
sizof
volatile
do
if
static
while
61. Базовые типы
ТипБиты
Минимально допустимый диапозон значений
char
unsigned char
signed char
int
unsigned int
signed int
short int
unsigned short int
signed short int
8
8
8
16 или 32
16 или 32
16 или 32
16
16
16
от -127 до 127
от 0 до 255
от -127 до 127
от -32767 до 32767
от 0 до 65535
то же, что int
от -32767 до 32767
от 0 до 65535
то же, что short int
long int
32
от -2 147 483 647 до 2 147 483 647
long long int
64
от -(263-1) до (263-1), добавлен стандартом C99
signed long int
unsigned long int
unsigned long long
int
32
32
то же, что long int
от 0 до 4 294 967 295
64
от 0 до (264-1), добавлен в C99
float
32
от 1E-37 до 1E+37, с точностью не менее 6 значащих десятичных цифр
double
64
от 1E-37 до 1E+37, с точностью не менее 10 значащих десятичных цифр
long double
80
от 1E-37 до 1E+37, с точностью не менее 10 значащих десятичных цифр
62. Примеры объявления переменных
char esc = '\\';int i = 0;
float eps = 1.0e-5;
const double е = 2.71828182845905; // константа
int i,j,l;
short int si;
unsigned int ui;
double balance, profit, loss;
63. Где объявляются переменные
Объявление переменных может быть расположено в трех местах:внутри функции, в определении параметров функции и вне всех
функций. Это - места объявлений соответсвенно локальных,
формальных параметров функций и глобальных переменных
64. Локальные переменные
Переменные, объявленные внутри функций, называются локальнымипеременными. В некоторых книгах по С они называются
динамическими переменными.
Локальную переменную можно использовать только внутри блока, в
котором она объявлена.
Иными словами, локальная переменная невидима за пределами своего
блока. (Блок программы — это описания и инструкции, объединенные
в одну конструкцию путем заключения их в фигурные скобки.)
65. Локальные переменные
Локальные переменные существуют только во время выполненияпрограммного блока, в котором они объявлены, создаются они при
входе в блок, а разрушаются — при выходе из него. Более того,
переменная, объявленная в одном блоке, не имеет никакого
отношения к переменной с тем же именем, объявленной в другом
блоке.
66. Локальные переменные
void func1(void){
int x;
x = 10;
}
void func2(void)
{
int x;
x = -199;
}
67. Локальные переменные
void f(void){
int t;
scanf("%d%*c", &t);
if(t==1) {
char s[80]; /* эта переменная создается только
при входе в этот блок */
printf("Введите имя:");
gets(s);
/* некоторые операторы ... */
}
/* здесь переменная s невидима */
}
68. Локальные переменные
Если имена переменных, объявленных во внутреннем и внешнем (поотношению к нему) блоках совпадают, то переменная внутреннего
блока "прячет" (т.е. скрывает, делает невидимой) переменную
внешнего блока. Рассмотрим следующий пример:
69. Локальные переменные
#include <stdio.h>int main(void)
{
int x;
x = 10;
if(x == 10) {
int x; /* эта x прячет внешнюю x */
x = 99;
printf("Внутренняя x: %d\n", x);
}
printf("Внешняя x: %d\n", x);
return 0;
}
70. Локальные переменные
Результат выполнения программы следующий:Внутренняя х: 99
Внешняя х: 10
71. Глобальные переменные
В отличие от локальных, глобальные переменные видимы и могутиспользоваться в любом месте программы. Они сохраняют свое
значение на протяжении всей работы программы. Чтобы создать
глобальную переменную, ее необходимо объявить за пределами
функции. Глобальная переменная может быть использована в любом
выражении, независимо от того, в каком блоке это выражение
используется.
72. Локальные переменные
#include <stdio.h>int count; /* глобальная переменная count */
void func1(void);
void func2(void);
int main(void)
{
count = 100;
func1();
return 0;
}
void func1(void)
{
int temp;
temp = count;
func2();
printf("count равно %d", count); /* напечатает 100 */
}
void func2(void)
{
int count;
for(count=1; count<10; count++)
putchar('.');
}
73. Глобальные переменные
Тип области видимостиОбласть видимости
область действия - файл (имя, объявленное вне
всех блоков и классов, можно использовать в
транслируемом файле, содержащем это
объявление; такие имена называются
глобальными (global))
Начинается в начале файла (единица
трансляции) и кончается в конце файла. Такую
область видимости имеют только
идентификаторы, объявленные вне функции.
Эти идентификаторы видимы в любом месте
файла. Переменные с этой областью видимости
являются глобальными)
область действия - блок
Начинается открывающейся фигурной скобкой
"{" блока и кончается с его закрытием скобкой
"}". Эту область видимости имеют также
параметры функции. Переменные, имеющие
такую область видимости, являются
локальными в своем блоке
область действия - прототип функции
Идентификаторы, объявленные в прототипе
функции, видимы внутри прототипа
область действия - функция (имена,
объявленные в функции, могут быть
использованы только в теле функции)
Начинается открывающейся фигурной скобкой
"{" функции и кончается с ее закрытием скобкой
"}". Такую область видимости имеют только
метки. Метка используется оператором goto и
должна находится внутри той же функции