Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

sem9_3

.c
Скачиваний:
0
Добавлен:
29.05.2019
Размер:
3.56 Кб
Скачать
#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;
}
Соседние файлы в предмете Информатика