Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







ОСНОВЫ АЛГОРИТМИЗАЦИИ И ПРОГРАММИРОВАНИЯ.





ОСНОВЫ АЛГОРИТМИЗАЦИИ И ПРОГРАММИРОВАНИЯ.

ЯЗЫК С/С++. СТРУКТУРНЫЙ ПОДХОД.

 

Краткий курс лекций

 

Философия Си:

Не устанавливать барьеров на вашем пути, но при этом возложить на вас всю ответственность за злоупотребление предоставленной свободой.

 

 

Тирасполь, 2002

ОБЗОР ЯЗЫКОВ ПРОГРАММИРОВАНИЯ

 

Pascal

 

Был разработан в 1968 - 71 гг. Никлаусом Виртом в Цюрихском Институте информатики (Швейцария). Первоначальная цель разработки языка диктовалась необходимостью инструмента «для обучения программированию как систематической дисциплине». Однако была обнаружена чрезвычайная эффективность языка Паскаль в самых разнообразных приложениях, от решения небольших задач численного характера до разработки сложных систем - компиляторов, баз данных, ОС и т.д.

 

Основными характеристиками языка являются:

1. Развитая система типов, ориентация на принципы структурного программирования, поддержка процесса пошаговой разработки.

2. Компактность. Легок для изучения и освоения. Полное описание языка занимает 30 страниц. Синтаксические правила - на 1 страницу.

3. Годен для разработки больших и сложных программ.

4. Технологичен для реализации на всех, в том числе нетрадиционных, машинных архитектурах.

В 1983 году был принят международный стандарт языка. Язык Тurbo Pascal является расширением американского стандарта ANSI Рascal, учитывающий архитектурные особенности операционной оболочки MS DOS, и снабжён внушительными по объёму и разнообразию пакетами стандартных процедур. Наличие объектно - ориентированных средств облегчает констру-ирование больших программных систем на основе технологии модульного программирования.



 

Система Turbo Pascal является интегрированной средой, включающей ряд компонентов, поддерживающих все виды работ по созданию программ. Система содержит универсальный встроенный редактор; компилятор входного языка, редактор связей и встроенный символьный отладчик. Многооконный интерфейс с развитой системой меню обеспечивает высокую производительность труда программиста.

 

Программное приложение Delphi, работающее в ОС Windows 95, основано на языке Pascal.

 

Си

 

I этап.Разработан в 1972 году Д.Ритчи в фирме Bell Laboratories. Его предшественниками явились язык BCPL (Ричардсон, Кембридж, Англия) и язык B (1970 год, Томпсон) для ранней версии ОС UNIX для компьютера РDP 11.

У языка В не было типов данных, его единственным объектом было машинное слово. Для получения доступа к машинным словам использовались переменные, содержащие указатели. Язык Си устранил эти недостатки. Сохранились указатели, но появились и более сложные структуры данных: массивы, структуры.

Си - современный язык. Его структура позволяет программно использовать нисходящее проектирование, структурное программирование и пошаговую разработку модулей.

Си - мобильный язык. Легко переносится на другие типы машин с небольшими изменениями.

Си - эффективный язык. Программы на Си компактны и быстродействующие.

Си - мощный и гибкий язык. Большая часть UNIX написана на Си, компиляторы и интерпретаторы Fortran, Pascal, Basic, Лисп, Лого. Используются для решения физических, технических проблем, производства мультфильмов.

Си - удобный язык. Сняты многие ограничения.

С++ - язык программирования, используемый в задачах от системного программирования до проблем искусственного интеллекта.

II этап. Разработал С++ сотрудник Bell Lab’s в 1983 году Брайен Страуструп. Turbo Pascal 6.0 заимствовал часть идей из С++.

III этап. В 1989году фирма Borland создала Turbo C++ 1.0.

IV этап B 90г. Borland C++ 2.0, появилась возможность программировать в среде Windows. Borland C++ 3.0 имеет библиотеку классов Objekt Windows (библиотека готовых функций для работы в окне).

В 1991 году в Москве, на выставке программных продуктов 80% программ было написаны на Си и Pascal.

Си - олицетворяет гибкость и богатство возможностей, часто в ущерб безопасности и простоте, надёжность, в ущерб универсальности и изяществу Паскаль.

Borland С++ является интегрированной средой программирования имеющей:

1. текстовый редактор,

2. компилятор,

3. редактор связей,

4. отладчик,

5. мощные средства настройки среды.

Си - это язык "компилирующего" типа.

Компилятор - это системная программа, которая преобразует "язык высокого уровня" в язык компьютера - машинный язык. Компиляторы удобны при разработке больших программ, многократного использования.

V этап Дальнейшим продолжением развития Си++ и объектно-ориентированного стиля программирования явилась разработка среды программирования Borland C++ Builder, позволяющая быстро создавать программы, работающие в среде Windows 95, 98. Имеется целая библиотека визуальных компонент (VCL).

 

ЭТАПЫ СОЗДАНИЯ ПРОГРАММЫ

 

1) Программа записывается в любом текстовом редакторе и сохраняется в исходном файле с расширением *.С, *.СРР.

2) Преобразуется компилятором в объектный файл *.obj. На этом этапе пока программа работать не может, так как здесь не реализованы ссылки на функции.

3) Преобразуется в исполняемый файл программой, называемой загрузчиком или редактором связей *.EXE. Он собирает части программы. Иногда его называют линковщиком. Этот файл уже может быть исполнен компьютером.

 

Пример программы на СИ

# include < stdio.h >

заголовок void main (void)

 

 
 


{

тело функции /*тело функции*/

printf("Hello World!");

}

 

1-я строка – директива, подключающая заголовочный файл стандартного ввода-вывода. Операторов в Си мало, но есть библиотека функций. Чтобы их использовать надо их подключить, что и делает директива – 1-я строка программы. Символ # указывает, что строка должна быть обработана препроцессором языка Си.

2-я строка – имя главной функции main ( ), эта функция не возвращает никаких параметров (об этом буду говорить немного позже). Программа Си всегда имеет функцию main( ). С нее начинается выполнение программы.

3-я строка – начало тела функции. {} определяют тело функции (в Паскале - это begin и end)

4-я строка – комментарий, он не компилируется, а только поясняет что делается.

5-я строка – библиотечная функция – печатать на экране, выражение в скобках на этой строке – параметр функции, он всегда берётся в кавычки.

; - это признак оператора Си, это часть оператора, а не разделитель операторов, как в Паскале.

 

Советы, как сделать программу читаемой:

1) Выбирать осмысленные имена

2) Использовать комментарии

3) Использовать пустые строки для того, чтобы отделить одну часть функции от другой

4) Помещать каждый оператор в другой строке.

 

БАЗОВЫЕ ЭЛЕМЕНТЫ ЯЗЫКА СИ

 

Рассмотрим обязательные элементы, с помощью которых должна оформляться программа на Си:

 

1. Комментарии – используются для документирования программы. Любая программа должна содержать комментарии: какой алгоритм применяется, что делает программа…

Ø 1 способ: /* Текст */ - в любом месте программы.

Как только компилятор встречает /**/, он их пропускает. Компилятор игнорирует /* */, так как он не в состоянии интерпретировать язык, отличающийся от языка Си. То есть, если вы хотите исключить из компиляции какую-то строку, то заключите её в /**/.

Ø 2 способ: если комментарий большой, то используем такой тип

/* Строка 1 - для комментария любой длины

строка 2

строка 3*/

Ø 3 способ: // - текст до конца строки.

 

2. Идентификатор - это имя, которое присваивается какому-либо объекту (переменной). Используются строчные и прописные буквы, цифры и знак подчёркивания. Строчные и прописные буквы различаются. (В Бейсике не различаются). Если назвать переменную name, Name или NAME, то это будут разные переменные.

Начинаются идентификаторы с буквы или знака подчеркивания. Например, _name. Но не рекомендуется начинать с _, так как этот знак используется для глобальных имен сомого языка Си.

В современном программировании часто используется для создания идентификаторов Венгерская нотация, где используются определенные символы, характеризующие идентификатор, например:

b – байт; ch – однобайтовый символ;

w – слово; f – флаг;

l – длинное слово; fn – функция;

u – беззнаковое; p – указатель;

с – счетчик; d – разность двух пре-х

cz – строка; и т.д.

 

3. Служебные слова – это слова, с которыми в языке жестко сопоставлены определённые смысловые значения и которые не могут быть использованы для других целей. Это имена операторов, библиотечных функций, команды препроцессора и так далее. Этим слова нельзя использовать для создания имен своих функций, переменных…

 

ДАННЫЕ В ПРОГРАММЕ НА СИ

 

Каждая программа оперирует с данными. Они присутствуют в программе в виде переменных и констант.

Данные, которые могут изменяться или которым может присваиваться значения во время выполнения программы, называются переменными.

Данные, которым устанавливаются определенные значения и они сохраняют свои значения на всем протяжении работы программы, называются константами.

 

Константы

 

Константы - это фиксированные значения. Значение, будучи установлено, больше не меняется. Константы бывают различных типов. Типы отличаются по принципу размещения в памяти ЭВМ, а для человека по виду записи. В Си существует 7 ключевых слов, используемых для указания на различные типы данных: int, long, short, unsigned, char, float, double.

 

Типы констант:

a) Целые и длинные целые. Записываются в десятичной, восьмеричной и шестнадцатеричной системе счисления. Они могут быть знаковые и беззнаковые.

Десятичная система: целые константы занимают 16 бит памяти, и принимают диапазон значений: -32768 до +32767(215). Если константа беззнаковая, то диапазон удваивается: 0 до 65535 (за счет того, что 15-й разряд – знаковый используется под число). Для обозначения беззнакового числа используют суффикс u (unsigned), например 123u.

Если число больше 40000, то компилятор автоматически преобразует его в отрицательное число, поэтому суффикс u обязателен:40000u. В примере 123u компилятору все равно – есть суффикс или его нет, так как это число входит в диапазон 32767.

Длинное целое занимает 32 бита, диапазон значений

± 2147483648 (знаковое длинное – long). Если вы поставили суффикс l, то, несмотря на число, будет занято 32 бита. Например: -5326l

0 – 4294967295 беззнаковое длинное - (unsigned long). Диапазон увеличивается за счет 31-го бита. Используются суффиксы ul, например, 32659ul.

 

Восьмеричная система:

Если число начинается с цифры 0, оно интерпретируется как восьмиричное число

16 битов 0 ¸ 077777

0100000 ¸ 0177777u

32 бита 0200000 ¸ 01777777777l

020000000000 ¸ 037777777777ul

Шестнадцатеричная система:

Если число начинается с символа 0х, то оно интерпретируется как шестнадцатиричное

16 битов 0x0000 ¸ 0x7FFF

0x8000 ¸ 0xEFFFu

32 бита 0x10000 ¸ 0x7FFFFFFFl

0x80000000 ¸ 0xFFFFFFFFul

 

b) Вещественные константы. Это числа с плавающей точкой. Значение имеет дробную часть. По умолчанию все вещественные константы имеют тип двойной точности double. Занимают в памяти 8 байт(даже если 0,0). Диапазон значений ±1*10±307, можно записать и в научной форме, например: 0,5е+15 или

1,2е-3=1,2*10-8=0,0012.

Принудительно можно задать формат одинарной точности float. Число будет занимать 4 байта, используется суффикс f (5.7 f). Соответсвенно диапазон сужается ±1*10±37

А также расширенной точности long double – 10 байт. (3.14L)

Знак + можно не писать. Разрешается опускать либо десятичную точку, либо экспоненциальную часть, но не одновременно (.2; 4е16). Можно не писать дробную либо целую часть, но не одновременно (100.; .8е-5)

 

c) Символьные константы. Это набор символов, используемых в ЭВМ.

Делятся на 2 группы: печатные и не печатные (управляющие коды). Символьная константа включает в себя только 1 символ, который необходимо заключить в апострофы и занимает 1 байт памяти.

Любой символ имеет своё двойное представление в таблице ASCII. В программе символьные константы вводятся в одинарных кавычках, при компиляции в программу подставляется числовое значение символа из ASCII. Один символ занимает 1 байт.

Символ 'А' 'a' ' ' '\n'

Его код 65 97 32 10

Как целый тип данных 'A'=01018, 010000012, 4116, 6510. Коды запоминать не надо.

Управляющие коды начинаются с символа \ и тоже заключаются в апострофы. Наиболее распространенные управляющие коды:

\n – переход на новую строку

\t – табуляция (сдвиг курсора на некоторое фиксированное значение)

\b – шаг назад (сдвиг на одну позицию назад)

\r – возврат каретки (возврат к началу строки)

\f – подача бланка (протяжка бумаги на 1 страницу)

\\ - слеш

\’ - апостроф

\” - кавычки

Последние три знака могут выступать символьными константами, а также применяться в функции printf() , поэтому применение их в качестве символов может привести к ошибке. Например, если мы хотим вывести строку «Символ \ называется слеш», то оператор должен выглядеть так:

рrintf( «Символ \\ называется слеш»);

 

a) Строковые константы- содержат последовательность из 1 и более символов, заключённых в " ". Расходуется по 1 байту на любой символ + 1байт на так называемый ноль-символ - признак конца строки. Ноль-символ – не цифра ноль, он означает, что количество символов в строке (N) должно быть на 1 байт больше (N+1), чтобы обозначать конец строки (компилятор его прибавляет сам автоматически). Например: «строка текста» занимает (13+1) байт;

«Мир» -

м и р 0

 

 

Тип с плавающей точкой

float 4 байта 10±37

этот тип называется типом с одинарной точностью

double 8 байт 10±307 двойной точности

 

long double 10 байт 10±4932 длинное двойной точности (расширенной точности) редко применяется, в основном применяют для очень точных нвучных экспериментов. Тип int тождественен short int, long double - представлению числа с плавающей точкой в регистрах сопроцессора

 

Тип: символьный.

Character - char. Он в основном используется для символов, в частности если надо использовать ASCII код символа. Но может также использоваться для целых чисел.

6116
Например: char x; x

 

 

x=’a’; 1 байт

 

char 1 байт±128

signed char ±128

unsigned char 0 ... 255

В Си нет строковых переменных, есть массивы, но об этом чуть позже.

 

При описании данных, необходимо ввести тип, за которым должно идти имя переменной (описание). Можно в один оператор объединять несколько имен переменных одного типа, разделенных запятой. Операторы должны заканчиваться точкой с запятой.

Пр.: int num;

int cows, hogs;

 

Переменным можно присваивать некоторое значение перед началом обработки (инициализировать). В качестве инициализации переменной часто применяются константы.

Пр.: int num;

num=1024;

 

Можно инициализировать переменную в операторе описания:

int cows = 72;

int num=1024, hogs=45;

 

Не смешивайте инициализируемые и не инициализируемые переменные в одном операторе. Например: short dogs, cats=92; здесь dogs¹92 (а впечатление создается).

 

Если присваивается символьное значение переменной типа char , то необходимо не забывать брать символ в апострофы:

char isma=’S’;

т.к. если записать char isma=S, компилятор будет считать, что используется переменная с именем S, которая не описана.

Символ ‘4’ и число 4 – разные вещи. Код символа ‘4’ равен 52

В СИ имеется встроенная операция sizeof, которая позволяет определить размер объектов в байтах.

Пример:

main()

{

printf(“данные типа int занимают %d байта.\n”, sizeof(int));

printf(“данные типа char занимают %d байта.\n”, sizeof(char));

printf(“данные типа long занимают %d байта.\n”, sizeof(long));

}

В результате будет выведена информация:

данные типа int занимают 2 байта

данные типа char занимают 1 байта

данные типа long занимают 4 байта

Символ %d указывает куда нужно вставить значение переменной. % - означает, что необходимо напечатать число, а d – что число необходимо печатать в десятичном формате.

 

ОПЕРАЦИИ ЯЗЫКА СИ

 

Си – простой язык, эта простота заключается в том, что большая часть программы – это выражения (логические, арифметические, …).

Программа получается легко читаемой, если в ней есть выражения, поэтому в Си имеется так много операций. Операнд – это то, над чем выполняется операция. Например: процесс «поедания» бутерброда – это применение операции «поедание» к операнду «бутерброд».

Операции в языке Си применяются для представления арифметических выражений. Насчитывается около 40 операций и 16 приоритетов. Величина, над которой выполняется операция, называется операндом. Операции могут быть унарные (один операнд), бинарные (два операнда) и тернарные.

 

Арифметические операции

 

Можно выполнять действия над переменными, переменными и константами, константами.

1) Самый высокий приоритет у скобок ().

2) Изменение знака r = -12; -r (2)

3) Умножения * x*y; x*2; 3*9 (3)

Деления / x / y; x/5; 7/5 (3)

Операции отношения

 

Меньше <, (7) Больше или равно > =, (7)

Меньше или равно <=, (7) Не равно != (8)

Больше > (7) Равно = = . (8)

Используются для сравнения в условных выражениях. При этом значения операндов не изменяется, только вырабатывается значение «истина», «ложь».

Например: y>x+2, если истина, то переменная принимает любое значение, если ложь, то это нуль.

 

Не следует путать знаки = и = =. С помощью операции присваивания (=) некоторой переменной слева от этого знака присваивается значение. А с помощью операции отношений (= =) проверяется равенство выражений, стоящих слева и справа от этого знака.

Приоритет у <, <=, =>, > выше, чем у = = и !=.

 

Все операции отношений возвращают результат «истина» или «ложь» (0 или 1). Значение переменных при этом не изменяется.

При сравнении float лучше пользоваться только операциями < и >, т.к. ошибки округления могут привести к тому, что числа окажутся неравными, хотя по логике они должны быть равны. (например 3*1/3 равно 1,0, но 1/3 в вещественном формате будет представлена как 0,999999…, и произведение не будет равно 1)

Приоритет больше чем у операции присваивания, но меньше чем у +, -.

y > x+2; - сначала сложение, затем сравнение.

 

Логические операции

 

Используются для проверки условия, вырабатывая значение: истина или ложь. Опреандами логических операций обычно являются условные выражения. Логические выражения вычисляются слева напрова; вычисления прекращаются, как только установлена истинность или ложность всего выражения.

1) && "И" (операция логического умножения). Выражение истинно только в том случае, если истинны выражения, стоящие до и после &&. Если первое – ложь, то дальше не проверяется) (12)

практика&&время= = совершенство

 

2) || "ИЛИ" ( логическое сложение. Выражение истинно, если одно из выражений истинно. Если первое – истина, дальше не проверяется) (13)

 

3) ! "НЕ" (отрицание) (2)

 

Булева логика:

x y && || !
0 11

 

Операнд у этой операции только один.

Пр.: if(x>0 && y<10) действие

5>2 && 4>7 - ложь

5>2 || 4>7 - истина

!(4>7) – истина

У операции ! (НЕ) очень высокий приоритет (выше только у скобок). && и || выше присваивания, но ниже чем отношения.

Операции с разрядами

 

Поразрядные логические операции. Приводят к изменению значения переменной. Действия производятся над данными класса целых и char. Они называются поразрядными, потому что они выполняются отдельно над каждым разрядом (битом) независимо от разряда, находящегося слева или справа. Это необходимо аппататчикам; у них существует понятие словосостояние устройства: готово, не готово. Я могу изменять этот бит. Так же это пригодится тем, кто работает с видеопамятью, с помощью этих операций можно поменять цвет, буквы со строчных в заглавные и наоборот (достаточно поменять бит, отвечающий за эти буквы).

1) ~ Дополнение до 1 или поразрядное отрицание. Это унарная операция изменяет каждую 1 на 0, а 0 на 1. В отличие от логического отрицания операнд здесь меняется.

~(11010) получим (00101)

 

2) & Поразрядное Ислужит для сбрасывания битов. Эта бинарная операция сравнивает последовательно разряд за разрядом два операнда. Результат равен 1, если оба соответствующих разряда операндов равны 1

(11010110) & (10110111) => (10010110) сбрасывание битов в первом операнде.

Например: ‘A’ -4116 отличаются на один бит – пятый в 2-ой системе счис-

‘a’-6116 ления

 

3) | Поразрядное ИЛИ служит для установки (выставления) битов. Эта бинарная операция сравнивает последовательно разряд за разрядом два операнда. Результат равен 1, если один (или оба) из соответствующих разрядов операндов равны 1.

(11010110) | (10110111) => (11110111) Если в надо из 0 получить 1, то в маске ставят 1.

 

4) ^ Исключающее ИЛИ. Это бинарная операция. Результат равен 1, если один из разрядов равен 1 (но не оба)

(11010110) ^ (10110111) => (01100001)

 

Таблица истинности

х у ^

 

 

Операции сдвига

 

Операции сдвига осуществляют поразрядный сдвиг операнда. Величина сдвига определяется значением правого операнда. Сдвигаемые разряды теряются. При сдвиге вправо знаковый разряд размножается.

 

1) << сдвиг влево. Разряды левого операнда сдвигаются влево на число позиций, указанное правым операндом. Освобождающиеся позиции заполняются нулями, а разряды, сдвигаемые за левый предел левого операнда, теряются.

(10001010)<<2 = = 00101000

Это равноценно умножению на 2 в степени n

number<<n – умножает number на 2 в n-й степени

 

2) >> сдвиг вправо. Разряды левого операнда сдвигаются вправо на число позиций, указанное правым операндом. Разряды, сдвигаемые за правый предел левого операнда, теряются. Для беззнаковых чисел освобожденные слева разряды заполняются нулями. Для чисел со знаком минус слева дописывают единицы, говорят, что знаковый бит размножается.

x=5=1012 x>>1 0010=210

(10001010)>>2 = = 00100010

Эта операция выполняет деление на 2n:

number>>n – делит number на 2 в n-й степени. Деление целочисленное.

 

Операция условия ?:

 

Операция состоит из двух частей (? и :) и содержит три операнда

(операнд1 ? операнд2 : операнд 3).

(выражение)? Значение 1 : значение 2

Операнд вырабатывает условие истина или ложь.

Например: (х>0)? printf(“Истина”): printf(“ложь”);

Это более короткий способ записи оператора if else и называется «условным выражением».

Например условное выражение x = (y<0)? –y : y; означает, что если у меньше 0, то х = -у, в противном случае х = у. В терминах оператора if else это выглядело бы так:

if(y<0)

x = -y;

else

x = y;

Условные выражения более компактны и приводят к получению более компактного машинного кода.

Т.о. если условие операнда 1 истинно, то значением условного выражения является величина операнда 2, если условие операнда 1 ложно – величина операнда 2.

Условное выражение удобно использовать, когда имеется некоторая переменная, которой можно присвоить одно из двух возможных значений.

Пр.: max = (а>b) ? a : b;

Си – язык выражений. Убедились?

Преобразование типов

 

В операторах и выражениях должны быть данные одного и того же типа. Но на Си возможно это нарушить (в отличие от Паскаль). Си компилятор автоматически преобразует типы, но следует соблюдать определенные правила:

1.Если производится операция над данными 2-х разных типов, то обе величины приводятся к высшему типу (происходит "повышение" типа).

2. Типы от низшего к высшему: char, short, int, long, float, double. Применение слова unsigned повышает ранг соответствующего типа со знаком.

3. В операторе присваивания конечный результат вычисления выражения в правой части приводится к типу переменной, которой должно быть присвоено это значение ( при этом может быть как повышение так и понижение типа). "Понижение" типа приводит к отбрасыванию разрядов.

4. При вычислениях величин типа float они автоматически преобразуются в тип double (для сохранения точности вычислений, это уменьшает ошибку округления). Конечный результат преобразуется обратно в float, если это диктуется оператором описания.

Например: int x;

а)х=5/2;

После вычисления х=2. то есть не используется правило округления, а просходит отбрасывание дробной части.

Или б)х=5,9/2; ответ х=2 (0,95 отбрасывается, потому что х int)


Пример: float y;

В)y=5/2;

Ответ : у=2,0

 

int/int=int, затем 2 повышается до float, ответ у=2,0. Достаточно написать 5,0/2,0, ответ будет верный. Но не очень хочется писать нули, поэтому делают принудительное преобразование типов.

 

Операции приведения

 

Хотя в СИ и возможно преобразование типов, лучше избегать этого и указывать точно тип данных. Это называется приведением типов.

1) (float)9=9.00

2) int num;

num = 1,6+1,7; 3,3 => 3. Сначала числа складываются, затем результат приводится к указанному типу.

num = (int)1,6+(int)1,7; 1+1 = 2. В этом случае, числа сначала приведены к данному типу, а затем складываются.

3) float y;

y=(float)5/2; ответ 2,5.

То есть для страховки от неожиданностей приводите сами к необходимому типу, не ждите сюрпризов от компилятора.

 

ОПЕРАТОРЫ ЯЗЫКА СИ

 

Основу программы на Си составляют выражения, а не операторы. Большинство операторов в программе являются выражениями с ‘;’. Это позволяет создавать эффективные программы.

Оператор является законченной конструкцией языка Си. Операторы служат основными конструкциями при построении программы. Выражение состоит из операций и операндов (операнд – то, над чем выполняется операция, простейшее выражение может состоять из одного операнда). Оператор служит командой компьютеру. Операторы бывают простые и составные. Простые операторы оканчиваются ; .

Ø Простые операторы

1. Пустой оператор ';’

2. Оператор определения (описания): int x, y; (выделяется память и ей присваивается идентификатор х и у)

3.Оператор присвоенияcount = 0.0; или х=10; это означает, что в ячейку памяти с идентификатором х записывается 10. Если написать просто х=10, то это выражение. Можно порисваивать и так: a=b=c=10; здесь присвоение тоже происходит слева направо. Нельзя присвоить константе какое-то значение, например: 2002=bmw; верно наоборот bmw=2002.

4.Оператор выражения (управляющий оператор): у=х+5; это означает, что переменной у присвоить результат от расчета выражения х+5.

sum = sum+count;

var = (var + 10)/4;

5.Оператор вызова функции

printf("Привет ");

 

Ø Составные операторы или блоки

Это группа операторов, заключенных в фигурные скобки {...}.

 

На сегодняшний момент у вас достаточно знаний, чтобы решать простейшие задачи.

Например: найти значение функции f(x) =(x+3)2+3(x+1), при х=2

 

void main ( ) - главная функция

{

int f, x; - оператор определения

x=2; - оператор присваивания

f(x) =(x+3)*(x+2) +3*(x+1); - оператор выражения

}

1) Но ответ программы, где увидеть?

2) Где свойство массовости?

! После выполнения сделать вывод результата.

! Сделать ввод значения х с клавиатуры (не больше 32000)

 

Вложенные циклы

Если внутри одного цикла находится другой цикл, то эта конструкция называется вложенный цикл. Внутренний цикл выполняется столько раз, сколько задано во внешнем цикле. Количество вложенных циклов не ограничено.

Пример использования – двумерная таблица.

 

// Пример программы на вложенные циклы

// Вывести на экран числа от 0 до 99 по 10 в каждой строке

#include <stdio.h>

void main(void)

{

int num=0;

int i, j;

for(i=0; i<10; i++) {

for(j=0; j<10; j++)

printf("%4d",num++);

printf("\n");

}

}

 

Форматирование вывода

 

Для форматирования вывода можно установить несколько флагов, для этого используются функции-члены setf, unsetf.

unsigned v =12345;

cout << "Before: " << v << endl;

cout.setf(cout.hex); //Модификация потока

cout << "After: " << v << endl;

Для форматирования можно подключить заголовочный файл Iomanip.h, тогда используем манипуляторы

cout << "In hexadecimal v == " << hex << v << endl;

cout << "In decimal v == " << dec << v << endl;

ends вставить нулевой завершающий символ в строку

endl начать новую строку

oct 8-ричная система счисления

Для выравнивания по правому краю целочисленных переменных можно задать: cout.width(8); но он не оказывает влияние на следующее выводимое значение.

 

Заключительная программа

 

Задача. Три бригады собирают в саду яблоки. Написать программу учета сбора яблок каждой бригадой. Определить, сколько яблок было собрано за день и средний заработок в каждой бригаде.

 

# include <stdio.h>

# include <conio.h>

void main (void)

{

int worker1, worker2, worker3; //Кол-во человек в бригадах

int weight1, weight2, weight3; //Вес яблок

char ch;

float cost; //Стоимость яблок

int num, w; //Номер бригады и вес яблок

clrscr();

weight1 = weight2 = weight3 = 0;

printf("Введите количество студентов в каждой бригаде\n");

scanf ("%d %d %d",&worker1,&worker2,&worker3);

fflush(stdin);

printf("Введите стоимость 1 кг. яблок \n");

scantf("%f",&cost);

fflush(stdin);

for(;;) {

printf("В. номер бригады и количество собранных яблок\n");

scanf("%d %d",&num,&w);

switch (num) {

 

case 1:

weight1 += w;

break;

case 2:

weight2 += w;

break;

case 3:

weight3 += w;

break;

default:

printf("Вы неверно ввели номер бригады\n");

}

printf("Для окончания нажмите клавишу q\n");

ch = getche();

if (ch == 'q')

break;

}

printf("Собрано яблок \n");

printf("1 б-й = %d, 2 б-й = %d, 3 б-й = %d\n”, weight1,weight2,weight3);

printf("Всего за день собрано %d яблок\n ",weight1+weight2+ weight3);

printf("Заработок в 1-й бригаде=%f\n", (float)weight1*cost/worker1);

printf("Заработок в 2-й бригаде=%f\n", (float)weight2*cost/worker2);

printf("Заработок в 3-й бригаде=%f\n", (float)weight3*cost/worker3);

}

 

МАССИВЫ

 

Одномерные массивы

Массив - это набор переменных, расположенных последовательно в памяти, имеющих одно имя и отличающихся друг от друга числовым признаком. Массивы необходимы, когда имеется большой объем данных.

Каждая переменная в массиве называется элементом. Каждый элемент в массиве имеет свой индекс - уникальный порядковый номер в массиве. Обращение к элементу массива осуществляется с помощью индекса. Индекс изменяются от 0 до n-1, где n размерность массива.

Чтобы определить массив в программе, необходимо:

указать тип данных в массиве;

1) указать имя массива;

2) в [ ] указать количество элементов в массиве.

Например:

float mas [20]; - объявляет массив mas, состоящий из 20 членов или элементов. первый элемент - mas [0], последний mas - [19].

mas [5] = 32.54; присваивание значения элементу массива;

float y = mas[5]; чтение в у содержимого последнего элемента массива.

Массивы могут быть образованы из данных любого типа. Одномерные массивы называются вектором, двумерные – матрицей.

В памяти ЭВМ массив float mas[3]; представлен так:

 
 

 


4b 4b 4b

Контроль компилятором на конец массива не осуществляется. Вы записываете данные в массив дальше, выйдя за границы массива, чем можете запортить следующие данные в памяти. Контроль за этим лежит целиком на программисте.

Многомерные массивы

 

Определяются в программе также как и одномерные с указанием размерности каждого индекса в квадратных скобках.

float rain[5][12];

Количество выделяемой памяти рассчитывается как 4*5*12 байт.

Каждый индекс изменяется от 0 до n-1. В памяти все элементы располагаются последовательно, но индексы меняются следующим образом:

 
 

 


Элементы двумерных массивов хранятся в памяти ЭВМ по строкам, то есть если перебирать элементы в порядке их хранения, то быстрее будет меняться правый индекс.

 

//Пример программы ввода кол-ва осадков помесячно за 5 лет и расчета среднего за каждый год и за 5 лет

void main(void){

int i,j;

float mas[5][12], sumyear, sum=0;

for (i=0; i<5; i++){

printf("Ввести кол-во осадков за %d год помесячно\n", i+1);

sumyear=0;

for (j=0; j<12; j++){

scanf ("%f",&mas[i][j]);

sumyear+=mas[i][j];

}

sum+=sumyear/12;

printf(Ср. за %d год = %.2f\n”,sumyear/12);

}

printf(Ср. за 5 лет = %.2f\n”,sum/5);

}

 

ФУНКЦИИ

 

Функция – самостоятельная единица программы, спроектированная для реализации конкретной задачи.

Функция – это фрагмент программы со своим именем, к которому можно обратиться многократно для выполнения необходимых действий.

Функция содержит как данные, так и операции над этими данными. Если для объекта имя ссылается на область памяти, где он хранится, то и имя функции ссылается на начало кода этой функции. Функции в Си играют ту же роль что и функции, программы, процедуры в других языках.

- они освобождают от повторного программирования, если конкретную задачу нужно решать в программе несколько раз.

- повышают уровень модульности программы, облегчают её чтение, внесение изменений, коррекцию ошибок.

Функции бывают библиотечные и пользовательские. Для использования библиотечных функций нужно указать заголовочный файл, в которых они объявлены. (директива #include).

 

Аргументы функции

 

Вернёмся к рассмотренной задаче. Пусть функция starbar() печатает любой символ, указанный в вызывающей программе. Он передается в функцию как аргумент.

 

#inсlude <stdio.h>

void starbar (char);

void main (void) {

starbar ('_'); - вызов функции

printf ("ПГУ");

printf ("им.Т.Г.Шевченко");

printf ("25 октября, 200");

starbar('#'); - вызов функции

}

void starbar (char x) { - определение функции

int count;

for (count=1; count<=65; count++)

putchar (x);

putchar ('\n');

}

 

Определение функции начинается с void starbar (char x) {

Переменная x - является формальным параметром. Это новая переменная и под нее должна быть выделена отдельная ячейка памяти. При вызове функции мы присваиваем форма









Что способствует осуществлению желаний? Стопроцентная, непоколебимая уверенность в своем...

Что будет с Землей, если ось ее сместится на 6666 км? Что будет с Землей? - задался я вопросом...

Система охраняемых территорий в США Изучение особо охраняемых природных территорий(ООПТ) США представляет особый интерес по многим причинам...

ЧТО ПРОИСХОДИТ, КОГДА МЫ ССОРИМСЯ Не понимая различий, существующих между мужчинами и женщинами, очень легко довести дело до ссоры...





Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2021 zdamsam.ru Размещенные материалы защищены законодательством РФ.