8434

Стандартный файловый ввод-вывод

Лабораторная работа

Информатика, кибернетика и программирование

Стандартный файловый ввод-вывод 1. Цель работы. Целью лабораторной работы является получение практических навыков в работе с файловыми функциями форматного ввода-вывода. 2. Темы для предварительной проработки Функции форматного файлового вв...

Русский

2013-02-11

114.5 KB

37 чел.

Стандартный файловый ввод-вывод

1. Цель работы

    Целью лабораторной работы является получение практических навыков в работе с файловыми функциями форматного ввода-вывода.

2. Темы для предварительной проработки

  •  Функции форматного файлового ввода-вывода.
  •  Указатели и массивы.

3. Задание для выполнения

    Составить программу, которая читает текстовый файл и выполняет такое преобразование его, какое задано в Вашем варианте индивидуального задания.

    Примечания:

  1.  Файл должен иметь не менее 10-15 строк текста.
  2.  Допускается ограничить максимальную длину строки в тексте 80 символами.
  3.  Допускается (если в индивидуальном задании не оговорено второе) считать, что слова разделяются пробелами, а знаки препинания рассматривать как буквы.
  4.  Допускается создавать при выполнении программы временные файлы, которые, однако, не должны сохранятся после окончания программы.

4. Варианты индивидуальных заданий

 1      

 2      

 3      

 4      

 5      

 6      

 7      

 8      

 9      

10      

11      

12      

13      

14      

15      

16      

17      

18      

19      

20      

21      

22      

23      

24      

25      

26      

27      

28      

29      

30      

5. Пример решения задачи (вариант 30)

5.1. Разработка алгоритма решения.

    5.1.1.Общий алгоритм
    Условия задания требуют выровнять все строки до размера самой длинной строки во всем файле. Следовательно, для решения задачи придется прочитать файл, как минимум, дважды - при первом чтении (первая фаза программы) определить максимальную длину строки, а при втором (вторая фаза программы) - выполнять заданные преобразования. Но достаточно ли будет при первом чтении просто определять длину строки? В строке могут быть лишние пробелы, которые при выравнивании будут удалены, так что простого определения длины (например, при помощи функции
strlen()) недостаточно - следует при определении длины принять во внимание и пробелы, что будет требовать посимвольного просмотра всей строки. Если мы в первой фазе будем только подсчитывать лишние пробелы, то во второй фазе нам в значительной степени придется повторить эту работу, чтоб избавиться от этих лишних пробелов - так почему бы не выполнить всю эту работу в первой фазе? Выравнивание во второй фазе будет выполняться добавлением пробелов между словами, так что нам нужно будет знать количество слов В каждой строке - его можно определить в том же просмотре строки, когда мы удаляем лишние пробелы, т.е. в первой фазе.

    Таким образом, мы приходим к двухфазной схеме программы, когда в первой фазе выполняется какая-то часть обработки и получается промежуточный результат. Этот промежуточный результат является входными данными для второй фазы, которая выполняет окончательную обработку и формирует конечный результат.

    Промежуточный результат первой фазы состоит из:

  •  максимальной длины строки в файле;
  •  всех строк файла, из которых удалены лишние пробелы;
  •  количества слов для каждого строки файла.

    Если первая составная часть промежуточного результата - одно число, которое может сохраняться в переменной программы и через нее передаваться от первой фазы во вторую, то остальные составляющие требуют для своего сохранения файл. Следовательно, программа будет выполняться, как показано на рис.1

Рис.1. Двухфазное выполнение программы

    Общий алгоритм выполнения программы (без детализации выполнения первой и второй фаз) показан на рис.2.

Рис.2. Схема алгоритма

    Алгоритм программы, на наш взгляд, достаточно понятен из приведенной схемы, обратим внимание только на некоторые особенности, которые не были упомянуты ране или не детализированы на схеме алгоритма.

    Отметим, что на схеме приняты такие обозначения для переменных алгоритма: inf и outf - файловые переменные, которые представляют входной и выходной файлы соответственно; l - длина текущей строки, lmax - длина самой длинной строки в файле; nw - количество слов в текущей строке.

    Программа должна получать имя файла как свой параметр. Поэтому выполнение программы должно начинаться (блок 1) с проверки того, задан ли этот параметр. Если параметр не задан, программа должна завершаться.

    Открытие файлов (блоки 3 и 13) должно сопровождаться проверкой успешности открытия. Если открытие неуспешно (причиной этого может быть, например, неправильно заданное имя файла), программа должна завершаться.

    Та обработка строк, которую выполняют две фазы программы на рис.2, не детализирована - подробно мы раскроем эти фазы ниже.

    При первом чтении файла выполняется определение максимальной длины строки - на схеме алгоритма это блоки 4 и 9 - 11.

    Алгоритм второго чтения (блоки 13 - 20) предусматривает некоторые обстоятельства, которые мы ранее не рассмотрели. Выравнивание будет вестись вставкой дополнительных пробелов между словами. Но что делать, если строка состоит из единственного слова или вообще пустая? Задание не предусматривает ничего по этому поводу - принимаем решение, что такая строка будет выводиться без выравнивания, только с удалением лишних пробелов. Обработка строки на второй фазе будет, очевидно, происходить таким образом, что прочитанная строка будет сохраняться в каком-то входном буфере, а строка-результат будет формироваться в выходном буфере. Следовательно, если количество слов в строке больше одного (блок 16), выполняется обработка фазы 2 и в выходной файл выводится строка из выходного буфера (блоки 17, 18). Если же в строке одно слово или совсем ничего нет, строка из входного буфера без обработки выводится в выходной файл (блок 19).

    Обратите внимание также на то, что перед завершением программы временный файл для сохранения промежуточного результата уничтожается (блок 21).

    5.1.2. Алгоритм выполнения первой фазы
    Детализируем теперь ту обработку каждого строки, которая выполняется на первой фазе, - рисунок 3. Имея в виду то, что реализация алгоритма буде выполнена на языке C, мы уже при составлении его учитываем возможности языка в отношении использования указателей при работе со строками.

Рис.3. Первая фаза. Схема алгоритма.

    Та обработка, которую мы должны выполнить, включает в себя удаление двойных пробелов и подсчет количества слов. Для обеих задач нам нужно сравнивать два соседних символа в строке. К текущему символу мы будем обращаться через указатель, а предыдущий символ будет сохраняться в переменной os. Для самого первого символа строки значение предыдущего символа - пробел, начальное значение количества слов - nw - 0 (блок 2). Строка из файла считывается в буфер в оперативной памяти, при ее посимвольном просмотре мы будем формировать выходную строку в втором буфере. Указатели b1 и b2 устанавливаются на начало входного и выходного буферов соответственно (блок 3).

    Обработка строки будет вестись в цикле (блоки 4 - 10). Условием выхода из цикла является достижение конца строки во входном буфере, это выяснится, когда мы найдем во входном буфере символ с кодом 0 (блок 4). В каждой итерации цикла мы первым делом проверяем текущий символ во входном буфере - тот, на который указывает указатель b1 (блок 5). Если это символ перехода на новую строку - символ с кодом 0A16 - мы не делаем ничего, сразу же переходим на конец цикла (блок 10). Если это пробел, проверяем (блок 6), не был ли пробелом предыдущий символ, если так, то переходим на конец цикла. Таким образом, повторные пробели и символы перехода просто не копируются в выходной буфер. Если пробел не повторный, он обрабатывается как любой второй символ. Обработка других символов начинается с проверки, не был ли пробелом предыдущий символ (блок 7). Такая ситуация является признаком начала нового слова и, если она обнаружена, счетчик слов увеличивается на 1 (блок 8). Потом символ из входного буфера пересылается в выходной и указатель в выходном буфере сдвигается на 1 (блок 9). На следующем блоке сходятся все ветви обработки: тот символ входного буфера, который был только что обработан, сохраняется как предыдущий символ и сдвигается указатель во входном буфере (блок 10).

    После выхода из цикла нам нужно записать в выходной буфер признак конца строки - символ с кодом 0. Но нужно иметь в виду то, что мы можем иметь еще один лишний пробел в конце строки. Если выходная строка пустая (блок 11) или последний записанный в нее символ - не пробел (блок 12), признак конца записывается (блок 14) за последним символом строки (туда, куда показывает указатель b2). Если же последний символ - пробел, признак конца записывается вместо него (блок 13).

    5.1.3. Алгоритм выполнения второй фазы
    Цель этой фазы - выравнивание. Если обозначим ту длину строки, до которой должно происходить выравнивание, -
lmax, а текущую длину - l, то для выравнивания в строку следует добавить lmax-l пробелов. Эти пробелы должны быть равномерно распределены в nw-1 промежутках между словами. Следовательно, количество пробелов, которое следует добавлять в каждый промежуток - nb=(lmax-l)/(nw-1) . Но операция деления может давать результат с дробной частью. Следовательно, для точного выравнивания в несколько промежутков в начале строки будут добавляться nb пробелов (и игнорированием дробной части nb) , а в остальные промежутки - на 1 большее количество, так чтобы итоговая длина строки была равна точно lmax. Количество последних промежутков равно остатку от деления. Другой способ точного определения требуемого количества пробелов для каждого промежутка - пересчитывать nb для каждого следующего промежутка с учетом количества уже обработанных символов строки, именно такой способ предлагается в алгоритме, схема которого приведена на рисунке 4.

Рис.4. Вторая фаза. Схема алгоритма.

    nb определяется (блок 2), как было показано выше. Выше мы также приняли такой вариант определения точного количества пробелов, который предусматривает переопределение nb. При этом переопределении нужно будет корректировать значения l и lmax, поэтому делаем копию значения lmax в переменной lm (блок 3), именно эту копию мы и будем изменять. Потом устанавливаем указатели b1 и b2 на начало соответствующих буферов (блок 4) и в цикле (блоки 5 - 15) перебираем символы входного буфера, доки не встретим признак конца строки (блок 5).

    В каждой итерации цикла мы переписываем один символ из входного буфера в выходной (блок 6) и сдвигаем указатели в буферах (блок 7). Потом проверяем - не был ли только что переписанный символ пробелом (блок 8). Если так, то в цикле (блоки 9 - 11) записываем в выходной буфер nb пробелов. После обработки каждого промежутка уменьшаем счетчик слов (блок 12) и, если еще есть промежутки (блок 13), перевычисляем nb (блок 14). После выхода из цикла в выходной буфер дописывается еще символ конца строки (блок 16).

    Обратите внимание на то, что те переменные, которые используются для вычисления nb, уменьшаются на 1 при обработке каждого следующего символа: при обработке символа из входного буфера уменьшаются и l, и lm (блок 15), а при дописывании каждого пробела в выходной буфер - только lm (блок 11).

5.2. Определение переменных программы

    Символьная строка, в которой сохраняется имя файла, который мы обрабатываем:

   char filename[80];  

    Два буфера для сохранения входной и выходной строк, одни те же буферы используются на первой и на второй фазе. Размер обоих буферов - 81 символ (80 символов - ограничение, которое допускается условиями задания, + 1 символ - признак конца строки).

   char bu1[81], bu2[81];

    Символьные строки, как данные большого объема, должны размещаться в статической памяти. Остальные переменные - локальные в функции main().

    Для реализации алгоритма нам прежде всего будут нужны файловые переменные - для входного и выходного файлов. Мы будем пользоваться функциями форматного ввода-вывода, которые требуют объявления файлов як переменных типа FILE*:

   FILE *inf, *outf;

    Эти две программные переменные используются и в первой, и во второй фазе программы, хотя в разных фазах они ассоциируются с разными физическими файлами.

    Работа с символьными строками будет вестись через указатели, следовательно, нужны будут указатели на текущие символы во входной и выходной строке соответственно:

   char *b1, *b2;

    В соответствии с алгоритмом нам нужна переменная для хранения предыдущего символа:

   char os;

    Переменные для хранения: текущей длины строки, максимальной длины строки, максимальной длины строки с модификацией ее (см. алгоритм 2-ой фазы):

   int  l; int lmax; int lm;       

    Переменные для хранения: количества слов и количества дополнительных пробелов между словами:

   int  nw; int nb;

    Всем целочисленным переменным мы даем тип int из соображений стилевой традиции, хотя объективно хватило бы и типа short.

5.3. Разработка текста программы

    Мы позволим себе несколько сократить описание текста программы, ибо в основном он однозначно отражает приведенные выше алгоритмы и описания данных. Сосредоточимся только на особенностях реализации.

    Файлы, которые включаются в программу:
    
<stdio.h> - описания функций форматного ввода-вывода;
    
<string.h> - описания строковых функций (strlen(),string());

    <stdlib.h> - описания функций общего назначения (exit(),atoi()).

    Функция main() имеет два параметра, это форматный состав параметров, которые передаются главной функции: второй параметр - массив указателей на символьные строки, первый - количество элементов в этом массиве. Элемент с индексом 0 - строка обращения к программе, а тот параметр, которого требуют спецификации (имя файла) - элемент с индексом 1. Проверка параметров состоит в проверке их количества.

    Для открытия файлов повсюду в программе используется функция fopen(), она возвращает указатель, который является файловой переменной в программе. Мы всегда проверяем этот указатель; если он пустой, мы выдаем на экран сообщение про невозможность открытия файла и завершаем программу с помощью функции exit().

    Заголовок цикла:

   for (lmax=0; fgets(bu1,80,inf)!=NULL; ) {

реализует сразу блоки 4, 5, 6 схемы алгоритма рис.2. Для чтения строки мы применяем функцию fgets(), которая считывает строку из файла. При попытке читать за концом файла эта функция возвращает NULL, что и есть признаком конца файла.

    Следующий сложный заголовок цикла:

   for (os=' ',nw=0,b1=bu1, b2=bu2; *b1; os=*b1++) {

реализует блоки 2,3,4,5,10 схемы алгоритма рис.3.

    Оператор:

   switch (*b1) { . . . }

- разветвление в зависимости от значения текущего символа. Обратите внимание на то, как реализована та часть разветвления, которая на схеме рис.3 представлена блоком 6, в программе это:

   case ' ': if (os==' ') break;

- если предыдущий символ - пробел, происходит выход из switch, если же нет - управление переходит на следующий оператор, т.е., на обработку остальных символов.

    Сложное условие исключения пробелов в конце строки (блоки 11 - 14 рис.3) в программе реализовано одним оператором if - else:

   if ((b2>=bu2)&&(*(b2-1)==' ')) *(b2-1)=0;

   else *b2=0;

Вывод промежуточного результата выполняется оператором:

   fprintf(outf,"%02d %s\n",nw,bu2);

    Этот оператор выводит текстовую строку, в которой два первые символы - цифры количества слов в строке, далее через пробел - сама строка.

    Цикл чтения строк на второй фазе:

   while (fgets(bu1,80,inf)!=NULL) {

    Необходимо пояснить разделение прочитанной строки на количество слов и саму строку. Мы записываем признак конца строки в элемент с индексом 2:

   bu1[2]=0;

таким образом мы разбиваем строку на две строки. Первая из этих строк - два первых символа, мы преобразуем их в число слов:

   nw=atoi(bu1);

    Указатель b1 мы устанавливаем на элемент с индексом 3, т.е., на начало самих данных строки:

   b1=bu1+3;

    Потом мы еще определяем длину строки и записываем признак конца вместо последнего символа строки - символа перехода на новую строку:

   l=strlen(b1)-1; b1[l]=0;

    Поскольку в формуле вычисления nb мы используем nw-1, мы сразу уменьшаем nw на 1 и далее сравниваем его з 0:

   if (--nw>0) {

    Сложный заголовок цикла:

   for (lm=lmax, b2=bu2; *b1; l--,lm--) {

реализует блоки 3,4,5,15 схемы алгоритма рис.4.

    Оператор:

   if ((*b2++=*b1++)==' ') {

реализует блоки 6, 7, 8 схемы алгоритма рис.4: пересылка, наращивание указателей, анализ пересланного символа.

    Вывод результатов в файл выполняется функцией fprintf(), но для обработанной строки параметр функции - b2 - указатель на выходной буфер, а для необработанной - на входной - b1.

    Уничтожение временного файла выполняется функцией unlink().

    Полный текст программы приведен ниже.

/***************************************************/

/*              Лабораторная работа ╧10            */

/*             Обработка текстового файла          */

/*         Пример выполнения. Вариант ╧30.         */

/***************************************************/

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

char filename[80];     /* имя файла */

char bu1[81], bu2[81]; /* входной и выходной буферы */

int main(int an, char *av[]) {

 char *b1, *b2; /* текущие указатели в буферах */

char os;       /* предыдущий символ */

FILE *inf, *outf;  /* файловые переменные */

int  l,        /* текущая длина строки */

     lmax,     /* максимальная длина строки */

     lm;       /* макс. длина строки (рабочая) */

int  nw,       /* количество слов */

     nb;       /* количество пробелов */

 /* проверка параметров */

 if (an<2) {

   printf("Не задан параметр вызова\n");

   exit(0);

   }

 strcpy(filename,av[1]);

 /* открытие файлов */

 if ((inf=fopen(filename,"r"))==NULL) {

   printf("Невозможно открыть файл: %s\n",filename);

   exit(0);

   }

 if ((outf=fopen("TMP","w"))==NULL) {

   printf("Невозможно создать файл: TMP\n");

   exit(0);

   }

 /* первая фаза - определение максимальной длины */

 /* чтение фала строка за строкой */

 for (lmax=0; fgets(bu1,80,inf)!=NULL; ) {

   /* удаление из строки лишних пробелов

      и определение количества слов */

   for (os=' ',nw=0,b1=bu1, b2=bu2; *b1; os=*b1++) {

     switch(*b1) {

       case 0xA: /* символ новой строки удаляется */

         break;

       case ' ': /*2-й пробел подряд удаляется */

         if (os==' ') break;

       default: /* остальные символы переписываются */

         if (os==' ') nw++; /* начало слова */

         *b2++=*b1;

         break;

         }

       }

   /* удаление пробела в конце */

   if ((b2>=bu2)&&(*(b2-1)==' ')) *(b2-1)=0;

   else *b2=0;

   /* вывод в файл количества слов и строки */

   fprintf(outf,"%02d %s\n",nw,bu2);

   /* определение максимальной длины */

   l=strlen(bu2);

   if (l>lmax)lmax=l;

   }

 fclose(inf);

 fclose(outf);

 /* вторая фаза - окончательная обработка */

 /* открытие файлов */

 if ((inf=fopen("TMP","r"))==NULL) {

   printf("Невозможно открыть файл: TMP\n");

   exit(0);

   }

 if ((outf=fopen(filename,"w"))==NULL) {

   printf("Невозможно открыть файл: %s\n",filename);

   exit(0);

   }

 /* чтение фала строка за строкой */

 while (fgets(bu1,80,inf)!=NULL) {

   /* виделение количества слов и текста */

   bu1[2]=0; nw=atoi(bu1);

   b1=bu1+3;

   l=strlen(b1)-1; b1[l]=0;

   /* если слов 1 или 0 - строка остается как есть  */

   if (--nw>0) {

     /* определение количества пробелов между словами */

     nb=(lmax-l)/nw;

     for (lm=lmax, b2=bu2; *b1; l--,lm--) {

       /* перезапись символов на выход */

       if ((*b2++=*b1++)==' ') {

         /* если конец слова - добавить пробели */

         for (; nb; nb--) { lm--; *b2++=' ';}

         /* коррекция количества пробелов между словами */

         if (--nw) nb=(lm-l)/nw;

         }

       }

     /* признак конца строки в выходном буфере */

     *b2=0;

     /* вывод в файл */

     fprintf(outf,"%s\n",bu2);

     }

   /* вывод строки, которая осталась без изменений */

   else fprintf(outf,"%s\n",b1);

   }

 fclose(inf);

 fclose(outf);

 /* уничтожение промежуточного файла */

 unlink("TMP");

 return 0;

}

5.5. Отладка программы

    Для отладки программы прежде всего следует подготовить текст, который будет использоваться как входные данные контрольного примера. В этом тексте должны быть такие строки, которые позволяют проверить разные ветви алгоритма программы, а именно:

  •  строки, в которых между некоторыми словами есть промежутки в два и более пробелов;
  •  строки, в которых есть пробелы в начале строки;
  •  строки, в которых есть пробелы в конце строки;
  •  строки, которые состоят из одного слова;
  •  строки, которые состоят из одного слова с пробелами перед ним и после него;
  •  строки, которые состоят из одних пробелов;
  •  пустые строки.

    Обязательно следует проверить также работу программу при отсутствии входных параметров и при задании имени несуществующего файла.

    Поскольку программа изменяет файл, рекомендуем на этапе отладки записывать результат не в той же файл, а в другой. Тогда подготовленный файл с данными контрольного примера можно буде использовать много раз. Рекомендуем также при отладке удалить из программы оператор уничтожения промежуточного файла - это дает возможность контролировать промежуточные результаты.

    Отладку самого преобразования строк можно вести в пошаговом режиме с отслеживанием содержимого входного и выходного буферов и значений ключевых переменных.

5.6. Результаты работы программы

    Ниже приведен пример результатов работы программы, текст, использованные для этого примера, удовлетворяет требованиям, приведенным в предыдущем пункте.

    Входной файл:

Первая часть цикла лабораторных работ по курсу

"Основы программирования               

     и алгоритмические языки" посвящена языку C в его

базовом варианте,

изложенном в классической работе [1].

Для

выполнения  этой    части      цикла            годится

 любая операционная среда

и любая система программирования C, так как         

    те

свойства языка, которые   тут изучаются, являются ядром языка

и присутствуют во всех его   реализациях. В частности,  мы

       внедряем

этот цикл  в среде операционной системы PC DOS

7.0 и системы программирования Borland  C++     3.1.

    

Лабораторная  

      работа

1 ориентирована на выбранную систему программирования,

       ее           цель                        -

сформировать у студентов начальные навыки

подготовки, выполнения       

и отладки программ в выбранной среде. Остальные

работ от

среды не зависят.

    Выходной файл:

Первая   часть   цикла   лабораторных   работ   по    курсу

"Основы                                    программирования

и  алгоритмические  языки"  посвящена   языку   C   в   его

базовом                                           варианте,

изложенном      в      классической       работе       [1].

Для

выполнения       этой       части       цикла       годится

любая                  операционная                   среда

и   любая   система    программирования    C,    так    как

те

свойства языка, которые тут изучаются, являются ядром языка

и присутствуют во всех его  реализациях.  В  частности,  мы

внедряем

этот   цикл   в   среде   операционной   системы   PC   DOS

7.0   и   системы   программирования   Borland   C++   3.1.

Лабораторная

работа

1  ориентирована  на  выбранную  систему  программирования,

ее                          цель                          -

сформировать     у     студентов      начальные      навыки

подготовки,                                      выполнения

и   отладки   программ   в   выбранной   среде.   Остальные

работы                                                   от

среды                      не                      зависят.

5.7. Выводы

    При выполнении лабораторной работы изучены вопросы:

  •  функции файлового ввода-вывода
  •  передача параметров главной функции
  •  символьные строки и указатели

Вариант №1

В каждой строке удалить лишние пробелы между словами и, сохраняя первоначальную длину строки, разместить текст по центру строки.

Вариант №2

В каждой строке заменить последовательность слов "один", "два", "три" на "1-2-3".

Вариант №3

В каждой строке вставить после знаков препинания пробели, если их там нет.

Вариант №4

В каждой строке поменять местами соседние слова.

Вариант №5

Разбить каждую строку на две строки приблизительно одного размера, не разрывая слова.

Вариант №6

В каждой строке все слова, длина которых превышает среднюю длину слов в строке, сократить до средней длины.

Вариант №7

Разместить текст в несколько столбцов, так чтоб n-е слово i-ой строки размещалось под n-им словом i+1-ой строки.

Вариант №8

Скопировать второе слово каждой строки в начало следующей строки.

Вариант №9

В каждой строке удалить пары слов, в которых одно слово является зеркальным отображением второго.

Вариант №10

В каждой строке удалить лишние пробелы между словами и разместить их по левому краю, сохраняя первоначальную длину строки.

Вариант №11

Удалить из текста все слова, состоящие из одной буквы.

Вариант №12

Удалить из текста все слова с четными номерами (сквозная нумерация слов по всему тексту).

Вариант №13

В каждом слове все буквы разместить в алфавитном порядке.

Вариант №14

В каждой строке удалить те слова, в которых первые три буквы совпадают с начальными буквами последнего слова строки.

Вариант №15

В каждом слове строки изменить порядок букв на противоположный.

Вариант №16

Во всем тексте вставить переход на новую строку там, где есть два или больше пробела подряд.

Вариант №17

В каждой строке поменять местами первое слово с последним, второе - с предпоследним и т.д.

Вариант №18

В каждой строке самое длинное слово заменить на "длинное слово".

Вариант №19

Удалить из текста все слова, в которых содержатся буквосочетания "ов".

Вариант №20

В каждой строке удалить лишние пробелы между словами и разместить их по правому краю, сохраняя первоначальную длину строки.

Вариант №21

В каждой строке заменить последовательность слов "1", "2", "3" на "один-два-три".

Вариант №22

Удалить из текста все слова, в которых какие-либо буквы повторяются.

Вариант №23

В каждой строке все слова разместить в алфавитном порядке.

Вариант №24

Переформировать весь текст так, чтоб каждое предложение занимало отдельную строку. (Признак конца предложения - точка.)

Вариант №25

В каждой строке все слова, которые совпадают с первым словом строки, заменить на второе слово.

Вариант №26

Во всем тексте все появления слова "наилучший" взять в кавычки.

Вариант №27

В каждой строке для всех слов, которые встречаются в строке больше одного раза, оставить только первое вхождение.

Вариант №28

Во всем тексте после каждых трех слов вставить слово "блин".

Вариант №29

В каждой строке заменить ту комбинацию из трех символов, которая чаще всех встречается в строке, на символ '&'.

Вариант №30

Выровнять все строки до размера самой длинной строки в файле, вставляя пробелы между словами.


 

А также другие работы, которые могут Вас заинтересовать

42033. Дослідження законів Ома та Кіргофа в колах першого порядку 2.47 MB
  Замалюйте цей графік. Замалюйте графік із заданими значеннями а потім вкажіть декілька своїх для амплітуди та частоти та замалюйте ще кілька графіків. Ба Замалювали графік рис. 5 Вказали своє значення для амплітуди та частоти та замалювали графік.
42034. Електричні кола з послідовним зєднанням елементів 97.5 KB
  Комплексний опір ланцюга реактивний опір ланцюга опір індуктивності опір ємності опір резистора На малюнку зображено як саме опір елементів залежить від частоти: Рис. комплексний опір ланцюга реактивний опір ланцюга опір індуктивності опір ємності опір резистора На малюнку зображено як саме опір елементів залежить від частоти: Рис. 2 З малюнка легко бачити що тільки опір резистора не залежить від частоти.3Напруга на резисторі Поняття про резонанс напруг На частотах реактивний опір кола дорівнює...
42036. Изучение работы жидкостного U-образного манометра и комплекта приборов для измерения давления пневматической ветви ГСП 785 KB
  Давление питания преобразователей 14014 кгс см2 0140014 МПа Расход воздуха питания в установившемся режиме не более 8 л мин. Рабочий диапазон изменения выходного пневматического сигнала составляет 08 кгс см2 008 МПа. При изменении перепада давления от нуля до предельного номинального значения выходной сигнал изменяется от 02 до 10 кгс см2 от 002 до 01 МПа. Расчетные значения выходных сигналов Sp для номинального перепада давления...
42038. Изучение работы приборов для измерения давления электрической ветви ГСП 112 KB
  Студенты знакомятся с принципом действия устройством преобразователя измерительного Метран43 в комплекте с вторичным прибором и приобретают навыки в определении давления при помощи измерительных преобразователей типа Метран43. Снимают статическую характеристику измерительного преобразователя Метран43. Преобразователи давления типа Метран43 Преобразователи разности давления типа Метран43 предназначены для промышленных систем автоматического контроля и систем в составе АСУ ТП на базе микропроцессорной техники работающих со...