Лабораторная работа2 / lab2
.doc
Дисциплина Операционные Системы
Кафедра МОЭВМ
Отчет по лабораторной работе №2
«Написание команды на языке Си, компиляция её в GCC с помощью Make»
Выполнила : Чярина Т.В.
Группа : № 5341
Проверил : Алексеев А.Н.
Санкт-Петербург, 2008г
Постановка задачи:
-
написать программу на Си с параметрами:
program входной файл выходной файл
-
если входной файл или выходной файл не заданы то используется стандартный ввод и вывод (stdin, stdout)
-
программа считывает входной файл
-
в выходной файл пишет копию входного файла, но в началах строк ставит "+" если в строке найдено слово палиндром ,в противном случае "-"
-
написать скрипт тестирующую эту прогу.
-
Использовать makefile для компиляции и сборки программы.
Применение утилиты Make
Создадим MakeFile в котором будет описан сценарий компиляции. Это позволит упростить процедуру компиляции.
prog: prog.o abba.o
gcc -o prog prog.o abba.o
prog.o: abba.h
abba.o: abba.c abba.h
Тестирование программы
#!/bin/bash
echo "Скрипт тестирования программы"
echo "Введите имя входного файла:"
read p1
if [ -e $p1 ]
then
echo "Введите имя выходнго файла:"
read p2
./prog $p1 $p2
else
echo "Входной файл не существует!"
fi
Реализация программы
Программа реализована в трех файлах:
-
Prog.c – запуск программы
-
Abba.c – функции программы
-
Abba.h – модуль
Prog.c:
#include "abba.h"
int main(int argc, char *argv[])
{
char *inp=0;
char *out=0;
if(argc>1){
inp=argv[1];
if(argc>2) out=argv[2];
}
testfile(inp,out);
return 0;
};
Abba.h:
#include <stdio.h>
#include <string.h>
int isabba(char*);
int testfile(char*,char*);
int testline(char*);
Abba.c:
#include "abba.h"
int isabba(char* s)
{
int beg = 0; // начало слова
int end = strlen(s) - 1; // конец слова
while (beg < end)
if (s[beg++] != s[end--])
return 0; // не палиндром
return 1; // палиндром
}
int testline(char* line)
{
char str[512]="";
strcpy(str,line);
char* del = " ,.?!:-;+*=/<>(){}[]\n\t";// разделители слов
char* word = strtok(str, del); // выделяем первое слово в строке
// цикл обработки слов в строке
while(word)
{
if(isabba(word)) // если слово - палиндром
{
return 1;
}
word = strtok(NULL, del); // выделяем следующее слово в строке
}
return 0;
};
int testfile(char* inp,char* outp)
{
FILE *in,*out;
if(inp)
{
in = fopen(inp,"r");
if(in==0)
{
printf("Ошибка не могу открыть файл %s\n",inp);
return 1;
}
}
else
in=stdin;
if(outp)
{
out = fopen(outp,"w");
if(out==0)
{
printf("Ошибка - не могу создать-открыть файл %s\n",outp);
return 2;
}
}
else
out=stdout;
char line[512];
char ch;
while(fgets(line,sizeof(line),in)!=0)
{
if(testline(line)!=0) ch='+';
else ch='-';
fputc(ch,out);
fputs(line,out);
}
if(in) fclose(in);
if(out) fclose(out);
return 0;
};