• Paranoid - курс по анонимности и безопасности в сети от команды codeby. Защита персональных данных, анонимность в сети интернет, настройка виртуальных машин, безопасная передача данных, анти форензика и еще много всего полезного. Подробнее ...

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

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

Guest

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

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

Guest

#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);
 
G

Guest

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

lazybiz

Well-known member
03.11.2010
1 339
0
#13
Тэг С++, это то, в чем нужно писать код, кнопка которого выглядит как надпись "С++" над сообщением, которое ты пишешь.
 
E
#15
Ну ксень, этож просто, вот вы прилетели на юпитер. а по юпитерски ни юп юп, и переводчика не взяли, как вы думаете это юпитерцам понравится?
А чего когда вы пришли на этот форум не хотите спросить так как это принято?
 

DarkKnight

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

DarkKnight

Well-known member
01.08.2010
653
0
#18
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;
}
 

Вложения

G

Guest

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

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

DarkKnight

Well-known member
01.08.2010
653
0
#20
Вот тоже самое но по ширине...
*сразу скажу, что алгоритм содержит возможную ошибку выравнивания (т.к. не всегда возможно при 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;
}
 

Вложения

Статус
Закрыто для дальнейших ответов.