У Дейтлов есть код
| Код | // Рис. 2.9: fig02_09.cpp // Использование повторения с пометкой для вычисления среднего #include<iostream.h> #include<windows.h> int rustext(char str[]) { char buffer[1024]; CharToOem(str,buffer); cout << buffer; } using std::cout; using std::cin; using std::endl; using std::ios; #include<iomanip.h>; using std::setprecision; using std::setiosflags; int main() { int total, // сумма оценок gradeCounter, // число введенных оценок grade; // одна оценка double average; // число с десятичной точкой для оценки // фаза инициализации total = 0; gradeCounter = 0; // фаза обработки rustext("Введите оценку или -1 для завершения: "); cin >> grade; while (grade != -1) { total = total + grade; gradeCounter = gradeCounter + 1; rustext("Введите оценку или -1 для завершения: "); cin >> grade; } // фаза завершения if (gradeCounter != 0) { average = static_cast < double > (total) / gradeCounter; rustext("Средняя оценка равна "); cout << setprecision(3) << setiosflags(ios::fixed | ios::showpoint) << average << endl; } else rustext("Нет введенных оценок"); cout << endl; system("pause"); return 0; // признак успешного завершения }
|
Во-первых, почему они связались с static_cast < double >? Можно было сразу для переменных total и gradeCounter задать тип double. Догадываюсь, что для них определен int, а позднее с помощью static_cast временно задан double из соображений экономии памяти? Я прав? Ведь можно было сразу им double задать:
| Код | // Рис. 2.9: fig02_09.cpp // Использование повторения с пометкой для вычисления среднего #include<iostream.h> #include<windows.h> int rustext(char str[]) { char buffer[1024]; CharToOem(str,buffer); cout << buffer; } #include<iomanip.h>; int main() { double total, // сумма оценок gradeCounter, // число введенных оценок grade, // одна оценка average; // число с десятичной точкой для оценки // фаза инициализации total = 0; gradeCounter = 0; // фаза обработки rustext("Введите оценку или -1 для завершения: "); cin >> grade; while (grade != -1) { total = total + grade; gradeCounter = gradeCounter + 1; rustext("Введите оценку или -1 для завершения: "); cin >> grade; } // фаза завершения if (gradeCounter != 0) { average = total / gradeCounter; rustext("Средняя оценка равна "); cout << setprecision(2) << setiosflags(ios::fixed | ios::showpoint) << average << endl; } else rustext("Нет введенных оценок"); cout << endl; system("pause"); return 0; // признак успешного завершения }
|
Во-вторых, я не пойму, зачем нужен параметр ios::showpoint в setiosflags. Вводил значения 9 и 6, как с showpoint получаю 7.50, так и без него также.
В-третьих, зачем писать using std::cout; и прочие using... Когда я учил С++ по Подбельскому, там этого не было, и у меня и без них все работает. |