Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование основы языка С++. Учебное пособие
.pdf
следует избегать использования break и continue в циклах;
для бесконечных циклов следует использовать форму while (true):
while (true) {
:
}
3.4 Условные выражения
избегайте сложных условных выражений:
bool isFinished = (elementNo < 0) || (elementNo > maxElement);
bool isRepeatedEntry = elementNo == lastElement;
if (isFinished || isRepeatedEntry) {
:
}
// NOT:
if ((elementNo < 0) || (elementNo > maxElement)||
elementNo == lastElement) {
:
}
ожидаемую часть следует располагать в части if, исключение – в
части else:
bool isOk = readFile (fileName);
if (isOk) {
:
}
else {
:
}
условие следует размещать в отдельной строке:
if (isDone) // НЕ РЕКОМЕНДУЕТСЯ: if (isDone) doCleanup();
doCleanup();
следует строго избегать исполнимых выражений в условиях:
File* fileHandle = open(fileName, "w");
if (!fileHandle) {
:
}
// НЕЛЬЗЯ:
if (!(fileHandle = open(fileName, "w"))) {
161

:
}
3.5 Другое
следует избегать «магических» чисел в коде;
•
константы с плавающей точкой следует записывать с десятичной
•
точкой и с указанием по крайней мере одной цифры после запятой:
double total = 0.0; // НЕ РЕКОМЕНДУЕТСЯ: double total = 0;
double speed = 3.0e8; // НЕ РЕКОМЕНДУЕТСЯ: double speed = 3e8;
double sum;
:
sum = (a + b) * 10.0;
константы с плавающей точкой следует всегда записывать, по
•
крайней мере, с одной цифрой до десятичной точки:
double total = 0.5; // НЕ РЕКОМЕНДУЕТСЯ: double total = .5;
у функций нужно обязательно указывать тип возвращаемого зна-
•
чения:
int getValue() // НЕЛЬЗЯ: getValue()
{
:
}
не следует использовать goto;
•
4 Оформление и комментарии
4.1 Оформление
основной отступ следует делать в два пробела:
•
for (i = 0; i < nElements; i++)
a[i] = 0;
блоки кода следует оформлять следующим образом:
•
while (!done) {
doSomething();
done = moreToDo();
}
объявления классов следует оформлять следующим образом:
•
class SomeClass : public BaseClass
{
public:
162

...
protected:
...
private:
...
}
определения методов следует оформлять следующим образом:
•
void someMethod()
{
...
}
конструкцию if-else следует оформлять следующим образом:
•
if (condition) {
statements;
}
if (condition) {
statements;
}
else {
statements;
}
if (condition) {
statements;
}
else if (condition) {
statements;
}
else {
statements;
}
цикл for следует оформлять следующим образом:
•
for (initialization; condition; update) {
statements;
}
цикл for с пустым телом следует оформлять следующим образом:
•
for (initialization; condition; update)
163

;
цикл while следует оформлять следующим образом:
•
while (condition) {
statements;
}
цикл do-while следует оформлять следующим образом:
•
do {
statements;
} while (condition);
конструкцию switch следует оформлять следующим образом:
•
switch (condition) {
case ABC :
statements;
// Отсутствует "break"
case DEF :
statements;
break;
case XYZ :
statements;
break;
default :
statements;
break;
}
конструкцию try-catch следует оформлять следующим образом:
•
try {
statements;
}
catch (Exception& exception) {
statements;
}
если конструкция if-else содержит только одно выражение в теле,
•
фигурные скобки можно опускать:
if (condition)
statement;
164

while (condition)
statement;
for (initialization; condition; update)
statement;
возвращаемый функцией тип может располагаться над именем
•
самой функции:
void
MyClass::myMethod(void)
{
:
}
4.2 Пробелы
операторы следует отбивать пробелами;
•
после зарезервированных ключевых слов языка C++ следует ста-
•
вить пробел;
после запятых следует ставить пробелы;
•
двоеточия следует отбивать пробелами;
•
после точек с запятой в цикле for следует ставить пробелы;
•
после имен методов может идти пробел, если далее следует другое
•
имя:
doSomething (currentFile);
логические блоки в коде следует отделять пустой строкой:
•
Matrix4x4 matrix = new Matrix4x4();
double cosAngle = Math.cos(angle);
double sinAngle = Math.sin(angle);
matrix.setElement(1, 1, cosAngle);
matrix.setElement(1, 2, sinAngle);
matrix.setElement(2, 1, –sinAngle);
matrix.setElement(2, 2, cosAngle);
multiply(matrix);
методы рекомендуется отделять тремя пустыми строками;
•
переменные в объявлениях можно выравнивать:
•
AsciiFile* file;
int nPoints;
float x, y;
165

4.3 Комментарии
сложный код, написанный с использованием хитрых ходов, следует
•
не комментировать, а переписывать;
все комментарии следует писать на английском;
•
используйте // для всех комментариев, включая многострочные;
•
комментарии следует располагать так, чтобы они относились к
•
тому, что они описывают:
while (true) { // НЕ РЕКОМЕНДУЕТСЯ: while (true) {
// Do something // Do something
something(); something();
} }
166

Приложение Готовые решения на С++
Готовые решения представляют вариант решения достаточно
стандартных задач на С++, которые представлены для ознакомления
[16– 18].
1 Вывод двоичного представления целого десятичного числа
#include <cstdio>
#include <string>
//Сразу напишем общую версию для всех целочисленных типов
template <typename T>
std::string intToBin(T val) {
if (val == 0)
return "0"; //Здесь сработает конструктор std::string
//Буфер для записи двоичного представления
//Всего битов в числе sizeof(T) * 8, и еще один на терминальный символ
char bary[sizeof(T) * 8 + 1];
//Индекс записи в буфер выше
int idigit = 0;
bool meetOne = false;
//Спускаемся от старшего к младшему биту
for (int i = sizeof(T) * 8 – 1; i >= 0; i--)
{
if (val & (T(1) << i)) //Если бит номер i установлен...
{
//...записываем 1 в соответствующий бит строкового представления
//и устанавливаем флаг встречи с 1
meetOne = true;
bary[idigit++] = '1';
}
else
{
//...записываем ноль, но только если до этого была единица,
//так избавимся от ненужных ведущих нулей
if (meetOne)
{
bary[idigit++] = '0';
}
167

}
}
//Завершение строки терминальным символом
bary[idigit] = '\0';
return bary; //Конструктор std::string
}
int main()
{
int val;
while (std::scanf("%d", &val) != EOF)
{
std::printf("%s ", intToBin(val).c_str());
}
return 0;
}
2 Разложение натурального числа на простые множители
#include <iostream>
#include <vector>
using namespace std;
template <typename intT>
vector<intT> fact(intT num) {
intT j = 2;
vector<intT> res;
while (num / intT(2) >= j) {
if (num % j == 0) {
res.push_back(j);
num /= j;
j = intT(2);
}
else {
++j;
}
}
res.push_back(num);
return res;
168

}
//typedef unsigned long integralT;
typedef __int64 integralT;
int main() {
vector<integralT> v;
integralT n;
while (true) {
cout << "Enter positive number: ";
cin >> n;
v.clear();
v = fact(n);
for (auto i = v.begin(); i != v.end(); i++) {
if (i != v.begin())
cout << ", ";
cout << *i;
}
cout << endl << endl;
}
return 0;
}
3 Итеративное вычисление факториала
#include <iostream>
using namespace std;
// Итеративное вычисление факториала
long double fact(int N)
{
if (N < 0) // если пользователь ввел отрицательное число
return 0; // возвращаем ноль
if (N == 0) // если пользователь ввел ноль,
return 1; // возвращаем факториал от нуля – единицу
// Вычисляем факториал в цикле
long double result = 1;
for (int i = 1; i <= N; i++) {
result *= i;
}
169

return result;
}
int main()
{
int N;
setlocale(0, ""); // Включаем кириллицу
cout << "Введите число для вычисления факториала: ";
cin >> N;
cout << "Факториал для числа " << N << " = " << fact(N) << endl <<
endl; // fact(N) – функция для вычисления факториала.
system("pause");
return 0;
}
170
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
