Файл: Литература Герберт. Шилдт. С руководство для начинающих.doc
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 16.03.2024
Просмотров: 20
Скачиваний: 0
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Перечисления
Дни недели
//arb2015_enum_day_of_week
#include "stdafx.h"
#include
using namespace std;
enum days_of_week { Sun, Mon, Tue, Wed, Thu,Fri,Sat };
int main()
{
days_of_week day1,day2;
day1=Mon;
day2=Thu;
int diff=day2-day1;
cout<<" the difference in days = "<
if (day1
system("pause");
return 0;
}
Тип перечисление
В С++ можно определить список именованных целоцисленных констант. Такой список называется перечислением. Эти константы можно использовать везде , где допустимы целочисленные значения ( например, в целочисленных выражениях).
Перечисления определяются с помощью ключевого слова enum,
а формат их определения имеют такой вид
enum имя_типа { список_перечисления } список_переменных;
Под элементом список _перечисления понимается список разделенных запятыми имен , которые представляют значения перечисления. Элемент список_переменных необязателен, поскольку переменные можно объявлять позже , используя имя_типа перечисления.
В следующем примере используется перечисление transport и две переменные типа transport с именами t1и t2.
enum transport {car, truck, airplane, train, boat };
transport t1 , t2;
t1 = airplane;
Важно понимать , что каждое имя списка перечислениея означает целое число, причем каждое следующее число (представленное именем ) на единицу больше предыдущего. Поэтому при выполнении следующей инструкции
cout<< car<<’ ‘<
на экран будут выведены чиса 0 и 3.
Несмотря на то , что перечислимые константы автоматически преобразуются в целочисленные , обратное преобразование автоматически не выполняется. Например, следующая инструкция некорректна.
t2=1;// ошибка
Эта инструкция вызовет во время компиляции ошибку, поскольку автоматического преобразования целочисленных значений в значения типа transport не существует. Откорректировать предыдущую инструкцию можно с помощью операции приведения типов
t2= (trunsport) 1;
Теперь переменная t2 будет содержать значение truck, поскольку эта transport-константа связывается со значением 1.
Используя инициализатор, можно указать значение одной или нескольких перчислимых констант. Это делается так : после соответствующего элемента списка перчисления ставится знак равенства и нужное целое число. При использовании инициализатора следующему ( после инициализированного ) элементу списка присваивается значение , на единицу превышающее предыдущее значение инициализатора.
enum transport {car, truck, airplane=10, train, boat } ;
Теперь все имена перечисления transport имеют следующие значения
сar 0
truck 1
airplane 10
train 11
boat 12
//arb2014_type_enum
#include
using namespace std;
#include "stdafx.h"
#include
#include
using namespace std;
int main()
{
ofstream out("out.txt");
enum transport {car, truck=2,airplane=10, train, boat };
transport t1,t2;
out<<"airplane=10 airplane= "<
out<<"airplane=10 airplane+10” <
t2=truck;
t2=(transport)((int)t2 +2);
out<<" t2=(transport)((int)t2 +2) t2= "<
out.close();
}
enum transport {car, truck=2,airplane=10, train, boat };
Файл out.txt
airplane=10 airplane= 10
airplane=10 airplane+10 = 20
t2=(transport)((int)t2 +2) t2= 4
Примечание: именованной константы со значением 4 нет в перечислении.
Тип union – объединение
Объединение - это область памяти которую разделяют несколько различных переменных. Объединение создается с помощью ключевого слова union. Его объявление подобно объявлению структуры.
union utype
{
short int i;
char ch;
};
Здесь объявляется объединение , в котором значение типа short int и значение типа char разделяют одну и туже область памяти. Необходимо сразу же прояснить один момент: невозможно сделать так, чтобы объединение хранило и целочисленное значение , и символ одновременно, поскольку переменные i и ch (в памяти ) накладываются друг на друга. Но программа в любой момент времени может обрабатывать информацию
//arb2014_struct_union2
#include "stdafx.h"
#include
#include
#include
using namespace std;
int main()
{
struct strtype
{
int x;
union
{
short int age;
char title[30];
};
};
int n;
cout<<"enter size of array n=";
cin>>n;
strtype* a= new strtype[n];
ifstream in("arb.txt");
ofstream out("out.txt");
int i;
for(i=0;i
{
int y;
in>>y;
if(y==0) in>>a[i].age; else in>>a[i].title;
a[i].x=y;
}
in.close();
for(i=0;i
{
out<
if(a[i].x) out<
out<
}
out.close();
system("pause");
return 0;
}
n=20
Файл arb.txt
0 23 1 boss 1 it 0 17 1 office 1 landlord 0 20 1 sportsmen
0 23 1 boss 0 17 1 it 1 office 1 landlord 0 20 1 sportsmen
0 23 1 boss 0 17 1 it 1 office 1 landlord 0 20 1 sportsmen
0 23 1 boss 0 17 1 it 1 office 1 landlord 0 20 1 sportsmen
Файл out.txt
0 23
1 boss
0 17
1 it
1 office
1 landlord
0 20
1 sportsmen
0 23
1 boss
0 17
1 it
1 office
1 landlord
0 20
1 sportsmen
0 23
1 boss
0 17
1
Лекция'>Лекция №13
Структуры
Структуры - тип данных, определяемые пользователем
Задача 1.
Структура комплексное число
//arb2014_struct_complex
#include "stdafx.h"
#include
using namespace std;
struct complex
{
double re;
double im;
} ;
/////////////
complex create_complex()
{
complex p;
cout<<"enter re=";
cin>>p.re;
cout<<"enter im=";
cin>>p.im;
return p;
}
//////////////////
void show(complex p)
{
cout<
}
///////////////////////////////////
complex add(complex p, complex q)
{
complex temp;
temp.re=p.re+q.re;
temp.im=p.im+q.im;
return temp;
}
//////////////////////////
complex subtr(complex p, complex q)
{
complex temp;
temp.re=p.re-q.re;
temp.im=p.im-q.im;
return temp;
}
//////////////////////////
complex mult (complex p, complex q)
{
complex temp;
temp.re=p.re*q.re-q.im*p.im;
temp.im=p.re*q.im+q.re*p.im;
return temp;
}
//////////////////////////////
complex div(complex p,complex q)
{
double r=q.re*q.re + q.im*q.im;
complex temp;
temp.re=(p.re*q.re+p.im*q.im)/r;
temp.im=(p.im*q.re-p.re*q.im)/r;
return temp;
}
///////////////////////////////////////////
int main()
{
complex p,q;
cout<<" enter complex p:"<
p=create_complex();
cout<<" enter complex q:"<
q= create_complex();
cout<<" complex number p: ";
show(p);
cout<<" complex number q: ";
show(q);
complex u=add(p,q);
cout<<" complex number u=p+q u: ";
show(u);
u=p;
cout<<" complex number u=p u: ";
show(u);
u=subtr(p,q);
cout<<" complex number u=p-q u: ";
show(u);
u=add(add(p,q),subtr(p,q));
cout<<" complex number u=(p+q)+(p-q) u: ";
show(u);
u=subtr( add(add(p,q),subtr(p,q)),p);
cout<<" complex number u=((p+q)+(p-q))-p u: ";
show(u);
u=mult(p,p);
cout<<" complex number u=p*p u: ";
show(u);
u=div(p,p);
cout<<" complex number u=p/p u: ";
show(u);
u=div(add(p,p),p);
cout<<" complex number u=(p+p)/p u: ";
show(u);
system("pause");
return 0;
}
Лекция
Задача 2
Поиск треугольника с наибольшей площадью.
//arb2013_struct_triangle_max_square_variant2
#include "stdafx.h"
#include
#include
#include
#include
#include
using namespace std;
struct dot
{
double koor_x,koor_y;
};
struct triangle
{
dot a;
dot b;
dot c;
};
const int num_dot=30;
const int num_tr=10;
//////////////////////////////////////////////////
void create(ifstream &f, dot &x)
{
if (!f)
{
cout<<"File not found! ";
exit(-1);
}
f>>x.koor_x>>x.koor_y;
}
/////////////////////////////////////////////////
void create(triangle &Tr, dot dx, dot dy, dot dz)
{
Tr.a=dx;
Tr.b=dy;
Tr.c=dz;
}
///////////////////////////////////////////////
double len_side(dot dx,dot dy)
{
return sqrt( ( dx.koor_x - dy.koor_x )*( dx.koor_x - dy.koor_x ) +
( dx.koor_y - dy.koor_y)*( dx.koor_y - dy.koor_y ));
}
////////////////////////////////////////////////
bool usl_triangle(dot dx, dot dy, dot dz)
{
return
(dx.koor_x - dz.koor_x)*(dy.koor_y - dz.koor_y)!=
(dy.koor_x - dz.koor_x)*(dx.koor_y - dz.koor_y);
}
/////////////////////////////////
double square(triangle Tr)
{
double s[3];
s[0]=len_side(Tr.a,Tr.b);
s[1]=len_side(Tr.a,Tr.c);
s[2]=len_side(Tr.b,Tr.c);
double Semi_Per;
Semi_Per=(s[0]+s[1]+s[2])/2;
return sqrt(Semi_Per*(Semi_Per-s[0]) *(Semi_Per-s[1])
*(Semi_Per-s[2]));
}
/////////////////////////////////
void show(ofstream &f, triangle Tr)
{
f<
double s[3];
s[0]=len_side(Tr.a,Tr.b);
s[1]=len_side(Tr.a,Tr.c);
s[2]=len_side(Tr.b,Tr.c);
cout.precision(4);
f<<"dot1= " << "(" <
<
f<<"dot2= " <<"(" <
<
f<<"dot3= " <<"("<
<
f<<"side AB= "<
f<<"side AC= "<
f<<"side BC= "<
f<<"square tr ABC= "<
}
//////////////////////////////////////////////////////////////////////
int main()
{
dot dt1,dt2,dt3;
triangle Tr[num_tr];
int i,num_tr_true;
ifstream in("arb.txt");
ofstream out("out.txt");
num_tr_true=-1;
for (i=0;i
{
create(in,dt1);
create(in,dt2);
create(in,dt3);
if (usl_triangle(dt1,dt2,dt3))
{
num_tr_true++;
create(Tr[num_tr_true],dt1,dt2,dt3);
}
}
double max=0.0;
int ind=0;
for(i=0;i
if (max
{
max=square(Tr[i]);
ind=i;
}
out<<"Max Square= "<
show(out,Tr[ind]);
out<
out<<"show all triangles:"<
for(i=0;i
show(out,Tr[i]);
out<
out<<"num_tr_true= "<
out.close();
system("pause");
return 0;
}
Файл arb.txt
1.0 1.0
22.0 27.0
32.0 39.0
1.11111 1.1
3.333 3.455
6.66 4.056
4.11111 5.1
7.333 8.455
6.66 4.056
11.11111 12.1
17.333 13.455
22.66 24.056
13.11111 14.1
34.333 36.455
61.66 64.056
41.11111 42.1
43.333 38.455
26.66 24.056
0.11111 1.1
0.333 3.455
0.66 4.056
12.91111 11.1
32.9333 3.455
6.966 4.9056
1.911111 5.1
3.9333 3.455
6.66 4.056
17.11111 18.1
37.333 38.455
61.66 64.0756
2.11111 4.1
3.333 9.455
16.66 14.056
10.11111 11.1
13.333 13.455
16.66 14.056
1.0 1.0
2.0 2.0
3.0 3.0
Файл out.txt
Max Square=
Triangle=
dot1= (12.9111, 11.1)
dot2= (32.9333, 3.455)
dot3= ( 6.966,4.9056)
side AB= 21.4321
side AC= 8.58574
side BC= 26.0078
square tr ABC= 84.7379
show all triangles:
Triangle=
dot1= ( 1, 1)
dot2= ( 22, 27)
dot3= ( 32, 39)
side AB= 33.4215
side AC= 49.0408
side BC= 15.6205
square tr ABC= 4
Triangle=
dot1= (1.11111, 1.1)
dot2= ( 3.333, 3.455)
dot3= ( 6.66, 4.056)
side AB= 3.23772
side AC= 6.28714
side BC= 3.38085
square tr ABC= 3.24986
Triangle=
dot1= (4.11111, 5.1)
dot2= ( 7.333, 8.455)
dot3= ( 6.66, 4.056)
side AB= 4.65152
side AC= 2.75441
side BC= 4.45018
square tr ABC= 5.95759
Triangle=
dot1= (11.1111, 12.1)
dot2= (17.333,13.455)
dot3= ( 22.66,24.056)
side AB= 6.36773
side AC= 16.623
side BC= 11.8642
square tr ABC= 29.3701
Triangle=
dot1= (13.1111, 14.1)
dot2= (34.333,36.455)
dot3= ( 61.66,64.056)
side AB= 30.8239
side AC= 69.6606
side BC= 38.8404
square tr ABC= 12.5748
Triangle=
dot1= (41.1111, 42.1)
dot2= (43.333,38.455)
dot3= ( 26.66,24.056)
side AB= 4.26882
side AC= 23.1175
side BC= 22.03
square tr ABC= 46.383
Triangle=
dot1= (0.11111, 1.1)
dot2= ( 0.333, 3.455)
dot3= ( 0.66, 4.056)
side AB= 2.36543
side AC= 3.00653
side BC= 0.6842
square tr ABC= 0.318365
Triangle=
dot1= (12.9111, 11.1)
dot2= (32.9333, 3.455)
dot3= ( 6.966,4.9056)
side AB= 21.4321
side AC= 8.58574
side BC= 26.0078
square tr ABC= 84.7379
Triangle=
dot1= (1.91111, 5.1)
dot2= (3.9333, 3.455)
dot3= ( 6.66, 4.056)
side AB= 2.60677
side AC= 4.86229
side BC= 2.79215
square tr ABC= 2.85038
num_tr_true= 10
Неформатируемый ввод-вывод
данных в двоичном режиме
Несмотря на простоту чтения ( и записи) форматироанных текстовых файлов , они не являются эффективным способом обработки файлов. Иногда просто необходимо сохранять неформатированные двоичные данные , а не текст. Поэтому С++ поддерживает ряд функций файлового ввода-вывода в двоичном режиме , которые могут выполнять операции безформатированных данных.
Для выполнения двоичных операций файлового ввода-вывода необходимо открыть фйл с использованием спецификатора режима ios::binary.
В общем случае существует два способа записи неформатированных двоичных данных в файл и считывания их из файла. Первый состоит в использовании функции-члена put() (для записи байта в файл) и функции-члена get() (для считывания байта из файла). Второй способ предполагает применение «блочных» С++ функций ввода-вывода read() и write().
//arb2014_binary_get_put
#include "stdafx.h"
#include
#include
using namespace std;
int main()
{
ifstream in("arb.txt");
ofstream out("out.bin", ios::binary);
if(!in)
{
cout<<"can't open file arb!"<
system("pause");
exit(1);
}
char ch;
while(in>>ch)
out.put(ch);
in.close();
out.close();
ifstream in1("out.bin",ios::binary);
ofstream out1("out1.txt");
if(!in1)
{
cout<<"can't open file out.bin"<
system("pause");
exit(1);
}
while(in1.get(ch))
out1<
out<
in1.close();
out1.close();
system("pause");
return 0;
}
Файл arb.txt
abc def Kazan State University
Файл out1.txt
abcdefKazanStateUniversity
т.к. cin пробелы пропускает, то в бинарных файлах
нет пробелов.
В этом случае необходимо текст записывать блоками.
#include "stdafx.h"
#include
#include
#include
using namespace std;
int main()
{
const int n=80;
ifstream in("arb.txt");
ofstream out("out.bin", ios::binary);
if(!in)
{
cout<<"can't open file!";
system("pause");
exit(1);
}
char mch[n];
in.getline(mch,80);
//cout<<"mch="<
int k=strlen(mch);
//cout<<"k= "<
in.close();
out.write((char*) mch, k*sizeof(char));
out.close();
ifstream in1("out.bin",ios::binary);
ofstream out1("out1.txt");
if(!in1)
{
cout<<"can't open file!"<
system("pause");
exit(1);
}
char ch;
while(in1.get(ch))
out1<
out1<
in1.close();
out1.close();
system("pause");
return 0;
}
Запись блоками write
//arb2014_binary_read_write_2
//arb2014_binary_get_put
#include "stdafx.h"
#include
#include
#include
using namespace std;
int main()
{
const int n=80;
ifstream in("arb.txt");
ofstream out("out.bin", ios::binary);
if(!in)
{
cout<<"can’t open file! ";
system("pause");
exit(1);
}
char mch[n];
in.getline(mch,80);
int k=strlen(mch);
in.close();
out.write((char*) mch, k*sizeof(char));
out.close();
ifstream in1("out.bin",ios::binary);
if(!in1)
{
cout<<"can’t open file! ";
system("pause");
exit(1);
}
ofstream out1("out1.txt");
char ch;
while(in1.get(ch))
out1<
out1<
in1.close();
out1.close();
system("pause");
return 0;
}
Файл arb.txt
abc def Kazan State University 123 456
Файл out1.txt
abc def Kazan State University 123 456
Записать блоком write и прочитать блоком read
//arb2014_binary_read_write_2
#include "stdafx.h"
#include
#include
#include
using namespace std;
int main()
{
const int n=80;
ifstream in("arb.txt");
ofstream out("out.bin", ios::binary);
if(!in)
{
cout<<"can't open file! ";
system("pause");
exit(1);
}
char mch[n];
in.getline(mch,80);
int k=strlen(mch);
in.close();
out.write((char*) mch, k*sizeof(char));
out.close();
ifstream in1("out.bin",ios::binary);
if(!in1)
{
cout<<"can't open file!"<
system("pause");
exit(1);
}
ofstream out1("out1.txt");
in1.read((char*)mch, k*sizeof(char));
out1<
out1.close();
system("pause");
return 0;
}
Файл arb.txt
abc def Kazan State University 123 456
Файл out1.txt
abc def Kazan State University 123 456
Считывание и запись в файл блоков данных
Чтобы считывать и записывать в файл блоки двоичных данных, используйте функции-члены read() и write().
Их прототипы имеют следующий вид:
istream &read((char*) buf, streamsize num);
ostream &write((char*) buf, streamsize num);
Функция read() считывает num байт данных из связанного с файлом потока и помещает их в буфер , адресуемый параметром buf.
Функция write() записывает num байт данных в связанный с файлом поток из буфера, адресуемого параметром buf.
Тип streamsiize определен библиотекой С++ как некоторая разновидность целочисленного типа.
При выполнении следующей программы сначала в файл записывается массив целых чисел , а затем он же считывается из файла
//arb2014_binary_array_read_write
#include "stdafx.h"
#include
#include
#include
using namespace std;
int main()
{
const int n=5;
int a[n]={1,2,3,4,5};
int i;
ofstream out("out.bin", ios::binary);
out.write((char*)a, n*sizeof(int));
out.close();
ifstream in("out.bin", ios::binary);
if(!in)
{
cout<<"can't open file!"<
system("pause");
exit(1);
}
for(i=0;i
a[i]=0;//очищаем массив
in.read((char*)a, n*sizeof(int));
cout<<"array a:"<
for(i=0;i
cout<
cout<
in.close();
system("pause");
return 0;
}
Задачи из методички Гусенкова А.М.
Задача 2
Создание двоичного (binary) файла целых чисел.
Можно использовать в следующих далее программах
в качестве входного файла.
//arb2014_binary_gus_9_2
#include "stdafx.h"
#include
#include
using namespace std;
int main()
{
char fname[20]; // // Для ввода имени выходного файла
int x;
cout << "Enter name of file :";
cin >> fname;
// Открытие двоичного файла для вывода.
ofstream out(fname, ios::binary);
if(!out) // // Если не удалось открыть файл
{
cout << "Not open file"<
system("pause");
exit(1);
}
cout << "Enter integer numbers. Number 9999 - end of input"<
// Ввод целых чисел с экрана терминала и запись в двоичный
// файл.
// Функция sizeof(int) возвращает количество байт, выделяемых
// для размещения числа типа int
while(cin>>x && x != 9999)
out.write((char*) &x, sizeof(int));
out.close();
// Открытие созданного двоичного файла для ввода.
ifstream in(fname, ios::binary);
if(!in)
{
cout << "Not open file"<
system("pause");
exit(1);
}
cout << "Output file :"<
// Чтение двоичного файла и вывод его на экран терминала.
while( in.read((char*) &x, sizeof(int)) )
cout << x << ' ';
cout << endl;
in.close();
system("pause");
return 0;
}
Задача 3
Задан текстовой файл, состоящий из целых чисел. Используя этот файл , создается бинарный файл целых чисел ”file1.bin”. Используется функция create().
Далее осуществляется проверка на правильное чтение с //помощью функции check().
После этого к полученному бинарному файлу дописывается последовательность целых чисел
из того же текстового файла. И опять проверка на правильность дописывания. Файл открывается для записи и указатель позиции записи устанавливается в конец
файла. Параметр ios::app out1_bin.open("file1.bin",ios::binary | ios::app);
// arb2013_gusen_10_3_bin
#include "stdafx.h"
#include
#include
#include
using namespace std;
//////////////////////////
void create(ifstream &f, ofstream &g)
{
int x;
if(!f)
{
cout << "Can not open file "<
system("pause");
exit(1);
}
while(f>>x)
{
g.write((char *) &x, sizeof(int));
}
}
/////////////////////////////////////////
void check(ifstream &f, ofstream &g)
{
int x;
if(!f)
{
cout << "Can not open file"<
system("pause");
exit(1);
}
while(f.read((char*)&x, sizeof(int)))
{
g<
}
g<
}
////////////////////////////////////////
int main()
{
ifstream in1("arb.txt");
ofstream out1_bin("file1.bin",ios::binary);
create(in1,out1_bin);
in1.close();
out1_bin.close();
ifstream in1_bin("file1.bin",ios::binary);
ofstream out1("out1.txt");
check(in1_bin,out1);
out1.close();
in1_bin.close();
in1.open("arb.txt");
out1_bin.open("file1.bin",ios::binary | ios::app);
// Файл открывается для записи и указатель позиции
// записи устанавливается
// в конец файла. Параметр ios::app
create(in1,out1_bin);
in1.close();
out1_bin.close();
in1_bin.open("file1.bin",ios::binary);
out1.open("out1.txt");
check(in1_bin,out1);
out1.close();
in1_bin.close();
system("pause");
return 0;
}
Задача 10.5
/* Расщепление. Образовать из входного файла целых чисел
два новых файла. В один из них поместить все положительные
числа, а в другой – все остальные числа.
*/
// Входной файл можно создать в задаче D2.
#include "stdafx.h"
#include
#include
#include
using namespace std;
int main()
{
int x;
ifstream myin("file.bin", ios::binary);
if(!myin)
{
cout << "Can’t open file file1.bin"<
system("pause");
exit(1);
}
ofstream myout1("file1.bin", ios::binary);
// Файл положительных
ofstream myout2("file2.bin", ios::binary);
// Файл остальных чисел
while(myin.read((char *) &x, sizeof(int)))
{
if(x>0)
myout1.write((char *) &x, sizeof(int));
else
myout2.write((char *) &x, sizeof(int));
}
myout1.close();
myout2.close();
// Вывод созданных файлов на экран терминала
// для проверки результата.
ifstream myplus("file1.bin", ios::binary);
cout << "File of positive numbers"<
while (myplus.read((char *) &x, sizeof(int)))
cout << x << ' '; cout << endl;
ifstream myother("file2.bin", ios::binary);
cout << "File of other numbers"<
while(myother.read((char *) &x, sizeof(int)))
cout << x << ' ';
cout <
myplus.close();
myother.close();
system("pause");
return 0;
}
Задача 10.6
Дан двоичный файл целых чисел. Вычислить сумму всех его чисел.
Пример чтения чисел в массив. Каждая порция заносится в массив. Входной файл уже создан
#include "stdafx.h"
using namespace std;
#include
#include
using namespace std;
int main()
{
const int N=5;
int x[N], sum, len, i;
ifstream myin("file.bin", ios::binary); // Входной файл
if(!myin)
{
cout << "Can’t open file file.bin"<
exit(1);
}
sum = 0;
while(!myin.eof())
// Чтение файла в массив. Указано имя массива (без &)
{
myin.read((char *) x, N*sizeof(int));
// gcount() возвращает количество прочитанных байт.
len = myin.gcount()/sizeof(int);
for(i=0; i
}
myin.close();
cout << "Sum =" << sum << endl;
system("pause");
return 0;
}
Задача 11.3
Описать структуру экзаменационной ведомости, содержащую следующие сведения:
-
номер группы; -
наименование предмета; -
дата экзамена; -
фамилия экзаменатора; -
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
//arb2014_gus_11_3_december_2014
#include "stdafx.h"
#include
#include
using namespace std;
int main()
{
struct student // определение типа student
{
char name[30];
char num_z[6];
int zach;
int mark_exam;
};
struct vedomost // определение типа vedomost
{
int group;
char predmet[15];
char date[10];
char examenater[15];
student spisok[9]; // тип student яв-ся элементом
//типа vedomost
} ;
vedomost subject1; // описание переменной типа vedomost
int i;
int marks[4]; // Cчетчик оценок
ifstream in("vedomost.txt");
if(!in)
{
cout << "Can't open file vedomost.txt"<
system("pause");
exit(1);
}
// чтение ведомости из файла
in >> subject1.group >> subject1.predmet >> subject1.date >> subject1.examenater;
for(i=0; i<9; i++)
in >> 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;
}
ofstream out("out.txt");
out<<" the final performance in the group"<
out << "marks 5 " << marks[3] <
out<<"marks 4 " << marks[2]<
out<< "marks 3 " << marks[1]<
out<<"marks 2 " << marks[0] << endl;
out.close();
system("pause");
return 0;
}
Файл out.txt
( перевод итоговая успеваемость в группе )
the final performance in the group
marks 5 2
marks 4 3
marks 3 2
marks 2 2
Задача 11.4
Военно-учетный стол. Регистрация студентов.
Дан текстовый файл, содержащий следующую информацию о студентах:
-
Фамилия; -
Номер группы; -
Служба в армии (служил-1 или нет-0); -
Если служил, то воинское звание, иначе – возраст.
-
Создать файл записей -
На основе файла записей сформировать текстовый файл, содержащий сведения о студентах не служивших в армии. (В виде таблицы.)
Пример входного файла:
Иванов 923 1 солдат
Петров 924 0 19
Сидоров 924 1 мл.лейтенант
Хайруллин 922 1 сержант
Карасиков 924 0 17
Либерман 924 0 25
//arb2014_gus_11_4_december_2014
#include "stdafx.h"
#include
#include
using namespace std;
int main()
{
struct student
{
char name[30];
int group;
int army;
union // Аналог записи с вариантами в Pascal
{
char voin_zv[15];
int age;
};
};
student man;
ifstream in("student.txt");
if(!in)
{
cout << "Can't open file student.txt"<
exit(1);
}
// Создание двоичного файла записей
ofstream binout("voenkomat.bin",ios::binary);
while(!in.eof())
{
in >> man.name >> man.group >> man.army;
if (man.army)
in >> man.voin_zv;
else
in >> man.age;
if(!in.eof())
binout.write((char *) &man,sizeof(struct student));
}
binout.close();
// Чтение файла записей
ifstream binin("voenkomat.bin",ios::binary);
ofstream out("result.txt"); // выходной файл (таблица)
// вывод заголовка
out << " Список студентов не служивших в армии"<
// Ввод записей и печать таблицы
while(1)
{
binin.read((char *) &man,sizeof(struct student));
if (binin.eof())
break;
if(!man.army)
{
/* Форматирование для печати таблицы.
width(N) – устанавливает ширину поля вывода равную N.
fill(C) – где С –одиночный символ. Устанавливает символ-заполнитель свободных позиций в поле вывода (по умолчанию – пробел).
setf(ios::left) – устанавливает выравнивание к левому краю поля вывода (по умолчанию производится выравнивание к правому краю поля вывода).
unsetf(ios::left) – отменяет выравнивание к левому краю поля вывода. */
out.width(29);
out.fill('-');
out << '-' <
out.fill(' ');
out.width(1);
out << '|';
out.width(15);
out.setf(ios::left);
out << man.name;
out.width(1);
out << '|';
out.width(5);
out.unsetf(ios::left);
out << man.group;
out.width(1);
out << '|';
out.width(5);
out << man.age;
out.width(1);
out << '|' <
out.width(29);
out.fill('-');
out << '-' << endl;
out.fill(' ');
}
}
system("pause");
return 0;
}
Файл result.txt
Список студентов не служивших в армии
-----------------------------
|Петров | 924| 19|
-----------------------------
-----------------------------
|Карасиков | 924| 17|
-----------------------------
-----------------------------
|Либерман | 924| 25|
Реальная зарплата
Real salary
Задан текстовой файл
Строка файла имеет вид
1wwwwwwwwwwww 120 22 33 44 44 55 66 77 88 99 2 2 0.15
ФИО 12 чилел – зарплаты по месяцам и процент кредита
Создать структуру salary
Поля:
-фио – символьная строка
-целочисленный массив зарплат
-процент по кредиту –тип вещественный
-реальная зарплата за год
Реальная зарплата вычисляется как сумма зарплат всех месяцев*0.87*(1-credit)/12;
Все структуры перенести в бинарный файл.
Далее. Переносим структуры из бинарного файла
в массив. Размерность масства задается динамически.
Упорядочить массив по невозрастанию реальной зарплаты.
На экран вывести 5 первых сотрудников.
//arb2014_binary_real_salary
#include "stdafx.h"
#include
#include
using namespace std;
const int n=12;
struct salary
{
char fam[30];
int m[n];
double credit;
double real_salary;
};
//////////////////////////////
int main()
{
int i,j, num=0;
salary* z;
ifstream in("salary.txt");
ofstream out("salary.bin", ios::binary);
salary x;
if(!in)
{
cout<<"file not open!";
exit(-1);
}
while (in)
{
in>>x.fam;
for (i=0; i
{
in>>x.m[i];
}
in>>x.credit;
double s=0;
for(i=0; i
{
s=s+x.m[i];
}
s=s*0.87*(1-x.credit);
x.real_salary=s/12;
if(in)
{
out.write ((char*)&x, sizeof (salary));
num++;
}
}
in.close();
out.close();
z=new salary[num];
ifstream in1("salary.bin", ios::binary);
i=0;
while (i
{
i++;
}
in1.close();
for(i=0; i
for(j=i+1; j
{
if(z[i].real_salary
{
x=z[i];
z[i]=z[j];
z[j]=x;
}
}
cout<<" high salary 5 employees"<
for(i=0; i<5; i++)
cout<
system("pause");
return 0;
}
Файл salary.txt
1wwwwwwwwwwww 120 22 33 44 44 55 66 77 88 99 2 2 0.15
2wwwwwwwwwwww 135 22 33 44 44 55 66 77 88 99 2 2 0.15
3wwwwwwwwwwww 126 22 33 44 44 55 66 77 88 99 2 2 0.15
4wwwwwwwwwwww 12 226 33 44 44 55 66 77 88 99 2 2 0.15
5wwwwwwwwwwww 126 225 33 44 44 55 66 77 88 99 2 2 0.15
6wwwwwwwwwwww 12 22 33 44 44 55 66 77 88 99 2 2 0.15
7wwwwwwwwwwww 12 22 336 44 44 55 66 77 88 99 2 2 0.15
8wwwwwwwwwwww 12 22 336 44 44 55 66 77 88 99 2 2 0.15
9wwwwwwwwwwww 12 22 33 446 44 55 66 77 88 99 2 2 0.15
10wwwwwwwwwwww 12 22 33 446 44 55 66 77 88 99 2 2 0.15
12wwwwwwwwwwww 12 22 336 44 44 55 66 77 88 99 2 2 0.15
13wwwwwwwwwwww 12 226 33 44 44 55 66 77 88 99 2 2 0.15
14wwwwwwwwwwww 126 22 33 44 44 55 66 77 88 99 2 2 0.15
15wwwwwwwwwwww 126 22 33 44 44 55 66 77 88 99 2 2 0.15
16wwwwwwwwwwww 126 22 336 644 44 55 66 77 88 99 2 2 0.15
17wwwwwwwwwwww 12 22 336 44 44 55 66 77 88 99 2 2 0.15
Бинарные файлы
Прием заявлений и зачисление на ВМК
#include "stdafx.h"
#include
#include
#include
using namespace std;
const int k=3;
struct attestat
{
char FIO[30];
int SC[k];// score for sc[0] - math sc[1]-ph sc[2]-rus
int OLIMP;// 1-yes 0 - no
};
struct score
{
char FIO[30];
int SUM_SC;
int OLIMP;// 1-yes 0 - no
};
//////////////////////////////////////////////////////////////////////////
void show(score* x,int n)
{
int i;
for (i=0;i
cout<
x[i].SUM_SC<
}
////////////////////////////////////////////////////////////////////////////
void create_mas(score* x,int n,ifstream &f)
{
int i;
attestat a;
if (!f)
{
cout<<"Can't open file!!!"<
system("pause");
exit(-1);
}
cout<
{
f.read((char*)&a,sizeof(struct attestat));
strcpy_s(x[i].FIO,a.FIO);
x[i].OLIMP = a.OLIMP;
x[i].SUM_SC = a.SC[0]+a.SC[1]+a.SC[2];
}
f.close();
}
////////////////////////////////////////////////////////////////////////////////////
void create_bin_file(ifstream &f, ofstream &g,int &n)
{
attestat a;
n=0;
if (!f)
{
cout<<"Can't open file!!!"<
system("pause");
exit(-1);
}
while(f>>a.FIO>>a.SC[0]>>a.SC[1]>>a.SC[2]>>a.OLIMP )
{
if ((a.SC[0]>=60)&&(a.SC[1]>=60)&&(a.SC[2]>=50))
{
g.write((char*)&a,sizeof(struct attestat));
n++;
}
}
f.close();
g.close();
}
//////////////////////////////////////////////////////////////////////////////////
void show_text_file(ifstream &f)
{
attestat a;
if (!f)
{
cout<<"Can't open file!!!"<
exit(-1);
}
cout<<"show text file "<
while(f>>a.FIO>>a.SC[0]>>a.SC[1]>>a.SC[2]>>a.OLIMP)
{
cout<
}
f.close();
}
//////////////////////////////////////////////////////////////////////////
void show_bin_file(ifstream &f, ofstream &g)
{
score a;
if (!f)
{
cout<<"Can't open file!!!"<
system("pause");
exit(-1);
}
g<<"show bin file "<
while(f.read((char*)&a, sizeof(score)))
{
g<
}
f.close();
g.close();
}
//////////////////////////////////////////
void order(score* x, int n)
{
int i,j;
score r;
for (i=0;i
for (j=i+1;j
if (( x[i].SUM_SC < x[j].SUM_SC) || ((x[i].SUM_SC ==
x[j].SUM_SC) && ( x[i].OLIMP < x[j].OLIMP)))
{
r= x[i];
x[i]= x[j];
x[j]=r;
}
}
//////////////////////////////////////////////////////////////////////////////////
int main()
{
setlocale(LC_ALL,"Rus");
int num_abit;
int i,j;
ifstream VMK_in("priem_VMK.txt");
ofstream VMK_out("priemVMK.bin",ios::binary);
create_bin_file(VMK_in,VMK_out,num_abit);
ifstream VMK_bin_in("priemVMK.bin",ios::binary);
score* mas;
mas = new score [num_abit];
VMK_in.open("priem_VMK.txt");
show_text_file(VMK_in);
create_mas(mas,num_abit,VMK_bin_in);
cout<<"mas ="<
show(mas,num_abit);
cout<<" Рейтинг. Упорядоченный массив "<
order(mas,num_abit);
show(mas,num_abit);
int plan;
cout<
cout<<"Введите план приема plan= ";
cin>>plan;
int dop=0;
cout<<" Проходной балл = "<
if (mas[plan-1].SUM_SC==mas[plan].SUM_SC)
{
j=plan;
while (j<=num_abit && mas[plan-1].SUM_SC
==mas[j].SUM_SC)
{
j++;
dop++;
}
}
cout<<"Предоставлено дополнительных мест dop= "<
ofstream zach("zachislenie.bin",ios::binary);
ofstream dop_spisok("dopol.bin",ios::binary);
for (i=0;i
zach.write((char*) &mas[i], sizeof(score));
for (i=plan;i
dop_spisok.write((char*) &mas[i], sizeof(score));
zach.close();
dop_spisok.close();
VMK_bin_in.open("zachislenie.bin",ios::binary);
ofstream VMK_out_text("zach.txt");
VMK_out_text<<"Зачисление на ВМК:"<
show_bin_file(VMK_bin_in,VMK_out_text);
VMK_out_text.open("zach_dop.txt");
VMK_bin_in.open("dopol.bin",ios::binary);
VMK_out_text<<"Зачисление на ВМК по дополнительному списку:"<
show_bin_file(VMK_bin_in,VMK_out_text);
system("pause");
return 0;
}
Файл priem_VMK.txt
1aaaaaaaaaaaaaaa 61 62 67 1
2aaaaaaaaaaaaaaa 61 62 68 0
3aaaaaaaaaaaaaaa 61 62 69 1
4aaaaaaaaaaaaaaa 61 62 67 0
5aaaaaaaaaaaaaaa 61 62 70 1
6aaaaaaaaaaaaaaa 61 62 75 0
7aaaaaaaaaaaaaaa 61 62 75 1
8aaaaaaaaaaaaaaa 61 62 67 1
9aaaaaaaaaaaaaaa 61 62 27 1
10aaaaaaaaaaaaa 61 62 47 1
11aaaaaaaaaaaaa 61 62 57 1
12aaaaaaaaaaaaaaa 61 62 87 1
13aaaaaaaaaaaaaaa 61 62 97 1
14aaaaaaaaaaaaaaa 61 62 87 0
15aaaaaaaaaaaaaaa 61 62 67 1
16aaaaaaaaaaaaaaa 61 62 67 0
17aaaaaaaaaaaaaaa 61 62 67 1
18aaaaaaaaaaaaaaa 61 62 67 1
Зачисление на ВМК:
show bin file
13aaaaaaaaaaaaaaa 220 1
12aaaaaaaaaaaaaaa 210 1
14aaaaaaaaaaaaaaa 210 0
7aaaaaaaaaaaaaaa 198 1
6aaaaaaaaaaaaaaa 198 0
5aaaaaaaaaaaaaaa 193 1
3aaaaaaaaaaaaaaa 192 1
2aaaaaaaaaaaaaaa 191 0
8aaaaaaaaaaaaaaa 190 1
1aaaaaaaaaaaaaaa 190 1
Файл dop_zach.txt
Зачисление на ВМК по дополнительному списку:
show bin file
15aaaaaaaaaaaaaaa 190 1
17aaaaaaaaaaaaaaa 190 1
18aaaaaaaaaaaaaaa 190 1
4aaaaaaaaaaaaaaa 190 0
16aaaaaaaaaaaaaaa 190 0
Appendix
Templates Шаблоны
Задача 1
#include "stdafx.h"
#include
using namespace std;
template
void box(T length, T width, T height);// прототип функции
int main()
{
setlocale( LC_ALL,"Russian" );
box
box
box
box
box
box
system("pause");
return 0;
}
// Определение функции box()
template
void box(T length, T width, T height)
{
cout<<"Объем параллелепипеда равен "<<
length* width* height <
}
Задача 2
#include "stdafx.h"
#include
using namespace std;
const int n=5;
/////////////////
template
void create ( T* x , int k);
//возможный вариант void vvod ( int x[n])
template
void show ( T* x, int k);
template
T max ( T* x, int k);
/////////////////////////
int main()
{
setlocale( LC_ALL,"Russian" );
int a[n];
cout<<" введите целочисленный массив а:"<
create(a,n);
cout<<" целочисленный массив а:"<
show( a, n);
cout<< "max(a,n)= "<
double b[n];
cout<<" введите вещественный массив b:"<
create(b,n);
cout<<" вещественный массив b:"<
show ( b, n);
cout<< "max(b,n)= "<
system("pause");
return 0;
}
//////////////////////
template
void create ( T* x, int k)
{
int i;
for (i=0; i
{
cout<<"x["<
cin>>x[i];
}
}
///////////////////////
template
void show ( T* x, int k)
{
int i;
for (i=0; i
cout<
cout<
}
////////////////////////////
template
T max( T* x, int k)
{
int i;
T m;
m=x[0];
for (i=0; i
if (m
return m;
}
/////////////////////////
Задача 3
Заданы два целочисленных мвссива размерноси n*n.
A*B , если EiAj[ A[i][j] >0]
Вычислить С=
A+B, противном случае
Задачу выполнить и для вещественных массивов
#include "stdafx.h"
# include
# include
# include
using namespace std;
template
void create ( T **, int);
template
void show( T **, int);
template
bool EA( T**, int);
template
void mult ( T**, T**, T**,int);
template
void add ( T **, T**, T**,int);
/////////////////////////////////////
int main()
{
int n;
cout<<"enter size of array n =";
cin>>n;
int **a, **b, **c;
a= new int*[n];
int i;
for (i=0;i
a[i]=new int[n];
b= new int*[n];
for (i=0;i
b[i]=new int [n];
c= new int*[n];
for (i=0;i
c[i]=new int[n];
cout<<"enter array a:"<
create
cout<<"enter array b:"<
create
cout<<" array a:"<
show
cout<<" array b:"<
show
if (EA
else add
cout<<"array c: "<
show
for(i=0;i
delete []a[i];
delete [] a;
for(i=0;i
delete []b[i];
delete []b;
for(i=0;i
delete []c[i];
delete []c;
double **a1, **b1, **c1;
a1= new double*[n];
for (i=0;i
a1[i]=new double[n];
b1= new double*[n];
for (i=0;i
b1[i]=new double [n];
c1= new double*[n];
for (i=0;i
c1[i]=new double[n];
cout<<"enter array a1:"<
create
cout<<"enter array b1:"<
create
cout<<" array a1:"<
show
cout<<" array b1:"<
show
if (EA
mult
else add
cout<<"array c1: "<
show
for(i=0;i
delete []a1[i];
delete [] a1;
for(i=0;i
delete []b1[i];
delete []b1;
for(i=0;i
delete []c1[i];
delete []c1;
system("pause");
return 0;
}
////////////////////////////////
template
void create(T**x, int n)
{
int i,j;
for (i=0; i
for (j=0; j
{
cout<<"x["<
cin>>x[i][j];
}
}
////////////////////////////
template
void show(T**x, int n)
{
int i,j;
for (i=0; i
{
for (j=0; j
cout<
cout<
}
}
/////////////////////////////////
template
bool EA(T**x, int n)
{
bool p,q;
int i,j;
p=false;
for (i=0;i
{
q=true;
for (j=0; j
if (x[i][j]<=0) q=false;
p=q;
}
return p;
}
//////////////////////////////
template
void mult ( T **x, T**y, T**z,int n)
{
int i, j, k;
for (i=0; i
for (j=0; j
{
z[i][j]=0;
for (k=0; k
z[i][j]=z[i][j]+x[i][k]*y[k][j];
}
}
/////////////////////////////
template
void add ( T **x, T**y, T**z, int n)
{
int i, j;
for (i=0; i
for (j=0; j
z[i][j]= x[i][j]+y[i][j];
}
/////////////////////////////////////////////////////////////
Задано натуральное число n.
-
Выписать все числа, полученные из данного, вычеркиванием одной цифры -
Выписать все числа, полученные из данного вычеркиванием одной цифры , являющиеся простыми
#include "stdafx.h"
#include
using namespace std;
////////////////////////////
int length_num(int x)
{
int l=0;
while(x>0)
{
x=x/10;
l++;
}
return l;
}
///////////////////////
int delete_cifra(int x, int k)
{
int j=0;
int t=1;
int s=0;
while(x>0)
{
int p=x%10;
j++;
if (k!=j)
{
s=s+p*t;
t=t*10;
}
x=x/10;
}
return s;
}
/////////////////////////////////////
bool prime(int x)
{
if(x<2) return false;
if(x==2) return true;
bool t=true;
int i;
for( i=2;i<=sqrt(x)&& t;i++)
if (x%i ==0) t=false;
return t;
}
/////////////////////////////////////
int main()
{
int x;
cout<<"enter x= ";
cin>>x;
int l=length_num(x);
int i;
cout<<" all numbers"<
for(i=1;i<=l;i++)
cout<
cout<<" all prime numbers"<
for(i=1;i<=l;i++)
if(prime(delete_cifra(x,i)))
cout<
system("pause");
return 0;
}
////////////////////////////////////////////
Example n=234
all: 23, 24, 34
primes: 23
////////////////////////////////////////////////////////////////////////////////
Дихотомический поиск элемента в массиве
Задан упорядоченный массив. Найти позицию элемента х в массиве. o(log n) итераций цикла
#include "stdafx.h"
#include
using namespace std;
int main()
{
setlocale(LC_ALL, "rus");
const int n = 10;
int a[n] = { 1,2,3,4,5,6,7,8,9,10 };
int left = 0, right = n - 1, x;
int mid;
cout << "введите x= ";
cin >> x;
bool flag = false;
while (!flag && (left <=right))
{
mid = (right + left) / 2;
if (a[mid] == x) flag = true;
if (x > a[mid])
left = mid + 1;
else right = mid - 1;
}
if (flag) cout << "Индекс элемента " << x << " в массиве равен: " << mid << endl;
else cout << "Извините, но такого элемента в массиве нет" << endl;
system("pause");
return 0;
}