FAQ:ANSI CPP — различия между версиями

Материал из Весельчак У
Перейти к: навигация, поиск
(Добавлена статья.)
 
(не показано 18 промежуточных версий 2 участников)
Строка 1: Строка 1:
===Не получается сравнить два числа типа double===
+
== Ответы на часто задаваемые вопросы по ANSI C++.  ==
стандартный прием - задание точности:
+
<pre>
+
#include <math.h>
+
double d1,d2;
+
double acc=0.00001;//требуемая точность сравнения
+
...
+
...
+
if( fabs(d1-d2) < acc )
+
{
+
//операнды равны (с точностью acc)
+
}
+
else
+
{
+
//убедились, что операнды не равны, здесь можно
+
//смело сравнивать операторами ">" и "<"
+
}
+
</pre>
+
  
===Как задать число знаков после запятой у float при преобразовании в строку?===
+
Составлено по материалам [http://forum.shelek.ru форума программистов].  
примеры для разных случаев:
+
<pre>
+
char sDouble[128]
+
float d1 = 0.001778;
+
...
+
sprintf(sDouble,"%.4f",d1);//4 знака после запятой
+
...
+
printf("%.4f", d1);//4 знака после запятой
+
...
+
cout<<setiosflags( ios::fixed )<< setprecision( 4 )
+
<< d1;//4 знака после запятой
+
</pre>
+
  
===Как динамически задать число знаков после запятой у float при преобразовании в строку?===
+
<br>  
Если нужно вывести, к примеру, 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?===
+
#[[FAQ:ANSI CPP:сравнить два числа типа double|Не получается сравнить два числа типа double.]]
В printf в спецификаторе числа разрядов можно поставить символ "*".
+
#[[FAQ:ANSI CPP:задать число знаков после запятой|Как задать число знаков после запятой у float при преобразовании в строку?]]
тогда соответствующий по порядку аргумент будет интерпретирован
+
#[[FAQ:ANSI CPP:динамически задать число знаков после запятой|Как динамически задать число знаков после запятой у float при преобразовании в строку?]]
как число знаков
+
#[[FAQ:ANSI CPP:задать число знаков после запятой в функции printf|Как задать число знаков после запятой у float в функции printf?]]
<pre> printf("%.*f", 2, 3.1415);//выведет 3.14 </pre>
+
#[[FAQ:ANSI CPP:вывод в файл с помощью fstream|Как всё, что выводится в cout, вывести в файл?]]
(для CString::Format символ "*" НЕ работает)
+
#[[FAQ:ANSI CPP:при вводе текста в переменную считываются только те символы, которые шли до пробела, а необходимо считать всю строку целиком|Как преодолеть такую ситуацию, когда при вводе текста в переменную считываются только те символы, которые шли до пробела, а мне необходимо считать всю строку целиком?]]
 +
#[[FAQ:ANSI CPP:генерация случайных чисел от 0 до 1|Какую функцию нужно использовать для генерации случайных чисел от 0 до 1?]]
 +
#[[FAQ:ANSI CPP:присвоение строки|Почему не получается присвоить строку?]]
 +
#[[FAQ:ANSI CPP:передача параметров конструктору базового класса|Как из конструктора класса-наследника передать параметры конструктору базового класса?]]
 +
#[[FAQ:ANSI CPP:обращение к переменной или методу базового класса|Как обратиться к переменной или методу базового класса?]]
 +
#[[FAQ:ANSI CPP:генератор псевдослучайных чисел|Стандартный генератор псевдослучайных чисел.]]
 +
#[[FAQ:ANSI CPP:проинициализировать статический член класса|Как проинициализировать статический член класса?]]
 +
#[[FAQ:ANSI CPP:задать значение константы в двоичном представлении|Как задать значение константы в двоичном представлении (т.е. единицами и нулями в виде битового поля)?]]
 +
#[[FAQ:ANSI CPP:преобразование строки и числа|Как можно число, представленное в символьном виде, получить (или преобразовать) в виде целочисленного типа данных? И как представить число в виде массива символов (строки)? (например CString -&gt; int и int -&gt; CString)]]
 +
#[[FAQ:ANSI CPP:удалить из строки все пробелы|Как удалить из строки все пробелы при обработке строки символов в Си++?]]
  
===Как всё, что выводится в cout,вывести в файл?===
+
[[Category:FAQ]] [[Category:FAQ:ANSI_CPP]]
Можно перенаправишь поток 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>
+

Текущая версия на 18:17, 20 сентября 2008

Ответы на часто задаваемые вопросы по ANSI C++.

Составлено по материалам форума программистов.


  1. Не получается сравнить два числа типа double.
  2. Как задать число знаков после запятой у float при преобразовании в строку?
  3. Как динамически задать число знаков после запятой у float при преобразовании в строку?
  4. Как задать число знаков после запятой у float в функции printf?
  5. Как всё, что выводится в cout, вывести в файл?
  6. Как преодолеть такую ситуацию, когда при вводе текста в переменную считываются только те символы, которые шли до пробела, а мне необходимо считать всю строку целиком?
  7. Какую функцию нужно использовать для генерации случайных чисел от 0 до 1?
  8. Почему не получается присвоить строку?
  9. Как из конструктора класса-наследника передать параметры конструктору базового класса?
  10. Как обратиться к переменной или методу базового класса?
  11. Стандартный генератор псевдослучайных чисел.
  12. Как проинициализировать статический член класса?
  13. Как задать значение константы в двоичном представлении (т.е. единицами и нулями в виде битового поля)?
  14. Как можно число, представленное в символьном виде, получить (или преобразовать) в виде целочисленного типа данных? И как представить число в виде массива символов (строки)? (например CString -> int и int -> CString)
  15. Как удалить из строки все пробелы при обработке строки символов в Си++?