![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
ammaximus |
![]()
Сообщение
#1
|
![]() Ночной волк ![]() ![]() Группа: Пользователи Сообщений: 103 Пол: Мужской Репутация: ![]() ![]() ![]() |
Пытаюсь разобраться с манипуляторами на примере этой задачи
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 |
![]()
Сообщение
#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
|
ammaximus |
![]()
Сообщение
#4
|
![]() Ночной волк ![]() ![]() Группа: Пользователи Сообщений: 103 Пол: Мужской Репутация: ![]() ![]() ![]() |
Программа 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 |
![]()
Сообщение
#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;
}
Не надо пользоваться безликими числами. Гораздо удобнее использовать именованные константы и перечисления. |
ammaximus |
![]()
Сообщение
#6
|
![]() Ночной волк ![]() ![]() Группа: Пользователи Сообщений: 103 Пол: Мужской Репутация: ![]() ![]() ![]() |
#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 |
![]()
Сообщение
#7
|
Гость ![]() |
не *.H-файл ххххххххххххххххПОЧЕМУ? Потому что использование H-файлов в настоящее время является deprecated (не рекомендованным) Стандартом С++. Тому есть много причин:1) в один прекрасный момент H-версии файлов могут просто исчезнуть, и перестать поддерживаться; 2) содержимое <iostream.h> поддерживает работу с простыми символами (char), а содержимое <iostream> кроме этого поддерживает еще и работу с Юникодом (wchar_t); 3) интерфейс <iostream.h> уже достаточно долгое время не изменяется, а <iostream> изменяется в ходе развития С++ и его библиотек (STL) 4) классы, описанные в <iostream.h> входят в глобальное пространство имен, а классы, описанные в <iostream> - в пространство имен std, что позволяет избежать конфликтов при использовании одинаковых имен. ххххххххххххххххххххх это зачем? Затем, что см. пункт 4) выше, и затем, чтобы не писАть:
std::cout.setf(std::ios_base::right | std::ios_base::dec);
std::cout << std::setw(15) << privet << std::endl; // Проверка выравнивания вправо
, а сразу сказать компилятору, что ты будешь использовать именно пространство имен std... |
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 9:28 |