Задача: Форматирование строки (выравнивание текста)

Тема в разделе "C/C++/C#", создана пользователем -, 10 дек 2010.

Статус темы:
Закрыта.
  1. Гость

    Произвести выравнивание по правому краю введенного текста, для чего к каждой строке применить функцию WIDE(str,k), которая равномерно вставляет пробелы между словами так, чтобы длина строки str стала равной k. (Величина k должна быть больше длины самой длинной строки текста.)

    заранее спасибо
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    А где такую взять?
     
  3. Гость

    не знаю=))))
     
  4. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Я уж тем более... Свои наработки есть?
     
  5. Гость

    короче...
    у меня две задачи:

    задача №1.Произвести выравнивание по правому краю введенного текста, для чего к каждой строке применить функцию WIDE(str,k), которая равномерно вставляет пробелы между словами так, чтобы длина строки str стала равной k. (Величина k должна быть больше длины самой длинной строки текста.)
    задача №2.Напишите программу, определяющую, является ли введенная строка палиндромом. Палиндром – фраза, которая читается справа налево и слева направо одинаково без учета регистра букв и наличия пробелов. Например, строка Аргентина манит негра — является палиндромом.

    для второй я записала программу:
    #include <iostream>
    #include <string.h>
    #include "rus.h"
    using namespace std;
    bool pop (char *str)
    {
    int i,n=strlen(str);
    for (i=0;i<n/2;i++)
    {
    if(str==str[n-1-i])
    }

    cout<<rus("Строка является палиндромом\n" );
    else
    cout<<rus("Строка не является палиндромом\n" );
    }
    printf('Введите строку:');
    getch (s);
     
  6. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Мне просто интересно.. она работает?
     
  7. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    кажется, во второй проге это не реализовано:
     
  8. Гость

    дааа...
    а что?? что то не то?
     
  9. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Ну... по-моему там чего то не хватает.. хотя бы функции main.
     
  10. Гость

    точно=))))
    я тебе не ту скинула=)))
    вот:

    Код (C++):
    #include <iostream>
    #include <string.h>
    #include "rus.h"
    using namespace std;
    bool pop (char *str)
    {
    int i,n=strlen(str),k=0;
    for (i=0;i<n/2;i++)
    {
    if(str[i]==str[n-1-i]) k++;}
    if (k==n/2) return true;
    else return false;

    }
    int main (void)
    { char z[80];
    cout <<rus("Ввидите строку");
    cin>>z;
    if(pop(z))
    cout<<rus("Строка является палиндромом\n" );
    else
    cout<<rus("Строка не является палиндромом\n" );
    return 0;
    }
     
  11. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Ксюня93
    Ксюнь, используй тэги!
     
  12. Гость

    какие еще теги?
     
  13. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Тэг С++, это то, в чем нужно писать код, кнопка которого выглядит как надпись "С++" над сообщением, которое ты пишешь.
     
  14. Гость

     
  15. etc

    etc Гость

    Ну ксень, этож просто, вот вы прилетели на юпитер. а по юпитерски ни юп юп, и переводчика не взяли, как вы думаете это юпитерцам понравится?
    А чего когда вы пришли на этот форум не хотите спросить так как это принято?
     
  16. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Ксюня93
    Тебе нужна только первая? Вторая не нужна?
     
  17. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Так выравнивание нужно произвести по правому краю??? Или все же по ширине (вставляя пробелы между словами)????
    Просто если нужно было бы произвести по правому краю, то пробелы бы вставлялись только в начале... ;-)
     
  18. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Код (C++):
    /*
    Произвести выравнивание по правому краю введенного текста, для чего к каждой строке применить функцию WIDE(str,k)
    */

    /*
    codeby.net
    Autor: DarkKnight125 (Denis Goncharov)
    */

    #include <iostream>

    using namespace std;

    //Варавнивание по правому краю
    char* Wide(char* Str, int Size)
    {
    char *Result = new char[Size+1]; //Выделим память под новую строку Размером Size + 1(Нулевой символ)
    memset(Result, 0, Size+1); //Обнулим выделеную память
    //Циклом добавим пробелы в начало строки в кол-ве равном [Нужный размер - длина исход. строки]
    for (int i = 0; i<Size - strlen(Str); i++)
    {
    Result[i] = ' '; //Добавляем пробемы в Result
    }
    strcat(Result,Str); //Ну и в конце объеденим Result с исх. строкой
    return Result;
    }

    void main(void)
    {
    setlocale(LC_ALL,"Russian");
    char buffer[1024]; //Наша вводимая строка
    int Size; //Размер выравнивания
    cout<< "Введите исходную строку : ";
    cin.getline(buffer,1023);
    cout<<"Введите кол-во пунктов выравнивания Size = ";
    cin >> Size;
    cout<< endl << "Результат : " << endl;
    cout<<Wide(buffer,Size) << endl;
    }
     

    Вложения:

    • widestr.jpg
      widestr.jpg
      Размер файла:
      33,3 КБ
      Просмотров:
      41
  19. Гость


     
  20. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Вот тоже самое но по ширине...
    *сразу скажу, что алгоритм содержит возможную ошибку выравнивания (т.к. не всегда возможно при n количестве слов, разделить их равным кол-вом пробелов и получить ровно size).. Конечно это все можно доработать, но код будет более не понятным (он то и сейчас не очень)...

    Код (C++):
    /*
    Произвести выравнивание по ШИРИНЕ введенного текста, для чего к каждой строке применить функцию WIDE(str,k)
    */

    /*
    codeby.net
    Autor: DarkKnight125 (Denis Goncharov)
    */

    #include <iostream>

    using namespace std;

    //Варавнивание по правому краю
    char* Wide(char* Str, int Size)
    {
    char *Result = new char[Size+1]; //Выделим память под новую строку Размером Size + 1(Нулевой символ)
    memset(Result, 0, Size+1); //Обнулим выделеную память
    char *ptr = Str; //Заведем указатель на исходную строку
    int cnt = 0; //Кол-во пробелов
    //Найдем сначало кол-во пробелов
    while (strstr(ptr," "))
    {
    ptr = strstr(ptr," ")+1; //Сдвиним указатель за первый пробел в строке на которую указывает ptr
    cnt++; //Увеличим счетчик пробелов
    }
    if (cnt == 0) cnt++; //Подстра*цензура*ся, на тот случай если в строке нет пробелов вообще (что бы не вышло деление на нуль)
    int m = (Size-strlen(Str))/cnt + 1; //Найдем кол-во пробелов которые нужно добавить
    ptr = Result; //Поставим указатель на начала Результирующей строки
    for (int i = 0; i<strlen(Str); i++) //Обойдем все исходную строку
    {
    if (Str[i] == ' ') //Если найден пробел, то
    {
    for (int j = 0; j< m; j++) //Циклом выставим нужное кол-во пробелов (m)
    if (strlen(Result) < Size) //Но на всякий пожарный перед добавлением проверим не больше ли длина строки результата, чем заявленное кол-во символов выравнивания
    *ptr++ = ' '; //Поставим пробел и сдвинем указатель
    }
    else *ptr++ = Str[i]; //А если же символ не пробел просто запишим его в Result (в позицию на которую указывает указатель) и свдинем указатель
    }
    return Result; //Вернем результат
    }

    void main(void)
    {
    setlocale(LC_ALL,"Russian");
    char buffer[1024]; //Наша вводимая строка
    int Size; //Размер выравнивания
    cout<< "Введите исходную строку : ";
    cin.getline(buffer,1023);
    cout<<"Введите кол-во пунктов выравнивания Size = ";
    cin >> Size;
    cout<< endl << "Результат : " << endl;
    cout<<Wide(buffer,Size) << endl;
    }
     

    Вложения:

    • widestr2.jpg
      Размер файла:
      37,9 КБ
      Просмотров:
      28
Загрузка...
Похожие Темы - Задача Форматирование строки
  1. Янчик
    Ответов:
    0
    Просмотров:
    471
  2. TrishaRay
    Ответов:
    1
    Просмотров:
    778
  3. elzim
    Ответов:
    0
    Просмотров:
    929
  4. ShaoKahn
    Ответов:
    0
    Просмотров:
    1.114
  5. eremin-sanek
    Ответов:
    3
    Просмотров:
    1.101
Статус темы:
Закрыта.

Поделиться этой страницей