Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Урезать длинну кода
#1
На мой взгляд получилась уж сильно грамоздко.
Закомментил все основные моменты, для более быстрого "разбора" кода. Подскажите/направте, что можно укоротить в коде.

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

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

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

using namespace std;

// Расширение новой строки (заполнение пробелами)
void ExtensionIfANewLine(char* str,char* str_2,int s,int n)
{
int nSpace = n - 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(char* str)
{
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 != -1) nWord++;

return
nWord;
}

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

// Получение редактированной строки
void getEditString(char* str)
{
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!=-1) ChangingPositionCharacter(str,begin,size);
}

// Сохранение данных
int DataStorage(char* str,char* newFile,int n)
{
FILE *F = 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 минут
Наглядный пример выполнения программы:
[Изображение: image.png]
Ответ
#2
Как минимум, подсчет количества слов в строке ради того, чтобы вывести одно дохлое сообщение, избыточен. Можно от того уйти совсем, либо делать проверку внутри getEditString()
// aka Deft
Ответ
#3
На жабе это выглядело примерно бы так
PHP код:
<?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 кода ?)
Ответ
#4
#include <iostream>
Пишите на C++? А std:Confusedtring для кого придуман?
ЗАПОМНИТЕ - STL НЕОТЪЕМЛИМАЯ ЧАСТЬ С++!!!!
Ответ
#5
imho
Перетащите функции в *.h и :di:
[Изображение: dxqV.gif]
Ответ
#6
Azagthtot Написал:#include <iostream>
Пишите на C++? А std:Confusedtring для кого придуман?
ЗАПОМНИТЕ - STL НЕОТЪЕМЛИМАЯ ЧАСТЬ С++!!!!
String преподаватель запретил использовать.

Добавлено через 1 минуту
Yorie Написал:Как минимум, подсчет количества слов в строке ради того, чтобы вывести одно дохлое сообщение, избыточен. Можно от того уйти совсем, либо делать проверку внутри getEditString()
В условие указано, если в строке меньше 1го слова, выводить ошибку.
Ответ
#7
string.h тоже? strstr() ну очень хорошая функция Smile
Код:
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;
}
Ответ
#8
Azagthtot Написал:string.h тоже? strstr() ну очень хорошая функция Smile
Да, онли char.
Ответ
#9
Effas Написал:Да, онли char.
Используйте алгоритм Рабина-Карпа для поиска
Ответ
#10
Azagthtot Написал:Используйте алгоритм Рабина-Карпа для поиска
Вики:
Цитата:Алгоритм Рабина — Карпа — это алгоритм поиска строки, который ищет шаблон, то есть подстроку, в тексте используя хеширование.
Разжевать не много можно? В каких целях я буду использовать у себя в программе?
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Копирование html;PHP - кода M1xF1ght 6 2,245 11-30-2017, 09:16 AM
Последний пост: Anikey

Перейти к форуму:


Пользователи, просматривающие эту тему: 10 Гость(ей)