Методические указания icon

Методические указания




Скачати 192.31 Kb.
НазваМетодические указания
Дата04.07.2012
Розмір192.31 Kb.
ТипМетодические указания


Министерство образования и науки Украины

Сумский государственный университет


МЕТОДИЧЕСКИЕ УКАЗАНИЯ

к выполнению курсовой работы

по дисциплине “Программирование в Unix”

для студентов специальности “Информатика”

заочной формы обучения


Сумы

Изд-во СумГУ

2006

Учебное издание


МЕТОДИЧЕСКИЕ УКАЗАНИЯ

к выполнению курсовой работы

по дисциплине “Программирование в Unix”

для студентов специальности “Информатика”

заочной формы обучения


Кафедра информатики


Составитель М.С.Бабий


Ответственный редактор С.Н.Симоненко

Редактор Н.А. Кравченко

Ответственный за выпуск В.А. Любчак


Подп. в печать 01.06.2006, поз. 107

Формат 60х84/16. Бумага офс. Печать офс.

Усл. печ. лист. 1,86 Уч.-изд. лист. 1,32

Тираж 60 экз. Себестоимость изд. 1 грн. 76 к.

Зак. № 420 .


Издательство СумГУ при Сумском государственном университете.

40007, Сумы, ул. Римского-Корсакова, 2

Свидетельство о внесении субъекта издательского дела в Государственный реестр ДК № 2365 от 08.12.2005.

Напечатано в типографии СумГУ

40007, Сумы, ул. Римского-Корсакова, 2.


СОДЕРЖАНИЕ


C.

1 Основы работы с Unix . . . . . . . . . . . . . . . . 4

2.Редактирование исходных файлов программы . . . . 7

3 Компиляция и запуск программы на C++ . . . . . . 9

4 Файловые функции Unix . . . . . . . . . . . . . . . 10

5 Пример программы для обработки файла . . . . . . 12

6 Межмашинное взаимодействие . . . . . . . . . . . . 15

7 Функции для программирования сокетов . . . . . . 16

8 Программа создания виртуального канала . . . . . . 18

9 Создание порожденного процесса . . . . . . . . . . 21

10 Программные каналы . . . . . . . . . . . . . . . . . 24

11 Задания на курсовую работу . . . . . . . . . . . . . 26

СПИСОК ЛИТЕРАТУРЫ . . . . . . . . . . . . . . . . 31


1 Основы работы с Unix


Для выполнения курсовой работы подходит любая версия Unix с установленным компилятором с языка C++, в том числе и эмулятор Cygwin для системы Windows. В последнем случае при инсталляции нужно открыть раздел Devel и изменить для строки “gcc: C, C++, Fortran compilers” режим установки на “Keep”.

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


man

Справка о команде.

Пример.

man cp


ls

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


cd

Переход в другой каталог.

Примеры.

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

cd / - переход в корневой каталог.

cd /usr/local/bin - переход в указанный каталог.

cd ../ - переход в родительский каталог.


pwd

Вывод имени текущего каталога.


cp

Копирование файлов и каталогов.


Примеры.

cp file1 file2

cp file1 /archive

cp file1 /archive/newfile

cp file1 file2 /archive - файлы file1, file2 копируются в каталог /archive.

cp -R dir1 /dir2 - рекурсивное копирование каталогов: все содержимое dir1 копируется в новый каталог dir2, если dir2 существует, в нем создается новый каталог dir1.


mkdir

Создание каталога.

Пример.

mkdir dir1


mv

Переименование и перемещение файлов и каталогов.

Примеры.

mv file1 file2 - переименование файла.

mv /dir1 /dir2 - переименование каталога. Если dir2 существует и не пустой, переименования не происходит.

mv file1 /dir2 - перемещение.

mv file1 /dir2/abc - если abc – каталог, file1 перемещается в abc. Если abc не существует, file1 перемещается в dir2 под именем abc.


rm

Удаление файлов и каталогов.

Примеры.

rm file1 - удаление файла.

rm file1 file2 - удаление двух файлов.

rm -R dir1 - удаление каталога dir1 и всего, что в нем находится.


rmdir

Удаление каталогов. Эта команда удаляет лишь пустой каталог. Команда с опцией -p удаляет каталог с пустыми подкаталогами.


touch

Служит двум целям: созданию пустого файла и обновлению даты создания файла.

Пример.

touch file1


find

Поиск файла.

Пример.

find . –nane "lost*" - поиск файлов, имя которых начинается с подстроки “lost”. Поиск выполняется, начиная с текущего каталога. Если поиск нужно начать с корневого каталога, в команде ставится знак “/”.

2 Редактирование исходных файлов программы


Исходные файлы могут быть подготовлены в любом текстовом редакторе. При этом для символов кириллицы желательно использовать кодировку KOI-8.

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

Сразу после запуска редактор находится в командном режиме. В этом режиме нажатия клавиш интерпретируются как команды редактору, а не как текст. Чтобы переключиться в режим ввода текста, необходимо нажать одну из клавиш: a, i или o.

Клавиша a означает append (добавить). В этом режиме вводимый текст будет вставлен после символа, на котором находится курсор.

Клавиша i означает insert (вставить). Вводимый текст будет вставлен перед символом, на котором находится курсор.

Клавиша o означает open (открыть).После строки, на которой находится курсор, в текст будет вставлена новая строка, и курсрор перейдет на новую строку. Есть еще команда O, которая добавляет пустую строку над текущей строкой.

Переход из режима ввода текста в командный режим выполняется клавишей Esc.


Команды редактирования текста

D - удаляет текст от позиции курсора до конца строки.

dd - удаляет текущую строку.

число dd - удаляет несколько строк, начиная с текущей.

r символ – заменяет символ в позиции курсора символом, указанным за r.

x - удаляет символ в позиции курсора и сдвигает следующие за ним символы влево.

~ - заменяет букву в позиции курсора той же буквой другого регистра.

J - объединяет текущую строку с предыдущей.


Операции над файлами

:w - сохраняет изменения в текущем файле.

:w имя_файла - сохраняет текст в файле с указанным именем.

:q - осуществляет выход из программы. Если имеются несохраненные изменения, редактор выдает сообщения об этом и программа не закрывается.

:q! - осуществляет выход из программы, даже если имеются несохраненные изменения. Изменения при этом теряются.

:e имя_файла – загружает заданный файл в редактор.


Копирование текста

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

yw - помещает в буфер символы от позиции курсора до конца слова.

y$ - помещает в буфер текст от текущей позиции курсора до конца данной строки.

yy - помещает в буфер всю строку.

число yy - помещает в буфер несколько строк, начиная с текущей.


Для вырезания текста используется команда d.

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

3 Компиляция и запуск программы на C++


Для проверки работы компилятора g++ можно набрать простейшую программу на языке Си.


#include

int main()

{

printf ("Hello");

}


Сохраним файл под именем a.cpp.

Компиляцию программы выполним командой


g++ a.cpp -o a.out .


Здесь опция –o определяет имя выходного исполняемого файла.

Запуск программы на выполнение выполним командой


./a.out .


Программа должна выдать приветствие Hello.


4 Файловые функции Unix


Для работы с файловой системой используются следующие функции Unix [2]:


int open (const char* path, int acces_mode, int permission) -прототип функции находится в fcntl.h, path – путь, permission обычно 0.

Флаги режима доступа: O_RDONLY – для чтения, O_WRONLY – для записи, O_RDWR – для чтения и записи.

Существует также модификатор доступа, например O_CREAT – если файл не существует, он создается.

Функция возвращает дескриптор файла или -1 при ошибке.


int creat (const char* path, int acces_mode) – упрощенный вариант создания файла.


long read (int fdesc, void* buf, int size) – читается блок данных из файла.

Прототип находится в unistd.h, fdesc – файловый дескриптор, buf – адрес буфера, содержащего прочитанные данные, size – количество байтов, которое нужно прочитать из файла.

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


long write (int fdesc, const void* buf, int size) – записывает блок данных в файл.

Прототип - в unistd.h, параметры как в read.

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

long lseek (int fdesc, long pos, int whence) – изменяет текущую позицию указателя чтения-записи в файле.

Прототип - в unistd.h, pos – задает смещение в байтах, которое должно быть прибавлено к базовому адресу для получения нового смещения. Параметр whence задает базовый адрес:

SEEK_CUR – текущий адрес указателя в файле;

SEEK_SET – начало файла;

SEEK_END – конец файла.

Функция возвращает смещение.

5 Пример программы для обработки файла


Программа имеет следующие режимы работы:

1 - создание файла, состоящего из записей следующего содержания: наименование компьютерной техники, количество, цена;

2 - корректировка файла, состоящая в изменении цены конкретного устройства;

3 - просмотр содержания файла.


#include

#include

#include

#include

#include

#define STOP ""

struct UNIT

{ char name[20]; int amount;

float price;} work;

int len = sizeof(UNIT);

int fdesc;

char fname[] = "list";


void sozd()

{

fdesc=open (fname, O_WRONLY);

for(int i=1;i<10;i++)

{ puts ("Введите наименование: ");

getchar();

gets (work.name);

if (strcmp(work.name, STOP) == 0) break;

puts ("Введите количество и цену: ");

scanf ("%i%f", &work.amount, &work.price);

write(fdesc, &work, len);

}


close (fdesc);

}


void correct()

{

char s[20]; float c;

puts ("Введите наименование: ");

getchar();

gets(s);

puts ("Введите новую цену: ");

scanf("%f",&c);

fdesc=open (fname, O_RDWR);

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

{ int res = read(fdesc, &work, sizeof(UNIT));

if (res==0) break;

if (strcmp(work.name, s) == 0)

{ work.price = c;

lseek(fdesc, -len, 1);

write (fdesc, &work, len);

break;

}

}

close(fdesc);

}


void vyvod()

{

fdesc=open (fname, O_RDONLY);

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

{ int res = read(fdesc,&work, len);

if (res == 0) break;

printf ("name=%s; amount=%i; price=%f;\n",

work.name, work.amount, work.price);

}

close(fdesc);

}


void main()

{

int r;

puts ("Режимы работы:");

puts ("1 - создание файла; 2 - корректировка ; 3 - вывод");

puts ("Введите режим: ");

scanf ("%i", &r);

switch (r) {

case 1 : sozd(); break;

case 2 : correct(); break;

case 3 : vyvod(); break; }

}


6 Межмашинное взаимодействие


Межмашинное соединение чаще всего реализуется с помощью сокетов [2].

Различают сокеты с установлением соединения и без установления соединения. В зависимости от того, к какому домену принадлежит гнездо, используются разные форматы адресов сокетов и базовые транспортные протоколы. При использовании сокетов используются следующие стандартные домены: AF_UNIX (формат адреса – путевое имя Unix) и AF_INET (формат адреса – хост-имя и номер порта).

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

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

7 Функции для программирования сокетов


Основные функции для программирования сокетов перечислены ниже.


int socket (int domain, int type, int protocol) – создает гнездо заданного типа и с указанным протоколом для конкретного домена.


int bind (int sid, struct sockaddr* addr_p, int len) – присваивает сокету имя.


int listen (int sid, int size) – задает количество ожидающих клиентских сообщений, которые можно поставить в очередь к одному серверному сокету.


int accept (int sid, struct sockaddr* addr_p, int len_p) – принимает запрос на соединение от клиентского сокета.


int connect (int sid, struct sockaddr* addr_p, int len) – посылает запрос на соединение в серверный сокет.


int send (int sid, const char* buf, int len, int flag) – передает сообщение в удаленный сокет.


int recv (int sid, char* buf, int len, int flag) – принимает сообщение из удаленного сокета.


int shutdown (int sid, int mode) – закрывает сообщение для чтения и/или записи.


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


Серверный сокет Клиентский сокет


socket socket

| |

\/ \/

bind connect

| |

\/ _____ \/______

listen <-- \/ \/

|______| send recv

| /\ /\

\/ |______________|

accept |

| \/

______\/______ shutdown

\/ \/ |

send recv \/

/\ /\ close

|_______________|

|

\/

shutdown

|

\/

close


8 Программа создания виртуального канала


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

Данный вариант запускался на выполнение с использованием эмулятора Cygwin на компьютере с ОС W2K Professional.

Серверная программа имеет вид:


#include

#include

#include

#include

#include

#include

main (int argc, char *argv[])

{

const char* MSG2 = "Hello to client";

int port = atoi (argv[1]);

char host[20];

int sid;

int len;

int nsid;

int domain = AF_INET;

char buf[80];

struct sockaddr_in addr;

struct hostent* hp;

strcpy (host, argv[2]);

sid = socket (domain, SOCK_STREAM, 0);

addr.sin_family = domain;

hp = gethostbyname (host);

memcpy (&addr.sin_addr.s_addr, hp->h_addr, 4);

addr.sin_port = htons(port);

len = sizeof (addr);

bind (sid, (struct sockaddr*)&addr, len);

listen (sid,5);

nsid = accept (sid, 0, 0);

recv (nsid, buf, sizeof buf, 0);

cerr<<"server: receive msg: '"<
send (nsid, MSG2, strlen(MSG2)+1, 0);

}


Клиентская программа имеет вид:


#include

#include

#include

#include

#include

#include

main( int argc, char* argv[])

{

const char* MSG1 = "Hello to server";

int port = atoi (argv[1]);

char host[20];

int sid;

int len;

int domain = AF_INET;

char buf[80];

struct sockaddr_in addr;

struct hostent* hp;

strcpy (host, argv[2]);

sid = socket (domain, SOCK_STREAM, 0);

addr.sin_family = domain;

hp = gethostbyname (host);

memcpy (&addr.sin_addr.s_addr, hp->h_addr, 4);

addr.sin_port = htons(port);

len = sizeof (addr);

connect (sid, (struct sockaddr*)&addr, len);

send (sid, MSG1, strlen(MSG1)+1, 0);

recv (sid, buf, sizeof buf, 0);

cerr<<"client: recv '"<
shutdown (sid, 2);

}


Исполняемые файлы создаются командными строками

g++ serv.cpp -o serv.out

g++ clnt.cpp -o clnt.out


Серверную программу на компьютере с DNS-именем COMP1 можно запустить, например, командной строкой


./serv.out 1149 COMP1 & ,


а клиентскую на другом компьютере – строкой


./clnt.out 1149 COMP1

9 Создание порожденного процесса


Для создания порожденного процесса используется функция fork:

pid_t fork (void).

Тип pid_t определен в и соответствует типу int. При успешном выполнении создается порожденный процесс и функция возвращает идентификатор этого порожденного процесса родительскому процессу. Порожденный процесс получает от fork нулевой код возврата.

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

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

Функция exit завершает процесс. Ее прототип имеет вид:

void exit (int exit_code),

где exit_code – код завершения процесса.

Простейший пример создания нового процесса:


#include

#include

#include


int main()

{ int status;

if (fork())

{ cout << "Child process\n";

exit(0);

};


cout << "Parent process\n";

}


Родительский процесс использует функции wait и waitpid для перехода в режим ожидания завершения порожденного процесса и для выборки его статуса завершения. Прототипы этих функций выглядят так:


pid_t wait (int status_p);

pid_t waitpid (pid_t child_pid, int* status_p,

int options).


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

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

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

int execl (const char* path, const char* arg, ).

Первый аргумент функции является либо полным путевым именем, либо именем файла программы, подлежащей исполнению. Аргументы arg являются аргументами для программы, вызванной функцией exec. Они отображаются в переменную argv функции main новой программы. При этом arg отображается в argv[0], значение, указанное после arg, - в argv[1] и т. д. Список аргументов заканчивается нулевым значением.


Пример.


#include

#include


int main()

{

char s1[8]="string1", s2[4]="string2";

execl ("./b.out", s1, s2, 0);

return 0;

}


Здесь вызывается программа b.out, скомпилированная из файла


#include

int main(int argc, char* argv[])

{

printf("%s\n",argv[0]);

printf("%s\n",argv[1]);

return 0;

}


В результате выполнения примера будут выведены строки string1

string2


Большинство программ вызывают exec в порожденном процессе, так как выполнение родительского процесса после вызова exec желательно продолжить. Однако программа может вызвать exec без fork, аfork без exec.

10 Программные каналы


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

int pipe (int fifo[2]).

Аргумент fifo является массивом, состоящим из двух целых чисел, присваиваемых ему интерфейсом pipe. В болшинстве систем Unix канал является однонаправленным, т. е. для чтения данных из канала процесс использует дескриптор файла fifo[0], а для записи данных в канал – другой дескриптор файла fifo[1].

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


#include

#include

#include

#include


int main()

{

int child_pid;

int fifo[2], status;

int sf=sizeof(float);

float buf1=2;


pipe(fifo);

write(fifo[1],&buf1,sf);


child_pid=fork();

if (child_pid==0)

{ float buf2;

read(fifo[0],&buf2,sf);

buf2=buf2+1;

write(fifo[1],&buf2,sf);

exit(0);

};


wait(&status);

read(fifo[0],&buf1,sf);

cout << "buf1=" << buf1;

}


.


11 Задания на курсовую работу


Задание 1


Написать программу на языке C++ для компилятора g++ системы UNIX, которая бы поддерживала следующие режимы:

- создание в домашнем каталоге файла с именем list и занесение в него нескольких записей следующего содержания: наименование компьютерной техники – строковый тип, количество – целый тип, цена – вещественный тип;

- обработка файла в соответствии с одним из вариантов, описанным ниже;

- просмотр содержания скорректированного файла list или нового файла list1.

При работе с файлами использовать файловые дескрипторы.


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

Вариант 2. Создать новый файл list1 из записей файла list, наименование техники в которых начинается с символа “К”.

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

Вариант 4. Добавить в конец файла list первую, третью и четвертую записи из этого же файла.

Вариант 5. Сосчитать общее количество единиц компьютерной техники, сведения о которой хранятся в файле list.

Вариант 6. Вывести на экран данные n-й строки файла list. Значение n ввести с клавиатуры.

Вариант 7. Поменять местами третью и четвертую записи файла list.

Вариант 8. Изменить в файле list цену устройства “Системный блок” на новую цену 950.

Вариант 9. Удалить из файла list последнюю запись.

Вариант 10. Создать новый файл list1 из записей файла list, взятых в обратном порядке.

Вариант 11. Найти в файле list компьютерное устройство с наиболее высокой ценой.

Вариант 12. Определить общую стоимость компьютерной техники, сведения о которой хранятся в файле list.

Вариант 13. В файле list найти запись с наименованием “Сканер HP” и уменьшить количество, которое содержится в записи, на единицу.

Вариант 14. Создать новый файл list1 из записей файла list, наименование техники в которых начинается со слова “Дискеты”.


Задание 2


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


Вариант 1

- Клиент передает серверу строку символов.

- Сервер передает клиенту подтверждение о приеме.


Вариант 2

- Клиент передает серверу строку несколько сообщений.

- Сервер передает клиенту количество полученных сообщений.


Вариант 3

- Клиент передает на сервер ряд показаний датчика.

- Сервер возвращает клиенту максимальное показание датчика.


Вариант 4

- Клиент передает на сервер последовательность измеренных величин.

- Сервер возвращает клиенту среднее значение измеренных величин.


Вариант 5

- Клиент передает серверу строку символов.

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


Вариант 6

- Клиент передает серверу два текстовых сообщения.

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


Вариант 7

- Клиент передает на сервер ряд показаний датчика.

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


Вариант 8

- Клиент передает на сервер последовательность измеренных величин.

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


Вариант 9

- Клиент передает серверу строку символов.

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


Вариант 10

- Клиент передает серверу два текстовых сообщения.

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


Вариант 11

- Клиент передает серверу строку символов.

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


Вариант 12

- Клиент передает серверу текстовое сообщение.

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


Вариант 13

- Клиент передает на сервер ряд показаний датчика.

- Сервер получает показания от клиента, запускает новый процесс и передает ему через неименованный программный канал полученные показания. Запущенный процесс выводит на экран минимальное показание датчика.


Вариант 14

- Клиент передает на сервер последовательность измеренных величин.

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


СПИСОК ЛИТЕРАТУРЫ


1. Керниган Б., Пайк Р. UNIX - универсальная среда программирования. – М.: Финансы и статистика, 1992. - 304с.

2. Чан Т. Системное программирование на C++ для UNIX. - К.: BHV, 1999. - 592с.

3. Эбен М., Таймэн Б. FreeBSD. Энциклопедия пользователя. – СПб.: ДиаСофт, 2003. -768с



Схожі:

Методические указания iconЛ. П. Вороновская А. А. Кузнецова математика методические указания
Методические указания для работы с иностранными студентами подготовительного отделения
Методические указания iconЕ. А. Маковкин рисунок детали головы методические указания
Методические указания к выполнению практического задания и самостоятельной работы
Методические указания iconМетодические указания
Методические указания к самостоятельному изучению дисциплины «Основы гидромелиорации» для
Методические указания iconМетодические указания
Методические указания и исходные данные к курсовой работе «Расчёты устойчивости грунтовых массивов»/. Сост. Таранов В. Г., Рудь А....
Методические указания iconДокументи
1. /Методические указания - Реология/1 ВИЗНАЧЕННЯ РЕОЛОГ_ЧНИХ ХАРАКТЕРИСТИК НА РОТАЦ_ЙНИХ...
Методические указания iconМетодические указания
Методические указания к выполнению лабораторного практикума по дисциплине «Коррозия и защита металлов» для студентов всех специальностей....
Методические указания iconИ в свет Разрешаю на основании "Единых правил", п. 14 Заместитель первого проректора начальник организационно методического управления В. Б. Юскаев методические указания
Методические указания к выполнению курсовой работы по дисциплине «Техническая термодинамика»/ Составители
Методические указания iconИ в свет разрешаю на основании «Единых правил», п. 14 Проректор В. Д. Карпуша методические указания
Методические указания к выполнению индивидуального домашнего задания «Расчёт энергоэффективности использования теплонасосной установки»...
Методические указания iconИ в свет разрешаю на основании «Единых правил», п. 14 Проректор В. Д. Карпуша методические указания
Методические указания к выполнению индивидуального домашнего задания «Расчёт энергоэффективности использования теплонасосной установки»...
Методические указания iconМетодические указания
Методические указания к выполнению курсовой работы по фотограмметрии и дистанционному зондированию (для студентов 4 курса дневной...
Методические указания iconМетодические указания
Методические указания для проведения практических занятий по дисциплине «Основы гидромелиорации» для
Додайте кнопку на своєму сайті:
Документи


База даних захищена авторським правом ©zavantag.com 2000-2013
При копіюванні матеріалу обов'язкове зазначення активного посилання відкритою для індексації.
звернутися до адміністрації
Документи