- •Предисловие
- •Знакомство с языком C
- •Структура программы
- •Пример простой программы
- •Более сложный пример
- •Контрольные вопросы
- •Основные понятия, объявление переменных, типы данных
- •Объявление переменных
- •Примеры описаний переменных:
- •Основные типы данных
- •Производные типы.
- •Контрольные вопросы
- •Ввод/вывод с помощью функций printf() и scanf().
- •Модификаторы спецификаций преобразования используемые в функции printf()
- •Применение функции scanf()
- •Контрольные вопросы
- •Операции
- •Простейшие арифметические операции
- •Операция присваивания
- •Использование в выражениях операндов разных типов
- •Операции преобразования типов
- •Дополнительные арифметические операции
- •Дополнительные операции присваивания
- •Операции отношения
- •Логические операции
- •Приоритеты операций
- •Таблица 3. Таблица приоритетов рассмотренных выше операций
- •Контрольные вопросы
- •Операторы
- •Оператор-выражение
- •Ветвление
- •Условный оператор
- •Оператор switch
- •Оператор break
- •Циклы
- •Цикл while
- •Цикл do…while
- •Цикл for
- •Другие операторы
- •Оператор continue
- •Оператор goto
- •Оператор вызова функции
- •Контрольные вопросы
- •Обработка числовых последовательностей
- •Последовательная обработка
- •Обработка числовых последовательностей
- •Примеры
- •Контрольные вопросы
- •Последовательная обработка символьных данных
- •Символьные данные
- •Последовательная обработка символов
- •Функции getchar( ) и putchar( )
- •Контрольные вопросы
- •Обработка массивов
- •Массивы
- •Объявление массива
- •Использование и обработка массивов
- •Примеры
- •Контрольные вопросы
- •Указатели и динамические массивы
- •Указатели
- •Динамическое выделение памяти
- •Статические и динамические массивы
- •Контрольные вопросы
- •Подпрограммы
- •Описание подпрограмм
- •Параметры подпрограмм
- •Область действия переменных
- •Примеры
- •Контрольные вопросы
- •Рекурсивные функции
- •Понятие рекурсивной функции
- •Контрольные вопросы
- •Символьные строки и функции обработки строк
- •Посимвольная обработка строк
- •Пример программы
- •Контрольные вопросы
- •Структуры
- •Тип данных структура
- •Контрольные вопросы
- •Работа с файлами
- •Примеры
- •Контрольные вопросы
- •Массивы и функции как параметры
- •Указатели на функции
- •Массивы и указатели
- •Указатели и двумерные массивы
- •Пример
- •Технологии программирования
- •Структурное программирование
- •Модульное программирование
- •Объектно-ориентированное программирование
- •Компонентное программирование
- •Структурная декомпозиция задачи и разработка алгоритмов и программ методами сверху вниз и снизу вверх
- •Контрольные вопросы
- •Модульное программирование
- •Работа с графикой на языке C и модуль graphics.h
- •Типы видео мониторов и их режимы
- •Инициализация графики
- •Система координат
- •Основные графические функции
- •Функции рисования
- •Функции изменения параметров рисования
- •Шаблоны линий
- •Шаблоны закраски
- •Задание на расчетно-графическую работу
- •Порядок выполнения работы
- •Задание
- •Задание для вариантов 1-11
- •Задание для вариантов 12-20
- •Задание для вариантов 21-40
- •Пример исходных данных для вариантов 12-16
- •Задание для вариантов 41-60
- •Варианты индивидуальных заданий
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Вариант 11
- •Вариант 12
- •Вариант 13
- •Вариант 14
- •Вариант 15
- •Вариант 16
- •Вариант 17
- •Вариант 18
- •Вариант 19
- •Вариант 20
- •Вариант 21
- •Вариант 22
- •Вариант 23
- •Вариант 24
- •Вариант 25
- •Вариант 26
- •Вариант 27
- •Вариант 28
- •Вариант 29
- •Вариант 30
- •Вариант 31
- •Вариант 32
- •Вариант33
- •Вариант 34
- •Вариант 35
- •Вариант 36
- •Вариант 37
- •Вариант 38
- •Вариант 39
- •Вариант 40
- •Вариант 41
- •Вариант 42
- •Вариант 43
- •Вариант 44
- •Вариант 45
- •Вариант 46
- •Вариант 47
- •Вариант 48
- •Вариант 49
- •Вариант 50
- •Вариант 51
- •Вариант 52
- •Вариант 53
- •Вариант 54
- •Вариант 55
- •Вариант 56
- •Вариант 57
- •Вариант 58
- •Вариант 59
- •Вариант 60
- •Задания на курсовую работу
- •Требования к курсовой работе
- •Этапы разработки программ
- •Содержание отчета по курсовой работе
- •Задания к курсовой работе
- •Литература
- •Функции консольного ввода/вывода
- •Функции обработки строк
- •Функции преобразования данных
Знакомство с языком C
В1972 году Керниганом и Ритчи в фирме Bell Labs был создан язык программирования C. Он создавался как язык для разработки операционной системы UNIX. Он представлял собой дальнейшее развитие языка Би (B), который основывался на созданном в Кембриджском университете языке
BCPL (от Basic Combined Programming Languageбазовый комбинированный язык программирования), который в свою очередь был потомком Алгола-60.
C часто называют «переносимым ассемблером», имея в виду то, что он позволяет работать с данными практически так же эффективно, как на ассемблере, предоставляя при этом структурированные управляющие конструкции и абстракции высокого уровня (структуры и массивы). Именно
сэтим связана его огромная популярность и поныне. И именно это является его ахиллесовой пятой. Компилятор C очень слабо контролирует типы, поэтому очень легко написать внешне совершенно правильную, но логически ошибочную программу.
В1986 году Бьярн Страуструп создал первую версию языка C++, добавив в язык C объектно-ориентированные черты, взятые из Simula, и исправив некоторые ошибки и неудачные решения языка. C++ продолжает совершенствоваться и в настоящее время, так в 1998 году вышла новая (третья) версия стандарта, содержащая в себе некоторые довольно существенные изменения. Язык стал основой для разработки современных больших и сложных проектов. У него имеются, однако же, и слабые стороны, вытекающие из требований эффективности.
В1995 году в корпорации Sun Microsystems Кеном Арнольдом и Джеймсом Гослингом был создан язык Java. Он наследовал синтаксис C и C++ и был избавлен от некоторых неприятных черт последнего. Отличительной особенностью языка является компиляция в код некоей абстрактной машины, для которой затем пишется эмулятор (Java Virtual Machine) для реальных систем. Кроме того, в Java нет указателей и
9
множественного наследования, что сильно повышает надежность программирования.
В 1999–2000 годах в корпорации Microsoft был создан язык C#. Он в достаточной степени схож с Java (и задумывался как альтернатива последнему), но имеет и отличительные особенности. Ориентирован, в основном, на разработку многокомпонентных Интернет-приложений.
Структура программы
Любая программа на языке С состоит из одной или более "функций", являющихся основными компонентами программы. Одна из функций, с которой начинается выполнение программы, называется главной и всегда носит имя main. Остальные функции – это подпрограммы, которые могут вызываться либо из главной функции, либо из других подпрограмм. Простая программа, состоящая только из функции main, имеет следующую структуру:
<Директивы препроцессора> main ()
{<Описания переменных> <Операторы>
}
Заголовок функции - main(). Круглые скобки после имени main как раз и указывают, что это функция. Тело функции заключается в фигурные скобки и состоит из объявлений переменных и операторов, опиcывающих процесс обработки данных.
В программу можно включать комментарии, начинающиеся с пары символов /* и заканчивающиеся парой */ (они могут быть везде, где могут быть пробелы).
Пример простой программы
/* Сложение двух целых чисел */
10
#include <stdio.h> |
|
|
main () |
целочисленных переменных а и b */ |
|
{ int a, b; /* объявление |
||
printf ("Задайте два числа: "); /* вывод сообщения |
*/ |
|
scanf ("%d %d", &a, &b); |
/* ввод значений а и b |
*/ |
printf ("%d + %d = %d\n", |
a, b, a+b); /* вывод результата */ |
|
return 0; |
|
|
} |
|
|
При выполнении этой программы на экране появится сообщение:
Задайте два числа:
и затем программа будет ждать, пока вы не введете числа (ввести можно в той же строке, разделяя числа пробелом). Например:
Задайте два числа: 328 54
Затем появится результат в виде:
328 + 54 = 382
В этой программе директива препроцессора #include <stdio.h> служит для включения в программу библиотечного файла stdio.h, содержащего
объявления стандартных |
функций ввода/вывода, таких как printf, scanf. |
|
Тело функции main содержит три оператора вызова функций printf |
и scanf. |
|
Обратите внимание, |
что все ключевые слова в языке Си |
пишутся |
строчными буквами, директивы препроцессора начинаются с символа #. Для наглядности принята ступенчатая форма записи программы.
Считается, что программы, работающие под управлением операционной системы MS DOS, должны вернуть системе код завершения 0 в случае успешного выполнения и любой другой в случае ненормального завершения. Поэтому функция main() заканчивается оператором возврата значения return 0;
Более сложный пример
#include <stdio.h> #include <stdlib.h> #define PROMPT ':'
main()
{
float a,b,rez; char oper;
while(putch(PROMPT),scanf("%f%c%f",&a,&oper,&b)!=EOF)
11
{
switch (oper)
{
case '+': rez=a+b; break; case '-': rez=a-b; break; case '*': rez=a*b; break; case '/': rez=a/b; break; default:
printf("Ошибка!\n"); exit(1);
}
printf("Результат:%f\n",rez)
}
}
Первые две строки программы
#include <stdio.h> #include <stdlib.h>
используются для подключения двух библиотек стандартных функций. Первая содержит функции ввода-вывода, такие как putch(), scanf(), printf(). Вторая – функцию exit() и другие …
Строка
#define PROMPT ':'
объявляет, что имя PROMPT обозначает символьную константу ':'. В языке Си различаются строчные и прописные буквы, поэтому необходимо писать все имена одинаково во всей программе, в частности, имя prompt будет обозначать уже какой-то другой объект, а не тот который обозначается именем PROMPT или именем Prompt.
В следующей строке начинается функция main(). Программа на языке Си представляет собой набор из нескольких функций (возможно, что только одну функцию) одна из которых называется main(). Именно с этой функции начинается выполнение программы. Круглые скобки после имени функции пишутся всегда, в том числе и когда у функции нет параметров (как в нашем случае). Скобки являются признаком того, что main – это имя функции.
Тело функции заключается в фигурные скобки {}, это аналог begin…end из Паскаля.
12
Строки
float a,b,rez; char oper;
описывают переменные, используемые в функции main(). Это три вещественные (тип float) переменные a, b, rez – исходные числа и результат и символьная переменная oper – операция, которую необходимо выполнить.
Цикл while производит повторяющийся ввод данных, вычисление и вывод результата. Повтор этих действий осуществляется до тех пор, пока условие цикла не станет ложным. Условие записано в круглых скобках после ключевого слова while следующим образом:
putch(PROMPT),scanf("%f%c%f",&a,&oper,&b)!=EOF
Оно состоит из двух частей, разделенных запятой. Значение такого выражения всегда совпадает со значением его второй части. Однако, первая часть выражения тоже вычисляется (выполняется). Здесь первая часть условия осуществляет вывод на экран символа ':', заданного константой
PROMPT.
Вторая часть условия состоит из обращения к функции форматированного ввода scanf(), которая вводит три параметра: первый операнд вычисляемой операции, саму операцию и второй операнд. Первым параметром функции является управляющая строка, которая говорит о том, какие значения вводятся. Запись %f%c%f означает, что сначала вводится вещественное число, затем символ, затем снова вещественное число. Т.е. вычисляемое выражение вводится без пробелов между числом и знаком операции (пробел тоже символ и, если его поставить после первого числа, то операцией будет ' ', а второе число вообще не будет введено, т.к. на его месте окажется символ операции), например, так:
2.5+5.7<Enter>
13
Обратите внимание на то, что параметры записываются в виде &<имя переменной>. Операция & означает получение адреса переменной, т.е. параметрами функции scanf() являются адреса переменных в которые необходимо записать вводимые значения.
У функции scanf() есть возвращаемое значение, которое в данном условии сравнивается с константой EOF, обозначающей символ конца файла. Операция != означает "не равно". Таким образом, цикл будет выполняться до тех пор пока вместо вычисляемого выражения не будет введен символ конца файла:
<Ctrl+z><Enter>
В теле цикла с помощью оператора switch (аналог case из Паскаля) анализируется введенное значение операции (переменная oper). Если значение совпадает с одним из значений, указанных в последующих строках после ключевого слова case, то выполняются операторы написанные в соответствующей строке после символа ':'. Первый оператор вычисляет заданное выражение. Оператор break служит для прекращения выполнения оператора switch. Если его пропустить, то будут выполняться все последующие операторы, записанные в других разделах оператора switch.
Операторы, записанные в разделе default, будут выполнены, если значение переменной oper не совпадет ни с одним значением, приведенным в разделах case. В нашем случае это будет означать, что выражение было введено неправильно. Тогда с помощью функции форматированного вывода printf() на экран будет выведено сообщение об ошибке и с помощью функции exit() программа завершит свою работу.
Если выражение было введено правильно, то программа продолжает свою работу и выводит на экран результат вычисления выражения:
printf("Результат:%f\n",rez)
Первым аргументом функции printf() является управляющая строка. В ней можно написать обычный текст (Результат:), который будет выведен на
14