Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите дописать часть кода.

82K
06 декабря 2012 года
DronStyle
13 / / 28.10.2012
Если в строке больше трёх пробелов, заменить их на троеточия.
Код:
#include <iostream>
#include <cctype>
#include <cstring>
using namespace std;
int amountSpace (char*);
  void zamena(char *t)
{
    while (*t)
{
 if (isspace (*t))
 *t = '.';
}
t++
 }
}
int main()
{
    char tmp [80];
    int p;
    int i;
    char* ptr;
    int k(0);
   
    do
    {
        cout <<"Enter tmp-> ";
        cin.getline (tmp,80);
        ptr=new char [strlen (tmp)+1];
        strcpy_s (ptr, strlen (tmp)+1, tmp);
        cout <<"\nBefore\t" << ptr << endl; //строка до обработки
        p=amountSpace(ptr);
        if (p==0)
            break;
                if (p>2)
                zamena (ptr);
        cout<<"Probel -> "<<p<<endl;
        cout <<"After\t" << ptr << endl<<endl; //строка после обработки
        delete [] ptr;
    }while(1);
   
    return 0;
}
int amountSpace (const char* pS)   // Вычеслить в строке количество пробелов
{
    int n(0); const char* p(pS);
    while (*p)
    {
        if (isspace (*p)) ++n;
        p++;
    }
    return n;
}
392
08 декабря 2012 года
cronya
421 / / 03.01.2009
как в задании сказано так и сделано: Если в строке больше трёх пробелов, заменить их на троеточия.
Тогда надо было написать: Заменить все пробелы на троеточее.
вот держи:)
Код:
#include <iostream>

using namespace std;

char* Amount(char* ptr);
char* Change(char* ptr, int spaceEnd, int count);

int main()
{
    char tmp [80];  
    cout <<"Enter tmp-> ";
    cin.getline (tmp,80);  
    char* ptr=new char [strlen (tmp)+1];
    strcpy_s (ptr, strlen (tmp)+1, tmp);
    cout <<"\nBefore\t" << ptr << endl; //строка до обработки 
    ptr = Amount(ptr);
    cout <<"After\t" << ptr << endl<<endl; //строка после обработки
    if(ptr)    
        delete[] ptr;
    system("pause");
    return 0;
}
/*фун-ция ищет в стороке пробелы до первого встречного
потом проверяет на наличие пробелов заново, пока пробелы
не исчезнут
*/

char* Amount(char* ptr)
{
    //флаг, который останавливает цикл проверки на пробелы
    bool ExitFlag = false;
    /*флаг, который разрешает вызвать функцию для замена пробелов
    на текущей позиции
    */

    bool SpaceFlag = false;
    /*указатель на строку, в том числе и преобразованную*/
    char* point = ptr;
    cout<<"Amount of White-Space: "<<endl;
    /*цикл проверки на наличие пробелов*/
    do
    {
        ExitFlag = true;
        SpaceFlag = false;
        /*кол-во пробелов*/
        int count = 0;
        /*получаем указатель на преобразованную строку*/
        ptr = point;
        /*длинна строки*/
        int Length = strlen(ptr);
        /*индекс конечного пробела*/
        int spaceEnd = -1;     
        for(int idx=0; idx<Length;idx++)
        {
            /*если есть пробел в символе*/
            if(isspace(ptr[idx]))
            {              
                /*инкрементируем счетчик*/
                count++;
                /*запоминаем индекс последнего пробела*/
                spaceEnd = idx;
                /*ставил флаг что нашли пробел*/
                SpaceFlag = true;
            }
            /*если нет пробела в символе*/
            else
            {
                /*если были найдены пробелы*/
                if(SpaceFlag == true)
                {
                    /*вызываем фун-ию замены пробелов и получаем указатель на новую моди-
                    фицированную строку*/

                    point = Change(ptr,spaceEnd, count);
                    /*выводим кол-во пробелов ранне найденное*/
                    cout<<count<<endl;
                    SpaceFlag = false;
                    /*оставливаем цикл ходьбы по страке*/
                    break;                 
                }
            }
        }
        /*проверяем, если были пробелы, проверяем строку еще раз на пробелы, если нет -
        заканчиваем работу нашей фун-ции*/

        if(count == 0)ExitFlag = false;
    }
    while(ExitFlag);
    return ptr;
}
/*замена пробелов на троеточие*/
char* Change(char* ptr, int spaceEnd, int count)
{
    /*длинна текущей строки*/
    int Length = strlen(ptr);
    /*индекс начала 1-ого пробела*/
    int spaceBegin = spaceEnd - count;
    /*первый символ после пробела*/
    int LastLine = spaceEnd + 1;
    /*флаг, хранящий первый символ после пробела*/
    int fixLastLine = LastLine;
    /*длина новой строки*/
    int newLength = -1;
    /*если пробелов больше 2*/
    if(count > 2)
    {
        /*задаем длину новой строки*/
        newLength = Length - count + 4;
    }
    /*если пробелов меньше 2*/
    else
    {
        /*кол-во пробелов = 1, задаем длину новой строки*/
        if(count == 1)  newLength = Length + 3;
        /*кол-во пробелов = 2, задаем длину новой строки*/
        if(count == 2)  newLength = Length + 4;
    }
    /*выделяем память под новую строку*/
    char* newPtr = new char[newLength];
    /*цикл записи в новую строку модифицированой строки*/
    for(int idx=0; idx<newLength; idx++)
    {
        /*записывам символы пока не встречали пробелы в новую строку*/
        if(idx <= spaceBegin)
        {
            newPtr[idx] = ptr[idx];
        }
        /*записывам 3 точки вместо пробелов и оставшиеся символы*/
        else
        {
            /*если пробелов между слова больше 1
            Если индекс в новой строке меньше индекс последнего пробела
            и если было больше 3 пробелов делаем один раз замену всех проблов на троеточее,
            чтобы не было глюка при замене большого коли-ва пробелов*/

            if(idx < spaceEnd && LastLine == fixLastLine)
            {
                /*записывам 3 точки вместо пробелов*/
                for(int jdx=0; jdx<3; jdx++)
                {
                    newPtr[idx] = '.';
                    idx++;
                }
            }
            /*если пробел между слова один*/
            if(idx == spaceEnd && count == 1)
            {
                /*записывам 3 точки вместо пробела*/
                for(int jdx=0; jdx<3; jdx++)
                {
                    newPtr[idx] = '.';
                    idx++;
                }
            }
            newPtr[idx] = ptr[LastLine];
            LastLine++;
        }      
    }  
    /*освобождаем память, которую использовала старая строка*/
    if(ptr) delete []ptr;
    /*возращаем указаатель на новую строку*/
    return newPtr;
}
85K
07 декабря 2012 года
Lakroft
6 / / 04.10.2012
Не совсем понятно что конкретно требуется, поэтому просто отдебажил:
Код:
#include <iostream>
#include <cctype>
#include <cstring>
using namespace std;
int amountSpace (const char*);

void zamena(char *t)
{
    while (*t)
    {
          if (isspace (*t))
          *t = '.';
          t++;
     }
}

int main()
{
    char tmp [80];
    int p;
    int i;
    char* ptr;
    int k(0);
   
    do
    {
        cout <<"Enter tmp-> ";
        cin.getline (tmp,80);
        ptr=new char [strlen (tmp)+1];
        strcpy (ptr, tmp);
        cout <<"\nBefore\t" << ptr << endl;
        p=amountSpace(ptr);
        if (p==0)
            break;
                if (p>2)
                zamena (ptr);
        cout<<"Probel -> "<<p<<endl;
        cout <<"After\t" << ptr << endl<<endl;
        delete [] ptr;
    }while(1);
   
    return 0;
}

int amountSpace (const char* pS)
{
    int n(0);
    const char* p(pS);
    while (*p)
    {
        if (isspace (*p)) ++n;
        p++;
    }
    return n;
}
На Dev-C++ все заработало.
82K
07 декабря 2012 года
DronStyle
13 / / 28.10.2012
Там одна точка, а нужно три.
392
08 декабря 2012 года
cronya
421 / / 03.01.2009
Вы еще не сделали, кошмар :)

Код:
#include <iostream>

using namespace std;

void amountSpace (char* ptr);
void zamena(char *ptr, int count);

int main()
{
    char tmp [80];  
    char* ptr;    
    cout <<"Enter tmp-> ";
    cin.getline (tmp,80);
    ptr=new char [strlen (tmp)+1];
    strcpy_s (ptr, strlen (tmp)+1, tmp);
    cout <<"\nBefore\t" << ptr << endl; //строка до обработки
    amountSpace(ptr);
    cout <<"After\t" << ptr << endl<<endl; //строка после обработки
    system("pause");
    delete [] ptr;
    return 0;
}

void amountSpace (char* ptr)   // Вычеслить в строке количество пробелов
{
    cout << "Count of White-space:" <<endl;
    do
    {
        int count = 0;
        bool flag = false;
        while(*ptr)
        {
            if(isspace(*ptr))
            {
                flag = true;
                count++;           
                *ptr++;        
            }
            else
            {
                if(flag == true)
                {
                    if(count > 2)
                    {
                        cout << count << endl;
                        zamena(ptr, count);
                        flag = false;
                        break;
                    }
                    else
                    {
                        cout << count << endl;
                        flag = false;
                        count = 0;
                        *ptr++;
                    }
                   
                }
                else
                {
                    *ptr++;
                }
            }
        }
        if(count == 0)
        break;
    }
    while(1);  
}

void zamena(char *ptr, int count)
{
    for(int idx = count; idx != 0; idx--)
    {
        *ptr --;       
    }
    for(int idx = 0; idx < count; idx++)
    {
        *ptr = '.';
        *ptr++;
    }
}
82K
08 декабря 2012 года
DronStyle
13 / / 28.10.2012
Пасибо большое, только она почему-то замену на троеточия не производит.........
Запустите через Visual Studio 2008 гляньте
392
08 декабря 2012 года
cronya
421 / / 03.01.2009
как это не производит, писал в 2010 студии все работает как часы, он замену делает если больше 2 пробелов между словами, если вам нужно сделать замену всех пробелов, при наличии хотя бы одного кол-ва 3 пробелов во всей строке дорабатывайте алгоритм.

Вот лог:
Код:
Enter tmp-> Hellow World, how    is   your      job

Before  Hellow World, how    is   your      job
Count of White-space:
1
1
4
3
6
After   Hellow World, how....is...your......job

Для продолжения нажмите любую клавишу . . .
Если вам надо сделать замену пробелов больше 3 именно на 3 точки всегда, то тогда другой вопрос
82K
08 декабря 2012 года
DronStyle
13 / / 28.10.2012
Ааа....Я понял что вы сделали, пасибо большое вам, но вы чуть не так задание поняли....в результате у меня должно быть приблезительно такое "I...do...not...speak...English" <---- вот такие троеточия, между словами три точки, даже если между словами был 1 пробел (та и в принципе больше одного пробела Я ставить между словами не буду)
82K
08 декабря 2012 года
DronStyle
13 / / 28.10.2012
Помоги пожалуйста !!!!!!!!
392
08 декабря 2012 года
cronya
421 / / 03.01.2009
Как то так наверно
Код:
#include <iostream>

using namespace std;

char* Amount(char* ptr);
char* Change(char* ptr, int spaceEnd, int count);

int main()
{
    char tmp [80];  
    cout <<"Enter tmp-> ";
    cin.getline (tmp,80);  
    char* ptr=new char [strlen (tmp)+1];
    strcpy_s (ptr, strlen (tmp)+1, tmp);
    cout <<"\nBefore\t" << ptr << endl; //строка до обработки 
    ptr = Amount(ptr);
    cout <<"After\t" << ptr << endl<<endl; //строка после обработки
    if(ptr)    
        delete[] ptr;
    system("pause");
    return 0;
}

char* Amount(char* ptr)
{
    bool ExitFlag = false, SpaceFlag = false;
    char* point = ptr;
    cout<<"Amount of White-Space: "<<endl;
    do
    {
        ExitFlag = true;
        SpaceFlag = false;
        int count = 0;
        ptr = point;
        int Length = strlen(ptr);
        int spaceEnd = -1;     
        for(int idx=0; idx<Length;idx++)
        {
            if(isspace(ptr[idx]))
            {              
                count++;
                spaceEnd = idx;
                SpaceFlag = true;
            }
            else
            {
                if(SpaceFlag == true)
                {
                    if(count > 2)
                    {
                        point = Change(ptr,spaceEnd, count);
                        cout<<count<<endl;
                        SpaceFlag = false;
                        break;
                    }
                    else
                    {          
                        count = 0;
                        SpaceFlag = false;
                    }
                }
            }
        }
        if(count == 0)ExitFlag = false;
    }
    while(ExitFlag);
    return ptr;
}

char* Change(char* ptr, int spaceEnd, int count)
{
    int Length = strlen(ptr);
    int spaceBegin = spaceEnd - count;
    int LastLine = spaceEnd + 1;
    int newLength = Length - count + 4;
    char* newPtr = new char[newLength];
    for(int idx=0; idx<newLength; idx++)
    {
        if(idx <= spaceBegin)
        {
            newPtr[idx] = ptr[idx];
        }
        else
        {
            if(idx < spaceEnd)
            {
                for(int jdx=0; jdx<3; jdx++)
                {
                    newPtr[idx] = '.';
                    idx++;
                }
            }
            newPtr[idx] = ptr[LastLine];
            LastLine++;
        }      
    }
    newPtr[newLength-1] = '\0';
    if(ptr) delete []ptr;
    return newPtr;
}
на указателях слишком мутарно делать, так что думаю самый оптимальный вариант
82K
08 декабря 2012 года
DronStyle
13 / / 28.10.2012
cronya тебе уже наверное мягко говоря зае**лось возиться с этой фигнёй, но дело в том что ты меня недопонимаешь.....
Ты меняешь пробелы на троеточия когда пробелов между словами три или больше, а мне нужно что бы оно меняло на троеточия даже когда между словами один пробел, как то нужно выделить место перед первой точкой и записать туда ещё две (это если делать продолжение моей
82K
08 декабря 2012 года
DronStyle
13 / / 28.10.2012
cronya тебе уже наверное мягко говоря зае**лось возится с моей "фигнёй", но ты меня чутка недопонимаешь....
Ты делаешь троеточия когда между словами больше или равно трех пробелов,а мне нужно что бы оно меняло на троеточие даже когда между словами один единственный пробел, даже если два или хоть 10000000000 пробелов всё ровно на одно троеточие.
Вот исходная строка: I do not speak English или хоть даже так I_____do__________not___speak ___________English
Вот переделанная (переделаная строка будет и для первого и для второго варианта одинаковой) : I...do...not...speak...English
P.S. Я пойму тебя прекрасно если ты пошлёшь меня, и не станешь переделывать.....
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог