Информатика и технология программирования


Форматирование строки - часть 2


Шаг 5: Определение ns,nw:


for (i=0,ns=0,nw=0,inword =0; ; i++)
{
// Анализ символа IN[i] и подсчет параметров;


if (IN[i] =='\0') break;
}

Шаг 6: Размещение слов в выходной строке:


{
for (i=0,j=0,inword =0; ; i++)
{
// Анализ символа IN[i] и форматирование


// (перенос в OUT[j]);


}
if (IN[i] =='\0') break;
} }

Шаг 7: Анализ символа состоит в выделении 4 вариантов по двум сравнениям -признака inword и типа символа IN[i] - разделителя или символа слова:


{
if (IN[i]==' ' || IN[i]=='\0')
if (inword)
{ nw++; inword =0; } // Конец слова


else
{} // Продолжение разделителя


else
{ ns++;
if (inword)
{} // Продолжение слова


else
{ inword =1; } // Начало слова


} }

Шаг 8: Анализ символа IN[i] и форматирование:


{
if (IN[i]==' ' || IN[i]=='\0')
if (inword)
{ // Конец слова


for (k=0; k&#60np; k++) // Включение "np"


OUT[j++]=' '; // пробелов


if (nr-- &#62 0) // Включение


OUT[j++]=' '; // дополнительного пробела


}
else
{} // Продолжение разделителя


else
if (inword)
OUT[j++]=IN[i]; // Продолжение слова


else
{ // Начало слова


OUT[j++]=IN[i];
inword =1;
} }

Окончательный вариант с оптимизацией (исключение лишних ветвей):


//------------------------------------------------------bk34-12.cpp


//-----Форматирование строки


void format(char IN[], char OUT[], int n)
{
int nw, ns, np, nr, i, j, k, inword;
for (i=0,ns=0,nw=0,inword =0; ; i++)
{
if (IN[i]==' ' || IN[i]=='\0')
{ if (inword) { nw++; inword =0; } }
else
{ ns++; inword=1; }
if (IN[i] =='\0') break;
}
OUT[0] = '\0';
if (nw &#60 2) return;
np = (n - ns) / (nw - 1);
if (np &#60= 0) return;
nr = (n - ns) % (nw - 1);
for (i=0,j=0,inword=0; ; i++)
{
if (IN[i]==' ' || IN[i]=='\0')
{ if (inword)
{
for (k=0; k&#60np; k++) OUT[j++]=' ';
if (nr-- &#62 0) OUT[j++]=' ';
}
}
else
{ OUT[j++]=IN[i]; inword =1; }
if (IN[i] =='\0') break;
}
}




- Начало -  - Назад -  - Вперед -



Книжный магазин