Основы программирования

Изучение основных правил формального описания синтаксиса языка программирования. Ознакомление с требованиями к байту перед вызовом функции. Исследование процесса организации данных в виде стека. Рассмотрение и характеристика примеров работы с файлами.

Рубрика Программирование, компьютеры и кибернетика
Вид курс лекций
Язык русский
Дата добавления 12.10.2016
Размер файла 156,4 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

1. Правила записи программы на языке Си

Как указывалось выше, программа перед обработкой компьютером должна быть помещена в файл на диске. Обычно этот файл имеет расширение <.c>.

Рассмотрим типичную структуру файла с программой на языке Си и правила его оформления на следующем простом примере:

/* Включить описания функций стандартного ввода-вывода */

#include <stdio.h>

/* Включить описания математических функций */

#include <math.h>

/* Другие включаемые файлы */

/* Собственно текст программы */

void main( void ) /* <-- заголовок главной функции */

{

float num; /* <-- описание типов данных */

/* Исполняемые операторы -* */

num = 2.345; /* Присвоим переменной num

значение 2.345 */

printf( " sin(%f) = %f\n", num, sin(num) ); /* Вывод на экран */

}

Любой файл начинается с директив #include, вставляющих в текст программы так называемые заголовочные файлы, которые содержат описания функций, используемых в этом файле. В нашем примере это описания стандартных функций ввода-вывода <stdio.h> и математических функций <math.h>.

Далее следует заголовок главной функции программы main, операторы описания типов данных и исполняемые операторы.

Директивы #include должны всегда начинаться с новой строки, остальные же операторы программы могут иметь произвольное положение в файле вплоть до записи в одну строку. При записи не допускается разрывать слова, числа, двухсимвольные операции.

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

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

/* Это комментарий */

// Это тоже комментарии.

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

- программы читаются людьми, компьютеру комментарии не нужны;

- всегда необходимы вводные комментарии, в которых указывается назначение программы, ее автор, дата написания и изменения, краткое описание алгоритма, входных и выходных данных, основных переменных и вызываемых функций;

- комментарии должны содержать дополнительную информацию, а не перефразировать программу;

- комментарии должны быть расположены так, чтобы программа не была менее наглядной;

- неправильные комментарии хуже, чем их отсутствие.

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

2. Правила формального описания синтаксиса языка программирования

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

- символы в кавычках переносятся в конструкцию языка так, как они записаны. Кавычки при этом отбрасываются. Например, "while" означает, что в конструкции языка присутствует while;

- имена, записанные слитно русскими и латинскими буквами, обозначают различные конструкции языка. Например, оператор_цикла;

- квадратные скобки охватывают элементы языка, которые могут повторяться 0 или 1 раз. Например, "AB"["C"] означает, что в конструкции языка может присутствовать или AB или ABC;

- фигурные скобки охватывают элементы языка, которые могут повторяться 0 или много раз. Например, "AB" { "C" } означает, что в конструкции языка может присутствовать или AB, или ABC, или ABCC и т.д.;

- символ | обозначает или, то есть используется для задания альтернативных значений, из списка элементов, разделенных знаком |. Например, "AB"|"C"|"ff" означает, что в конструкции языка может присутствовать или AB или C или ff;

- круглые скобки используются для группировки. Например, "A"("B"|"C")"D" означает, что в конструкции языка может присутствовать или ABD или ACD;

- многоточие используется для обозначения очевидных пропущенных значений в перечислении;

- символ = обозначает - слово есть. Например, буква = "A"|"B"|"C".

В дальнейшем, синтаксис языка Си будет описываться либо с помощью примеров, либо с помощью расширенной формы Бэкуса-Наура. В последнем случае это будет помечаться аббревиатурой БНФ.

3. Идентификаторы языка Си

Идентификаторы или имена служат для обозначения различных объектов программ: переменных (ячеек памяти), адресов, функций, файлов и т.д., иначе говоря - данных и действий над данными.

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

БНФ:

имя = ( буква | "_" ) { буква | цифра | "_" }

буква = |"A"|"B"|...|"Y"|"Z"|"a"|"b"|...|"y"|"z"

цифра = "0"|"1"|...|"9"

При этом прописные и строчные буквы считаются разными.

Длина имени в ANSI стандарте языка Си не ограничена. В Турбо Си имя не может быть длиннее 32 символов. Например: a, a1, _a, a_b.

Выбор имен должен производиться так, чтобы имя как можно точнее соответствовало смыслу объекта или действия, которое оно обозначает. Например: speed_of_body, SpeedOfBody, BodySpeed.

Экономия на длине имен - плохой стиль программирования.

4. Понятие о типах данных

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

4.1 Системы счисления. Представление данных в ЭВМ

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

Пусть, например, имеем запись числа

an ... a3 a2 a1 a0

тогда его значение можно вычислить по следующей формуле

an*Mn + ... + a3*M3 + a2*M2 + a1*M1 + a0*M0 ,

где an...a0 - цифры из записи числа.

Максимальное значение числа без знака, которое может быть представлено N разрядами позиционной системы счисления определяется как MN - 1.

В общепринятой десятичной системе счисления для записи чисел используются десять цифр 0,1,2,3,4,5,6,7,8,9. Основание системы счисления - 10. Значение числа определяется, например, так

9721 (10) = 9*103 + 7*102 + 2*101 + 1*100

В вычислительной технике, кроме десятичной, широко используются двоичная, восьмеричная и шестнадцатеричная системы счисления. Все данные внутри ЭВМ представлены в двоичной системе, поскольку в этом случае достаточно всего двух цифр, а электронные схемы, как правило, тоже имеют два различных состояния. Десятичная, восьмеричная и шестнадцатеричная системы используются при выводе информации для пользователя, недостающие цифры шестнадцатеричной системы счисления заменяются буквами A,B,C,D,E,F.

Приведем несколько примеров:

1010 (2) = 1*23 + 0*22 + 1*21 + 0*20 = 10 (10)

2701 (8) = 2*83 + 7*82 + 0*81 + 1*80 = 1473 (10)

F4A (16) = 15*162 + 4*161 + 10*160 = 3914 (10)

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

1473 : 8 = 184 остаток 1

184 : 8 = 23 остаток 0

23 : 8 = 2 остаток 7

2 : 8 = 0 остаток 2

1473 (10) = 2701 8

Перевод чисел из двоичной системы счисления в восьмеричную или шестнадцатеричную осуществляется путем разбиения двоичного числа на триады или тетрады и записи вместо них соответствующей восьмеричной или шестнадцатеричной цифры. Например:

0101 1011 1111 1100 (2) = 5BCF (16) = 23548 (10)

5 11=B 15=F 12=C

0 101 101 111 111 100 (2) = 55774 (8) = 23548 (10)

5 5 7 7 4

Обратное преобразование выполняется путем записи вместо восьмеричной или шестнадцатеричной цифры соответствующей двоичной триады или тетрады.

Целые беззнаковые числа хранятся в памяти ЭВМ в виде двоичных чисел, занимающих N двоичных разрядов. Диапазон чисел в этом случае от 0 до 2N-1. Целые числа со знаком, записанные в те же N двоичных разрядов будут иметь диапазон от -2(N-1) до 2(N-1)-1 .

Действительные числа хранятся в памяти ЭВМ в специальном формате с плавающей точкой. При этом часть двоичных разрядов ячейки хранит мантиссу числа со знаком, а другая часть - порядок числа. Диапазон действительных чисел определяется количеством двоичных разрядов, отведенных под порядок, а их точность - количеством разрядов под мантиссу.

Символы представлены в ЭВМ в виде соответствующих целочисленных кодов, хранимых в двоичной форме. Обычно под символ отводится один байт памяти, поэтому количество различных символов равно 28-1=255.

4.2 Основные типы данных языка Си

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

Назначение типа имени осуществляется с помощью описания типа.

БНФ:

описание_типа =

["const "] имя_типа " " имя ["=" константа]

{ "," имя ["=" константа] } ";"

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

Если в описании имеется знак "=" и константа соответствующего типа, то вместе с объявлением переменной происходит ее инициализация, то есть присваивание начального значения.

В языке Си предопределены несколько имен типов:

БНФ:

имя_типа = "int" | "short" | "long" | "char" |

"float" | "double"

int - целый длиной 2 байта, диапазон значений -32768 ... +32767;

short - целый короткий, для IBM PC аналогичен int;

long - целый длиной 4 байта, диапазон значений

char - символьный длиной 1 байт, его можно рассматривать как целое -128...+127 (иногда 0...255);

float - тип данных с плавающей точкой, длиной 4 байта, вещественное число с диапазоном значений от до и 6-ю значащими цифрами;

double - тип данных с плавающей точкой, длиной 8 байт, вещественное число с диапазоном значений от до и 14-ю значащими цифрами;

Примеры описаний:

int a, b=4, c; /* описывает целые переменные a,b,c */

/* и инициализирует переменную b */

float speed, line; /* описывает вещественные переменные */

/* speed, line */

const double pi=3.14159; /* описывается имя pi, которое */

/* используется как константа */

/* типа double */

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

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

4.3 Правила записи констант различных типов

Константы - это объекты данных, которые не меняют своих значений в процессе выполнения программы. Имя константы однозначно определяет и ее тип, и ее значение.

В простейшем случае в Си определены три типа констант: целые, вещественные, символьные. Рассмотрим правила их записи.

БНФ:

целая_константа =

( десятичная | восьмеричная |

шестнадцатеричная ) ["l"|"L"]

десятичная = цифра {цифра}

восьмеричная = "0" цифра8 {цифра8}

шестнадцатеричная = "0" ( "x" | "X" ) цифра16 {цифра16}

цифра8 = "0"|"1"|...|"7"

цифра16 = "0"|"1"|...|"9"|"A"|"B"|"C"|"D"|"E"|"F"

Обычно целые константы имеют тип int, добавление сзади константы буквы l или L обозначает константу типа long.

Пример правильных целых констант: 17, 012L, 0x35, 1235L

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

БНФ:

вещ_константа = цифра {цифра} "." {цифра}

[ "e" [ "+" | "-" ] цифра {цифра} ]

Пример правильных вещественных констант: 12e-33, 12.5, 128.05e-56, 54e23 .

Отрицательные вещественные константы получаются путем добавления знака "-" перед константой без знака. Значением вещественной константы является число, которое она обозначает.

Символьной константой является любой символ, заключенный в апострофы: 'A', 'c', 'd'. Значение символьной константы - величина целого типа, равная коду символа из таблицы кодов.

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

'\n' - символ перевода строки,

'\r' - символ возврата каретки,

'\t' - символ табуляции,

'\b' - символ возврата на шаг,

'\\' - обратная косая черта,

'\"' - кавычки,

'\0' - символ с кодом 0.

Несмотря на то, что специальные символы записываются с помощью двух символов, фактически определяется однобайтовая символьная константа.

Символ может быть представлен и его шестнадцатеричным кодом, перед которым необходимо поставить \x. Например: '\x4C'эквивалентно 'L' и т.д.

4.4 Беззнаковый тип для целых данных

Обычно целый тип охватывает и отрицательные и положительные значения. Например, тип int имеет диапазон значений от -32768 до 32767. Иногда отрицательные значения не нужны. Тогда имеется возможность вдвое увеличить диапазон положительных значений, т. е. от 0 до 65535. Это можно сделать если описать тип как беззнаковый.

БНФ:

имя_беззнакового_типа =

"unsigned "("int"|"long"|"short"|"char" )

Пример:

unsigned int ab, c, d;

4.5 Символьные строки

Последовательность символов, заключенная в двойные кавычки, представляет собой символьную строку. Двойные кавычки в строку не входят. Например, "Это строка символов". Первая кавычка указывает на начало строки, последняя на ее окончание.

Строка символов хранится в памяти ЭВМ как массив символов.

Массив символов представляет собой последовательность символов, расположенных в непрерывной области памяти и объединенных общим именем:

В конце строки символов компилятор ставит ноль-символ, т.е. символ, код которого равен 0. Он служит признаком конца строки.

Значение символьной строки - это адрес ее первого символа.

При трансляции программы компилятор разместит все символьные строки в памяти, а в программу вместо них подставит соответствующие адреса (т.е. значения символьных строк!).

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

БНФ:

описание_массива_символов =

"char " имя "["размер"]" { "," имя "["размер"]" } ";"

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

Пример:

char name[50], fio[81];

Переменная name способна хранить строку из 49 символов, fio из 80. Значениями переменной name и fio являются адреса областей памяти, выделенных для хранения соответствующих строк.

5. Понятие функции

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

Язык Си имеет мощные средства создания собственных функций пользователя. Однако на первых порах мы будем использовать стандартные готовые функции, предоставляемые нам библиотекой языка Си. Для вызова функции необходимо записать следующую конструкцию языка:

БНФ:

вызов_функции =

имя_ функции "(" [ аргумент { "," аргумент } ] ")"

Пример:

printf( "Это простое число %d", num );

Здесь имя функции "printf", функция имеет два аргумента, первый - строка символов, второй - переменная num.

Аргументы функции - это данные, которые передаются функции для обработки. Функция может не только получать аргументы, но и возвращать вычисленные значения:

A = sin( x );

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

A = sin(x) * cos(y);

n = printf( "%d", k ) + 5;

Функции sin и cos возвращают вычисленные значения синуса и косинуса, а функция printf возвращает количество выведенных на экран байт.

Основная функция, описанная как void main ( void ), не принимает аргументов и не возвращает значения (void - пусто).

5.1 Стандартная функция printf

Функция предназначена для вывода информации на стандартное устройство вывода (stdout), которым обычно является экран дисплея.

БНФ: "printf" "(" формат { "," аргумент } ")"

Формат - это адрес строки символов, которая выводится в стандартное устройство вывода.

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

%d - для вывода целых чисел;

%c - для вывода образа символа, соответствующий аргумент должен содержать код символа;

%f - для вывода вещественного числа в виде целой и дробной части;

%e - для вывода вещественного числа в виде мантиссы и порядка;

%g - для вывода вещественного числа в виде %f или %e в зависимости от значения числа;

%u - для вывода беззнакового целого числа в десятичной системе счисления;

%o - для вывода беззнакового целого числа в восмеричной системе счисления;

%x - для вывода беззнакового целого числа в шестнадцатеричной системе счисления;

%s - для вывода на экран символьной строки, соответствующий аргумент должен быть адресом строки (т.е. именем символьного массива или строковой константой).

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

БНФ: модификатор = ["-"] {цифра1} [ "." {цифра2} ][l]

Примеры спецификаций преобразований с модификаторами: %-20.6lf , %6d, %8.4f

Если присутствует "минус", то данные выравниваются по левой колонке поля, отведенного для вывода числа. Ширина этого поля определяется числом, составленным из цифр поля <цифра1>. Для вещественных чисел можно дополнительно задавать число знаков после запятой с помощью числа, составленного из цифр <цифра2>. Буква l в конце модификатора обозначает преобразование для длинных типов данных, т.е. long, unsigned long и double.

Функция printf возвращает число успешно выведенных байт информации.

Пример:

double a=-78.98;

int c=24;

printf("a=%8.4lf,c=%6d",a,c);

На экране: a=-78.9800,с= 24

5.2 Стандартная функция scanf

Функция предназначена для ввода информации со стандартного устройства ввода (stdin), которым обычно является клавиатура.

БНФ: "scanf" "(" формат { "," аргумент } ")"

Пример:

scanf( "%d", &n );

Перед именем аргумента функции подставляется знак &, который делает переменную n доступной для изменения. Строго говоря, операция & означает получение адреса объекта данных, т.е. мы сообщаем функции scanf информацию о том, где находится ячейка, в которую необходимо занести данные. При использовании функции scanf совместно с данными типа int, long, float, double, перед именем переменной всегда должен стоять знак &. При использовании функции для ввода символьной строки знак & не нужен, т.к. имя массива символов и так означает адрес.

Например:

char name[41];

scanf( "%s", name );

Функцию scanf рекомендуется использовать без лишних символов в формате, иначе может возникнуть непредсказуемая ситуация.

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

Функция scanf возвращает число успешно прочитанных элементов данных. Это свойство можно использовать для проверки правильности ввода.

Функцию scanf нужно использовать совместно с printf для вывода подсказки.

Например:

printf( "Введите ваше имя ");

scanf("%s", name );

6. Операции и выражения

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

Существует большое количество операций различных видов: арифметические, логические, битовые и т.д. Наиболее просты для понимания арифметические операции. Каждая операция характеризуется выполняемыми действиями и результатом операции.

6.1 Простейшие арифметические операции

Определены для данных арифметических типов, т.е. вещественных (float, double) и целых (int, short, long, char и соответствующих им беззнаковых данных unsigned int, unsigned short, unsigned long, unsigned char).

Действие этих операций - соответствующее арифметическое действие. Результат операции - результат арифметического действия.

Одноместные арифметические операции имеют один операнд. К ним относятся операции "+" и "-", которые меняют знак операнда.

Результатом этих операций является значение операнда с противоположным знаком.

Двуместные арифметические операции имеют два операнда. К ним относятся операции + , - , * , / и % . Каждая из этих операций выполняет соответствующее действие, результат которого и является результатом операции. Операция + вычисляет сумму операндов, операция - вычисляет разность, операция * вычисляет произведение, операция / вычисляет частное от деления вещественных операндов или целую часть частного от деления целых операндов, операция % вычисляет остаток от деления первого операнда на второй.

Арифметические операции в выражениях выполняются слева направо в соответствии с общепринятыми приоритетами. Приоритет можно изменить с помощью скобок.

Примеры выражений с арифметическими операциями:

a + b%c

(a + b)/3*5

6.2 Операция присваивания

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

Результат операции присваивания - значение присвоенной величины.

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

Например:

ab = ( c = d+5 ) * 6

Присваивание имеет самый низкий приоритет из всех операций.

6.3 Оператор-выражение

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

БНФ:

оператор = выражение ";"

Пример:

ab = ( c = d + 5 ) * 6; /* это оператор */

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

6.4 Использование в выражениях операндов разных типов

При участии в арифметических операциях операндов разных типов, перед выполнением операции осуществляется преобразование типов так, чтобы не было потери точности. Затем осуществляется сама операция.

Типы данных в порядке возрастания точности: char, short, int, long, float, double.

Пример:

int a, c;

float d, e;

e = d*(c+e); /* c будет преобразовано в float */

a = 'A' + 20; /* 'A' будет преобразовано в int */

6.5 Операции преобразования типов

В некоторых случаях правила преобразования типов не позволяют получить верный результат, например:

int a, b;

float c;

a = 7; b = 14;

c = a/b; /* результат 0 */

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

c = a; c = c/b;

А можно применить операцию преобразования типа:

БНФ:

преобразование_типа = "("имя_типа ")" выражение

имя_типа - название любого типа, в том числе и заданного программистом.

Для нашего примера применение операции преобразования типа будет выглядеть так:

c = (float)a / (float)b;

Операция преобразования типа имеет приоритет более высокий, чем арифметическая операция.

6.6 Стандартные математические функции

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

При использовании этих функций в программу необходимо включить файл <math.h>, т.е. необходимо использовать директиву #include <math.h> . При этом будут определены следующие функции:

sin(x) - синус (аргумент в радианах);

cos(x) - косинус (аргумент в радианах);

tan(x) - тангенс (аргумент в радианах);

asin(x) - арксинус (результат в радианах);

acos(x) - арккосинус (результат в радианах);

atan(x) - арктангенс (результат в радианах);

sinh(x) - гиперболический синус;

cosh(x) - гиперболический косинус;

tanh(x) - гиперболический тангенс;

log10(x) - десятичный логарифм;

pow10(x) - возведение числа 10 в степень x;

log(x) - натуральный логарифм;

exp(x) - экспонента;

sqrt(x) - квадратный корень;

pow(x,y) - возведение x в степень y;

fabs(x) - абсолютная величина для double;

abs(x) - абсолютная величина для int.

6.7 Простейшие функции, определяемые программистом

Довольно часто программист сталкивается с тем, что стандартных функций, нужных ему, нет. Например, в библиотеке Turbo C нет функции для вычисления котангенса. В этом случае программист сам может задать нужную ему функцию. Функция должна быть оформлена специальным образом. Описание функции начинается заголовком:

БНФ:

заголовок_функции =

тип имя_функции"("[тип параметр {"," тип параметр}]")"

Например, заголовок функции вычисления котангенса:

double cotan ( double x )

За заголовком функции должно следовать тело функции, т.е. операторы, реализующие функцию. При этом они оформляются подобно операторам основной программы, т.е. тело функции начинается с "{" и заканчивается "}".

Для возврата в вызывающую функцию и для передачи ей вычисленного значения используется оператор return.

БНФ: "return " [выражение];

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

double cotan( double x )

{

double ctg;

ctg = 1.0 / tan(x);

return ctg;

}

или

double cotan( double x )

{

return 1.0 / tan(x);

}

После того как функция определена, она может быть использована, так же как и стандартные функции Си, например можно записать:

a = b * cotan(c);

При этом значение c будет передано функции в качестве параметра x, затем будет вычислено выражение 1/tan(x) и передано в вызывающую программу в качестве значения функции cotan.

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

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

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

6.8 Дополнительные арифметические операции

Язык Си имеет ряд уникальных операций, как правило, отсутствующих в других языках программирования. К этим операциям относятся операция увеличения на единицу ++ и операция уменьшения на единицу. Например:

a = a + 1; эквивалентно a++; или ++a;

Выполнение операций "++" или "--" вызывает увеличение или уменьшение на единицу значения соответствующей переменной.

Результат операций может быть различным в зависимости от того, где находятся знаки операций: если используется постфиксная операция, т.е операция ++ или -- записана после переменной, то результатом операции будет значение переменной до увеличения или уменьшения. Иными словами переменная сначала используется в выражении, а затем увеличивается или уменьшается. Например:

a = 4;

b = ( a++ ) * 5; /* здесь b = 20 */

Если используется префиксная операция, т. е. операция ++ или -- записана перед переменной, то результат операции - значение переменной после увеличения или уменьшения. Иными словами переменная вначале увеличивается или уменьшается, затем используется в выражении. Например:

a = 4;

b = ( ++ a ) * 5; /* здесь b = 25 */

Приоритет операций выше, чем у * или /, но все равно рекомендуется ставить скобки, чтобы не запутаться.

6.9 Дополнительные операции присваивания

Очень часто в программах присутствуют операторы вида

a = a + b;

a = a - b;

a = a * b;

a = a / b;

Они изменяют значения некоторых переменных. В языке Cи для сокращения программ и повышения их эффективности используются дополнительные операторы присваивания:

a += b;

a -= b;

a *= b;

a /= b;

a %= b;

Дополнительные операции присваивания должны быть записаны слитно, без пробелов. Действие операции - изменение значения переменной, стоящей слева от знака операции. Результат - значение измененной переменной.

Дополнительные операции присваивания имеют самый низкий приоритет и выполняются справа налево.

Использование операций ++, --, +=, , , /=, %= вместо обычных не является обязательным, но их применение считается хорошим стилем программирования на языке Cи.

6.10 Битовые операции

Любые данные, записанные в память ЭВМ, как известно, представляют собой последовательность бит, т.е. последовательность нулей и единиц. Например, любое число типа int будет занимать 2 байта в памяти, т.е 16 бит. Его можно рассматривать двояко: либо как целое число ( так и делается при выполнении операций *,/, +, - , % ), либо как последовательность бит, что возможно при использовании битовых операций.

Битовые операции выполняются независимо над каждым битом данных. Если операция двуместная, то она выполняется над соответствующими битами операндов.

В Си имеются следующие битовые операции:

~ битовое отрицание (одноместная),

& побитовое "и" (двуместная),

^ побитовое "исключающие или" (двуместная),

| побитовое "или" (двуместная).

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

Результаты битовых операций

op1

op2

~op1

op1 & op2

op1 ^ op2

op1 | op2

0

0

1

0

0

0

0

1

1

0

1

1

1

0

0

0

1

1

1

1

0

1

0

1

Рассмотрим несколько примеров.

Первый пример показывает, как с помощью операции | можно установить в единицу выбранные биты операнда:

/* a = 00001001 = 9 */

char a, b; /* 00011010 = 26 */

a = 9; /* -------- */

b = a | 26 /* b = 31 */ /* b = 00011011 = 31 */

Следующий пример показывает, как с помощью операции & можно обнулить старшую часть байта:

char a, b; /* a = 00101101 = 45 */

a = 45; /* 00001111 */

b = a & 0x0F; /* -------- */

/* b = 00001101 = 13 */

К битовым операциям относятся операции сдвига << и >> :

a << b сдвиг битов переменной a влево на b позиций,

a >> b сдвиг битов переменной a вправо на b позиций.

Например:

char a, b;

a = 26; /* a = 00011010 = 26 */

b = a << 2; /* b = 01101000 = 104 */

Сдвиг влево равносилен умножению на 2 в соответствующей степени. Сдвиг вправо - делению на 2 в соответствующей степени.

Все битовые операции выполняются слева направо. В следующей строке приведены битовые операции в порядке уменьшения их приоритета.

~, << >>, &, ^, |

Для двуместных битовых операций определены дополнительные операции присваивания:

a <<= b; эквивалентно a = a << b,

a >>= b; эквивалентно a = a >> b,

a &= b; эквивалентно a = a & b,

a ^= b; эквивалентно a = a ^ b,

a |= b; эквивалентно a = a | b.

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

Представляют собой двуместные операции, предназначенные для сравнения операндов. В языке Си имеются шесть операций отношения:

> больше,

< меньше,

>= больше или равно,

<= меньше или равно,

== равно,

!= не равно.

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

Например:

int a,b;

a = 5;

b = ( a + 5 <= 4 ); /* b = 0 */

Из сказанного выше следует, что в языке Cи отсутствует специальный логический тип данных. Его заменяет целый тип, причем логическому понятию "ложно" соответствует значение 0, а логическому понятию "истина" - любое отличное от 0 целое число.

Операции отношения выполняются слева направо. При нечетком понимании их действия возможно получение, вообще говоря, неверного результата. Например, с точки зрения синтаксиса языка Си выражение a<x<b записано совершенно правильно, но действия, выполняемые в соответствии с ним будут отличаться от принятых в математике: сначала будет вычислено выражение a<x, которое даст результат 0 или 1, а затем этот результат будет сравниваться с b.

Чтобы это выражение соответствовало математическому смыслу, его нужно разбить на две части a < x и x < b и связать его логической операцией && ("и"), т.е. (a < x) && (x < b). Такая запись читается так : если a меньше x и x меньше b, то результат - истина.

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

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

! логическое отрицание (одноместная),

&& логическое "и" (двуместная),

|| логическое "или" (двуместная).

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

Результаты логических операций

op1

op2

!op1

op1 && op2

op1 || op2

0

0

не 0 (1)

0

0

0

не 0 (1)

не 0 (1)

0

не 0 (1)

не 0 (1)

0

0

0

не 0 (1)

не 0 (1)

не 0 (1)

0

не 0 (1)

не 0 (1)

Логические операции выполняются слева направо, причем для двуместных операций второй операнд может не вычисляться, если значение первого операнда однозначно определяет значение операции. Это происходит в том случае, если первый операнд для && равен 0 (результат операции тоже 0) и если первый операнд для || не 0 (результат операции тоже не 0).

6.13 Операция определения размера данных

В некоторых случаях совершенно необходимо иметь возможность определять размеры данных, создаваемых пользователем. Это позволяет писать программы, независимые от компьютера, на котором они выполняются, а также упростить процедуру внесения корректировок в программы. Для определения размера данных в языке Си используется операция sizeof. Первая форма операции выглядит следующим образом:

БНФ: "sizeof(" тип ")"

Результат этой формы операции - размер данного соответствующего типа в байтах, например, sizeof(float) даст в результате 4.

Вторая форма операции выглядит следующим образом:

БНФ:

"sizeof " имя_данного

Результат этой формы операции - размер памяти, отведенной под соответствующее данное в байтах, например, после описания массива символов char name[40];, операция sizeof name даст в результате 40.

6.14 Приоритеты операций

Приоритеты и направление рассмотренных выше операций сведены в следующую таблицу. Операции одинакового приоритета объединены в группы, чем выше положение группы в таблице, тем выше приоритет операций группы.

Таблица приоритетов рассмотренных выше операций

Операции одного приоритета

Направление выполнения операции.

! ~ ++ -- (тип) sizeof

* / %

+ -

<< >>

< <= > >=

== !=

&

^

|

&&

||

= *= /= %= += -= <<= >>= &= ^= |=

7. Понятие о препроцессоре языка Си

Препроцессором называется составная часть компилятора, которая производит обработку исходного текста программы перед ее трансляцией. Управление работой препроцессора осуществляется с помощью специальных директив. Все директивы препроцессора начинаются со знака #.

Ранее была рассмотрена директива include. Вместо нее в исходный текст программы препроцессор вставляет содержимое файла, указанного в директиве. Так, по директиве #include <stdio.h> в текст программы вставляет содержимое файла stdio.h, находящегося в специальном системном каталоге, а только потом происходит трансляция.

Если в директиве #include имя файла заключено в кавычки, то вставляемый файл вначале ищется по правилам, предусмотренным MSDOS, а только потом в специальном системном каталоге. Например, по директиве препроцессора #include "func.h" будет осуществлена вставка текста из файла func.h, находящегося в текущем каталоге текущего диска.

Директива #define используется для назначения символических имен различным строкам текста. Например, директива:

#define PI 3.14159

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

В принципе строка может быть сколь угодно сложной, например:

#define TITLE printf("-------sin(x)-------cos(x)-------");

Однако использовать такие конструкции не рекомендуется ввиду сложности отыскания ошибок.

8. Операторы языка Си и приемы программирования

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

Признаком конца оператора в простейшем случае является ";". Одиночная ";" является пустым оператором. Как было отмечено выше, точка с запятой поставленная в конце выражения превращает его в оператор.

Кроме простого оператора в языке Си вводится понятие составного оператора, который представляет собой несколько операторов, заключенных в фигурные скобки:

БНФ: составной_оператор = "{" оператор { оператор } "}"

Пример:

{ a = b + c; scanf( "%lf", &t ); }

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

Все операторы языка Си, кроме оператора-выражения начинаются с ключевых слов. Например, описания начинаются с int, double и т.д.

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

8.1 Оператор цикла while

Оператор цикла while предназначен для реализации циклических алгоритмов и имеет следующую форму записи

БНФ: "while" "(" выражение ")" оператор

Пример :

while( a < 18 ) a = a+2;

При выполнении оператора цикла while вначале вычисляется выражение. Если оно не равно 0, то выполняется оператор. Далее снова вычисляется выражение и если оно не равно 0, то снова выполняется оператор. Такие циклические действия продолжаются до тех пор, пока выражение отлично от 0. Отсюда и название цикла while ( пока ). Как только выражение станет равным 0 цикл прекращает выполнятся и управление передается на следующий за циклом оператор.

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

Все операторы тела цикла должны быть записаны с отступом, обычно в три пробела.

Рассмотрим пример программы, которая выводит на экран таблицу функций sin(x) и cos(x):

#include <math.h>

#include <stdio.h>

void main( void )

{

double x = 0;

while( x < 3.0 )

{

printf( "%6.3lf %9.6lf %9.6lf\n",x, sin(x), cos(x) );

x += 0.2;

}

}

Если после while( x < 3.0 ) ошибочно поставить точку с запятой, то никаких сообщений об ошибках выдано не будет, но цикл станет бесконечным. Действительно, в этом случае тело цикла будет пустым оператором ";", переменная x не будет меняться, следовательно, результат выражения x < 3.0 всегда будет отличен от нуля.

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

8.2 Условный оператор и условная операция

Условный оператор предназначен для выбора одного из двух альтернативных действий и имеет следующую форму записи:

БНФ:

условный_оператор =

"if" "("выражение")" оператор_1 ["else" оператор_2]

Пример:

if ( a ) c = b+1; else c = b - 1;

if ( a > b ) k = sin( x ); else k = x + x;

При выполнении условного оператора вначале вычисляется <выражение>. Если его значение не равно нулю, то выполняется <оператор_1>, а <оператор_2> пропускается. Если значение выражения равно нулю, то выполняется <оператор_2>, а <оператор_1> пропускается.

При наличии вложенных операторов if следует иметь в виду, что ключевое слово else всегда относится к ближайшему if, как показано в следующем примере:

if( b > a )

if( c < d ) k= sin(x);

else t = cos(x);

else c = tan( x );

Для того чтобы избежать ошибок рекомендуется использовать операторные скобки

if( b < a )

{

if( c < d ) k = sin( x );

else t = cos( x );

}

else c = tan( x );

Особенно это важно если у вложенного оператора if отсутствует else, т.е.

if( b > a )

if( c < d ) k = sin( x );

else c = tan( x ); /* else относится к

вложенному if */

if( b > a )

{

if( c < d ) k = sin( x );

}

else

c = tan( x ); /* else относится к первому if */

Если в качестве <оператора_1> или <оператора_2> используется группа операторов, то ее записывают как составной оператор, заключая ее в операторные скобки "{" и "}".

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

1) короткие операторы:

if( a > b ) k = sin( x ); else k = x*x;

if( a > b ) k = sin( x );

else k = x*x;

2) группы коротких операторов:

if( a > b ) { ... } else {... }

if( a > b ) { ... }

else { ... }

или

if( ... )

{ ..... }

else

{ ..... }

3) длинные группы операторов:

if(... )

{

}

else

{

}

4) множественный выбор:

if ( a == 6 ) { ... }

else if ( a == 8 ) { ... }

else if ( a == 15 ) { ... }

else if ( a > 20 && a < 28 ) { ... }

else { ... }

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

БНФ:

условное_операция = выр_0 "?" выр_1 ":" выр_2

Значение условной операции равно <выр_1>, если <выр_0> не равно 0 и <выр_2> в противном случае. Например, следующий оператор

if ( x>a ) f = sin( x-a ); else f = sin(x);

можно заменить условной операцией, и сразу вычислить f:

f = sin( x>a ? x-a : x );

Очевидно, в последнем случае получился более короткий код, поскольку обращений к переменной f и функции sin вдвое меньше.

8.3 Запись алгоритмов с помощью диаграмм Несси-Шнейдермана (структограмм)

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

Однако для тех, кто только начинает программировать, может понадобится более наглядное средство иллюстрации алгоритмов.

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

Для описания логики работы программ вместо блок-схем можно использовать диаграммы Несси - Шнейдермана, которые отличаются тем, что пригодны для описания только структуированных программ (состоящих из базовых логических структур).

Рассмотрим базовые логические структуры и их представление в виде структограмм.

Процесс - один или несколько операторов, выполнение которых происходит последовательно.

8.4 Некоторые приемы программирования

Рассмотрим некоторые типовые приемы программирования и использования рассмотренных выше операторов.

Для подсчета различных объектов, получающихся в процессе работы программы используют счетчики, которые представляют собой переменные целого типа, меняющие свои значения в процессе выполнения счета. Использование счетчика покажем на примере программы, которая подсчитывает количество отрицательных значений функции sin( x ) для x меняющегося от xn до xk с шагом h.

Программа на языке Си :

#include <math.h>

#include <stdio.h>

/* использование счетчика */

void main( void )

{

double xn, xk, h, x;

int Count; /* счетчик */

printf( "Введите xn, xk, h \n" );

scanf( "%lf%lf%lf", &xn, &xk, &h );

x = xn;

Count = 0; /* инициализация счетчика */

while( x <= xk )

{

if( sin(x) < 0 ) Count++; /* выполнение счета */

x += h;

}

printf( "Число отрицательных синусов = %d\n", Count);

}

Довольно часто в программах приходится вычислять суммы и произведения. При нахождении суммы надо выделить переменную для ее хранения, обнулить ее, затем циклически добавлять к ней очередное значение. Найдем сумму отрицательных значений функции sin(x) для x меняющегося от xn до xk с шагом h. Следующая программа решает эту задачу:

#include <math.h>

#include <stdio.h>

/* нахождение суммы отрицательных значений синуса */

void main( void )

{

double xn, xk, h, x, sum;

printf( "Введите xn, xk, h \n" );

scanf( "%lf%lf%lf", &xn, &xk, &h );

x = xn;

sum = 0; /* обнуление суммы */

while( x <= xk )

{

if( sin(x)<0 ) sum += sin(x); /* вычисление суммы */

x += h;

}

printf( "Сумма = %lf\n", sum);

}

Для повышения эффективности программы можно описать еще одну переменную, например sinus и изменить оператор вычисления суммы:

if( ( sinus = sin(x) ) < 0 ) sum += sinus;

В этом случае экономится время за счет однократного вычисления синуса.

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

Во многих сложных алгоритмах требуется запоминать факты наступления различных событий, связанных с процессом выполнения программы. Для этих целей используются флаги, которые представляют собой переменные целого типа, принимающие определенные значения в зависимости от этих событий. Простейший пример использования флагов иллюстрирует фрагмент программы, моделирующий работу оператора if с помощью оператора while. Иными словами, показывается, что при реализации программ можно вообще обойтись без оператора if. Действительно, рассмотрим следующий оператор if:

if( a > b ) k = sin(x); else k = x * x;

Очевидно, такие же действия будет выполнять группа операторов, использующая флаг и приведенная ниже:

fl = 1; /* флаг */

while ( a > b && fl ) { k = sin(x); fl = 0; }

while ( fl ) { k = x * x; fl = 0; }

В данном случае флаг сигнализирует о выборе одной из альтернатив оператора if.

Следующая программа устанавливает факт наличия отрицательных значений sin(x) для x меняющегося от xn до xk c шагом h :

#include <math.h>

#include <stdio.h>

/* использование флагов */

void main( void )

{

double xn, xk, h, x;

int minus; /* флаг */

printf( "Введите xn, xk, h \n" );

scanf( "%lf%lf%lf", &xn, &xk, &h );

x = xn;

minus = 0; /* предполагается, что нет не одного

отрицательного значения */

while( x <= xk )

{

if( sin(x) < 0 ) minus = 1;

x += h;

}

if( minus ) printf( "Имеются отрицательные значения\n" );

else printf( "Все синусы положительные\n" );

}

В данной программе флаг устанавливается в 1, как только появляется отрицательный синус.

8.5 Оператор прерывания цикла

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

x = xn;

minus = 0;

while( x < xk && !minus )

{

...

}

В языке Си есть специальный оператор для прерывания цикла. Это оператор "break;". Выполнение его в программе немедленно прерывает цикл, в котором он находится и управление передается на следующий за циклом оператор. Используя оператор break, цикл предыдущей программы можно переписать в виде:

x = xn;

minus = 0;

while( x < xn )

{

if( sin(x) < 0 ) { minus = 1; break; }

x += h;

}

8.6 Оператор продолжения цикла

Оператор "continue;" вызывает переход к следующей итерации цикла, т.е. к очередной проверке условия. Естественно, все операторы тела цикла, находящиеся между continue и концом тела цикла пропускаются.

Операторы break и continue позволяют избавиться от необходимости применения оператора goto, поэтому последний в этом методическом пособии не рассматривается.

8.7 Пример организации простейшего меню

Современный стиль программирования предписывает использовать в программах различного рода меню, которые предоставляют пользователю возможность выбора одного из предложенных действий. Следующая программа вычисляет sin(x), cos(x), tan(x) в зависимости от выбора пользователя:

#include <math.h>

#include <stdio.h>

/* Организация простейшего меню */

void main ( void )

{

int loop; /* Флаг, который сигнализирует о конце работы */


Подобные документы

  • Цели и задачи дисциплины "Технология программирования". Программные средства ПК. Состав системы программирования и элементы языка. Введение в систему программирования и операторы языка Си. Организация работы с файлами. Особенности программирования на С++.

    методичка [126,3 K], добавлен 07.12.2011

  • Понятие математического программирования. Класс как тип структуры, позволяющий включать в описание типа не только элементы данных, но и функции. Рассмотрение основных особенности языка программирования C++. Характеристика среды MS Visual Studio 2008.

    контрольная работа [318,0 K], добавлен 13.01.2013

  • Особенности способов описания языков программирования. Язык программирования как способ записи программ на ЭВМ в понятной для компьютера форме. Характеристика языка Паскаль, анализ стандартных его функций. Анализ примеров записи арифметических выражений.

    курсовая работа [292,0 K], добавлен 18.03.2013

  • История создания языка Java. Основные принципы объектно-ориентированного программирования. Структура, особенности синтаксиса и примеры прикладных возможностей использования языка Java, его преимущества. Перспективы работы программистом на языке Java.

    курсовая работа [795,9 K], добавлен 14.12.2012

  • Изучение способов организации консольного ввода/вывода данных в режиме черного экрана. Ознакомление со стандартными типами данных (целый, вещественный, символьный, логический) и методами описания переменных, использующихся на языке программирования С++.

    презентация [2,2 M], добавлен 17.04.2010

  • Изучение теоретических основ разработки программы и правил выбора языка программирования. Рассмотрение основных задач по созданию сайта автоклуба. Основы разработки базы данных, создания web-дизайна, текстового наполнения сайта и его публикации.

    курсовая работа [687,9 K], добавлен 07.04.2014

  • Изучение общей структуры языка программирования Delphi: главные и дополнительные составные части среды программирования. Синтаксис и семантика языка программирования Delphi: алфавит языка, элементарные конструкции, переменные, константы и операторы.

    курсовая работа [738,1 K], добавлен 17.05.2010

  • Рассмотрение и ознакомление с одним из наиболее используемых языков программирования - С++. Его применение в процессе работы со строковыми типами данных и символами. Исследование кодов написания программ в режиме разработки консольного приложения.

    курсовая работа [6,1 M], добавлен 20.01.2016

  • Ознакомление с ситуацией распространения на рынке языков программирования. Определение плюсов и минусов Pascal, C++, VBA. Сравнение и анализ синтаксиса программ на основе одной задачи. Выявление лучшего языка для освоения первоначальных навыков.

    курсовая работа [1022,0 K], добавлен 13.10.2014

  • Исследование базовых концепций программирования приложений под операционную систему Windows. Изучение истории создания универсального языка программирования Си. Разработка графического пользовательского интерфейса. Обзор правил игры и алгоритма работы.

    курсовая работа [58,2 K], добавлен 09.11.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.