#include <fstream>
#include <string>
#include <fcntl.h>
#include <algorithm>
#include <iostream>
using namespace std;
fstream f;
const char* bdname = "clas.dbf";//Имя ДБ
class bd
{
public:
string name;
string town;
string clas;
bool vakcina_gripp;
double price;
void dop_bd(string str1, string str2, string str3, bool bul,double price )//Добавление элемента
{
fstream f;
f.open(bdname);
f << str1 << ' ' << str2 << str3 << bul << price;//Вывод в файл с именем bdname(константа)
}
void getbd()
{
int j = 0;
int i = 0;
char temp;
while (j < 2)
{
f >> temp;
if ((temp == ' ') && (j = 1)) break;
if (temp == ' ') j++;
name[i] = temp;
i++;
}
f >> temp;
temp = NULL;
while (temp != ' '){
town[i] = temp;
i++;
}
for (i = 0; i < 3; i++)
{
f >> clas[i];
}
f >> temp;
f >> temp;
if (temp == 'f') vakcina_gripp = false;
if (temp == 't') vakcina_gripp = true;
while (temp != ' ')
{
f >> temp;
}
f >> price;
}
};
void sort1(bd cls[]) // по Фамилии Имени
{
for (int i = 0; i < sizeof(cls)/sizeof(bd); i++) // Во всех последущих циклах использую, что sizeof(array)/sizeof(array_type) - количество элементов, хотя для динамики это невсегда работает.
for (int j = 0; j < sizeof(cls) / sizeof(bd)-i - 1; j++)
if (cls[j].name > cls[j+1].name)
swap(cls[j].name, cls[j + 1].name);
}
void sort2(bd cls[]) // по городу
{
for (int i = 0; i < sizeof(cls) / sizeof(bd); i++)
for (int j = 0; j < sizeof(cls) / sizeof(bd)-i - 1; j++)
if (cls[j].town > cls[j + 1].town)
swap(cls[j].town, cls[j + 1].town);
}
void sort3(bd cls[]) // по классу
{
for (int i = 0; i < sizeof(cls) / sizeof(bd); i++)
for (int j = 0; j < sizeof(cls) / sizeof(bd)-i - 1; j++)
if (cls[j].clas > cls[j + 1].clas)
swap(cls[j].clas, cls[j + 1].clas);
}
void sort4(bd cls[])// по булину
{
for (int i = 0; i < sizeof(cls) / sizeof(bd); i++)
for (int j = 0; j < sizeof(cls) / sizeof(bd)-i - 1; j++)
if (cls[j].vakcina_gripp > cls[j + 1].vakcina_gripp)
swap(cls[j].vakcina_gripp, cls[j + 1].vakcina_gripp);
}
void sort5(bd cls[])// по внесенной сумме
{
for (int i = 0; i < sizeof(cls) / sizeof(bd); i++)
for (int j = 0; j < sizeof(cls) / sizeof(bd)-i - 1; j++)
if (cls[j].price > cls[j + 1].price)
swap(cls[j].price, cls[j + 1].price);
}
string town(string nameet)
{
for (int i = 0; i < sizeof(myclass) / sizeof(bd); i++)
{
if (myclass[i].name == nameet) return myclass[i].town;
}
}
int count_t(string townet)
{
int count;
for (int i = 0; i < sizeof(myclass) / sizeof(bd); i++)
{
if (myclass[i].town == townet) count++;
}
return count;
}
int numb_true_value(string classet)
{
int count;
for (int i = 0; i < sizeof(myclass) / sizeof(bd); i++)
{
if ((myclass[i].clas == classet) && (myclass[i].vakcina_gripp == true)
&& (abs((myclass[i].price) - 200000.00) < 0.001)) count++;
}
return count;
}
bd *myclass = new bd;
int bin(string nameet)
{
size_t first = 0;
size_t last = sizeof(myclass) / sizeof(bd);
while (first < last) {
size_t mid = first + (last - first) / 2;
if (myclass[mid].name > nameet)
last = mid;
else first = mid + 1;
}
if (myclass[last].name == nameet) return last;
return -1;
}
int main()
{
for (int i = 0; i < 10; i++)
myclass[i].dop_bd("Tikhonov Mihail", "Moscow", "11G", false, 700.2132);// Заполняем всю ДБ одинаково.
//На всякий случай считываем из файла filename, в задании не понятно, чем должно быть и на сколько заполнено.
//Метод getdb берет данные из clas.dbf;
char* filename;
cout << "Введите имя файла базы данных(с раширением, без кавычек). Например MyOwnDb.dbf: ";
cin >> filename;
f.open(filename);
int i = 0;
while (!f.eof())
{
myclass[i].getbd(); //Получаем iый элемент класса bd;
i++;
}
char* jj;
int type, type2;
a:
while (true)
{
cout << "Введите N : номер задачи (N = [0;4] 1-4 для соотвествующей задачи, 0 для выхода): ";
cin >> type;
switch (type){
case 0: break;
case 1: cout << "Введите параметр сортировки. [1..5] для сортировки по [Имени..Внесенным средствам] соотвественно, 0 для возврата в гл. меню";
cin >> type2;
switch (type2){
case 0: goto a;
case 1: sort1(myclass);
case 2: sort2(myclass);
case 3: sort3(myclass);
case 4: sort4(myclass);
case 5: sort5(myclass);
}
case 2: cout <<"Введите значение поля 'Имя' ученика: ";// Как я понял второе задание - найти есть ли земляки у ученика 'Имя'
cin >> jj;
sort2(myclass);
if (count_t(town(jj)) == 1 )cout << endl << "Результат: Больше таких учеников нет";
if (count_t(town(jj)) > 1 )cout << endl << "Таких учеников: " << count_t(town(jj));
case 3: cout << "Введите значение поля 'Имя' ученика: ";
cin >> jj;
if (bin(jj)>0) cout << "Он учится в " << myclass[bin(jj)].clas << "классе ";//Вывод первого совпадения от бин. поиска. Если два ученика с один. именем, считаем их одним человеком.
else cout << "Такого ученика нет.";
case 4: cout << "Введите класс: ";
cin >> jj;
cout << "В этом классе только у " << numb_true_value(jj) << "учеников, подходящих данным условиям.";
}
}
return 0;
}