Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "pch.h"
- #include <windows.h>
- #include <conio.h>
- #include <stdio.h>
- #include <string.h>
- struct basket {
- char fam[20];
- char name[20];
- int time;
- int ochki;
- } ball;
- struct Root {
- basket ball;
- Root *left, *right;
- }*root = NULL;
- struct List {
- basket ball;
- List *next;
- }*first = NULL;
- FILE *f; int kolsp = 0;
- void del_tree(Root **root) {
- if (*root) {
- del_tree(&((*root)->left));
- del_tree(&((*root)->right));
- delete (*root);
- (*root) = NULL;
- }
- }
- int input()
- {
- int count; //кол-во введенных данных
- char sym;
- f = fopen("basket.txt", "rb+");
- if (f) {
- printf("Файл существует. Выберете действие\n");
- printf("1 - создать новый файл\n");
- printf("2 - добавить данные в существующий\n");
- printf("3 - выйти из операции ввода\n");
- //getchar();
- sym = getchar();
- switch (sym)
- {
- case '1': f = fopen("basket.txt", "wb");
- break;
- case '2': {
- f = fopen("basket.txt", "ab");
- fseek(f, 0, 2);
- }
- break;
- case '3': return 0;
- }
- }
- else f = fopen("basket.txt", "wb");
- count = 0;
- do {
- List *buf;
- while (first) {
- buf = first;
- first = first->next;
- delete buf;
- }first = NULL;
- printf("Введите время\n"); scanf("%d", &ball.time);
- printf("Введите название команды\n");
- //fflush(stdin);
- getchar();
- gets_s(ball.name);
- printf("Введите фамилию игрока\n");
- gets_s(ball.fam);
- printf("Введите кол-во забитых очков этим игроком\n"); scanf("%d", &ball.ochki);
- fwrite(&ball, sizeof(ball), 1, f); //пишет данные в файл
- printf("Продлжить ввод? [д/н]\n");
- //fflush(stdin);
- getchar();
- count++;
- sym = getchar();
- } while (sym == 'д' || sym == 'l');
- fclose(f);
- return count;
- }
- void view()
- {
- int count = 0;
- f = fopen("basket.txt", "rb");
- if (!f) {
- printf("Файл не найден\n");
- //system("Pause");
- }
- else {
- int kolvoOchkov1 = 0, kolvoOchkov2 = 0;
- int cravn;
- char kom[20];
- char k1[20], k2[20];
- fopen("basket.txt", "rb");
- //printf("Отчет по игре:\n");
- printf("Время ");
- printf("Команда ");
- printf("Фамилия ");
- printf("Очки\n");
- fread(&ball, sizeof(basket), 1, f);
- strcpy(kom, ball.name);
- do {
- printf("%-8d", ball.time);
- printf("%-10s", ball.name);
- printf("%-10s", ball.fam);
- printf("%d", ball.ochki);
- printf("\n");
- count++;
- cravn = strcmp(kom, ball.name);
- if (cravn == 0) {
- kolvoOchkov1 += ball.ochki;
- strcpy(k1, ball.name);
- }
- else {
- kolvoOchkov2 += ball.ochki;
- strcpy(k2, ball.name);
- }
- } while (fread(&ball, sizeof(basket), 1, f));
- if (kolvoOchkov1 > kolvoOchkov2)
- printf("Победила команда %s со счетом: %d:%d\n", k1, kolvoOchkov1, kolvoOchkov2);
- else printf("Победила команда %s со счетом: %d:%d\n", k2, kolvoOchkov2, kolvoOchkov1);
- }
- fclose(f);
- if (!count)
- printf("Нет данных!");
- }
- void taim()
- {
- f = fopen("basket.txt", "rb");
- if (!f) {
- printf("Файл не найден\n");
- }
- else {
- char k1time1[20], k2time1[20];
- int kolvoOchkov1time1 = 0, kolvoOchkov2time1 = 0, kolvoOchkov1time2 = 0, kolvoOchkov2time2 = 0;
- char kolvoOchkov1dop = 0, kolvoOchkov2dop = 0;
- int time1, time2;
- char kom[20];
- int cravn;
- //printf("\n");
- fread(&ball, sizeof(basket), 1, f);
- strcpy(kom, ball.name);
- do {
- cravn = strcmp(kom, ball.name);
- if (ball.time <= 15)
- if (cravn == 0) {
- kolvoOchkov1time1 += ball.ochki;
- strcpy(k1time1, ball.name);
- }
- else {
- kolvoOchkov2time1 += ball.ochki;
- strcpy(k2time1, ball.name);
- }
- else if (ball.time > 15 && ball.time <= 30)
- if (cravn == 0) {
- kolvoOchkov1time2 += ball.ochki;
- strcpy(k1time1, ball.name);
- }
- else {
- kolvoOchkov2time2 += ball.ochki;
- strcpy(k2time1, ball.name);
- }
- else
- if (cravn == 0)
- kolvoOchkov1dop += ball.ochki;
- else kolvoOchkov2dop += ball.ochki;
- } while (fread(&ball, sizeof(basket), 1, f));
- //printf("Отчет по таймам:\n");
- printf(" %-7s", k1time1);
- printf("%s\n", k2time1);
- printf("тайм1 %-7d", kolvoOchkov1time1);
- printf("%d\n", kolvoOchkov2time1);
- printf("тайм2 %-7d", kolvoOchkov1time2);
- printf("%d\n", kolvoOchkov2time2);
- if (kolvoOchkov1dop == 0 && kolvoOchkov2dop == 0) {
- kolvoOchkov1dop = '-';
- kolvoOchkov2dop = '-';
- printf("д.вр. %-7c", kolvoOchkov1dop);
- printf("%c\n", kolvoOchkov2dop);
- }
- else {
- printf("д.вр. %-7d", kolvoOchkov1dop);
- printf("%d\n", kolvoOchkov2dop);
- }
- }
- }
- void igroc()
- {
- f = fopen("basket.txt", "rb");
- if (!f) {
- printf("Файл не найден\n");
- }
- else {
- char best[20], komanda[12][20];
- int igr[12];
- memset(igr, 0, sizeof(igr));
- int cravn, i = 0;
- printf("Введите название команды, в которой вы хотите узнать лучшего игрока\n");
- scanf("%s", &best);
- while (fread(&ball, sizeof(basket), 1, f)) {
- cravn = strcmp(best, ball.name);
- if (cravn == 0) {
- int j = 0, k = 0;
- while (k < i) {
- cravn = strcmp(komanda[k], ball.fam);
- if (!(cravn == 0))
- j++;
- else igr[k] += ball.ochki;
- k++;
- }
- if (j == i) {
- strcpy(komanda[i], ball.fam);
- igr[i] += ball.ochki;
- i++;
- }
- }
- }
- int max = 0, a = 0;
- for (int poiskockov = 0; poiskockov < i; poiskockov++)
- if (igr[poiskockov] > max) {
- max = igr[poiskockov];
- a = poiskockov;
- }
- printf("Самый результативный игрок в команде %s - это %s (набрал(а) %d очков)\n", best, komanda[a], max);
- }
- }
- int kolvoStruct() {
- f = fopen("basket.txt", "rb");
- int kol;
- if (!f)
- printf("Файл не найден\n");
- else {
- kol = 0;
- while (fread(&ball, sizeof(basket), 1, f)) {
- kol++;
- }
- }
- fclose(f);
- return kol;
- }
- void sort() {
- int kolvoMas = kolvoStruct();
- basket *sortir1 = new basket[kolvoMas];
- basket buf;
- f = fopen("basket.txt", "rb");
- int kol;
- if (!f)
- printf("Файл не найден\n");
- else {
- fread(sortir1, sizeof(basket), kolvoMas, f);
- char nameBuf[20];
- char famBuf[20];
- int ochkiBuf;
- for (int i = 1; i < kolvoMas; i++) {
- buf = sortir1[i];
- strcpy(nameBuf, sortir1[i].name);
- strcpy(famBuf, sortir1[i].fam);
- int j = i - 1;
- while (j >= 0 && strcmp(sortir1[j].name, nameBuf) > 0) {
- sortir1[j + 1] = sortir1[j];
- j--;
- }
- while (j >= 0 && strcmp(sortir1[j].fam, famBuf) > 0 && strcmp(sortir1[j].name, nameBuf) == 0) {
- sortir1[j + 1] = sortir1[j];
- j--;
- }
- sortir1[j + 1] = buf;
- }
- printf("Выберите тип сортировки для вывода отчета по игре\n");
- printf("1- по двум ключам: по наименованию команды и по фамилиям в алфавитном порядке\n");
- printf("2- по убыванию количества заброшенных игроком мячей\n");
- int sum = 0;
- scanf("%d", &sum);
- int i;
- switch (sum) {
- case 1: {
- i = 0;
- printf("Время ");
- printf("Команда ");
- printf("Фамилия ");
- printf("Очки\n");
- do {
- printf("%-8d", sortir1[i].time);
- printf("%-10s", sortir1[i].name);
- printf("%-10s", sortir1[i].fam);
- printf("%d", sortir1[i].ochki);
- printf("\n");
- i++;
- } while (i < kolvoMas);
- }
- break;
- case 2: {
- i = 0;
- int *dop = new int[kolvoMas];
- for (; i < kolvoMas; i++)
- dop[i] = i;
- for (int k = 0; k < kolvoMas - 1; k++) {
- int min = k;
- for (int j = k + 1; j < kolvoMas; j++)
- if (sortir1[dop[j]].ochki > sortir1[dop[min]].ochki)
- min = j;
- if (min != k) {
- int p = dop[k];
- dop[k] = dop[min];
- dop[min] = p;
- }
- }
- printf("Время ");
- printf("Команда ");
- printf("Фамилия ");
- printf("Очки\n");
- i = 0;
- do {
- printf("%-8d", sortir1[dop[i]].time);
- printf("%-10s", sortir1[dop[i]].name);
- printf("%-10s", sortir1[dop[i]].fam);
- printf("%d", sortir1[dop[i]].ochki);
- printf("\n");
- i++;
- } while (i < kolvoMas);
- }
- break;
- }
- }
- }
- void Add_tree(Root **curr, basket ball) {
- if (!(*curr)) {
- *curr = new Root;
- (*curr)->left = NULL;
- (*curr)->right = NULL;
- strcpy((*curr)->ball.fam, ball.fam);
- if ((*curr)->ball.ochki < 0)
- (*curr)->ball.ochki = 0;
- (*curr)->ball.ochki += ball.ochki;
- strcpy((*curr)->ball.name, ball.name);
- }
- else if (strcmp(ball.fam, (*curr)->ball.fam) < 0)
- Add_tree(&(*curr)->left, ball);
- else if (strcmp(ball.fam, (*curr)->ball.fam) > 0)
- Add_tree(&(*curr)->right, ball);
- else
- if (strcmp(ball.name, (*curr)->ball.name) == 0)
- (*curr)->ball.ochki += ball.ochki;
- else Add_tree(&(*curr)->right, ball);
- }
- void derevo(Root **root) {
- //*root = NULL;
- if (root!=NULL)
- del_tree(root);
- f = fopen("basket.txt", "rb");
- if (!f) {
- printf("Файл не найден\n");
- }
- else {
- while (fread(&ball, sizeof(basket), 1, f)) {
- Add_tree(root, ball);
- }
- fclose(f);
- }
- }
- void komanda() {
- printf("Команда ");
- printf("Фамилия ");
- printf("Очки\n");
- }
- void View_tree(Root *root) {
- if (root) {
- View_tree(root->left);
- printf("%-10s", root->ball.name);
- printf("%-10s", root->ball.fam);
- printf(" %d\n",root->ball.ochki);
- View_tree(root->right);
- }
- }
- void View_tree_for_spisok(Root *root) {
- List *tek, *pred, *newel;
- if (root) {
- View_tree_for_spisok(root->left);
- kolsp++;
- newel = new List;
- strcpy(newel->ball.name, root->ball.name);
- strcpy(newel->ball.fam, root->ball.fam);
- newel->ball.ochki = root->ball.ochki;
- newel->next = NULL;
- tek = first;
- pred = NULL;
- while (tek && tek->ball.ochki > newel->ball.ochki) {
- pred = tek;
- tek = tek->next;
- }
- if (pred == NULL)
- first = newel;
- else
- pred->next = newel;
- newel->next = tek;
- if (kolsp > 10) {
- List *temp = first;
- for (int i = 0; i <= 8; i++) {
- temp = temp->next;
- if (i == 8) {
- delete((*temp).next);
- temp->next = NULL;
- }
- }
- }
- View_tree_for_spisok(root->right);
- }
- }
- void Display(List* Head) {
- printf("Команда ");
- printf("Фамилия ");
- printf("Очки\n");
- while (Head != NULL )
- {
- printf("%-10s", Head->ball.name);
- printf("%-10s", Head->ball.fam);
- printf(" %d\n", Head->ball.ochki);
- Head = Head->next;
- }
- }
- /*void Display(List* Head)
- {
- while (Head != NULL)
- {
- printf("%-10s", root->ball.name);
- printf("%-10s", root->ball.fam);
- printf(" %d\n", root->ball.ochki);
- Head = Head->next;
- }
- }*/
- /*void Drop(List* Item, List** head, List** tail, short& Koll)
- {
- if (*head == NULL)
- {
- Item->next = NULL;
- *head = Item;
- *tail = Item;
- return;
- }
- List *Old, *Temp;
- Temp = *head;
- Old = NULL;
- while (Temp != NULL)
- {
- if (Koll <= 10)
- {
- if (Item->ball.ochki <= Temp->ball.ochki)
- {
- Old = Temp;
- Temp = Temp->next;
- }
- else
- {
- if (Old != NULL)
- {
- Old->next = Item;
- Item->next = Temp;
- Koll++;
- return;
- }
- else
- {
- Item->next = Temp;
- *head = Item;
- Koll++;
- return;
- }
- }
- (*tail)->next = Item;
- Item->next = NULL;
- (*tail) = Item;
- Koll++;
- return;
- }
- }
- }
- void Tree_Run(Root* Roots, List** List_Head, List** List_Tail, short& count)
- {
- if (!Roots)
- {
- return;
- }
- else
- {
- Tree_Run(Roots->left, List_Head, List_Tail, count);
- List* TEMP = new List;
- TEMP->ball = Roots->ball;
- Drop(TEMP, List_Head, List_Tail, count);
- Tree_Run(Roots->right, List_Head, List_Tail, count);
- }
- }
- void Create_list(Root* Tree)
- {
- List* Head, *Tail;
- Head = NULL;
- Tail = NULL;
- short Count = 1;
- Tree_Run(Tree, &Head, &Tail, Count);
- printf("Команда ");
- printf("Фамилия ");
- printf("Очки\n");
- Display(Head);
- }*/
- /*void spisok(Root *root) {
- f = fopen("basket.txt", "rb");
- if (!f) {
- printf("Файл не найден\n");
- }
- else {
- //while (fread(&ball, sizeof(basket), 1, f)) {
- //Add_tree(root, ball);
- //}
- List *tek, *pred, *newel;
- for (int i=0;i<kolsp;i++)
- {
- newel = new List;
- View_tree_for_spisok(root);
- strcpy(newel->ball.name, ball.name);
- strcpy(newel->ball.fam, ball.fam);
- newel->ball.ochki = ball.ochki;
- newel->next = NULL;
- newel->ball.ochki = ball.ochki;
- tek = first;
- pred = NULL;
- //if (tek->ball.ochki < 0)
- //tek->ball.ochki = 0;
- while (tek && tek->ball.ochki < newel->ball.ochki) {
- pred = tek;
- tek = tek->next;
- }
- if (pred == NULL)
- first = newel;
- else pred->next = newel;
- newel->next = tek;
- }
- //tek = first;
- printf("Команда ");
- printf("Фамилия ");
- printf("Очки\n");
- while (tek) {
- printf("%-10s", tek->ball.name);
- printf("%-10s", tek->ball.fam);
- printf(" %d\n", tek->ball.ochki);
- tek = tek->next;
- }
- }
- fclose(f);
- }*/
- int main()
- {
- // получение информации о консольном окне
- HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
- HWND hcon = GetConsoleWindow();
- // программная установка консольного шрифта для отображения русского текста
- CONSOLE_FONT_INFO cfi;
- GetCurrentConsoleFont(hConsole, false, &cfi);
- COORD fs = GetConsoleFontSize(hConsole, cfi.nFont);
- PCONSOLE_FONT_INFOEX ccf = new CONSOLE_FONT_INFOEX;
- (*ccf).dwFontSize.X = 12;
- (*ccf).dwFontSize.Y = 20;
- (*ccf).nFont = 11;
- (*ccf).cbSize = sizeof(CONSOLE_FONT_INFOEX);
- ccf->FontWeight = 400;
- lstrcpyW((*ccf).FaceName, L"Lucida Console");
- (*ccf).FontFamily = FF_DONTCARE;
- bool b = SetCurrentConsoleFontEx(hConsole, false, ccf);
- fs = GetConsoleFontSize(hConsole, cfi.nFont);
- // установка кодировки 1251 для отображения русского текста
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- const int MAX = 8;
- int n = MAX; //кол-во пунктов меню
- COORD position[MAX];
- int punkt = 0;
- char names[MAX][48] = { "Ввод данных", "Отчет по игре", "Отчет по таймам", "Лучший игрок", "Отсортированный список игроков", "Дерево","Список","Выход" };
- do
- {
- int xmax, ymax;
- // получение параметров окна
- PCONSOLE_SCREEN_BUFFER_INFO pwi = new CONSOLE_SCREEN_BUFFER_INFO;
- PWINDOWINFO pgwi = new WINDOWINFO;
- GetConsoleScreenBufferInfo(hConsole, pwi);
- GetWindowInfo(hcon, pgwi);
- xmax = pwi->dwSize.X;
- ymax = pwi->dwSize.Y;
- int y0 = 8;
- for (int i = 0; i < n; i++)
- {
- position[i].X = (xmax - strlen(names[i])) / 2;
- position[i].Y = y0 + i;
- }
- SetConsoleTextAttribute(hConsole, BACKGROUND_GREEN); // цвет фона
- system("cls"); // очистка окна
- SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | BACKGROUND_GREEN); // цвет символов и цвет фона
- char title[] = "БАЗА ДАННЫХ";
- COORD pos;
- pos.X = (xmax - strlen(title)) / 2;
- pos.Y = 5;
- SetConsoleCursorPosition(hConsole, pos);
- puts(title);
- for (int i = 0; i < MAX; i++)
- {
- SetConsoleCursorPosition(hConsole, position[i]);
- puts(names[i]);
- }
- SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_INTENSITY | BACKGROUND_GREEN);
- SetConsoleCursorPosition(hConsole, position[punkt]); // выделение текущего пункта ярким цветом
- puts(names[punkt]);
- unsigned char ch;
- do
- {
- // обработка перемещения по меню клавишами со стрелками
- ch = getch();
- if (ch == 224)
- {
- ch = getch();
- switch (ch)
- {
- case 72:
- SetConsoleCursorPosition(hConsole, position[punkt]);
- SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | BACKGROUND_GREEN);
- puts(names[punkt]);
- punkt--;
- if (punkt < 0) punkt = 4;
- SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_INTENSITY | BACKGROUND_GREEN);
- SetConsoleCursorPosition(hConsole, position[punkt]);
- puts(names[punkt]); break;
- case 80:
- SetConsoleCursorPosition(hConsole, position[punkt]);
- SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | BACKGROUND_GREEN);
- puts(names[punkt]);
- punkt++;
- if (punkt > MAX - 1) punkt = 0;
- SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_INTENSITY | BACKGROUND_GREEN);
- SetConsoleCursorPosition(hConsole, position[punkt]);
- puts(names[punkt]); break;
- }
- }
- } while (ch != 13); // enter - выбор пункта меню
- switch (punkt)
- {
- case 0:
- SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | BACKGROUND_GREEN);
- system("cls");
- input();
- break;
- case 1:
- SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | BACKGROUND_GREEN);
- system("cls");
- view();
- system("pause");
- break;
- case 2:
- SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | BACKGROUND_GREEN);
- system("cls");
- taim();
- system("pause");
- break;
- case 3:
- SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | BACKGROUND_GREEN);
- system("cls");
- igroc();
- system("pause");
- break;
- case 4:
- SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | BACKGROUND_GREEN);
- system("cls");
- sort();
- system("pause");
- break;
- case 5:
- SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | BACKGROUND_GREEN);
- system("cls");
- derevo(&root);
- komanda();
- View_tree(root);
- system("pause");
- break;
- case 6:
- SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | BACKGROUND_GREEN);
- system("cls");
- derevo(&root);
- if(first==NULL)View_tree_for_spisok(root);
- Display(first);
- //Create_list(root);
- system("pause");
- kolsp = 0;
- break;
- }
- } while (punkt != MAX - 1);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement