Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование основы языка С++. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
следует избегать использования 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]