Помощь - Поиск - Пользователи - Календарь
Полная версия: Манипуляторы С++
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Другие языки
ammaximus
Пытаюсь разобраться с манипуляторами на примере этой задачи

1. Написать программу - посчитать длину окружности. Входные данные поступают с
клавиатуры. Установить ширину поля 10 символов, установить точность 4 цифры,
заполнить вместо пробелов символом / с помощью функций и
манипуляторов.Предусмотреть обработку ошибок. Результат выводится на экран в
десятичной, шестнадцатеричной и восьмеричной системе.
2. Проверить какие флаги потока вывода установлены и заменить попарно на
десятичные на шестнадцатиричные (и наоборот) левое выравнивание на правое
выравнивание (и наоборот) Проверить результат. Добавить в программу два своих
манипулятора. Один выводит сообщение, другой устанавливает
шестнадцатеричный вывод и символ заполнения $.


# include <iostream.h>
# include <iomanip.h>
const float pi=3.14;

int main() {
float l;
float r;

// number ONE
cout.width(10);
cout.precision(4);
cout.fill('/');
cout << "radius pls";;
// for (float r=0; cin.rdstate != '_good'; ++i);
cin >> r;
if (cin.rdstate != "_good") {
cout << " Input Error"
}
l=2*pi*r;
cout << "leghth of circle is";
cout << dec << l << /n;
cout << oct << l << /n;
cout << hex << l << endl;

// NUMBER TWO

long fl;
fl= cout.flags();
cout << "Now flag position: "<< fl<<"\n";

ostream& privet(ostream &stream)
{
stream << 'privet';
return stream;
}

ostream& hexdollar(ostream &stream)
{
stream.setf(ios::hex);
stream << fill('$');
return stream;
}

cout << privet << /n;
cout << hexdollar << 17 << endl;
return 0;
}


Помогите исправить
volvo
Ты "перемешал" оба задания в одну кашу... Отдели одно от другого. Вот так выглядит первое:
# include <iostream.h>
# include <iomanip.h>
const float pi = 3.14;

int main() {

float r;
// number ONE
cout.fill('/');
cout << "radius pls ";
cin >> r;
if (!cin.good()) {
cout << " Input Error"; return -1;
}

float l = 2 * pi * r;
cout << "appr. length of circle is ";
cout << setw(10) << dec << (int)l << "\n"; // dec/oct/hex влияют только на целые числа
cout << setw(10) << oct << (int)l << "\n";
cout << setw(10) << hex << (int)l << endl;
return 0;
}

(на GCC работает)

Аналогично сделай и второе.
Гость
Спасибо, Volvo
ammaximus
Программа 2, выравнивание по правому краю не происходит, почему? (MSV6) Как вообще работают флаги?


# include <iostream.h>
# include <iomanip.h>


ostream& privet(ostream &stream)
{
stream << "privet";
return stream;
}

ostream& hexdollar(ostream &stream)
{
stream.setf(ios::hex);
stream.fill('$');
return stream;
}


int main() {


long fl;
cout.setf(0x0004);
cout.setf(0x0010);
fl= cout.flags();

cout << "Now flag position: "<< fl<<"\n";
if (fl=20){
cout.unsetf(0x0004);
cout.unsetf(0x0010);
cout.setf(0x0002);
cout.setf(0x0040);
}
fl= cout.flags();
cout << "Now flag position: "<< fl<<"\n";
cout << privet << "\n";
cout << hexdollar << 17 << endl;

return 0;
}

volvo
Цитата
Программа 2, выравнивание по правому краю не происходит, почему?
Вот так тоже не работает?
#include <iostream> // не *.H-файл
#include <iomanip>
using namespace std;

ostream& privet(ostream &stream)
{
stream << "privet";
return stream;
}

ostream& hexdollar(ostream &stream)
{
stream.setf(ios::hex);
stream.fill('$');
return stream;
}


int main() {
long fl;
cout.setf(ios_base::right | ios_base::dec);
cout << setw(15) << privet << endl; // Проверка выравнивания вправо
fl = cout.flags();

cout << "Now flag position: "<< fl<<"\n";
if (fl == 20){ // Здесь - сравнение, а не присваивание !!!
cout.unsetf(ios_base::right | ios_base::dec);
cout.setf(ios_base::left | ios_base::hex);
}
fl = cout.flags();
cout << "Now flag position: "<< fl<<"\n";
cout << privet << "\n";
cout << hexdollar << 17 << endl;

return 0;
}
Не надо пользоваться безликими числами. Гораздо удобнее использовать именованные константы и перечисления.
ammaximus
Цитата(volvo @ 16.01.2009 16:47) *


#include <iostream> // не *.H-файл ххххххххххххххххПОЧЕМУ?
#include <iomanip>
using namespace std; ххххххххххххххххххххх это зачем?

ostream& privet(ostream &stream)
{
stream << "privet";
return stream;
}

ostream& hexdollar(ostream &stream)
{
stream.setf(ios::hex);
stream.fill('$');
return stream;
}
int main() {
long fl;
cout.setf(ios_base::right | ios_base::dec);
cout << setw(15) << privet << endl; // Проверка выравнивания вправо
fl = cout.flags();

cout << "Now flag position: "<< fl<<"\n";
if (fl == 20){ // Здесь - сравнение, а не присваивание !!! xxxxD
cout.unsetf(ios_base::right | ios_base::dec);
cout.setf(ios_base::left | ios_base::hex);
}
fl = cout.flags();
cout << "Now flag position: "<< fl<<"\n";
cout << privet << "\n";
cout << hexdollar << 17 << endl;

return 0;
}

Гораздо удобнее использовать именованные константы и перечисления.

Не знал что так можно
Почему не Н
volvo
Цитата(ammaximus @ 18.01.2009 17:18) *
не *.H-файл ххххххххххххххххПОЧЕМУ?
Потому что использование H-файлов в настоящее время является deprecated (не рекомендованным) Стандартом С++. Тому есть много причин:
1) в один прекрасный момент H-версии файлов могут просто исчезнуть, и перестать поддерживаться;
2) содержимое <iostream.h> поддерживает работу с простыми символами (char), а содержимое <iostream> кроме этого поддерживает еще и работу с Юникодом (wchar_t);
3) интерфейс <iostream.h> уже достаточно долгое время не изменяется, а <iostream> изменяется в ходе развития С++ и его библиотек (STL)
4) классы, описанные в <iostream.h> входят в глобальное пространство имен, а классы, описанные в <iostream> - в пространство имен std, что позволяет избежать конфликтов при использовании одинаковых имен.

Цитата(ammaximus @ 18.01.2009 17:18) *
ххххххххххххххххххххх это зачем?
Затем, что см. пункт 4) выше, и затем, чтобы не писАть:

std::cout.setf(std::ios_base::right | std::ios_base::dec);
std::cout << std::setw(15) << privet << std::endl; // Проверка выравнивания вправо

, а сразу сказать компилятору, что ты будешь использовать именно пространство имен std...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.