Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Комплексное пособие Си.pdf
Скачиваний:
57
Добавлен:
12.03.2015
Размер:
1.57 Mб
Скачать

Знакомство с языком 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