FAQ:ANSI CPP

Материал из Весельчак У
Перейти к: навигация, поиск

Не получается сравнить два числа типа 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');