Показать сообщение отдельно
Непрочитано 06.03.2012, 22:05   #1
Аватар для Effas
Пользователь

Автор темы (Топик Стартер) Урезать длинну кода

На мой взгляд получилась уж сильно грамоздко.
Закомментил все основные моменты, для более быстрого "разбора" кода. Подскажите/направте, что можно укоротить в коде.

Задача программы:
1. Ввести исходную строку.
2. Поменять первый символ на последний и последний на первый в каждом слове.
3. Ввести новую длину новой строки(она будет содержать текст редактированной строки, а длина разгоняется пробелами).

Все работает, но уж больно грамоздко :|

PHP код:
#include <iostream>
#include <fstream>

using namespace std;

// Расширение новой строки (заполнение пробелами)
void ExtensionIfANewLine(charstr,charstr_2,int s,int n)
{
    
int nSpace s;    // кол-во пробелов для новой строки          (str_2(newString))
    
int counterStr1 0,   // счетчик строки                            (str(editString))
        
counterStr2 0,   // счетчик новой строки                      (str_2(newString))
        
counterSpace 0,  // счетчик пробелов
        
position 0;      // позиция для выполнения
     
    
for(;str[counterStr1];counterStr2++)
    {
        if(
position==0)
        {
            if(
str[counterStr1]!=' ')
            {
                
str_2[counterStr2] = str[counterStr1];
                
counterStr1++;
            }
            else 
position 1;
        }
        else if(
position == 1)
        {
            
counterStr2--;
            
str_2[counterStr2] = str[counterStr1];
            
            for(;
counterSpace<nSpace;counterSpace++)
            {
                
counterStr2++;
                
str_2[counterStr2] = ' ';
            }
            
counterStr1++;
            
position 0;
        }
    }
}

// Счетчик слов в строке
int CountWordsInARow(charstr)
{
    
int nWord 0,          // кол-во найденных слов
        
position = -1;      // позиция для выполнения

    
for(int i 0;str[i];i++)
    {
       if(
position == -1)
       {
          if(
str[i] != ' 'position i;
       }
       else if(
str[i] == ' ')
       {
          
nWord++;
          
position = -1;
       }
    }
    if(
position != -1nWord++;
    
    return 
nWord;
}

// Смена позиции символа c сохранением предыдущего
void ChangingPositionCharacter(charstr,int j,int i)
{
    
char r str[j];
    
str[j] = str[i-1];
    
str[i-1] = r;
}

// Получение редактированной строки
void getEditString(charstr)
{
    
int size strlen(str);
    
int begin = -1;

    for(
int i=0;str[i];i++)
    {
       if(
begin == -1)
       {
          if(
str[i]!=' 'begin i;
       }
       else if(
str[i]==' ')
       {
          
ChangingPositionCharacter(str,begin,i);
          
begin = -1;
       }
    }
    if(
begin!=-1ChangingPositionCharacter(str,begin,size);
}

// Сохранение данных
int DataStorage(charstr,charnewFile,int n)
{
    
FILE *fopen(newFile"wt");
    if(
F==NULL
    {
        
printf("[Error!] Failed to save the data.\n"); 
        return 
0;
    }
    else 
    {
        for(
int i=0;i<n;i++)
            
fprintf(F,"%c",str[i]);        
        
fclose(F);
        
printf("The data are stored.\n");
        return 
1;
    }
}

int main()
{
    
char saveFile[256] = {0},     // имя файла для сохранения данных
         
sourceString[256] = {0}, // исходная строка 
         
editString[256] = {0},   // редактированная строка
         
newString[256] = {0};    // новая строка
         
    
int  lengthString 0,        // длина исходной строки
         
newLengthSring 0,      // длина новой строки
         
nWord 0;               // кол-во слов в исходной строке
         
    
    
printf("=================================================[Settlement Graphic Work N2]===");
    
printf("[Note!] Line can not consist of one word.\n");  // примечание к условию
    
    // зацикливаем до выполнения условия (см. примечание)
    
while(1)
    {
        
printf("Enter a string: "); gets(sourceString);      // ввод исходной строки
        
nWord CountWordsInARow(sourceString);                   // получаем кол-во введенных слов
        
        // проверяем на наличие более 2х слов в строке
        
if(nWord<=1)
            
printf("[Error!] Check the condition and try again.\n");   
        else break;
    }
    
    
strcpy(editString,sourceString);       // копируем содержимое из sourceString в editString
    
getEditString(editString);             // получаем отредактированную строку
    
lengthString strlen(editString);     // получаем длину строки
    
    
printf("[Note!] The length of the converted string\nshould be in the range from %d to 255.\n",lengthString);    // примечание к условию
    
    // зацикливаем до выполнения условия (см. примечание)
    
while(1)
    {
        
printf("Enter the length of new line: "); scanf("%d",&newLengthSring);      // ввод длины новой строки
        
        // проверка на ввод
        
if(newLengthSring<=lengthString || newLengthSring>=255)
            
printf("[Error!] Check the condition and try again.\n");
        else break;
    }
    
    
ExtensionIfANewLine(editString,newString,lengthString,newLengthSring);          // расширение новой строки (заполнение пробелами)
    
    // Результат
    
printf("=====================================================================[Result]===");
    
printf("sourceString = %s;\neditString = %s;\nnewString = %s;\n",sourceString,editString,newString);
    
    
// Сохранение данных
    
printf("===============================================================[Data storage]===");
    
printf("Save the file: "); scanf("%s",&saveFile);
    
DataStorage(newString,saveFile,newLengthSring);
        
    
system("PAUSE");
    return 
EXIT_SUCCESS;

Добавлено через 15 минут
Наглядный пример выполнения программы:

Последний раз редактировалось Effas; 06.03.2012 в 22:20. Причина: Добавлено сообщение
Effas вне форума Отправить сообщение для Effas с помощью Skype™ Ответить с цитированием