next up previous
Next: Циклы. Up: Лабораторный практикум по информатике Previous: Типы данных.

Библиотечные функции.

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

Подключение библиотек осуществляется путем указания компилятору ее имени, например, чтобы подключить математическую библиотеку, при компиляции надо указать >cc Имя программы -lm, т.е. поставить ключ -lИмя библиотеки.

Каждая библиотека содержит набор большого количества функций, собранных по пакетам, подключение которых осуществляется при помощи специальной записи в начале файла, имеющей вид #include <Имя заголовочного файла> для стандартных библиотек или #include "Имя заголовочного файла" для подключаемых файлов, созданных пользователем (т.е. большой проект можно разбить на несколько мелких файлов и указать главному файлу, что их надо подключить на завершающем этапе компиляции -- связке).

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

Основные функции, необходимые для преобразования типов данных и некоторых других действий, содержатся в модуле stdlib. Модуль stdio позволяет работать с файлами, и, как следствие, многими устройствами (которые, как вы помните, представляются в ОС Linux как файлы), а также с консолью (набранный вами текст попадает в файл стандартного ввода, а отображаемый на экране получается из файла стандартного вывода). Для математических вычислений используется библиотека math. Это -- основные библиотеки, которые нам понадобятся. Кроме них существует множество специальных библиотек, но для познания основ С они не обязательны.

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

Простейшие программы. Hello World! (Здравствуй, мир!). Итак, приступим к познанию С со стандартной программы, выводящей на экран надпись "Hello World!". В С существует множество операторов вывода, в данном случае нам больше всего подойдет printf (вывод на экран по формату). Если вы хотите узнать что-либо по конкретной стандартной функции, вызовите ее man-страничку командой man <команда> (так же, как это можно узнать для любой команды Linux).

Создайте в своей рабочей папке папку ,,С''. Создайте в ней текстовый файл HelloWorld.c и откройте его любым редактором (в Bash можно, войдя в эту папку, сразу набрать mcedit HelloWorld.c или kedit HelloWorld.c, тогда редактор сам создаст нужный файл и откроется для его редактирования.

Создание папки -- mkdir Имя, создание файла -- touch Имя.

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

#include <stdio.h>             // Подключим стандартные функции ввода-вывода

int main(){                    /* Главная функция */
    printf("Hello, World!\n"); // Выведем на экран надпись ,,Привет, мир!''
    return 0;                  // Выход из программы
}
Обратите внимание на то, что в языке С комментариями является весь текст строки, стоящий после символа двойного слэша (//), а также весь текст, независимо от количества занимаемых им строк, стоящий между символами /* и */.

Запись \n говорит о том, что после фразы ,,Hello, World!'' необходимо вставить знак переноса строки, чтобы после окончания программы приглашение Bash не оказалось на одной с ней строчке.

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

Составьте блок-схему программы.

Набрав и сохранив текст программы, нам следует откомпилировать его. Можно просто набрать >cc HelloWorld.c, тогда компилятор создаст исполняемый файл a.out, но лучше указать компилятору ключ -o, который поместит готовую к выполнению программу в файл, указанный после ключа:

>cc HelloWorld.c -o Hello
создаст файл Hello. Запустите его командой ./Hello. Указывать ./ перед именем программы нужно для того, чтобы Bash знала, что данный файл нужно искать в текущей папке, а не в папках, в которых по умолчанию хранятся программы.

Ввод, условный оператор. Обычно программа должна выполнять какие-то действия в ответ на действия пользователя или введенные им данные. Ввести данные в программу можно как при ее запуске (параметрами командной строки), так и в процессе ее выполнения при помощи функций >etchar, scanf и им подобных.

Функция >etchar считывает одну букву и возвращает ее код, функция scanf имеет такой формат: scanf("формат", список переменных), где формат -- описание типа данных, вводимых пользователем (например, td означает целое число), список переменных -- разделенный запятыми список переменных, которые должен ввести пользователь (на каждую переменную должен быть указан ее формат, форматы разделяются через пробел).

Более подробно о стандартных функциях можно узнать из их man-страниц (man функция).

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

В С структура условного оператора выглядит так:

if (Условие) действия1;
else действия2;
Если Условие истинно, выполняются действия1 (если их много, следует заключить их в блок {}), иначе выполняются действия2.

Составьте блок-схему алгоритма программы. Если возникнут затруднения, внимательно просмотрите ее текст (ниже).

Теперь создайте файл if.c и наберите в нем текст программы.

#include <stdlib.h>
int a,b;                                               // Резервируем память для переменных

int main(){
    printf("Введите значения a и b (через пробел)\n");
    scanf("%d %d",&a,&b);                              // Запрашиваем данные
    if(a>b) printf("a больше b\n");                    // И проверяем условие
    else{ 
        if(a<b) printf("b больше а\n");
        else printf("a и b равны\n");}
    return 0;
}

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

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

Префиксные и постфиксные операции. Циклы. Допустим, у нас есть какой-то счетчик i и нам надо увеличивать его на 1 каждый раз, когда происходит какое-то событие. Можно, конечно, записать i = i + 1;, но более наглядно (да и короче) было бы написать, используя оператор инкремента ++: ++i;. Кроме того, существует еще оператор декремента -, уменьшающий на 1 значение счетчика: -i;.

Для сокращения записей можно использовать операторы +=, -=, *=, /= и t=. Запись x @= y означает то же самое, что x = x @ y, где знак @ -- одна из операций + - * / %. Оператор t возвращает остаток от деления первого числа на второе.

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

#include <stdlib.h>
int x,y;

int main(){
    x = 1; y = 1;
    printf("x = %d, y = %d\n", x, y);          // x=1, y=1
    printf("++x = %d, y++ = %d\n", ++x, y++);  // x=2, y=1
    printf("x = %d, y = %d\n", x, y);          // x=2, y=2
    printf("--x = %d, y-- = %d\n", --x, y--);  // x=1, y=2
    printf("x = %d, y = %d\n", x, y);          // x=1, y=1
    return 0;
}
Наберите программу, откомпилируйте ее и посмотрите результат выполнения.

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

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



Edward V. Emelianoff 2007-04-25
Hosted by uCoz