ФГОБУ ВПО "СибГУТИ" Кафедра вычислительных систем ПРОГРАММИРОВАНИЕ ЯЗЫКИ ПРОГРАММИРОВАНИЯ Лабораторная работа №1 Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» Файловый путь Путь (англ. path) – набор символов, описывающий расположение файла или директории в файловой системе. Расположение задается перечислением директорий и (возможно) указанием файла. В UNIX-подобных операционных системах разделительным знаком при записи пути является символ "/" (слэш). В ОС Windows – символ "\" (обратный слэш). Примеры: ОС Windows: C:\Windows\System32\calc.exe ОС GNU/Linux: /usr/local/bin/gcc © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 2 Разделы жесткого диска http://techpubs.sgi.com/library/tpl/cgibin/getdoc.cgi?coll=0650&db=bks&fname=/SGI_Admin/IA_DiskFiles/ch01.html © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 3 Управление разделами ОС Windows ОС GNU/Linux © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 4 Файловые пути в ОС Windows Корни деревьев Program Files C: D: E: (раздел1) (раздел2) (раздел3) WINDOWS MyFiles ... Distr ... video prog ... ... C_manual.avi java.avi Абсолютные пути: D:\Distr\7z920.exe C:\WINDOWS\ E:\autorun.inf setup.exe projects Acrobat 7z920.exe ... autorun.inf lab1 lab1.c lab1.h D:\MyFiles\video\prog\C_manual.avi D:\MyFiles\video\prog\ D:\MyFiles\projects\lab1\lab1.c © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 5 Файловые пути в ОС Windows (2) Корни деревьев Program Files C: D: E: (раздел1) (раздел2) (раздел3) WINDOWS MyFiles ... Distr ... video prog setup.exe projects Acrobat 7z920.exe ... autorun.inf ... ... C_manual.avi java.avi lab1 lab1.c lab1.h Относительные пути: 7z920.exe (в D:\Distr\) .\prog\C_manual.avi (в D:\MyFiles\video) WINDOWS\ (на С:\) video\prog\ (в D:\MyFiles\) autorun.inf (на E:\) ..\projects\lab1\lab1.c (в D:\MyFiles\video) © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 6 Файловые пути в ОС GNU/Linux / (раздел1) home usr (раздел3) (раздел2) alex ivan video prog bin lib include bin ls mkdir rm projects ... C_manual.avi java.avi Абсолютные пути: /usr/bin/ /bin/ls /home/alex/video ... lab1 lab1.c lab1.h /home/alex/video/prog/C_manual.avi /home/alex/video/prog /home/alex/projects/lab1/lab1.c © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 7 Файловые пути в ОС GNU/Linux (2) / (раздел1) home usr (раздел3) (раздел2) alex ivan video prog bin lib include bin ls mkdir rm projects ... C_manual.avi java.avi Относительные пути: bin/ (в /usr/) /ls (в /bin) ./alex/video (в /home) ... lab1 lab1.c lab1.h ./prog/C_manual.avi (в /home/alex/video/) prog (в /home/alex/video/) ../projects/lab1/lab1.c (в /home/alex/video) © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 8 Файловые пути в ОС GNU/Linux (путь относительно дом. каталога) / (раздел1) home usr (раздел3) (раздел2) alex ivan video prog C_manual.avi java.avi bin lib include bin ls mkdir rm projects ... ... lab1 lab1.c lab1.h Относительно ДК тек. польз. (alex) Относительно ДК заданного польз. ~/video/prog/C_manual.avi ~alex/video/prog/C_manual.avi ~/projects/lab1 ~alex/projects/lab1 © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 9 Сетевые пути / (раздел1) Hostname = host.ru IP address = 192.168.1.1 home alex video ivan .. . ... prog C_tutorial.avi usr movie Java.avi hobbit.avi Skyfall.avi Windows (UNC): \\192.168.1.1\video\prog\C_tutorial.avi ; \\host.ru\video\movie\hobbit.avi GNU/Linux (URL): ftp://192.168.1.1/video/prog/Java.avi ; ftp://host.ru/video/prog/Java.avi GNU/Linux (SCP): 192.168.1.1:/home/alex/video/prog/Java.avi; alex@host.ru:~/video/prog/Java.avi © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 10 Имена узлов и IP адреса IP адрес представляет собой набор из четырех целых чисел, разделенных точкой: IP = x1.x2.x3.x4, где 0 ≤ xi ≤ 255, например: 192.168.1.1, 93.158.134.3, 173.194.47.164, 91.196.245.216. Имя узла (доменное имя. http://ru.wikipedia.org/wiki/Доменное_имя). Например: . ru sibsutis csc cpct yandex com org .. . .. . В рамках данной лабораторной работы будем считать, что существует только три домена верхнего уровня: ru, com и org. Использование любых других доменов недопустимо и считается ошибкой. © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 11 Cygwin Эмулятор Linux-окружения Сygwin (http://www.cygwin.com/ ) предоставляет пользователю возможность работы в Linux-подобной среде из операционной системы Windows. / home alex ivan Program Files cygdrive c d Windows Distr bin e ls mkdir rm Audio © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 12 Ограничения Максимальная длина пути: 260 символов Запрещенные символы: :*?"<>| Допустимые протоколы: http, ftp, rsync, smb Допустимые домены первого уровня: ru, com и org Допустимые IP адреса: IP = x1 . x2 . x3 . x4, где 0 ≤ xi ≤ 255 © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 13 Хранение путей в памяти программы * Путь (англ. path) – набор символов, описывающий расположение файла или директории в файловой системе. Для хранения путей в программах на языке Си необходимо использовать строки. Учитывая приведенные выше ограничения на длину пути, определение строки выглядит следующим образом: char path[261] = "/home/alex/video/prog/C_manual.avi" 0 1 2 3 4 5 6 7 8 9 ... / h o m e / a l e x / v i d e o / p r o g / \0 path[0] == '/' path[1] == 'h' path[9] == 'x' © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 14 Ввод данных. Один путь. Для ввода входных данных с клавиатуры необходимо использовать функцию: char *fgets(char *s, int size, FILE *stream); Прототип функции Позволяет указать имя функции, тип возвращаемого значения, а также тип и количество аргументов. Не позволяет: указать что именно делает функция s – имя символьного массива size – это максимальное количество вводимых символов (261) stream = stdin (определено по умолчанию, стандартный ввод) fgets выполняет чтение до обнаружения символа ‘\n’. fgets автоматически устанавливает в конце введенных данных ‘\0’. int main() { char path[1024]; fgets(path, 1024, stdin); . . . } © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 15 Ввод данных. Несколько путей. Для ввода более длинных строк (нескольких путей) также можно использовать функцию fgets. Согласно заданию, пути должны быть разделены символом ( пробел, +, : ), который также вводится пользователем при выполнении программы. Рассмотрим несколько примеров входных данных: $ ./input_delim_path input delim: + input paths: /home/+/home/alex+/home/ivan/test delim is + path string is: /home/+/home/alex+/home/ivan/test $ ./input_delim_path input delim: (пробел) input paths: /home/test/ /bin/bash delim is <space> path string is: /home/test/ /bin/bash © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 16 Ввод данных. Несколько путей. (2) #include <stdio.h> #define MAXPATH 261 #define MAXCNT 10 #define MAXSIZE (MAXPATH*MAXCNT) int main() { char delim; char paths[MAXSIZE]; printf("input delim: "); scanf("%c%*c",&delim); // <-- удаление '\n' из вх. потока! printf("input paths: "); fgets(paths,MAXSIZE,stdin); if( delim == ' ') printf("delim is <space>\n"); else printf("delim is %c\n",delim); printf("path string is: %s\n",paths); } © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 17 Функции Функция – это совокупность объявлений и операторов, предназначенная для решения некоторой задачи. Для обращения к функции используется ее имя. В любой программе, написанной на языке СИ, должна быть функция с именем main (главная функция или точка входа в программу), с которой начинается выполнение программы. С использованием функций в языке СИ связаны три понятия: определение функции – описание действий, выполняемых функцией; объявление (прототип) функции – задание формы обращения к функции; вызов функции; © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 18 Определение функции Имя функции Тип возвращаемого значения Тело функции Формальные параметры: локальные переменны, которые получают свое значение при вызове функции. Основное средство контроля поведения функции. int sum_count(int quant,int nums[]) { Локальные int i, sum = 0; переменные for(i=0;i<quant;i++){ sum += nums[i]; } return sum; } Возврат значения и немедленное завершение функции © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 19 Вызов функции int sum_count(int quant,int nums[]) { int i, sum = 0; for(i=0;i<quant;i++){ sum += nums[i]; } При вызове происходит: return sum; 1. Вычисление всех параметров} выражений 2. Приведение типов фактических параметров к типу формальных int main(){ int mas[] = {1,2,3,4,5,6,7}; int sum = sum_count(sizeof(mas)/sizeof(int),mas); return 0; } Фактические параметры Имя функции © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 20 Объявление (прототип) функции Прототип необходим в тех случаях, когда вызов функции необходимо выполнить до ее определения ИЛИ если определение функции располагается в ДРУГОМ файле. Имя функции Тип возвращаемого значения Тело функции Формальные параметры: локальные переменны, которые получают свое значение при вызове функции. int sum_count(int quant,int nums[]); { int i, sum = 0; for(i=0;i<quant;i++){ sum += nums[i]; } return sum; } © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 21 Объявление (прототип) функции (2) Прототип необходим в тех случаях, когда вызов функции необходимо выполнить до ее определения ИЛИ если определение функции располагается в ДРУГОМ файле. int sum_count(int quant,int nums[]); // прототип . . . . . int main(){ int mas[] = {1,2,3,4,5,6,7}; int sum = sum_count(sizeof(mas)/sizeof(int),mas); // вызов return 0; } . . . . . int sum_count(int quant,int nums[]) // определение { int i, sum = 0; for(i=0;i<quant;i++){ sum += nums[i]; } return sum; } © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 22 Изменение аргументов в функции В языке си аргументы передаются по значению. Это означает, что значение из фактического параметра копируется в формальный. Все дальнейшие изменения формального параметра не затронут фактический. int sum_sub(int x, int y, int sum, int sub){ sum = x + y; Изменяются только sub = x – y; формальные параметры! } int main(){ int s = 5, sm = 0, sub = 0; sum_sub(10,s,sm,sub); printf("sum = %d, sub = %d\n", sm, sub); return 0; } sm = 0, sub = 0 © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 23 Изменение аргументов в функции (глобальные переменные) Данная возможность существует, однако использование глобальных переменных не рекомендуется, так как оно ограничивает способы использования функции (недопустимы рекурсивные вызовы), а также не является потоко-безопасным (не допускает многопоточность). Требуется постоянно помнить имена глобальных переменных. #include <stdio.h> int sum = 0, sub = 0; int sum_sub(int x, int y, int sum, int sub){ sum = x + y; sub = x – y; } int main(){ int s = 5, sm = 0, sub = 0; sum_sub(10,s ,sm,sub); printf("sum = %d, sub = %d\n", sum, sub); return 0; } © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» sum = 15, sub = 5 24 Изменение аргументов в функции (указатели) Указатели являются более предпочтительным вариантом, который не обладает недостатками, связанными с глобальными переменными. #include <stdio.h> int sum_sub(int x, int y, int *sum, int *sub){ *sum = x + y; *sub = x – y; } int main(){ sum int s = 5, sm = 0, sb = 0; sum_sub(10, s, &sm, &sb); printf("sum = %d, sub = %d\n", sm, sb); return 0; } = 15, sub = 5 As Asm Asb As Asm Asum Asub 5 10 s sm sb x 5 y © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» Asm Asb sum sub 25 Изменение аргументов в функции (массивы) Имя массива является указателем-константой. В языке Си массивы передаются по указателю, а не по значению. Поэтому все изменения, внесенные в массив, сохраняются после завершения функции. #include <stdio.h> int sum_sub(int x, int y, int out[2]){ out[0] = x + y; out[1] = x – y; } int main(){ sum int s = 5, m[2]; sum_sub(10, s, m); printf("sum = %d, sub = %d\n", m[0], m[1]); return 0; } A A A A A s m s sm out Am 5 10 5 s x y out m = Am © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» = 15, sub = 5 26 Требования 1. Программа должна иметь следующую структуру: main() input() check() process() output() 2. Не допускается использование глобальных переменных для возврата результатов функций. 3. Не допускается использования стандартных функций обработки строк. 4. В отчете о лабораторной работе должен присутствовать список тестовых данных, на которых проверялась корректность работы программы, и соответствующие результаты выполнения программы. 5. Набор тестов должен обеспечивать проверку поведения программы для всех классов входных данных: 1) некорректный файловый путь и превышение допустимой длины пути; 2) допустимый путь, который не удовлетворяет условию; 3) допустимый путь, удовлетворяющий условиям. © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 27