• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

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

заранее спасибо
 
G

Guest

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

задача №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);
 
G

Guest

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

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;
}
 
L

lazybiz

Тэг С++, это то, в чем нужно писать код, кнопка которого выглядит как надпись "С++" над сообщением, которое ты пишешь.
 
E

etc

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

DarkKnight

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

DarkKnight

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
    19 КБ · Просмотры: 374
G

Guest

Так выравнивание нужно произвести по правому краю??? Или все же по ширине (вставляя пробелы между словами)????
Просто если нужно было бы произвести по правому краю, то пробелы бы вставлялись только в начале... ;-)


мне нужно по ширене (вставляя пробелы между словами)....
 
D

DarkKnight

Вот тоже самое но по ширине...
*сразу скажу, что алгоритм содержит возможную ошибку выравнивания (т.к. не всегда возможно при 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.png
    widestr2.jpg.png
    8,7 КБ · Просмотры: 451
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!