Добавил:
alex20000
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:sem9_3
.c#include <stdio.h>
int str_len(char* string);//фция, \счиающая длину строки
int str_cmp(char* string, char* string2);//ф-ция, сравнивающая строки
unsigned int str_to_uint(char* string);//преобразовать строку в целое число
int power(int number, int p);//возведение целые числа в степень
int min(int a, int b)
{
return a > b ? b : a;
}
int main(int argc, char** argv)
{
if(argc != 6)//кол-во аргументов должно быть 6
{
puts("usage: sem9_3 <filename> -p <maximum number of lines on 1 page> -n <maximum number of symbols on one line>");
return 0;
}
unsigned int p = 0, n = 0;//р- макс. число строк на странице n- макс. число символов в строкеh
for(int i = 2; i != 5; ++i) //проходим по всем аргументам
{
if(str_cmp(argv[i], "-p");//если текущий аргумент - -p
p = str_to_uint(argv[i + 1]);// то значение хранится в следующем
if(str_cmp(argv[i], "-n"))//если текущий аргумент - -n
n = str_to_uint(argv[i + 1]);// то значение хранится в следующем
}
//printf("%d %d", p, n);
FILE* f = fopen(argv[1], "r");//открываем файл
int c;
int num_symbols = 0;//кол-во выведенных символов в текущей строке
int num_lines = 0;//кол-во выведенных строк в текузей странице
int num_pages = 0;//кол-во выведенных страниц
int reached_end = 0;
do
{//цикл для вывода страниц
num_lines = 0;
do
{//цикл для вывода строк
printf("\n%d: ", ++num_lines);//в начале строки пишем ее номер и увеличиваем num_lines
c = 0;
num_symbols = 0;
do
{
c = fgetc(f);
if((c != EOF) && (c != '\n'))//выводим все символы в строке пока не достигли конца файла или строки
putchar((char)c);
}while((c != EOF) && (c != '\n') && (++num_symbols < n));//пока не достигли конца файла или строки или кол-во выведенных символов не превысило макс. значения
if(c == EOF)//если достигли конца файла, присваиваем 1 reached_end
reached_end = 1;
}while(!reached_end && (num_lines < p));//пока не достигли конца файла или не превысили макс. число строк на странице
printf("\n\n---PAGE %d---\n", ++num_pages);//когда достигли конца страницы, выводим соответствующий текст
}while(!reached_end);
return 0;
}
int str_len(char* string)
{
int result = 0;
while(string[result] != '\0')
result++;
return result;
}
int str_cmp(char* string1, char* string2)
{
for(int i = 0; i != min(str_len(string1), str_len(string2)); ++i)
{
if(string1[i] != string2[i])
return 0;
}
return 1;
}
unsigned int str_to_uint(char* string)
{
unsigned int result = 0;
unsigned int count = 0;
for(int i = (str_len(string) - 1); i >= 0; --i)
{
if((string[i] >= '0') && (string[i] <= '9'))
result += (string[i] - '0') * power(10, count++);
}
return result;
}
int power(int number, int p)
{
int result = 1;
for(int i = 0; i != p; ++i)
{
result *= number;
}
return result;
}