Слайд 1Основы программирования
Ст. преп.
каф. ПОВТ
Масленников Алексей Александрович
Лекция № 1
Введение в
программирование
Слайд 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
int main()
{
printf("Hello, world!");
getchar();
return
0;
}
Слайд 22Пример программы на языке C
#include //
Подключение библиотеки ввода-вывода
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
domains
list=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В чем же отличие процедурных и объектных языков
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;
} }}
Приведем пример описания лампочки на ОО языке C#
class Program
{
static void Main(string[] args)
{
lamp mylamp = new lamp("red", 10, 20);
mylamp.TurnOn();
mylamp.TurnOf();
}
}
Слайд 36В чем же отличие процедурных и объектных языков
#include
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);
}
Приведем пример описания лампочки на процедурном языке C
Слайд 37Переменные
Мы все время говорим «переменная», так что же это такое
?
Фундаментальные объекты данных, с которыми работает программа – это переменные
и константы. Переменная имеет имя, тип и текущее значение. Имя для переменной выбирается программистом произвольно с учетом следующих ограничений:
Слайд 38Переменные
int k;
Каждая переменная относится к определенному типу данных.
Такая принадлежность
устанавливается при объявлении переменной.
Все переменные одного типа данных имеют одинаковый
размер, одинаковое «внутреннее устройство» и одинаковый набор операций, которые можно к ним применить.
Слайд 39Типы данных
В языке Си определены следующие основные типы данных:
Слайд 40Типы данных
Пусть для конкретной вычислительной платформы переменные типа int имеют
длину 4 байта и текущее значение некоторой переменной таково:
Тогда, если
считать эти байты значением переменной типа signed int, будем иметь число -1. Если же в этой области памяти хранится переменная типа unsigned int, её значением будет 232-1 = 4 294 967 295.
Слайд 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Символьные константы
С помощью символьных констант реализованы управляющие последовательности
Слайд 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
#include
int main(int argc, char *argv[]) {
return 0;
}
Слайд 52Функция main
Функция main всегда имеет тип возвращаемого значения int, через
это значение ОС уведомляется об успешности или не успешности завершения
программы (т.н. «код завершения»). А т.к. int подразумевается «по умолчанию», то тип возвращаемого значения для main часто не указывают
#include
#include
int main(int argc, char *argv[]) {
return 0;
}
Слайд 53Функция main
Существует две формы main:
без аргументов – main() и
с аргументами – main(int argc, char *argv[])
Вторая форма main позволяет
при вызове программы из командной строки передать в нее произвольное количество строковых аргументов.
#include
#include
int main(int argc, char *argv[]) {
return 0;
}
Слайд 54Вывод на консоль
Используется функция
printf
Прототип:
int printf(char *format, arg list ...) --
выводит
в стандартный поток вывода stdout список аргументов согласно специальной форматной строке. Возвращает
число напечатанных символов.
Слайд 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
Объявление глобальных переменных
int main(список параметров)
{
последовательность операторов
}
тип_возвращаемого_значения f1(список п
{
последовательность операторов
}
тип_возвращаемого_значения f2(список п
{
последовательность операторов
}
.
.
.
тип_возвращаемого_значения
fN(список п
{
последовательность операторов
}
Объявление глобальных переменных
int main(список параметров)
{
последовательность операторов
}
тип_возвращаемого_значения f1(список п
{
последовательность операторов
}
тип_возвращаемого_значения f2(список п
{
последовательность операторов
}
.
.
.
тип_возвращаемого_значения fN(список п
{
последовательность операторов
}
Слайд 59В общем виде структура программы C
Любая программа на С состоит
из одной или нескольких функций. Обязательно должна быть определена единственная
главная функция main(), именно с нее всегда начинается выполнение программы. В хорошем исходном тексте программы главная функция всегда содержит операторы, отражающие сущность решаемой задачи, чаще всего это вызовы функций. Хотя main() и не является ключевым словом, относиться к нему следует как к ключевому. Например, не следует использовать main как имя переменной, так как это может нарушить работу транслятора.
Слайд 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
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
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('.');
}