Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Программирование / Programming (https://forum.zone-game.info/forumdisplay.php?f=98)
-   -   Урезать длинну кода (https://forum.zone-game.info/showthread.php?t=18533)

Effas 06.03.2012 22:05

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

Задача программы:
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 минут
Наглядный пример выполнения программы:
http://rghost.ru/36886030/image.png

Yorie 06.03.2012 22:53

Re: Урезать длинну кода
 
Как минимум, подсчет количества слов в строке ради того, чтобы вывести одно дохлое сообщение, избыточен. Можно от того уйти совсем, либо делать проверку внутри getEditString()

shocked 06.03.2012 23:32

Re: Урезать длинну кода
 
На жабе это выглядело примерно бы так
PHP код:

      StringTokenizer qwe = new StringTokenizer("Hello Zone-Game info");
      
StringBuilder result = new StringBuilder();
      
      while ( 
qwe.hasMoreElements() ) {
          
char[] ch qwe.nextElement().toString().toCharArray();
          
char chtmp ch[0];
          
ch[0] = ch[ch.length-1];
          
ch[ch.length-1] = chtmp;
          
result.append(ch).append(" "); } 

З,Ы подскажите есть тег для java кода ?)

Azagthtot 07.03.2012 00:00

Re: Урезать длинну кода
 
#include <iostream>
Пишите на C++? А std::string для кого придуман?
ЗАПОМНИТЕ - STL НЕОТЪЕМЛИМАЯ ЧАСТЬ С++!!!!

Nehrk 07.03.2012 00:09

Re: Урезать длинну кода
 
imho
Перетащите функции в *.h и :di:

Effas 07.03.2012 00:10

Re: Урезать длинну кода
 
Цитата:

Сообщение от Azagthtot (Сообщение 169088)
#include <iostream>
Пишите на C++? А std::string для кого придуман?
ЗАПОМНИТЕ - STL НЕОТЪЕМЛИМАЯ ЧАСТЬ С++!!!!

String преподаватель запретил использовать.

Добавлено через 1 минуту
Цитата:

Сообщение от Yorie (Сообщение 169081)
Как минимум, подсчет количества слов в строке ради того, чтобы вывести одно дохлое сообщение, избыточен. Можно от того уйти совсем, либо делать проверку внутри getEditString()

В условие указано, если в строке меньше 1го слова, выводить ошибку.

Azagthtot 07.03.2012 00:13

Re: Урезать длинну кода
 
string.h тоже? strstr() ну очень хорошая функция :)
Код:

char * mystring="This is a-test";
int wc = 1;
char * s = mystring;
for(;;) {
 char *s1 = strstr(s," ");
 if(!s1) s1 = strstr(s,",");
 if(!s1) s1 = strstr(s,"-");
 if(!s1) s1 = strstr(s,":");
 if(!s1) s1 = strstr(s,"-");
 if(!s1) break;
 wc++;
 s= s1+1;
}


Effas 07.03.2012 00:16

Re: Урезать длинну кода
 
Цитата:

Сообщение от Azagthtot (Сообщение 169095)
string.h тоже? strstr() ну очень хорошая функция :)

Да, онли char.

Azagthtot 07.03.2012 00:21

Re: Урезать длинну кода
 
Цитата:

Сообщение от Effas (Сообщение 169097)
Да, онли char.

Используйте алгоритм Рабина-Карпа для поиска

Effas 07.03.2012 00:24

Re: Урезать длинну кода
 
Цитата:

Сообщение от Azagthtot (Сообщение 169098)
Используйте алгоритм Рабина-Карпа для поиска

Вики:
Цитата:

Алгоритм Рабина — Карпа — это алгоритм поиска строки, который ищет шаблон, то есть подстроку, в тексте используя хеширование.
Разжевать не много можно? В каких целях я буду использовать у себя в программе?


Текущее время: 07:58. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot