Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи на заказ _ помогите перевести задачу с с на паскаль

Автор: darkstoun 24.10.2007 22:13

помогите перевести задачу с с на паскаль.нужно к завтрашнему вечеру.

AlignText.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <string.h>

//--- Собственно текст для выравнивания
const char szTextToAlign[] = "В аэропорту Новосибирска, совершил аварийную посадку пассажирский самолет Ту-154 со 139 пассажирами и 8 членами экипажа на борту, сообщили РБК в управлении информации и общественных связей МЧС России. Самолет выполнял рейс Иркутск – Москва (Домодедово), - отметили в МЧС. - По предварительным данным, причина вынужденной посадки - отказ одного из двигателей. По информации МЧС РФ в результате экстренной посадки никто не пострадал. По данному факту проводится расследование. ЧП с самолетами Ту-154 и Ту-134 происходят с пугающей регулярностью. Последнее произошло всего неделю назад, 15 октября с.г. Тогда в столичном аэропорту Внуково аварийную посадку совершил Ту-134, следовавший из Назрани в Москву. Причиной внепланового приземления стало задымление в кабине пилотов. Пилоты благополучно выполнили задачу по посадке машины, устранив попутно задымление при помощи огнетушителей. На борту самолета Дагестанских авиалиний находились 44 пассажира. Никто из них не пострадал. Всем памятна авиакатастрофа 22 августа 2006г., когда Ту-154, совершавший рейс Анапа - Санкт-Петербург, потерпел катастрофу в 45 км от Донецка. Самолет принадлежал авиакомпании Пулково. Все находившиеся на борту лайнера 160 пассажиров и 10 членов экипажа погибли. В Министерстве транспорта РФ также обеспокоены большим числом ЧП с участием устаревших отечественных самолетов. В начале февраля с.г. глава Минтранса Игорь Левитин заявил, что самолеты Ту-154 и Ту-134 будут постепенно, в течение 5 лет, выводиться из эксплуатации. Пока заменить Ту-154 у нас нечем, но у нас нет иного пути, как следовать рекомендациям МАК, - признал И.Левитин. Работы по проекту среднемагистрального пассажирского самолета Ту-154 начались в 1963г. Он стал первым проектом магистрального пассажирского самолета ОКБ, не имевшим военного прототипа. Опытный самолет совершил первый полет 3 октября 1968г. Первая серийная машина взлетела в 1970г., а регулярный пассажирский рейс Ту-154 впервые выполнил 9 февраля 1972г.";
//--- Нужная длина строки
const int nLineLength = 26;

int _tmain(int argc, _TCHAR* argv[])
{
//--- Для проверки - переводить не надо ---
FILE *f = fopen("fmtres.txt", "w");
//-----

//--- Приготовим текст ( чтобы между словами был только 1 пробел! ) ---
char *pszTextToAlignPrepared = new char [strlen(szTextToAlign) + 1];
memset(pszTextToAlignPrepared, 0, strlen(szTextToAlign) + 1);

int nNewIndex = 0;
for(int nIndex0 = 0; nIndex0 < strlen(szTextToAlign); nIndex0 ++)
{
if((szTextToAlign[nIndex0] == ' ') || (szTextToAlign[nIndex0] == ',') || (szTextToAlign[nIndex0] == '.'))
{
if(nIndex0 != strlen(szTextToAlign))
{
if(szTextToAlign[nIndex0 + 1] == ' ')
continue;
}
else
continue;
}
pszTextToAlignPrepared[nNewIndex] = szTextToAlign[nIndex0];
nNewIndex ++;
}

//--- Найдем длину приготовленного текста
int nTextLength = (int)strlen(pszTextToAlignPrepared);

int nStartPosition = 0;

//--- Приготовим рабочую строку
char *pszProcessingString = new char[nLineLength + 1];

//--- ОСНОВНОЙ ЦИКЛ ---
while(true)
{
//--- Очистим рабочую строку
memset(pszProcessingString, 0, nLineLength + 1);

//--- Сколько символов обрабатывать?
int nChars = nLineLength;

if((nStartPosition + nLineLength) > nTextLength)
{
nChars = nTextLength - nStartPosition;

//--- Условие окончания задачи (выхода из основного цикла)
if((nChars == 0) || (nStartPosition >= nTextLength))
break;
}

int nIndex = 0, nIndex1 = 0;
int nInitialSpacesCount = 0;

//--- Приготовим рабочую строку (исключая начальный и конечный пробелы)
//--- Заодно посчитаем количество слов в этой строке (считая разделителями слов пробел, запятую и точку)

while(nIndex1 < nChars)
//for(int nIndex = 0; nIndex < nChars; nIndex ++)
{
if(((nIndex == 0) && (pszTextToAlignPrepared[nStartPosition + nIndex] == ' ')))
{
nIndex ++;
continue;
}
{
if((pszTextToAlignPrepared[nStartPosition + nIndex] == ' ') ||
(pszTextToAlignPrepared[nStartPosition + nIndex] == ',') ||
(pszTextToAlignPrepared[nStartPosition + nIndex] == '.'))
nInitialSpacesCount ++;
pszProcessingString[nIndex1] = pszTextToAlignPrepared[nStartPosition + nIndex];
nIndex1 ++;
}
nIndex++;
}

if(pszProcessingString[strlen(pszProcessingString) - 1] == ' ')
pszProcessingString[strlen(pszProcessingString) - 1] = 0;

int nSpacesNeed = 0, nLineEnd = 0;
bool blCountSpaces = false;

//--- Посчитаем сколько пробелов надо вставить
//--- сначала для случая "обрезанного" слова
if(strlen(pszProcessingString) == nLineLength)
{
//--- Если строка случайно уже "отформатирована" - ничего не надо делать
if((pszTextToAlignPrepared[nStartPosition + nIndex] == ' ') ||
(pszTextToAlignPrepared[nStartPosition + nIndex] == ',') ||
(pszTextToAlignPrepared[nStartPosition + nIndex] == '.'))
{
nSpacesNeed = 0;
nStartPosition += nLineLength;
nLineEnd = nLineLength;
}
else
{
//--- Если слово слишком длинное - ошибка (переносить мы не умеем)
if(nInitialSpacesCount == 0)
{
printf("ERROR : Word too long!\n");
break;
}
//--- а если нет - выставим признак расчета числа пробелов
blCountSpaces = true;
}
}
//--- потом для случая "полного" куска фразы
else
{
//--- Если строка случайно уже "отформатирована" но у нее были пробелы спереди
//--- установим сколько надо вставить пробелов
if((pszTextToAlignPrepared[nStartPosition + nIndex] == ' ') ||
(pszTextToAlignPrepared[nStartPosition + nIndex] == ',') ||
(pszTextToAlignPrepared[nStartPosition + nIndex] == '.') ||
(nStartPosition + nIndex == nTextLength))

{
nSpacesNeed = nLineLength - strlen(pszProcessingString);
nStartPosition += nLineLength;
nLineEnd = strlen(pszProcessingString);
}
//--- а если нет - выставим признак расчета числа пробелов
else
blCountSpaces = true;
}

//--- Если самый распространенный случай - обрезанное слово в конце строки -
//--- посчитать сколько нужно вставить пробелов дополнительно

if(blCountSpaces == true)
{
for(int nIndex2 = nLineLength - 1; nIndex2 >= 0; nIndex2 --)
{
if((pszProcessingString[nIndex2] == ' ') ||
(pszProcessingString[nIndex2] == ',') ||
(pszProcessingString[nIndex2] == '.'))
{
nLineEnd = nIndex2;
nSpacesNeed = nLineLength - nIndex2;
nStartPosition += (nIndex2 + 1);
pszProcessingString[nIndex2] = 0;
break;
}
}
}

//--- Если нужно вставлять пробелы...
if(nSpacesNeed != 0)
{
//--- Если в рабочей строке нет пробелов - вставим один пробел справа
//--- и уменьшим количество нужных пробелов на 1
//--- и увеличим начальную длину строки на 1
if(strstr(pszProcessingString, " ") == NULL)
{
for(int nI = nChars - 1; nI >= 0; nI --)
pszProcessingString[nI + 1] = pszProcessingString[nI];
pszProcessingString[0] = ' ';
nSpacesNeed --;
nLineEnd ++;
}

char *pszTempString = new char[nLineLength + 1];

//--- Цикл вставки пробелов
while(nSpacesNeed > 0)
{
memset(pszTempString, 0, nLineLength + 1);

int nIndex4 = 0;

int nSpacesIncluded = 0;

for(int nIndex3 = 0; nIndex3 < nLineEnd; nIndex3 ++)
{
pszTempString[nIndex4] = pszProcessingString[nIndex3];

nIndex4 ++;

if(nSpacesNeed > 0)
{
if((pszProcessingString[nIndex3] == ' ') ||
(((pszProcessingString[nIndex3] == '.') ||
(pszProcessingString[nIndex3] == ',')) && (nIndex3 != nLineEnd - 1)))
{
pszTempString[nIndex4] = ' ';
nIndex4 ++;
nSpacesNeed --;
nSpacesIncluded ++;
}
}
}

nLineEnd += nSpacesIncluded;

strcpy(pszProcessingString, pszTempString);
}
//--- ОКОНЧАНИЕ ОСНОВНОГО ЦИКЛА ПО ВСТАВКЕ ПРОБЕЛОВ

delete pszTempString;
}

//--- Выведем результирующую строку на печать
int nResLen = strlen(pszProcessingString);
if(nResLen != nLineLength)
{
printf("Error formatting!\n");
break;
}
printf(pszProcessingString);
printf("\n");

//--- Для проверки - переводить не надо ---
fputs(pszProcessingString, f);
fputs("\n", f);
//---
}

delete pszProcessingString;
delete pszTextToAlignPrepared;

//--- Для проверки - переводить не надо ---
fclose(f);
//---

return 0;
}

заранее спасибо

Автор: Sozialist 25.10.2007 3:15

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

Автор: Гость 25.10.2007 11:55

Цитата(Sozialist @ 24.10.2007 23:15) *

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

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

Автор: Sozialist 25.10.2007 20:48

Сделать можно быстро. Но есть пару вопросов. Прошу прощения у администрации за выставление icq num. Но у гостя нет лички. Прошу не удалять.