Структурное программирование. Примеры
5.1. Таблица значений функции
5.1.1. Цикл while
// Пример 7.2.9
//Вывод таблицы значений функции циклом while
#include <iostream>
#include <math.h>
using namespace std;
double Fx(double x);
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
double a,b,h,x;
cout << "Введите диапазон a,b через пробел >";
cin >> a >> b;
cout << "Введите шаг изменения h > ";
cin >> h;
cout << "Таблица значений" << endl;
cout << "------------------------" << endl;
cout << " X : Y " << endl;
cout << "------------------------" << endl;
x=a; // начальное значение параметра цикла
while ( x<=b ) // условие повторения цикла
{
cout << " " << x << "\t\t"<< Fx(x) << endl;
x+=h; // изменение параметра цикла
}
cin.get();cin.get();
}
double Fx(double x) {
double y;
//y=x*x; //вид вычисляемой функции
y=sqrt(x); //вид вычисляемой функции
return y;
}
5.1.2. Цикл for
// Пример 7.2.10
//Вывод таблицы значений функции циклом for
#include <iostream>
#include <math.h>
using namespace std;
double Fx(double x);
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
double a,b,h,x;
cout << "Введите диапазон a,b через пробел >";
cin >> a >> b;
cout << "Введите шаг изменения h > ";
cin >> h;
cout << "Таблица значений" << endl;
cout << "------------------------" << endl;
cout << " X : Y " << endl;
cout << "------------------------" << endl;
for (x=a; x<=b; x+=h)
cout << " " << x << "\t\t"<< Fx(x) << endl;
// for (x=a; x<=b; cout << " " << x << "\t\t"<< Fx(x) << endl,x+=h);
cin.get();cin.get();
}
double Fx(double x) {
double y;
//y=x*x; //вид вычисляемой функции
y=sqrt(x); //вид вычисляемой функции
return y;
}
5.1.3. Операторы while, do while, for, switch
// Пример 7.2.11
// Повторение выполнения приложения при помощи цикла while
// Повторение ввода при помощи цикла do-while
// Вывод таблицы значений функции циклом for
// Выбор функции оператором switch
#include <iostream>
#include <math.h>
using namespace std;
enum TFunc {Finish, Kvadrat, Kub, Koren, Obratnoe, Sinus};
double Fx(double, TFunc);
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
double a,b,h,x;
int v;
// цикл выполнения приложения
while (true) {
// выбор типа функции - личная функция
do
{
cout << "Введите число\n1-квадрат, 2-куб, \
3-кв. корень, 4-обратное число, 5-синус, 0-выход >";
cin >> v;
} while (v<Finish || v>Sinus);
// завершение работы приложения
if (v==Finish) {
cout << "Приложение завершено! " ;
cin.get();
break;
}
// ввод границ отрезка - личная функция
do {
cout << "Введите диапазон a,b через пробел >";
cin >> a >> b;
} while (a>=b);
// ввод шага изменения - личная функция
do {
cout << " Введите шаг изменения h (0.1-2.0) > ";
cin >> h;
} while (h<0.1 || h>2);
// печать шапки таблицы
cout << "Таблица значений" << endl;
cout << "------------------------" << endl;
cout << " X : Y " << endl;
cout << "------------------------" << endl;
// вывод таблицы значений функции
for (x=a; x<=b; x+=h) {
cout << " " << x << "\t\t"<< Fx(x,(TFunc)v) << endl;
}
cin.get();
}
}
// функция для вычисления текущего значения х
double Fx(double x, TFunc v) {
double y;
switch (v) {
case 1 : y=x*x; break;
case 2 : y=x*x*x; break;
case 3 : y=sqrt(x); break;
case 4 : y=1/x; break;
case 5 : y=sin(x); break;
}
return y;
}
5.2. Числа Фибоначчи ( интересный for )
// Пример 7.2.12
// Нахождение N-го числа Фибоначчи итерацией
#include <iostream>
using namespace std;
//typedef unsigned long int ULONG;
typedef long double ULONG;
ULONG fib(ULONG position);
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
ULONG answer,position;
cout << "Номер числа в последовательности?:";
cin >> position;
cout << "\n";
answer=fib(position);
cout<< "Значение числа Фибоначчи = "<< answer;
cin.get();cin.get();
}
ULONG fib(ULONG n) {
ULONG minusTwo=1, minusOne=1, answer=2;
if (n<3)
return 1;
for (n-=3; n; n--) {// n=0 - ложь - условие завершения цикла
minusTwo=minusOne;
minusOne=answer;
answer=minusOne+minusTwo;
}
return answer;
}
5.3. Программа, работающая под управлением меню
// Пример 7.2.13
//Использование бесконечного цикла и выбора в меню
#include <iostream>
using namespace std;
typedef unsigned short int USHORT;
USHORT menu();
void DoTaskOne(); // Заглушки будущих функций - Stub
void DoTaskMany(USHORT);
void DoSomeThing();
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
bool exit=false; // флаг для завершения цикла
while(true) { // бесконечный цикл
USHORT choice=menu();
switch (choice) {
case (1) : DoTaskOne(); break;
case (2) : DoTaskMany(2); break;
case (3) : DoTaskMany(3); break;
case (4) : break;
case (5) : DoSomeThing(); break;
case (6) : DoTaskMany(4); break;
case (7) : exit=true; break;
default: cout << " Выберите снова\n"; cin.get(); break;
}
if (exit==true) break;
}
cin.get();
}
USHORT menu(){
USHORT choice;
cout << "**** Меню ****\n\n";
cout << "(1) Выбор 1.\n";
cout << "(2) Выбор 2.\n";
cout << "(3) Выбор 3.\n";
cout << "(4) Обновление меню.\n";
cout << "(5) Выбор DoSomeThing.\n";
cout << "(6) Выбор 4.\n\n";
cout << "(7) Выход.\n\n";
cout << ": ";
cin >> choice;
return choice;
}
void DoTaskOne() {
cout << "Задача 1! Для продолжения нажмите <Enter>\n";
cin.get(); cin.get();
}
void DoSomeThing() {
cout << "DoSomeThing! Для продолжения нажмите <Enter>\n";
cin.get(); cin.get();
}
void DoTaskMany(USHORT which) {
if (which ==2) cout << "Задача 2!\n";
else if (which == 3) cout << "Задача 3!\n";
else cout << "Задача 4!\n";
cout << " Для продолжения нажмите <Enter>\n";
cin.get(); cin.get();
}
5.4. Ввод числа из нужного диапазона
// Пример 7.2.14
// Повторение при вводе чисел с клавиатуры
#include <iostream>
using namespace std;
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
int age, min=20,max=30;
// Ввод возраста от min до max
do {
cout << "Введите возраст (" << min << "-" << max << ") ? " << endl;
cin >> age;
} while(age < min || age > max);
cout << "Возраст: " << age <<endl;
cin.get();
// Ввод возраста < min или > max
do {
cout << "Возраст <" << min << " или > " << max << " ? " << endl;
cin >> age;
} while(age >= min && age <= max);
cout << "Возраст : " << age <<endl;
cin.get();cin.get();
}
// Пример 7.2.15
// Ввод чисeл нужного диапазона
#include <iostream>
#include <ctype.h>
#include <string>
#include <conio.h>
using namespace std;
int GetNumber(int min, int max);
string FormString();
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
int MyInt, Age;
MyInt=GetNumber(1,10);
Age=GetNumber(20,40);
cout << "Введены числа : ";
cout << MyInt << '\t' << Age << endl;
cin.get(); cin.get();
}
int GetNumber(int min, int max) {
string str;
int value;
do {
cout << "Введите целое от " << min << " до " << max << endl;
str=FormString();
value=atoi(str.c_str()); // преобразование строки С++ в целое
} while (value < min || value > max);
cout << "Введено число: " << value << endl;
return value;
}
string FormString() {
int ENTER=13, ch;
string str;
while (1) {
ch=_getch();
if (ch==ENTER) {
cout << endl; break;
}
if (isdigit(ch)) {
str+=(char)ch;
cout << (char)ch;
}
}
return str;
}
Практические задания
1. Каким будет значение х после завершения цикла for?
for ( int x=0; x < 100; x++);
2. Напишите вложенный цикл for, печатающий картинку из нулей 10х10.
3. Напишите циклы for, while, do…while для печати чисел от 100 до 200 через 2.
4. Напишите программу для ввода числа из заданного диапазона с клавиатуры. В случае выхода за границу диапазона повторите ввод числа.
5. Напишите программу вычисления суммы и произведения чисел, вводимых с клавиатуры :
a. количество чисел предварительно вводится с клавиатуры;
b. вычисления прекращаются по запросу программы.
6. Что неверно в следующем коде?
int counter=0;
while (counter < 10) {
cout << “counter: ” << counter;
}
7. Что неверно в следующем коде?
for (int counter=0; counter < 10; conter++) ;
cout << “counter: ” << counter;
8. Что неверно в следующем коде?
int counter=100;
while (counter < 10) {
cout << “counter: ” << counter; counter--;
}
9. *** Напишите циклическую программу для ввода параметров объекта (Cat, Pencil, Worker, Student…) с клавиатуры и распечатки их на экран. Использовать классы из предыдущей темы.
10. Напишите 3 варианта switch для печати названий дней недели, используя различные типы его параметра : целое, символ и перечисление.
11. Напишите программу для вывода характеристики землетрясения по шкале Рихтера, используя следующую таблицу решений
Баллы | Характеристика |
n < 5 | Легкое, нет разрушений |
5 <= n < 5.5 | Среднее, небольшие разрушения |
5.5 <= n < 6.5 | Серьезное, разрушения и повреждения стен |
6.5 <= n < 7.5 | Бедствие, многие дома и здания повреждены |
n > 7.5 | Катастрофа, большинство домов и зданий разрушены |
12. Напишите программу для определения срока службы электрической лампочки на основе ее мощности, используя следующую таблицу решений.
Мощность, Вт | Срок службы, ч |
40, 60 | |
75, 100 | |
150, 200 |
13. Что недопустимо, а что логически неправильно в следующем коде?
double color=1;
switch (color) {
case 1 : cout << “Black\n”;
case 2 : cout << “White\n”;
default : cout << “Other\n”;
}
Контрольные вопросы
1. Почему отказались от циклов с меткой и оператором goto?
2. Как работает цикл while?
3. Может ли тело цикла while не выполниться ни разу?
4. Может цикл while выполняться бесконечно? Как избежать этого?
5. Может ли условие в цикле while быть сложным?
6. Для чего предназначены операторы break и continue?
7. Какой оператор обязательно должен быть внутри цикла while (1) ?
8. В каких случаях пользуются циклом do…while?
9. Какие три этапа включает в себя цикл for? Как он работает?
10. Можно ли в цикле for инициализировать и изменять несколько переменных?
11. Можно ли пропускать параметры в цикле for?
12. Может ли цикл for быть пустым?
13. Можно ли внутрь одного цикла вкладывать другой? Есть ли на это ограничения?
14. Какого типа должен быть параметр оператора switch?
15. Для чего в операторе switch используется оператор break?
16. Что произойдет, если случай оператора switch не будет завершен break?
17. Почему рекомендуется внутрь switch вставить случай default?
18. Есть ли ограничение на количество случаев в операторе switch?
19. Как сделать выбор между конструкциями if/else и switch?
Заключение
В данном конспекте лекций были освещены теоретические и практические приемы основ программирования на языке С++.
Цель пособия - дать правильное представление студентам о возможностях языка С++ и подготовить их к дальнейшему его изучению, т.е. к освоению объектно-ориентированного программирования (ООП).
ООП - методика разработки программ, состоящих из объектов. Основой для создания объектов являются классы. ООП позволило реализовать, внедрить в жизнь и постоянно дорабатывать огромные по размерам программные проекты. Разработать и сопровождать такие проекты по силам только большим группам программистов. Методами структурного программирования, применяемыми ранее, эти проекты реализовать было просто невозможно.
Вторая часть конспекта лекций будет посвящена изучению объектно-ориентированных возможностей языка С++, механизмам использования свободной памяти, концепциям хранения и обработки большого количества объектов в оперативной и внешней памяти.
Желаю всем успехов в освоении и использовании языка С++. Его знание позволит, в случае необходимости, достаточно быстро освоить языки программирования Java и C#, которые являются потомками C++.
Литература
1. Джесс Либерти. Освой самостоятельно С++. 3 и-е. М.: Вильямс. – 2000.
2. Г. Шилдт. Полный справочник по С++. 4 и-е. – М.: Вильямс. – 2003.
3. Т.А. Павловская. С/С++. Программирование на языке высокого уровня. ПИТЕР-2002
4. С.В. Глушаков. Практикум по С++. ФОЛИО – 2006
5. Х. Дейтел, П. Дейтел. Как программировать на С++.
6. Страуструп Б. Язык программирования С++. БИНОМ, 1999
7. Керниган Б., Ритчи Д., Фьюэр А. Язык программирования Си. - М.: Финансы и статистика , 2000.
8. Прата С. Язык программирования С. Лекции и упражнения : пер. с англ. / С. Прата. – 5-е изд. – М. : Вильямс, 2006. – 960 с.
9. Ю.Л. Кетков. Введение в языки программирования C и C++
http://www.intuit.ru/department/pl/ccpp/
10. А.Л. Фридман. Язык программирования C++
http://www.intuit.ru/department/pl/cpp/
Содержание
Введение.. 3
Тема 1: Введение в С++. 5
Лекция 1.1. Эволюция языка С++. Цикл разработки приложения. 5
Лекция 1.2. Работа в среде Visual Studio. 13
Практические задания. 21
Контрольные вопросы.. 22
Тема 2: Составные части программы на С++. 24
Лекция 2.1. Структура простой программы.. 24
Лекция 2.2. Использование функций. 36
Практические задания. 48
Контрольные вопросы.. 49
Тема 3: Переменные и константы... 51
Лекция 3.1. Встроенные типы данных. 51
Лекция 3.2. Константы, перечисления, синонимы типа. 61
Практические задания. 75
Контрольные вопросы.. 76
Тема 4: Операции и выражения.. 78
Лекция 4.1. Математические операторы и выражения. 78
Лекция 4.2. Логические операторы и выражения. 93
Практические задания. 105
Контрольные вопросы.. 106
Тема 5: Функции. 108
Лекция 5.1. Личные и встроенные функции. 108
Лекция 5.2. Параметры. Значения по умолчанию. Перегрузка. Рекурсия. 130
Практические задания. 147
Контрольные вопросы.. 149
Тема 6: Структуры. Классы и объекты. 150
Лекция 6.1. Структуры в языке С. 150
Лекция 6.2. Классы с открытыми данными. 163
Лекция 6.3. Конструкторы и деструктор. Cкрытие данных. 185
Лекция 6.4. Введение в библиотеки классов. 205
Практические задания. 213
Контрольные вопросы.. 214
Тема 7: Циклы, выбор вариантов. 216
Лекция 7.1. Циклы. 216
Лекция 7.2. Выбор из вариантов. 228
Практические задания. 246
Контрольные вопросы.. 248
Заключение.. 249
Литература.. 250