1-й семестр

advertisement
КАЗАНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Факультет вычислительной математики и кибернетики
Кафедра теоретической кибернетики
Введение в С++
А.М. Гусенков
Методическое пособие предназначено для преподавателей кафедры
теоретической кибернетики, ведущих практические занятия в первом
семестре курса «Информатика». Пособие содержит более 60 задач,
которые можно выполнить на ЭВМ как в среде ОС Windows, так и в среде
ОС Unix (Linux). Пособие также рекомендуется для студентов первого
курса для выполнения практических и семестровых заданий.
Казань 2006
Содержание
1. Основные структуры управления и их запись на языке С++. ...........................................3
2. Основные типы данных: int, float, double,char. Операции и функции над ними.
Выражения. ....................................................................................................................................5
3. Условная структура управления ..........................................................................................6
4. Циклическая структура управления. ...................................................................................9
5. Одномерные массивы. .........................................................................................................11
6. Двумерные массивы. Двойная индексация. ......................................................................14
7. Подпрограммы и функции. .................................................................................................15
8. Обработка символьной информации. ................................................................................19
9. Файловый ввод-вывод. ........................................................................................................24
10.
Двоичные файлы..............................................................................................................29
11.
Записи и файлы ................................................................................................................36
12.
Область видимости потоковых переменных. ...............................................................42
13.
Печать таблицы чисел. ....................................................................................................44
14.
Потоковые переменные и имена файлов.......................................................................45
Приложение 1. Таблица основных операций в порядке убывания приоритетов ..................47
Приложение 2. Средства ввода и вывода ..................................................................................47
Приложение 3. Математические функции (<math.h>) .............................................................51
2
1. Основные структуры управления и их запись на языке С++.
Задача 1.1 Последовательная и условная структуры управления порядком
выполнения операторов.
Н
+
1
-
+
2
3
+
1
3
4
2
5
К
{ if (b1)
if (b2)
{ s1; s2; }
else s3;
else
if (b3)
{ s4; s5; }
}
3
Задача 1.2 Циклическая структура управления (операторы while и do
while)
Н
+
1
+
2
3
1
К
+
3
-
2
{ while (b1)
{ if (b2)
do s1;
while (b3);
s2;
}
s3;
}
// Для адекватной реализации do while
// в С++ ‘+’ и ‘-‘ в b3 меняются местами,
// в отличии от блок-схемы для Pascal.
Задача 1.3 Перевод фрагментов C++-программ в запись блок-схем
begin if B then begin S1; if B1 then begin S2; S3 end else if B2 then S4 end else if B3 then begin
S5; S6; if B4 then S7 end end.
{ if (b) { s1; if (b1) { s2; s3; } else if (b2) s4; } else if (b3) { s5; s6;
if (b4) s7; } }
4
2. Основные типы данных: int, float, double,char. Операции и функции
над ними. Выражения.
Задача 2.1 Записать на языке C++ вычисление выражения с использованием
стандартных функций.
Y = sin2x+1*arctg( x +1)
#include <math.h> // Библиотека математических функций.
y = pow(sin(x),2) + 1*atan(x+1)
Задача 2.2 Логический тип данных. Отношения. Составление булевских
выражений.
.
а) х принадлежит отрезку [0,1];
x >= 0 && x <= 1
б) хотя бы одно из чисел x, y, z – положительно;
x > 0 || y > 0 || z > 0
в) нарисовать на плоскости область, в которой истинно указанное выражение:
(y>=x) and (y + x >=0) and (y<=1)
(y>=x) && (y + x >=0) && (y<=1)
г) переменой B присвоить значение true, если точка плоскости (x,y) принадлежит
заданной замкнутой области D, и false в противоположном случае
y
1
-1
1
x
-1
// Консольный ввод и вывод результатов. Входной поток cin.
// Выходной поток cout.
#include <math.h>
#include <iostream.h>
void main()
{ bool b;
double x,y;
cout << “Enter x:”;
cin >> x;
cout << “Enter y”;
5
cin >> y;
if(x>-1 && x<0 && y<x+1 && y>-1-x || x >=0 && x<1 &&
y<sqrt(1-x*x))
b = true;
else
b = false;
cout << “b=” << b;
}
3. Условная структура управления
Задача 3.1 Если x > y , то переменной z присвоить значение x – y,
Иначе переменной z присвоить значение x * y
z = x > y ? x – y : x * y; // Условное выражение
Задача 3.2 Среди чисел k, l и m два одинаковых, а третье отлично от них.
Переменной n
присвоить значение числа отличного от двух
одинаковых.
if (k==l) n=m;
else if (k==m) n=l;
else n=k;
// Конструкция else if
или с использованием условного выражения:
n = (k==l) ? m : (k==m) ? l : k :
Задача 3.3
/* Данная программа определяет четность введенного
целого числа
*/
#include <iostream.h>
void main()
{ int num;
cout << "Enter number:";
cin >> num;
// Чтение введенного числа
int k;
k = num%2; // Остаток от деления числа на 2
if(!k)
// Эквив. If ( k == 0 )
cout << "Even number\n"; // Число четное
else
cout << "Odd number\n"; // Число нечетное
}
Задача 3.4
/* Данная программа определяет четность введенного
целого числа. Вторая версия.
6
*/
#include <iostream.h>
void main()
{ int num;
cout << "Enter number:";
cin >> num;
// Чтение введенного числа
// Проверка остатка от деления числа на 2
// Эквив. if (!(num%2))
cout << "Even number\n"; // Число четное
if((num%2)==0)
else
cout << "Odd number\n";
// Число нечетное
}
Задача 3.5
/* Программа определяет, является ли год високосным.
Год високосный, если он делится на 4, но не делится на 100,
однако годы, делящиеся на 400, тоже високосные.
*/
#include <iostream.h>
void main()
{ int year;
cout << "Enter year:";
cin >> year;
if (year % 4 == 0 && year % 100 != 0 || year % 400 ==0)
cout << "leap-year\n";
// Год високосный
else
cout << "not leap-year\n";
// Год не високосный
}
Задача 3.6
/* Программа определяет, является ли год високосным.
Год високосный, если он делится на 4, но не делится на 100,
однако годы, делящиеся на 400, тоже високосные.
Вторая версия.
*/
#include <iostream.h>
void main()
{ int year;
cout << "Enter year:";
cin >> year;
if (!(year % 4) && year % 100 || !(year % 400)) // ! – экв. not
cout << "leap-year\n";
// Год високосный
else
cout << "not leap-year\n";
// // Год не високосный
}
Задача 3.7
/* Программа определяет, является ли год високосным.
7
Год високосный, если он делится на 4, но не делится на 100,
однако годы, делящиеся на 400, тоже високосные.
Третья версия с использованием условного выражения.
*/
#include <iostream.h>
void main()
{ int year;
cout << "Enter year:";
cin >> year;
cout << ( !(year % 4) && year % 100 || !(year % 400) ? "leap-year\n" :
"not leap-year\n");
}
Задача 3.8
/* Программа реализует калькулятор, выполняющий
арифметические операции.
Пример использования оператора switch.
*/
#include <iostream.h>
void main()
{ float x,y,z;
bool fl = true;
char op;
cout << "Enter first operand:";
cin >> x;
cout << "\nEnter operator: " ;
cin >> op;
cout << "\nEnter second operand:";
cin >> y;
switch (op)
{ case '+' :
z = x + y;
break;
case '-' :
z = x - y;
break;
case '*' :
z = x * y;
break;
case '/' :
if (y)
// Экв. if( y != 0)
z = x / y;
else
{ cout << "\nError: Divide by zero\n";
fl = false;
}
break;
default :
cout << "\nUnknown operator '" << op << "'\n";
fl = false;
}
if (fl)
8
cout << "\nResult=" << z << '\n';
}
4. Циклическая структура управления.
Задача 4.1 Вычислить:
n
∑ (-1)m-1
m=1 m2
#include <iostream.h>
#define N 100
void main()
{ int m;
double r = 0, sign = 1; // sign типа double для деления в цикле
for (m=1; m<=N; m++)
{ r = r + sign/(m*m); // Экв. r += sign/(m*m);
sign = sign*(-1);
}
cout << “Sum=”<< r;
}
Задача 4.2
// Вторая версия с явным преобразованием типа для правильного
// выполнения операции деления.
#include <iostream.h>
#define N 100
void main()
{ int m, sign = 1; // sign типа int
double r = 0;
for (m=1; m<=N; m++)
{ r = r + (double) sign/(m*m); // явное преобразование типа
sign = sign*(-1);
}
cout << “Sum=”<< r;
}
Задача 4.3. Циклическая структура управления.
∞
1+∑ xn =ex
n=1 n!
Вычислить приближенное значение функции, суммируя до первого члена, не
превосходящего по абсолютной величине ∂.
#include <iostream.h>
#include <math.h>
#define EPS 0.0001
// Оператор препроцессора для определения
// констант.
void main()
9
{ int n=1, fact=1;
double x, sum=0, term=1, step=1 ;
cout << "Enter x:";
cin >> x;
do
{ sum = sum + term;
fact = fact*n;
// Экв. fact *= n;
step = step*x;
term = step/fact;
n++;
}
while (fabs(term)>=EPS);
cout << "Sum=" << sum ;
}
Задача 4.4. Итерационные процессы.
Приближенное вычисление 1/x
Последовательности {ак} и {вк} заданы рекуррентно: а0 =1,
в0=1-х; (0<x<2)
ак= ак-1(1+вк-1), вк=в2к-1, к=1,2,…
Вычислить аn для наименьшего n, при котором вn ≤ ∂ (∂>0).
#include <iostream.h>
#define DELTA 0.001
void main()
{ double a=1, b, x;
cout << "Enter x:";
cin >> x;
if (x<=0 || x>=2)
cout << "not decision";
else
{ b=1-x;
do
{ a=a*(1+b);
b=b*b;
}
while(b>DELTA);
cout << "1/x=" << a << " "<< 1/x ;
}
}
Задача 4.5. Кратные вложенные циклы.
Вычислить:
n k
∑ ∏ xij , где xij=ln(i+cos(jy)).
i=2 j=0
10
#include <iostream.h>
#include <math.h>
#define N 10
#define K 5
void main()
{ int i,j;
double y, sum=0, prod;
cout << "Enter y:";
cin >> y;
for(i=2; i<=N; i++)
{ prod=1;
for(j=0; j<=K; j++)
prod=prod*log(i+cos(j*y));
sum=sum+prod;
}
cout << "Sum="<< sum;
}
5. Одномерные массивы.
Задача 5.1. Выбор элементов, удовлетворяющих заданному условию.
Определить количество элементов массива, находящихся за вторым элементом
равным нулю.
#include <iostream.h>
#define SIZE 10
void main()
{ int i, k=0, mas[SIZE];
cout << "Enter " << SIZE << " numbers" << '\n';
for(i=0;i<SIZE;i++)
cin >> mas[i];
for(i=0;i<SIZE;i++)
{ if(mas[i]==0)
k++;
if(k==2)
break;
}
if(k<2)
cout << "Not second zero in array\n";
else
cout << SIZE-i-1 << " elements\n" ;
}
Задача 5.2. Нахождения минимального и максимального элементов.
// Поиск минимального числа в массиве
#include <iostream.h>
void main()
{ int i, min, mas[10];
cout << "Enter 10 numbers" << '\n';
11
for(i=0;i<10;i++)
cin >> mas[i];
// i++ эквив. i=i+1
min=mas[0];
for(i=1;i<10;i++)
if (mas[i]<min)
min=mas[i];
cout << "min = " << min << '\n';
}
Задача 5.3. Сдвиг и перестановка векторов.
Записать вектор в обратном порядке.
// Запись вектора в обратном порядке
#include <iostream.h>
#define SIZE 9
void main()
{ int i, k, mas[SIZE];
cout << "Enter " << SIZE << " numbers" << '\n';
for(i=0;i<SIZE;i++)
cin >> mas[i];
for(i=0;i<SIZE/2;i++)
{ k=mas[i];
mas[i]= mas[SIZE-i-1];
mas[SIZE-i-1] = k;
}
for(i=0;i<SIZE;i++)
cout << mas[i] << " ";
cout << "\n";
}
Задача 5.4. Сортировки.
// Сортировка методом пузырька
#include <iostream.h>
#define SIZE 10
void main()
{ int i, j, k, mas[SIZE];
cout << "Enter " << SIZE << " numbers" << '\n';
for(i=0;i<SIZE;i++)
cin >> mas[i];
for(i=0;i<SIZE-1;i++)
for(j=0;j<SIZE-i;j++)
if (mas[j] > mas[j+1])
{ k=mas[j];
mas[j]= mas[j+1];
mas[j+1] = k;
12
}
for(i=0;i<SIZE;i++)
cout << mas[i] << " ";
cout << "\n";
}
Задача 5.5. Обработка упорядоченных последовательностей.
Дана последовательность x˜=(x1,…,xn) натуральных чисел. Её подпоследовательность
(xm+1,xm+2,...,xm+k) назовём неубывающей цепочкой (длины к), если
xm+1≤xm+2≤…≤xm+k, но xm>xm+1 и xm+k>xm+k+1.
Вычислить длину самой короткой и длину самой длинной из неубывающих
цепочек.
#include <iostream.h>
#define SIZE 10
void main()
{ int i, j, mas[SIZE], max = 0;
cout << "Enter " << SIZE << " numbers" << '\n';
for(i=0;i<SIZE;i++)
cin >> mas[i];
i = 0;
while (i<SIZE)
{
j = 1;
while (i + j - 1<SIZE-1 && mas[i+j - 1]<=mas[i+j])
j++;
//cout << j << '\n';
if (j > max)
max = j;
i = i + j;
}
cout << "max=" << max << '\n';
}
Задача 5.6
// Другой вариант программы с использованием цикла for
#include <iostream.h>
#define SIZE 10
void main()
{ int i, j, mas[SIZE], max = 0;
cout << "Enter " << SIZE << " numbers" << '\n';
for(i=0;i<SIZE;i++)
cin >> mas[i];
for (i = 0; i<SIZE; i = i + j)
{
for (j=1; i + j - 1<SIZE-1 && mas[i+j - 1]<=mas[i+j]; j++) ;
//cout << j << '\n';
13
if (j > max)
max = j;
}
cout << "max=" << max << '\n';
}
6. Двумерные массивы. Двойная индексация.
Задача 6.1 Вычислить произведение элементов каждой строки массива В
размерности n*m. Результат записать в одномерный массив D.
#include <iostream.h>
void main()
{ const int n = 4;
// Определение константы
const int m = 3;
double b[n][m];
double d[n];
cout << "Enter matrix " << n << " x " << m << ":\n";
for (int i = 0; i < n; i++)
{ cout << "Line " << i + 1 << ": ";
for (int j = 0; j < m; j++)
cin >> b[i][j];
}
for (i = 0; i < n; i++)
{ d[i] = 1;
for (int j = 0; j < m; j++)
d[i] *= b[i][j];
// Экв. d[i] = d[i] * b[i][j];
}
cout << "d = ";
for (i = 0; i < n; i++)
cout << d[i] << ' ';
cout << '\n';
}
Задача 6.2 Транспонирование матрицы.
Транспонирование матрицы саму в себя.
#include <iostream.h>
void main()
{ int i, j;
const int n = 4;
double b[n][n], x;
cout << "Enter matrix " << n << " x " << n << ":\n";
for (i = 0; i < n; i++)
{ cout << "Line " << i + 1 << ": ";
14
for (j = 0; j < n; j++)
cin >> b[i][j];
}
for (i = 0; i < n - 1; i++)
for (j = i + 1; j < n; j++)
{ x = b[i][j];
b[i][j] = b[j][i];
b[j][i] = x;
}
cout << "Transposed matrix: \n";
for (i = 0; i < n; i++)
{ for (j = 0; j < n; j++)
cout << b[i][j] << ' ';
cout << '\n';
}
}
7. Подпрограммы и функции.
Задача 7.1 Составить подпрограмму вычисления расстояния d между
точками P1(x1,y1) и P2(x2,y2) по формуле
d= √ (x1-x2)2+(y1-y2)2
Вычислить периметр треугольника, заданного координатами вершин.
// Вычислить периметр треугольника.
// Использование функции.
#include <iostream.h>
#include <math.h>
/* Функция вычисления расстояния между двумя точками.
Оператор return возвращает значение типа double.
Все аргументы функции передаются по значению.
*/
double distance (double x1, double y1, double x2, double y2)
{
return sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
}
void main()
{ double x1,y1,x2,y2,x3,y3;
double p;
// Ввод трех точек в x1,y1,x2,y2,x3,y3
cout << "Enter Point1(x,y): ";
cin >> x1 >> y1;
cout << "\nEnter Point2(x,y): ";
cin >> x2 >> y2;
cout << "\nEnter Point3(x,y): ";
cin >> x3 >> y3;
// Вычисление периметра
p = distance(x1,y1,x2,y2) + distance(x2,y2,x3,y3) + distance(x3,y3,x1,y1);
cout << "Perimeter = " << p << '\n';
}
15
Задача 7.2
// Вычислить периметр треугольника.
// Использование процедуры.
#include <iostream.h>
#include <math.h>
/* Процедура вычисления расстояния между двумя точками.
Тип возвращаемого значения void.
Здесь & dist – параметр-ссылка (& аналог var в Pascal)
Аргумент для параметра dist передается по ссылке.
*/
void distance (double x1, double y1, double x2, double y2, double &dist)
{
dist = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
}
void main()
{ double x1,y1,x2,y2,x3,y3, r1, r2, r3;
cout << "Enter Point1(x,y): ";
cin >> x1 >> y1;
cout << "\nEnter Point2(x,y): ";
cin >> x2 >> y2;
cout << "\nEnter Point3(x,y): ";
cin >> x3 >> y3;
distance(x1,y1,x2,y2,r1);
distance(x2,y2,x3,y3,r2);
distance(x3,y3,x1,y1,r3);
cout << "Perimeter = " << r1+r2+r3 << '\n';
}
Задача 7.3
// Вычислить периметр треугольника.
// Использование процедуры и глобальной переменной dist.
#include <iostream.h>
#include <math.h>
// Описание прототипа (заголовка) функции distance.
// Сама функция distance определена после функции main.
// Прототип необходим, если вызов функции текстуально
// располагается выше ее описания.
// Рекомендуется, для улучшения читабельности программы,
// описывать прототипы всех используемых функций.
void distance (double x1, double y1, double x2, double y2);
// Описание глобальной переменной dist.
// Переменная описана вне какой-либо функции.
double dist;
void main()
{ double x1,y1,x2,y2,x3,y3, r;
cout << "Enter Point1(x,y): ";
cin >> x1 >> y1;
cout << "\nEnter Point2(x,y): ";
16
cin >> x2 >> y2;
cout << "\nEnter Point3(x,y): ";
cin >> x3 >> y3;
distance(x1,y1,x2,y2);
r = dist;
distance(x2,y2,x3,y3);
r = r + dist;
distance(x3,y3,x1,y1);
r = r + dist;
cout << "Perimeter = " << r << '\n';
}
void distance (double x1, double y1, double x2, double y2)
{
dist = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
}
Задача 7.4
// Вычислить периметр треугольника.
// Использование функции.
// Для ввода координат каждой точки используются одномерные
// массивы.
#include <iostream.h>
#include <math.h>
// Прототипы функций.
double distance (double x1, double y1, double x2, double y2);
double perimeter (double t1[], double t2[], double t3[]);
void main()
{ double p1[2], p2[2], p3[2], r;
cout << "\nEnter Point1(x,y): ";
cin >> p1[0] >> p1[1];
cout << "\nEnter Point2(x,y): ";
cin >> p2[0] >> p2[1];
cout << "\nEnter Point3(x,y): ";
cin >> p3[0] >> p3[1];
r = perimeter(p1, p2, p3);
cout << "Perimeter = " << r << '\n';
}
// Массивы всегда передаются по ссылке.
// Размерность параметров-массивов можно не указывать.
// Она всегда будет равна размерности массива-аргумента.
double perimeter (double t1[], double t2[], double t3[])
{
return distance(t1[0],t1[1],t2[0],t2[1]) +
distance(t2[0],t2[1],t3[0],t3[1]) +
distance(t3[0],t3[1],t1[0],t1[1]);
}
double distance (double x1, double y1, double x2, double y2)
{
return sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
}
17
Задача 7.5
// Вычислить периметр или площадь треугольника.
// Использование функции в качестве параметра.
// Для ввода координат каждой точки используются одномерные
// массивы.
#include <iostream.h>
#include <math.h>
double rectangle(double func(double t1[], double t2[], double t3[]), double t1[], double t2[], double
t3[]);
double distance (double x1, double y1, double x2, double y2);
double perimeter (double t1[], double t2[], double t3[]);
double area (double t1[], double t2[], double t3[]);
void main()
{ double p1[2], p2[2], p3[2], r;
cout << "\nEnter Point1(x,y): ";
cin >> p1[0] >> p1[1];
cout << "\nEnter Point2(x,y): ";
cin >> p2[0] >> p2[1];
cout << "\nEnter Point3(x,y): ";
cin >> p3[0] >> p3[1];
if (p1[0] > 0)
{ r = rectangle(perimeter, p1, p2, p3); // Вычисляем площадь.
cout << "Perimeter = " << r << '\n';
}
else
{ r = rectangle(area, p1, p2, p3);
// Вычисляем периметр.
cout << "Area = " << r << '\n';
}
}
double rectangle(double func(double t1[], double t2[], double t3[]), double t1[], double t2[], double
t3[])
{
return func(t1, t2, t3);
}
double perimeter (double t1[], double t2[], double t3[])
{
return distance(t1[0],t1[1],t2[0],t2[1]) +
distance(t2[0],t2[1],t3[0],t3[1]) +
distance(t3[0],t3[1],t1[0],t1[1]);
}
double distance (double x1, double y1, double x2, double y2)
{
return sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
}
double area (double t1[], double t2[], double t3[])
{
return (t1[0]*(t2[1]-t3[1]) + t2[0]*(t3[1]-t1[1]) + t3[0]*(t1[1]-t2[1]))/2;
}
18
Задача 7.6
//Для заданной матрицы найти максимальную сумму элементов
// строки. Суммирование строк оформить в виде функции.
#include <iostream.h>
const n=3,m=4;
// Глобальное описание констант.
double sum(double a[][m], int k);
void main()
{
int i,j;
double mas[n][m], s,max;
// Ввод матрицы
cout << "Enter matrix " << n << " x " << m << ":\n";
for (i = 0; i < n; i++)
{ cout << "Line " << i + 1 << ": ";
for (j = 0; j < m; j++)
cin >> mas[i][j];
}
max=sum(mas,0); // Аргументы – имя двумерного массива
for(i=1;i<n;i++) // и номер строки для суммирования.
{ s = sum(mas,i);
if (s>max)
max=s;
}
cout << "\n\nResult=" <<max <<'\n';
}
// Необходимо указывать вторую размерность двумерного
// массива-параметра.
double sum(double a[][m], int k)
{ int i;
double s=0;
for(i=0;i<m;i++)
s+=a[k][i];
return s;
}
8. Обработка символьной информации.
Задача 8.1
// Вывод введенной строки символов в обратном порядке.
// Ввод строки в массив.
#include <iostream.h>
void main()
{ char str[20];
int i,n;
cout << "Enter string:";
cin >> str;
// Можно ввести не более 19 символов.
19
// Подсчет количества символов в строке.
// Символ ‘\0’ – признак конца строки.
for(n=0; str[n]!='\0'; n++);
for(i=n-1; i>=0 ;i--)
cout << str[i];
// Посимвольный вывод строки.
cout << '\n';
}
Задача 8.2
// Вывод введенной строки символов в обратном порядке.
// Ввод строки в массив.
// Второй вариант программы с использованием библиотеки
// работы со строками символов – string.
#include <iostream.h>
#include <string.h>
void main()
{ char str[20];
int i,n;
cout << "Enter string:";
cin >> str;
// Можно ввести не более 19 символов.
// Подсчет количества символов в строке.
n = strlen(str);
for(i=n-1; i>=0 ;i--)
cout << str[i];
// Посимвольный вывод строки.
cout << '\n';
}
Задача 8.3
/* Исключить из строки все символы, не являющиеся
буквами.
Ввод строки в массив.
*/
#include <iostream.h>
#include <string.h>
void main()
{ const m=30;
char str[m];
int n;
bool fl=true;
cout << "Enter string :";
cin >> str;
;
// Можно ввести не более 29 символов.
for (int i=0; str[i] != '\0'; i++)
if ( str[i]>='a' && str[i]<= 'z' || str[i]>='A' && str[i]<= 'Z')
cout << str[i];
cout << '\n';
}
20
Задача 8.4
// Определить, является ли введенное слово полиндромом.
// Ввод строки в массив.
#include <iostream.h>
void main()
{ const m = 20;
char str[m];
int i,n;
bool fl = true;
cout << "Enter string:";
cin >> str;
// Можно ввести не более 19 символов.
// Подсчет количества символов в строке.
// Символ ‘\0’ – признак конца строки.
for(n=0; str[n]!='\0'; n++);
for(i=0; i<n/2 ;i++)
if (str[i] != str[n-i-1])
{ fl = false;
break;
}
cout << (fl ? "Polindrom\n" : "Non polindrom\n");
}
// Другой вариант без break.
// for(i=0; i<n/2 && fl; i++)
Задача 8.5
// Сортировка слова в лексикографическом порядке
// методом “пузырька”.
// Ввод строки в массив.
#include <iostream.h>
#define MAX_LEN 20
void main()
{ char str[MAX_LEN], k;
int i,j,n;
bool fl = true;
cout << "Enter string:";
cin >> str;
// Можно ввести не более 19 символов.
// Подсчет количества символов в строке.
// Символ ‘\0’ – признак конца строки.
for(n=0; str[n]!='\0'; n++);
for(i=0;i<n && fl;i++)
{ fl = false;
for(j=0;j<n-i-1;j++)
if (str[j] > str[j+1])
{ k=str[j];
str[j]= str[j+1];
str[j+1] = k;
fl = true;
21
}
}
cout << str << '\n';
}
// Вывод С-строки (последний символ - ‘\0’)
Задача 8.6
/* Дан текст, состоящий из слов, разделенных пробелами и
заканчивающийся точкой.
Вывести на экран этот текст, печатая каждое слово в обратном
порядке.
*/
// Чтение производится в буфер (массив) по одному слову.
// Длина каждого слова не должна превышать 29 символов.
#include <iostream.h>
#include <string.h> // Библиотека С-строковых функций (‘\0’)
void main()
{ char buf[30];
int n;
bool fl=true;
cout << "Enter text :";
while(fl)
{ cin >> buf;
// Чтение слова в массив.
n = strlen(buf);
// Возвращает кол-во символов в строке.
if (buf[n-1] == '.')
{ n--;
fl=false;
}
for (int i=n-1; i>=0; i--)
cout << buf[i];
if (fl)
cout << ' ';
}
cout << '\n';
}
Задача 8.7
/* Дан текст, состоящий из слов, разделенных пробелами и
заканчивающейся точкой. Сосчитать, сколько слов содержит
ровно две буквы m.
*/
// Посимвольный ввод входного текста.
// Длина слов не не ограничена.
// Функция get() вводит очередной символ из входного потока
// и возвращает его в качестве своего значения.
// Функция get(f) вводит символ в переменную f.
#include <iostream.h>
void main()
{ char symb;
int count_word=0,count_let=0;
22
cout << "Enter text:";
symb=cin.get();
// Ввод символа (в том числе и пробела)
while (symb != '.')
{ if (symb==' ')
{ if (count_let==2)
count_word++;
count_let=0;
}
else
if (symb=='m')
count_let++;
symb=cin.get(); // Экв. cin.get(symb);
}
if (count_let==2)
count_word++;
cout << "Word count = " << count_word << '\n';
}
// Другой вариант решения:
// Заголовок цикла while ((symb=cin.get()) != '.') и
// удалить операторы symb=cin.get();
Задача 8.8
/* Дан текст, состоящий из строк и заканчивающейся пустой
строкой (‘\n’). Если последний символ строки цифра N, то
первые N символов строки заменить символом &.
*/
// Функция getline(buf,size,symb) читает символы из входного
// потока, пока не встретится символ symb (включая и его).
// Будет прочитано size-1 символов, если symb не встретится.
// Вместо symb (или в конце строки) подставляется ‘\0’.
// Результат чтения помещается в массив buf.
// и возвращает его в качестве своего значения.
#include <iostream.h>
#include <string.h>
void main()
{ const size=100;
char buf[size];
int n,i,lstr;
cout << "Enter text:\n";
while(1)
{ cin.getline(buf, size, '\n');
if (buf[0] == '\0')
break;
lstr=strlen(buf);
if (buf[lstr-1] >= '1' && buf[lstr-1] <= '9') // Если цифра.
n = buf[lstr-1] - '0';
else
n = 0;
for(i=0; i<n && i<lstr; i++)
buf[i] = '&';
23
cout << "Result :" << '\n' << buf << "\nEnter new line or press 'Enter' :\n";
}
}
Задача 8.9
/*Подсчитать количество строк, введенных с экрана терминала.
*/
// Ввод конца файла с экрана терминала: <Ctrl>z в первой позиции
// новой строки и <Enter>
// Функция read(buf, size) читает в массив buf или size символов,
// или меньшее количество, если читается конец файла.
// Функция gcount() возвращает количество прочитанных символов.
#include <iostream.h>
#include <string.h>
void main()
{ const size=10;
char buf[size];
int n,i,count=0;
cout << "Enter text:\n";
while(!cin.eof())
{ cin.read(buf, size);
n=cin.gcount();
for(i=0; i<n; i++)
if(buf[i]=='\n')
count++;
}
cout << "Number of line =" << count <<'\n';
}
9. Файловый ввод-вывод.
Задача 9.1
// Поиск минимального элемента в массиве.
// Ввод массива из файла fstream.h
// iostream.h входит в состав fstream.h
#include <fstream.h>
void main()
{ int i, min, mas[10];
ifstream myin("test.txt"); //Открытие файла для ввода.
for(i=0;i<10;i++)
myin >> mas[i];
min=mas[0];
for(i=1;i<10;i++)
if (mas[i]<min)
min=mas[i];
cout << "min = " << min << '\n';
}
24
Задача 9.2
// Приближенное вычисление 1/x
// Последовательности {ак} и {вк} заданы рекуррентно: а0 =1,
//
в0=1-х; (0<x<2)
//
ак= ак-1(1+вк-1), вк=в2к-1, к=1,2,…
// Вычислить аn для наименьшего n, при котором вn ≤ ∂ (∂>0).
// Ввод значения переменной х с экрана iostream.h
// Вывод всех членов последовательностей a и b,
// а также результата в файл fstream.h
#include <fstream.h>
#define DELTA 0.001
void main()
{ double a=1, b, x;
ofstream myout("result.txt"); //Открытие файла для вывода.
cout << "Enter x:";
cin >> x;
if (x<=0 || x>=2)
cout << "not decision";
else
{ b=1-x;
do
{ a=a*(1+b);
b=b*b;
myout << "a = " << a << " b = " << b << '\n';
}
while(b>DELTA);
myout << "1/x=" << a << "\nПроверка Вычислений "<< 1/x ;
}
}
Задача 9.3
// Запись вектора в обратном порядке
// Файловый ввод-вывод fstream.h
#include <fstream.h>
#define SIZE 9
void main()
{ int i, k, mas[SIZE];
ifstream myin("test.txt");
//Открытие файла для ввода.
ofstream myout("result.txt"); //Открытие файла для вывода.
for(i=0;i<SIZE;i++)
myin >> mas[i];
for(i=0;i<SIZE/2;i++)
{ k=mas[i];
mas[i]= mas[SIZE-i-1];
mas[SIZE-i-1] = k;
}
for(i=0;i<SIZE;i++)
25
myout << mas[i] << " ";
}
Задача 9.4
// Транспонирование матрицы.
// Файловый ввод-вывод fstream.h
#include <fstream.h>
void main()
{ int i, j;
const int n = 4;
double b[n][n], x;
ifstream myin("test.txt");
//Открытие файла для ввода.
ofstream myout("result.txt"); //Открытие файла для вывода.
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
myin >> b[i][j];
for (i = 0; i < n - 1; i++)
for (j = i + 1; j < n; j++)
{ x = b[i][j];
b[i][j] = b[j][i];
b[j][i] = x;
}
myout << "Транспонированная матрица :\n”;
for (i = 0; i < n; i++)
{ for (j = 0; j < n; j++)
myout << b[i][j] << ' ';
myout << '\n';
// Построчный вывод матрицы.
}
}
Задача 9.5
/* Дан текст, состоящий из слов, разделенных пробелами.
Выполнить форматирование текста, печатая в каждой строке
не более SIZE символов.
*/
// Чтение производится в буфер (массив) по одному слову.
// Длина каждого слова не должна превышать 29 символов.
// Файловый ввод-вывод fstream.h
#include <fstream.h>
#include <string.h> #define SIZE 30
void main()
{ char buf[30];
int n, len=0;
ifstream myin("text.txt");
ofstream myout("result.txt");
myin >> buf;
while( !myin.eof() )
{ n = strlen(buf);
if (len+n <= SIZE)
26
len=len+n+1;
else
{ len=n+1;
myout << '\n';
}
myout << buf << ' ';
myin >> buf;
}
}
Задача 9.6
/* В упакованном представлении текста – цифра “К” означает
К-кратное повторение следующей за ним буквы. Например,
текст “3bc3a” интерпретируется как ”bbbcaaa”.
Выполнить распаковку текста, считая, что символы символы- цифры рядом не
встречаются.
*/
// Посимвольный ввод входного текста.
// Длина слов не не ограничена.
// Функция get() вводит очередной символ из входного потока
// и возвращает его в качестве своего значения.
// Функция put(f) вводит символ f в выходной поток.
// Файловый ввод-вывод.
#include <fstream.h>
void main()
{ char symb;
int n, i;
ifstream myin("text.txt");
ofstream myout("result.txt");
symb=myin.get();
while( !myin.eof() )
{ if ( symb >='0' && symb <='9')
{ n = symb - '0';
symb=myin.get();
if (!myin.eof() )
for(i=1; i<=n; i++)
myout.put(symb);
}
else
myout.put(symb); // Вывод символа в файл.
symb=myin.get();
}
}
Задача 9.7
/* Дан текст, состоящий из слов, разделенных пробелами.
В каждой строке текста первое и последнее слово поменять
местами.
*/
27
#include <fstream.h>
#include <string.h>
void main()
{ const size=81; // Длина строки не более 80 символов.
char buf[size];
int n, i;
int first;
// Позиция начала первого слова строки
int count_first; // Кол-во символов первого слова
int last;
// Позиция окончания последнего слова
int count_last; // Кол-во символов последнего слова
ifstream myin("text.txt");
// Открытие файла для ввода
ofstream myout("result.txt"); // Открытие файла для вывода
while( !myin.eof() )
{ // Чтение строки в буфер
myin.getline(buf, size, '\n');
n=strlen(buf);
// n – кол-во символов в buf (без ‘\0’)
// Вывод начальных пробелов строки
for(i=0; i<=n; i++)
if(buf[i]==' ')
myout.put(buf[i]);
else
break;
if(buf[i]=='\0') // Если пустая строка
{ myout.put('\n');
continue;
// Переход к следующей итерации цикла
}
first=i; // Позиция начала первого слова строки
count_first=1;
// Подсчет кол-ва символов в первом слове
for(i=first+1; i<n; i++)
if(buf[i]!=' ' && buf[i]!='\0')
count_first++;
else
break;
// Пропуск пробелов в конце строки
for(i=n-1; i>=0 && buf[i]==' '; i--);
last=i;
// Позиция окончания последнего слова строки
count_last=0;
// Подсчет кол-ва символов в последнем слове
for(i=last; i>=0; i--)
if(buf[i]!=' ')
count_last++;
else
break;
// Если в строке только одно слово
if(first+count_first > last-count_last)
myout << buf << '\n'; // Вывод всей строки без изменений
else
{ // Вывод последнего слова
for(i=last-count_last+1; i<=last; i++)
myout.put(buf[i]);
// Вывод “середины” строки
28
for(i=first+count_first; i<=last-count_last; i++)
myout.put(buf[i]);
// Вывод первого слова
for(i=first; i<first+count_first; i++)
myout.put(buf[i]);
myout << '\n';
}
}
}
Задача 9.8
// Подсчет количества строк, слов и символов в тексте
#include <fstream.h>
#define SIZE 512
void main()
{ int nl=0; // Кол-во строк
int nw=0; // Кол-во слов
int nc=0; // Кол-во символов
int n,i;
char buf[SIZE]; // Размерность физического блока на диске
bool inword=false; // Находимся в слове
ifstream myin("text.txt");
while( !myin.eof() )
{ myin.read(buf, SIZE); // Чтение в буфер
n=myin.gcount();
nc+=n;
for(i=0; i<n; i++)
{ if(buf[i]=='\n')
++nl;
if(buf[i]=='\n' || buf[i]==' ')
inword=false;
else
if (!inword)
{ inword=true;
++nw;
}
}
}
cout<<"Lines= "<<nl<<"\nWords= "<<nw<<"\nSybbols= "<<nc<<'\n';
}
10.Двоичные файлы.
Задача 10.1
/* Сформировать двоичный файл вещественных чисел.
Правило образования компонент файла:
Ai =  (i+b) , i=1 .. n
*/
29
#include <fstream.h>
#include <math.h>
void main()
{ const int n=20;
const double b=0.1;
int i;
double x;
// Открытие двоичного файла для вывода (параметр ios::binary)
ofstream myoutbin("dbin.txt", ios::binary);
for(i=1; i<=20; i++)
{ x = sqrt(i+b);
// Запись числа в файл.
// Функция sizeof(int) возвращает количество байт, выделяемых
// для размещения числа типа double
myoutbin.write((char *) &x, sizeof(double));
}
}
Задача 10.2
/* Создание двоичного (binary) файла целых чисел.
Можно использовать в следующих далее программах
в качестве входного файла.
*/
// stdlib.h – для вызова функции exit() – завершение выполнения
// программы.
#include <fstream.h>
#include <stdlib.h>
void main()
{ char fname[20];
// Для ввода имени выходного файла
int x;
cout << "Enter name of file :";
cin >> fname;
// Открытие двоичного файла для вывода.
ofstream myoutbin(fname, ios::binary);
if(!myoutbin)
// Если не удалось открыть файл.
{ cout << "Not open file\n";
exit(1);
}
cout << "\nEnter integer numbers. Number 9999 - end of input\n";
// Ввод целых чисел с экрана терминала и запись в двоичный
// файл.
// Функция sizeof(int) возвращает количество байт, выделяемых
// для размещения числа типа int/
cin >> x;
while(!cin.eof() && x != 9999)
{ myoutbin.write((char *) &x, sizeof(int));
cin >> x;
}
myoutbin.close(); // Закрытие файла.
// Открытие созданного двоичного файла для ввода.
30
ifstream myinbin(fname, ios::binary);
if(!myoutbin)
{ cout << "Not open file\n";
exit(1);
}
cout << "\nOutput file at screen\n";
// Чтение двоичного файла и вывод его на экран терминала.
while(1)
{ myinbin.read((char *) &x, sizeof(int));
if( !myinbin.eof() )
cout << x << ' ';
else
break;
}
cout << '\n';
}
Задача 10.3
// Конкатенация двоичных файлов типа int.
// Два входных файла и результирующий.
// Файлы можно создать в задаче D2.
#include <fstream.h>
#include <stdlib.h>
void main()
{ int x;
ifstream myin1("file1.bin", ios::binary); // Первый входной файл
if(!myin1)
{ cout << "Can not open file file1.bin\n";
exit(1);
}
ifstream myin2("file2.bin", ios::binary); // Второй входной файл
if(!myin2)
{ cout << "Can not open file file2.bin\n";
exit(1);
}
ofstream myout("result.bin", ios::binary); // Результирующий файл
// Переписывание первого входного файла в результирующий
while(1)
{ myin1.read((char *) &x, sizeof(int));
if(!myin1.eof())
myout.write((char *) &x, sizeof(int));
else
break;
}
// Дописывание второго входного файла в результирующий
while(1)
{ myin2.read((char *) &x, sizeof(int));
if(!myin2.eof())
myout.write((char *) &x, sizeof(int));
31
else
break;
}
myout.close();
// Переписывание результирующего файла в текстовый
// файл для проверки результата.
ifstream mynew("result.bin", ios::binary);
ofstream mytext("restext.txt");
while(1)
{ mynew.read((char *) &x, sizeof(int));
if(!mynew.eof())
mytext << x << ' ';
else
break;
}
}
Задача 10.4
// Конкатенация двоичных файлов типа int.
// Результат в первом из файлов.
// Файлы можно создать в задаче D2.
#include <fstream.h>
#include <stdlib.h>
void main()
{ int x;
// Файл открывается для записи и указатель позиции
// записи устанавливается в конец файла. Параметр ios::app
ofstream myout("file1.bin", ios::binary | ios::app);
if(!myout)
{ cout << "Can not open file file1.bin\n";
exit(1);
}
ifstream myin("file2.bin", ios::binary); // Второй входной файл
if(!myin)
{ cout << "Can not open file file2.bin\n";
exit(1);
}
// Дописывание второго входного файла в первый.
while(1)
{ myin.read((char *) &x, sizeof(int));
if(!myin.eof())
myout.write((char *) &x, sizeof(int));
else
break;
}
myout.close();
// Переписывание первого файла в текстовый
// файл для проверки результата.
ifstream mynew("file1.bin", ios::binary);
32
ofstream mytext("restext.txt");
while(1)
{ mynew.read((char *) &x, sizeof(int));
if(!mynew.eof())
mytext << x << ' ';
else
break;
}
}
Задача 10.5
/* Расщепление. Образовать из входного файла целых чисел
два новых файла. В один из них поместить все положительные
числа, а в другой – все остальные числа.
*/
// Входной файл можно создать в задаче D2.
#include <fstream.h>
#include <stdlib.h>
void main()
{ int x;
ifstream myin("file.bin", ios::binary); // Входной файл
if(!myin)
{ cout << "Can not open file file1.bin\n";
exit(1);
}
ofstream myout1("file1.bin", ios::binary); // Файл положительных
ofstream myout2("file2.bin", ios::binary); // Файл остальных чисел
while(1)
{ myin.read((char *) &x, sizeof(int));
if(!myin.eof())
if(x>0)
myout1.write((char *) &x, sizeof(int));
else
myout2.write((char *) &x, sizeof(int));
else
break;
}
myout1.close();
myout2.close();
// Вывод созданных файлов на экран терминала
// для проверки результата.
ifstream myplus("file1.bin", ios::binary);
cout << "\nFile of positive numbers\n";
while(1)
{ myplus.read((char *) &x, sizeof(int));
if(!myplus.eof())
cout << x << ' ';
else
break;
33
}
cout << '\n';
ifstream myother("file2.bin", ios::binary);
cout << "\nFile of other numbers\n";
while(1)
{ myother.read((char *) &x, sizeof(int));
if(!myother.eof())
cout << x << ' ';
else
break;
}
cout << '\n';
}
Задача 10.6
//Дан двоичный файл целых чисел. Вычислить сумму всех его //чисел.
// Пример чтения чисел в массив.
//// Входной файл можно создать в задаче D2.
#include <fstream.h>
#include <stdlib.h>
void main()
{ const int N=5;
int x[N], sum, len, i;
ifstream myin("file.bin", ios::binary); // Входной файл
if(!myin)
{ cout << "Can not open file file.bin\n";
exit(1);
}
sum = 0;
while(!myin.eof())
// Чтение файла в массив. Указано имя массива (без &)
{ myin.read((char *) x, N*sizeof(int));
// gcount() возвращает количество прочитанных байт.
len = myin.gcount()/sizeof(int);
for(i=0; i<len; i++)
sum+=x[i];
}
myin.close();
cout << "Summer =" << sum << '\n';
}
Задача 10.7
Дан текстовый файл следующего вида:
5 2.5 3.18 1.2 24.12 11.9 qwerty
4 12.7 5.83 11.9 2.5
abc
3 1.21 7.9 2.2 longstring
34
, где первое целое число каждой строки равно количеству следующих за ним
вещественных чисел.
Создать двоичный (не типизированный файл). Затем, вывести в новый
текстовый файл информацию вида:
qwerty “среднее арифметическое вещественных чисел строки”
abc
“среднее арифметическое вещественных чисел строки”
longstring “среднее арифметическое вещественных чисел строки”
#include <fstream.h>
#include <stdlib.h>
#include <string.h>
void main()
{ int i,k;
double x,sum;
char buf[50],symb;
ifstream myin("intext.txt"); // Входной текстовый файл
if(!myin)
{ cout << "Can not open file intext.txt\n";
exit(1);
}
ofstream myout("result.bin", ios::binary); // Не типизир. файл
while(!myin.eof())
{ myin >> k ;
if(myin.eof())
break;
myout.write((char *) &k, sizeof(int)); // Запись целого
// Запись вещественных чисел
for(i=1; i<=k; i++)
{ myin >> x;
myout.write((char *) &x, sizeof(double));
}
myin >> buf; // Чтение С-строки в буфер
k = strlen(buf);
// Запись количества символов в строке
myout.write((char *) &k, sizeof(int));
// Посимвольная запись строки в двоичный файл
for(i=0; i<k; i++)
myout.put(buf[i]);
}
myout.close(); // Закрытие выходного двоичного файла
// Открытие созданного двоичного файла для чтения
ifstream newbin("result.bin", ios::binary);
// Открытие результирующего текстового файла
ofstream newout("result.txt");
while(!newbin.eof())
{ newbin.read((char *) &k, sizeof(int));
if(newbin.eof())
35
break;
sum=0;
// Вычисление среднего арифметического К чисел строки
for(i=1; i<=k; i++)
{ newbin.read((char *) &x, sizeof(double));
sum+=x;
// Экв. sum=sum+x;
}
sum/=k;
// Экв. sum=sum/x;
// Чтение количества символов в строке
newbin.read((char *) &k, sizeof(int));
// Вывод символов
for(i=1; i<=k; i++)
{ symb=newbin.get();
newout.put(symb);
}
// Вывод среднего арифметического
newout << ' ' << sum << '\n';
}
}
11.Записи и файлы
Задача 11.1
// Вычислить модуль (длину) трехмерного вектора,
// заданного координатами (x,y,z)
#include <iostream.h>
#include <math.h>
void main()
{ struct vector
// Определение структуры (нового типа) вектор
{ double x;
double y;
double z;
};
vector r;
// Описание переменной типа vector
cout << "Enter x :";
cin >> r.x;
cout << "\nEnter y :";
cin >> r.y;
cout << "\nEnter z :";
cin >> r.z;
cout << "\nScalar of vector = " << sqrt(r.x*r.x+r.y*r.y+r.z*r.z) << '\n';
}
Задача 11.2
//Вычислить сумму трехмерных векторов.
// (покомпонентное сложение).
// Сложение двух векторов оформить в виде функции
#include <iostream.h>
#include <math.h>
36
struct vector
// Определение структуры (нового типа) вектор
{ double x;
// Глобальное описание структуры
double y;
double z;
};
vector plus(vector a, vector b);
void main()
{ const int n=5;
int i;
struct vector r[n]; // Описание массива типа vector.
// Слово struct не обязательно.
struct vector sum;
// Ввод векторов
cout << "Enter vectors\n";
for(i = 0; i<n; i++)
{ cout << "Enter x :";
cin >> r[i].x;
cout << "Enter y :";
cin >> r[i].y;
cout << "Enter z :";
cin >> r[i].z;
}
sum=plus(r[0],r[1]); //Для переменных одинакового структурного
//типа определена операция присваивания
// (поэлементное копирование).
for(i = 2; i<5; i++)
sum=plus(sum,r[i]);
cout << "\nSumma of vector\nx="<<sum.x <<"\ny="<<sum.y<<"\nz="<<sum.z<<'\n';
}
vector plus(vector a,vector b)
{ a.x = a.x + b.x;
a.y = a.y + b.y;
a.z = a.z + b.z;
return a;
}
Задача 11.3
//Вычислить сумму трехмерных векторов.
// (покомпонентное сложение).
// Сложение двух векторов оформить в виде подпрограммы
#include <iostream.h>
#include <math.h>
struct vector
// Определение структуры (нового типа) вектор
{ double x;
// Глобальное описание структуры
double y;
double z;
};
void plus(vector a,vector b,vector &c);
void main()
{ const int n=5;
int i;
struct vector r[n];
// Описание массива типа vector.
37
struct vector sum;
cout << "Enter vectors\n";
for(i = 0; i<n; i++)
{ cout << "Enter x :";
cin >> r[i].x;
cout << "Enter y :";
cin >> r[i].y;
cout << "Enter z :";
cin >> r[i].z;
}
plus(r[0],r[1],sum); // Вызов процедуры
for(i = 2; i<5; i++)
plus(sum,r[i],sum);
cout << "\nSumma of vector\nx="<<sum.x <<"\ny="<<sum.y<<"\nz="<<sum.z<<'\n';
}
void plus(vector a,vector b,vector &c /*параметр-ссылка*/)
{ c.x = a.x + b.x;
c.y = a.y + b.y;
c.z = a.z + b.z;
}
Задача 11.4
Описать структуру student, содержащую следующие поля:
- Фамилия;
- Номер группы;
- Успеваемость (массив из 6 элементов)
Ввести с клавиатуры в массив данные о пяти студентах.
Вывести на дисплей фамилии и номера групп студентов, имеющих хотя бы
одну оценку 2.
#include <iostream.h>
#include <math.h>
void main()
{ struct student
{ char name[30];
int group;
int marks[6];
};
int i,j;
bool fl=false;
const int N=5;
student mas[N]; // Массив структур
// Ввод сведений о студентах в массив
for(i=0; i<N; i++)
{ cout << "\nEnter student " << i+1 << ' ';
cin >> mas[i].name >> mas[i].group;
for(j=0; j<6; j++)
38
cin >> mas[i].marks[j];
}
// Вывод двоечников на экран
for(i=0; i<N; i++)
for(j=0; j<6; j++)
if(mas[i].marks[j]==2)
{ if(!fl)
{
fl=true;
cout << "\nBad students\n";
}
cout << mas[i].name <<" "<< mas[i].group << '\n';
}
if(!fl)
cout << "\nNo bad students\n"; // Если нет двоечников
}
Задача 11.5
Описать структуру экзаменационной ведомости, содержащую следующие
сведения:
- номер группы;
- наименование предмета;
- дата экзамена;
- фамилия экзаменатора;
- 9 строк с полями: фамилия студента, номер зачетной книжки,
отметка о зачете (есть-1, нет-0), оценка по экзамену (2,3,4,5)
Вывести итоговые данные по экзамену (сколько оценок 2,3,4,5)
Пример входного файла:
923 мат.анализ 10.06.2006 Сидоров
Иванов
11111 1 4
Петров
22222 0 2
Сидоров 33333 1 2
Хайруллин 44444 1 5
Карасиков 55555 1 3
Красоткина 66666 1 3
Умнова
77777 1 5
Либерман 88888 1 4
Акзамова 99999 1 4
#include <fstream.h>
#include <stdlib.h>
void main()
{ struct student
{ char name[30];
char num_z[6];
int zach;
// Определения типа student
39
int mark_exam;
};
struct vedomost
// Определения типа vedomost
{ int group;
char predmet[15];
char date[10];
char examenater[15];
student spisok[9]; // Тип student является элементом типа
// vedomost
};
vedomost subject1; // Описание переменной типа vedomos
int i;
int marks[4]; // Счетчик оценок
ifstream myin("vedomost.txt");
if(!myin)
{ cout << "Can not open file vedomost.txt\n";
exit(1);
}
// Чтение ведомости из файла
myin >> subject1.group >> subject1.predmet >> subject1.date >> subject1.examenater;
for(i=0; i<9; i++)
myin >> subject1.spisok[i].name >> subject1.spisok[i].num_z
>> subject1.spisok[i].zach >> subject1.spisok[i].mark_exam;
// Обнуление счетчиков
for(i=0; i<4; i++)
marks[i] = 0;
// Подсчет оценок
for(i=0; i<9; i++)
switch (subject1.spisok[i].mark_exam)
{
case 2 :
marks[0]++;
break;
case 3 :
marks[1]++;
break;
case 4 :
marks[2]++;
break;
case 5 :
marks[3]++;
break;
}
cout << "marks 5 " << marks[3] << "\nmarks 4 " << marks[2] << "\nmarks 3 "
<< marks[1] << "\nmarks 2 " << marks[0] << '\n';
}
Задача 11.6
Военно-учетный стол. Регистрация студентов.
Дан текстовый файл, содержащий следующую информацию о студентах:
- Фамилия;
40
- Номер группы;
- Служба в армии (служил-1 или нет-0);
- Если служил, то воинское звание, иначе – возраст.
1. Создать файл записей
2. На основе файла записей сформировать текстовый файл,
содержащий сведения о студентах не служивших в армии.
(В виде таблицы.)
Пример входного файла:
Иванов
Петров
Сидоров
Хайруллин
Карасиков
Либерман
923
924
924
922
924
924
1 рядовой
0 19
1 мл.лейтенант
1 сержант
0 17
0 25
#include <fstream.h>
#include <stdlib.h>
void main()
{ struct student
{ char name[30];
int group;
int army;
union
// Аналог записи с вариантами в Pascal
{ char voin_zv[15];
int age;
};
};
student man;
ifstream myin("student.txt");
if(!myin)
{ cout << "Can not open file student.txt\n";
exit(1);
}
// Создание двоичного файла записей
ofstream mybinout("voenkomat.bin",ios::binary);
while(!myin.eof())
{ myin >> man.name >> man.group >> man.army;
if (man.army)
myin >> man.voin_zv;
else
myin >> man.age;
if(!myin.eof())
mybinout.write((char *) &man,sizeof(struct student));
}
mybinout.close();
// Чтение файла записей
41
ifstream mybinin("voenkomat.bin",ios::binary);
ofstream myout("result.txt"); // Выходной файл (таблица)
// Вывод заголовка
myout << " Список студентов не служивших в армии\n\n";
// Ввод записей и печать таблицы
while(1)
{ mybinin.read((char *) &man,sizeof(struct student));
if (mybinin.eof())
break;
if(!man.army)
{ /* Форматирование для печати таблицы.
width(N) – устанавливает ширину поля вывода равную N.
fill(C) – где С –одиночный символ. Устанавливает символ-заполнитель
свободных позиций в поле вывода (по умолчанию – пробел).
setf(ios::left) – устанавливает выравнивание к левому краю поля вывода (по
умолчанию производится выравнивание к правому краю поля вывода).
unsetf(ios::left) – отменяет выравнивание к левому краю поля вывода. */
myout.width(29);
myout.fill('-');
myout << '-' << '\n';
myout.fill(' ');
myout.width(1);
myout << '|';
myout.width(15);
myout.setf(ios::left);
myout << man.name;
myout.width(1);
myout << '|';
myout.width(5);
myout.unsetf(ios::left);
myout << man.group;
myout.width(1);
myout << '|';
myout.width(5);
myout << man.age;
myout.width(1);
myout << '|' << '\n';
myout.width(29);
myout.fill('-');
myout << '-' << '\n';
myout.fill(' ');
}
}
}
12. Область видимости потоковых переменных.
Задача 12.1 Приближенное вычисление 1/x
Последовательности {ак} и {вк} заданы рекуррентно: а0 =1,
в0=1-х; (0<x<2)
ак= ак-1(1+вк-1), вк=в2к-1, к=1,2,…
42
Вычислить аn для наименьшего n, при котором вn ≤ ∂ (∂>0).
// Передача имени потока в виде параметра функции.
#include <fstream.h>
#define DELTA 0.001
void proc(ofstream myout);
void main()
{ double a=1, b, x;
ofstream myout("result.txt"); //Локальное описание потока.
cout << "Enter x:";
cin >> x;
if (x<=0 || x>=2)
cout << "not decision";
else
{ b=1-x;
do
{ a=a*(1+b);
b=b*b;
myout << "a = " << a << " b = " << b << '\n';
}
while(b>DELTA);
myout << "1/x=" << a << "\nпроверка вычислений "<< 1/x ;
}
proc(myout); // Вызов функции
}
void proc(ofstream myout)
{ myout << '\n' << "Ok!"; // Вывод в поток
}
Задача 12.2 Приближенное вычисление 1/x
Последовательности {ак} и {вк} заданы рекуррентно: а0 =1,
в0=1-х; (0<x<2)
ак= ак-1(1+вк-1), вк=в2к-1, к=1,2,…
Вычислить аn для наименьшего n, при котором вn ≤ ∂ (∂>0).
// Описание имени потока в виде глобальной переменной.
#include <fstream.h>
#define DELTA 0.001
ofstream myout("result.txt"); // Глобальной описание потока
void proc();
void main()
{ double a=1, b, x;
cout << "Enter x:";
cin >> x;
if (x<=0 || x>=2)
cout << "not decision";
else
43
{ b=1-x;
do
{ a=a*(1+b);
b=b*b;
myout << "a = " << a << " b = " << b << '\n';
}
while(b>DELTA);
myout << "1/x=" << a << "\nпроверка вычислений "<< 1/x ;
}
proc(); // Вызов функции
}
void proc()
{ myout << '\n' << "Ok!"; // Вывод в поток
}
13.Печать таблицы чисел.
Задача 13.1
// Печать таблицы квадратных корней и квадратов
#include <iostream.h>
#include <math.h>
void main()
{ double x;
/* precision(n) – устанавливает количество выводимых цифр
дробной части числа (включая и десятичную точку) */
cout.precision(4);
cout<<" x
sqrt(x)
x^2\n\n";
for(x=2.0; x<=20.0; x++)
{ cout.width(2);
cout << x;
cout.width(13);
cout << sqrt(x);
cout.width(10);
cout << x*x << '\n';
}
}
Задача 13.2
// Печать таблицы квадратных корней и квадратов.
// Значения корней всегда печатаются как вещественные числа.
// ( Например, 4.000 вместо 4)
44
#include <iostream.h>
#include <math.h>
void main()
{ double x;
cout.precision(4);
/* precision(n) – устанавливает количество выводимых цифр
дробной части числа (включая и десятичную точку) */
cout<<" x
sqrt(x)
x^2\n\n";
for(x=2.0; x<=20.0; x++)
{ cout.width(2);
cout << x;
cout.width(13);
cout.setf(ios::showpoint);
/* setf(ios::showpoint) – устанавливает режим печати
вещественных чисел всегда с дробной частью */
cout << sqrt(x);
cout.unsetf(ios::showpoint);
/* setf(ios::showpoint) – отменяет режим печати
вещественных чисел всегда с дробной частью */
cout.width(10);
cout << x*x << '\n';
}
}
14.Потоковые переменные и имена файлов.
Задача 14.1
// Файл list.txt содержит список имен текстовых файлов.
// Подсчитать общее количество букв ‘a’ в этих файлах.
#include <stdlib.h> // Определена функция exit()
#include <fstream.h>
void main()
{ int count=0;
char filename[100];
// Описание потоковых переменных без привязки к файлам
ifstream myin;
ifstream infile;
ofstream myout;
// метод open() – открывает файл и связывает его с потоковой
// переменной. Флаг ios::nocreate – не создавать файл с таким
// именем, если он отсутствует. По умолчанию создается пустой
// файл.
myin.open("list.txt",ios::nocreate);
// Если файл не удалось открыть, то переменная потока (myin)
// получает значение ноль.
if (!myin)
{ cout << "Can't open file list.txt\n";
exit(1); // Завершение выполнения программы
}
45
myout.open("Result.txt");
while (1)
{ myin >> filename;
if (!myin.eof())
{ infile.open(filename,ios::nocreate); // Открытие файла
if (!infile)
cout << "Can't open " << filename << '\n';
else
{ while( !infile.eof() )
{ char symb;
symb=infile.get();
if (symb=='a')
count++;
}
infile.close(); //Закрытие обработанного файла.
// Освобождение потоковой переменной
}
}
else
break;
}
myout << "Общее кол-во букв 'а': "<< count << '\n';
}
Задача 14.2
// Слияние файлов.
// В существующий текстовый файл “file1.txt” добавить
// информацию из файла “file2.txt”
#include <stdlib.h> // Определена функция exit()
#include <fstream.h>
void main()
{ char buf[100];
ofstream myout;
ifstream myapp;
myapp.open("file2.txt",ios::nocreate);
if (!myapp)
{ cout << "Can't open file file2.txt\n";
exit(1);
// Завершение выполнения программы
}
myout.open("file1.txt",ios::app); /* Открытие файла для
добавления в конец (ios::app) */
while (!myapp.eof())
{ myapp.read(buf,100);
myout.write(buf,myapp.gcount());
}
myout.close();
myapp.close();
}
46
Приложение 1. Таблица основных операций в порядке убывания
приоритетов
sizeof ++ -- (тип) & !
* / %
+ < <= > >=
== !=
&&
||
?:
= += -= *= /=
Преобразов. типа, взятие адреса, not
Арифметические (остаток от деления)
Арифметические
Сравнение
Сравнение (равно, не равно)
Логическая (and)
Логическая (or)
Условная операция
Присваивание
Приложение 2. Средства ввода и вывода
1. Форматируемый ввод/вывод <iostream.h>
Стандартный входной поток cin
Стандартный выходной поток cout
#include <iostream.h>
int x, y, a[10], z;
cin >> x >> y >> a;
cout << “\nВывод с новой строки” << z;
2. Форматируемый ввод/вывод из файлов <fstream.h>
ifstream myin("test.txt");
//Открытие файла для ввода.
ofstream myout("result.txt"); //Открытие файла для вывода.
#include <fostream.h>
int x, y, a[10], z;
myin >> x >> y >> a;
myout << “\nВывод с новой строки” << z;
3. Функции ввода/вывода для обработки текстовых файлов.
47
get() - вводит очередной символ из входного потока и
в качестве своего значения.
char c; c=myin.get();
put(c) – выводит в выходной поток символ с.
cout.put(‘a’);
возвращает его
getline(buf, size,simb) – ) читает символы из входного потока, пока не
встретится символ symb (включая и его). Будет прочитано size-1 символов,
если symb не встретится. Вместо symb (или в конце строки) подставляется
‘\0’. Результат чтения помещается в массив buf .
char buf[20]; myin.getline(buf,19,’\n’);
read(buf, size) - читает в массив buf или size символов, или меньшее
количество, если считывается конец файла.
char buf[80]; myin.read(buf,80);
write(buf,size) – записывает size символов из массива buf в выходной
поток.
char buf[80]; myin.write(buf,50);
Замечание.
Все функции выполняют преобразования символов конца строки.
При вводе в один символ ‘\n’.
При выводе ‘\n’ преобразуется в Windows в два символа, в Unix в один.
gcount() - возвращает количество символов, прочитанных с помощью
последней функцией ввода.
int k; k=cin.gcount();
eof() – возвращает 1 (true), если прочитан конец файла и 0 (false) в
противном случае.
if (myin.eof()) cout << ”End of file myin”;
close() – закрытие файла
myin.close();
flush() – записывает содержимое буфера выходного потока на физическое
устройство. Удобно использовать при отладке программ.
cout.flush;
4. Двоичный (неформатируемый ввод/вывод).
ios::binary - параметр для открытия двоичного файла.
ofstream myoutbin("dbin.bin", ios::binary);
48
read(buf,size) – способ чтения из двоичного файла
int x;
ifstream myinbin("dbin.bin", ios::binary);
myinbin.read((char *) &x, sizeof(int));
write(buf,size) – способ записи в двоичный файл
double x;
ofstream myoutbin("vbin.bin", ios::binary);
myoutbin.write((char *) &x, sizeof(double));
sizeof(type) – возвращает количество байт, необходимых для размещения
объекта типа type.
5. Функции и флаги форматирования для печати таблиц.
width(N) – устанавливает ширину поля вывода равную N.
fill(C) – где С –одиночный символ. Устанавливает символ-заполнитель
свободных позиций в поле вывода (по умолчанию – пробел).
precision(N) – устанавливает количество цифр, выводимых
после десятичной точки, равное N-1.
setf(ios::left) – устанавливает выравнивание к левому краю поля вывода
(по умолчанию производится выравнивание к правому краю поля вывода).
unsetf(ios::left) – отменяет выравнивание к левому краю поля вывода.
setf(ios::showpoint) – устанавливает режим печати
чисел всегда с дробной частью.
unsetf(ios::showpoint) – отменяет режим печати
всегда с дробной частью
вещественных
вещественных чисел
myout.width(15);
myout.setf(ios::left);
myout << man.name;
6. Потоковые переменные и файлы.
ifstream myin; - описание потоковой переменной для ввода без открытия
файла.
49
ofstream myout; - - описание потоковой переменной для вывода без
открытия файла.
open( ) – открытие файла и связывание его с потоковой переменной.
close( ) – закрытие файла и освобождения потоковой переменной
ifstream myin;
ofstream myout;
myin.open(“file1.txt”, ios::nocreate);
myout. open(“file2.txt”);
……………………………..
myin.close();
myout.close();
ios::nocreate – параметр – не создавать пустой файл с именем, указанным
в open( ) , если такой файл отсутствует в каталоге.
ios::app – параметр - открытие выходного файла для дописывания
информации в конец этого файла.
ofstream myout;
myout.open(“file.txt”, ios::app);
Если файл не удается открыть, то потоковая переменная получает значение
ноль.
#include <stdlib.h> // Определена функция exit()
#include <fstream.h>
ifstream myin;
myin.open("list.txt",ios::nocreate);
if (!myin)
{ cout << "Can't open file list.txt\n";
exit(1); // Завершение выполнения программы
}
При указании пути имени файла символ \ записывается два раза \\
myout.open(“c:\\users\\file.txt”);
50
Приложение 3. Математические функции (<math.h>)
double acos(double x)
double asin(double x)
double atan(double x)
double cos(double x)
double cosh(double x)
double exp(double x)
double fabs(double x)
double log(double x)
double log10(double x)
double pow(double x, double y)
double sin(double x)
double sinh(double x)
double sqrt(double x)
double tan(double x)
double tanh(double x)
Арккосинус х
Арксинус х
Арктангенс х
Косинус х
Гиперболический косинус х
Степень х числа е
Модуль х
Натуральный логорифм
Логорифм х по основанию 10
х в степени y
Синус х
Гиперболический синус х
Квадратный корень из х
Тангенс х
Гиперболический тангенс х
51
Download