Лабораторная работа №1 ПРОГРАММИРОВАНИЕ ЯЗЫКИ ПРОГРАММИРОВАНИЯ Преподаватель:

advertisement
ФГОБУ ВПО "СибГУТИ"
Кафедра вычислительных систем
ПРОГРАММИРОВАНИЕ
ЯЗЫКИ ПРОГРАММИРОВАНИЯ
Лабораторная работа №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
Download