IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Манипуляторы С++
сообщение
Сообщение #1


Ночной волк
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской

Репутация: -  1  +


Пытаюсь разобраться с манипуляторами на примере этой задачи

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


Помогите исправить


--------------------
Не думай о белой обезьяне.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Ты "перемешал" оба задания в одну кашу... Отдели одно от другого. Вот так выглядит первое:
# 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 работает)

Аналогично сделай и второе.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Спасибо, Volvo
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Ночной волк
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской

Репутация: -  1  +


Программа 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;
}



--------------------
Не думай о белой обезьяне.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Цитата
Программа 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;
}
Не надо пользоваться безликими числами. Гораздо удобнее использовать именованные константы и перечисления.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Ночной волк
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской

Репутация: -  1  +


Цитата(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;
}

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

Не знал что так можно
Почему не Н


--------------------
Не думай о белой обезьяне.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Цитата(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...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Achat Misoprostol France
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Keflex How To Take
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Бывалый
***

Группа: Пользователи
Сообщений: 155
Пол: Мужской

Репутация: -  0  +


Why not settling on games that is fun and at the same time your earning. Well itll make suspense because of the game as well but dude just try it and it gave me hope while pandemic is real rn. Effects of Gambling on the Economy
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 16.04.2024 17:25
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name