На мой взгляд получилась уж сильно грамоздко.
Закомментил все основные моменты, для более быстрого "разбора" кода. Подскажите/направте, что можно укоротить в коде.
Задача программы:
1. Ввести исходную строку.
2. Поменять первый символ на последний и последний на первый в каждом слове.
3. Ввести новую длину новой строки(она будет содержать текст редактированной строки, а длина разгоняется пробелами).
Все работает, но уж больно грамоздко :|
Закомментил все основные моменты, для более быстрого "разбора" кода. Подскажите/направте, что можно укоротить в коде.
Задача программы:
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 минут
Наглядный пример выполнения программы: