FAQ:ANSI CPP — различия между версиями
Материал из Весельчак У
(→Как задать число знаков после запятой у float при преобразовании в строку?) |
|||
| Строка 16: | Строка 16: | ||
//смело сравнивать операторами ">" и "<" | //смело сравнивать операторами ">" и "<" | ||
} | } | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
</pre> | </pre> | ||
| Строка 65: | Строка 33: | ||
===Как динамически задать число знаков после запятой у float при преобразовании в строку?=== | ===Как динамически задать число знаков после запятой у float при преобразовании в строку?=== | ||
| + | Если нужно вывести, к примеру, double с 5 знаками после | ||
| + | десятичной точки, сначала нужно сформировать строку вида | ||
| + | "%.5f", а потом задать ее в качестве спецификации формата | ||
| + | <pre> char sDouble[128], strFormat[128]; | ||
| + | double d1 = 150.0f; | ||
| + | int nCount;//текущее количество знаков после запятой | ||
| + | ... | ||
| + | nCount = 5; | ||
| + | sprintf(strFormat, "%%.%df", nCount ); | ||
| + | //strFormat теперь содержит строку "%.5f" | ||
| + | //форматируем: | ||
| + | sprintf(sDouble, strFormat, d1); | ||
| + | </pre> | ||
| + | аналогично, если используется класс CString : | ||
| + | <pre> | ||
| + | CString sDouble,strFormat; | ||
| + | ... | ||
| + | strFormat.Format("%%.%df", nCount ); | ||
| + | sDouble.Format(strFormat, d1); | ||
| + | </pre> | ||
| + | |||
| + | ===Как задать число знаков после запятой у float в функции printf?=== | ||
| + | В printf в спецификаторе числа разрядов можно поставить символ "*". | ||
| + | тогда соответствующий по порядку аргумент будет интерпретирован | ||
| + | как число знаков | ||
| + | <pre> printf("%.*f", 2, 3.1415);//выведет 3.14 </pre> | ||
| + | (для CString::Format символ "*" НЕ работает) | ||
| + | |||
| + | ===Как всё, что выводится в cout,вывести в файл?=== | ||
| + | Можно перенаправишь поток cout при запуске программы, но тогда | ||
| + | ВСЕ сообщения пойдут в этот файл. Так что лучше открыть | ||
| + | специальный поток для файла: | ||
| + | <pre> | ||
| + | #include <fstream> | ||
| + | ... | ||
| + | ofstream file_out (filename); | ||
| + | ... | ||
| + | file_out<< "текст" <<setiosflags( ios::fixed ) | ||
| + | <<setprecision( 3 )<< 3.456564 << endl; | ||
| + | </pre> | ||
| + | |||
| + | ===Как преодолеть такую ситуацию, когда при вводе текста в переменную считываются только те символы, которые шли до пробела, а мне необходимо считать всю строку целиком? === | ||
| + | например: | ||
| + | <pre> | ||
| + | char test1[20],test[20]; | ||
| + | cin>>test; //ввожу: "текст с пробелом" | ||
| + | cout<<test; //выводится: "текст"} | ||
| + | |||
| + | scanf("%s",test1); //ввожу: "текст с пробелом" | ||
| + | printf("%s",test1); //выводится: "текст" | ||
| + | </pre> | ||
| + | Как это обойти? Средствам доступными в TC++3? | ||
| + | <pre> | ||
| + | string buffer; | ||
| + | getline(cin, buffer, '\n'); | ||
| + | cout << buffer << "|" << endl; | ||
| + | </pre> | ||
| + | или | ||
| + | <pre> | ||
| + | do | ||
| + | { | ||
| + | ch = getch(); | ||
| + | cout << ch | ||
| + | }while(ch!='/0'); | ||
| + | </pre> | ||
Версия 10:20, 20 апреля 2007
Содержание
- 1 Не получается сравнить два числа типа double
- 2 Как задать число знаков после запятой у float при преобразовании в строку?
- 3 Как динамически задать число знаков после запятой у float при преобразовании в строку?
- 4 Как задать число знаков после запятой у float в функции printf?
- 5 Как всё, что выводится в cout,вывести в файл?
- 6 Как преодолеть такую ситуацию, когда при вводе текста в переменную считываются только те символы, которые шли до пробела, а мне необходимо считать всю строку целиком?
Не получается сравнить два числа типа double
стандартный прием - задание точности:
#include <math.h>
double d1,d2;
double acc=0.00001;//требуемая точность сравнения
...
...
if( fabs(d1-d2) < acc )
{
//операнды равны (с точностью acc)
}
else
{
//убедились, что операнды не равны, здесь можно
//смело сравнивать операторами ">" и "<"
}
Как задать число знаков после запятой у float при преобразовании в строку?
примеры для разных случаев:
char sDouble[128]
float d1 = 0.001778;
...
sprintf(sDouble,"%.4f",d1);//4 знака после запятой
...
printf("%.4f", d1);//4 знака после запятой
...
cout<<setiosflags( ios::fixed )<< setprecision( 4 )
<< d1;//4 знака после запятой
Как динамически задать число знаков после запятой у float при преобразовании в строку?
Если нужно вывести, к примеру, double с 5 знаками после десятичной точки, сначала нужно сформировать строку вида "%.5f", а потом задать ее в качестве спецификации формата
char sDouble[128], strFormat[128]; double d1 = 150.0f; int nCount;//текущее количество знаков после запятой ... nCount = 5; sprintf(strFormat, "%%.%df", nCount ); //strFormat теперь содержит строку "%.5f" //форматируем: sprintf(sDouble, strFormat, d1);
аналогично, если используется класс CString :
CString sDouble,strFormat;
...
strFormat.Format("%%.%df", nCount );
sDouble.Format(strFormat, d1);
Как задать число знаков после запятой у float в функции printf?
В printf в спецификаторе числа разрядов можно поставить символ "*". тогда соответствующий по порядку аргумент будет интерпретирован
как число знаков
printf("%.*f", 2, 3.1415);//выведет 3.14
(для CString::Format символ "*" НЕ работает)
Как всё, что выводится в cout,вывести в файл?
Можно перенаправишь поток cout при запуске программы, но тогда ВСЕ сообщения пойдут в этот файл. Так что лучше открыть специальный поток для файла:
#include <fstream> ... ofstream file_out (filename); ... file_out<< "текст" <<setiosflags( ios::fixed ) <<setprecision( 3 )<< 3.456564 << endl;
Как преодолеть такую ситуацию, когда при вводе текста в переменную считываются только те символы, которые шли до пробела, а мне необходимо считать всю строку целиком?
например:
char test1[20],test[20];
cin>>test; //ввожу: "текст с пробелом"
cout<<test; //выводится: "текст"}
scanf("%s",test1); //ввожу: "текст с пробелом"
printf("%s",test1); //выводится: "текст"
Как это обойти? Средствам доступными в TC++3?
string buffer; getline(cin, buffer, '\n'); cout << buffer << "|" << endl;
или
do
{
ch = getch();
cout << ch
}while(ch!='/0');