// Rpectik 2.cpp : main project file.
#include "stdio.h"
#include "locale"
#include "windows.h"
#include "conio.h"
#include "string.h"
#define kol 20 //Обьявляем размер переменных типа char grname , prname,naz,os
//Структура содержащая характеристики компьютера.
struct xar
{
char grname[kol],prname[kol];//grname-тип видио карты ,prname-тип процессора.
int ram,hd,graf,pr;//ram-обьем оперативной памяти,hd-обьем винчестера,graf-обьем видио памяти,pr-частота процессора.
};
//Сткуктура содержащая основные параметры.
struct comp
{
xar xr;
char os[kol],naz[kol];//os-Тип операционной системы; naz - Название компьютера.
int chena;//chena-цена .
};
//Функция ввода одной переменной типа структура.
comp *vvod(comp *mas,int i)
{
char str[kol];
if(mas)
mas=(comp*)realloc(mas,i*sizeof(comp)+sizeof(comp));
else
mas=(comp*)calloc(1,sizeof(comp));
fflush(stdin);
printf("Название компьютера - ");
gets(mas[i].naz);
printf("Тип операционной системы - ");
gets(mas[i].os);
printf("Цена - ");
gets(str);
if(strlen(str)!=0) mas[i].chena=atoi(str); else mas[i].chena=-1;
printf("Тип видиокарты - ");
gets(mas[i].xr.grname);
printf("обьем видио памяти - ");
gets(str);
if(strlen(str)!=0) mas[i].xr.graf=atoi(str); else mas[i].xr.graf=-1;
printf("Тип процессора - ");
gets(mas[i].xr.prname);
printf("Частота процессора - ");
gets(str);
if(strlen(str)!=0) mas[i].xr.pr=atoi(str); else mas[i].xr.pr=-1;
printf("Обьем оперативной памяти - ");
gets(str);
if(strlen(str)!=0) mas[i].xr.ram=atoi(str); else mas[i].xr.ram=-1;
printf("Обьем винчестера - ");
gets(str);
if(strlen(str)!=0) mas[i].xr.hd=atoi(str); else mas[i].xr.hd=-1;
system("cls");
return mas;
}
void struct_swap(comp *e1, comp *e2)//Функция для замены структурных меременных местами.
{
comp tmp; //Обьявляем структурную переменную типа comp.
tmp=*e1;
*e1=*e2;
*e2 =tmp;
}
void sortby_cost(comp *mas, int size)//Сортировка структурных переменных по характеристике -стоимость.
{
int i, j;
for(i=0; i < size; i++) // i - номер прохода
for(j = size-1; j > i; j--) // внутренний цикл прохода
if (mas[j-1].chena > mas[j].chena)
struct_swap(mas+j,mas+j-1);//Вызываем функцию замены структурных переменных местами
}
void sortby_hd(comp *mas, int size)//Сортировка структурных переменных по характеристике -обьем винчестера.
{
int i, j;
for(i=0; i < size; i++) // i - номер прохода.
for(j = size-1; j > i; j--) // внутренний цикл прохода.
if (mas[j-1].xr.hd > mas[j].xr.hd)
struct_swap(mas+j,mas+j-1);//Вызываем функцию замены структурных переменных местами.
}
void sortby_pr(comp *mas, int size)//Сортировка структурных переменных по характеристике -частота процессора.
{
int i, j;
for(i=0; i < size; i++) // i - номер прохода.
for(j = size-1; j > i; j--) // внутренний цикл прохода.
if (mas[j-1].xr.pr > mas[j].xr.pr)
struct_swap(mas+j,mas+j-1);//Вызываем функцию замены структурных переменных местами.
}
void sortby_graf(comp *mas, int size)//Сортировка структурных переменных по характеристике -обьем видео памяти.
{
int i, j;
for(i=0; i < size; i++) // i - номер прохода.
for(j = size-1; j > i; j--) // внутренний цикл прохода.
if (mas[j-1].xr.graf > mas[j].xr.graf)
struct_swap(mas+j,mas+j-1);//Вызываем функцию замены структурных переменных местами.
}
//Функция вывода одной структурной записи
void vivod(comp *mas,int i)
{
printf("\nНазвание компьютера - %s\n",mas[i].naz);
printf("Тип операционной системы - %s\n",mas[i].os);
printf("Цена - %d\n",mas[i].chena);
printf("Тип видиокарты - %s\n",mas[i].xr.grname);
printf("обьем видио памяти - %d\n",mas[i].xr.graf);
printf("Тип процессора - %s\n",mas[i].xr.prname);
printf("Частота процессора - %d\n",mas[i].xr.pr);
printf("Обьем оперативной памяти - %d\n",mas[i].xr.ram);
printf("Обьем винчестера - %d Gb\n",mas[i].xr.hd);
}
//Функция поиска
void poisk(comp *mas,int n)
{
comp *mask=NULL;
int i,c=0;
printf("Введите параметры поиска. Enter для пропуска. \n");
mask=vvod(mask,0);
system("cls");
puts("Поиск...\n");
for(i=0;i<n;i++)
{
if(strlen(mask->naz)>0) if(strcmp(mask->naz,mas[i].naz)!=0) continue;
if(strlen(mask->os)>0) if(strcmp(mask->os,mas[i].os)!=0) continue;
if(mask->chena>=0) if(mask->chena!=mas[i].chena) continue;
if(strlen(mask->xr.grname)>0) if(strcmp(mask->xr.grname,mas[i].xr.grname)!=0) continue;
if(mask->xr.graf>=0) if (mask->xr.graf!=mas[i].xr.graf) continue;
if(strlen(mask->xr.prname)>0) if(strcmp(mask->xr.prname,mas[i].xr.prname)!=0) continue;
if(mask->xr.pr>=0) if(mask->xr.pr!=mas[i].xr.pr) continue;
if(mask->xr.ram>=0) if(mask->xr.ram!=mas[i].xr.ram) continue;
if(mask->xr.hd>=0) if(mask->xr.hd!=mas[i].xr.hd) continue;
/////
vivod(mas,i);
c++;
}
printf("\nПоиск завершен. Всего подходящих результатов: %d\n",c);
free(mask);
}
comp* mydel(comp *mas,int count, int i)
{
for(int c=i-1;c<count-1;mas[c]=mas[c++ +1]);//Сдвигаем массив структурных переменных с определоной переменной тем самым удаляем её
return (comp*)realloc(mas,(count-1)*(sizeof(comp)));//Уменьшаем размер выделеной памяти на 1
}
void edit(comp *mas,int index)
{
index--;
puts("Нажмите пробел для пропуска элемента , либо любую клавишу для изменения:");
fflush(stdin);
puts("Цена");
if(getch()!=32) {printf("Значение: ");scanf("%d",&(mas+index)->chena);fflush(stdin);}
puts("ОС");
if(getch()!=32) {printf("Значение: ");scanf("%s",&(mas+index)->os);fflush(stdin);}
puts("Видеокарта");
if(getch()!=32) {printf("Значение: ");scanf("%s",&(mas+index)->xr.grname);fflush(stdin);}
puts("Обьем памяти видеокарты");
if(getch()!=32) {printf("Значение: ");scanf("%d",&(mas+index)->xr.graf);fflush(stdin);}
puts("Процессор");
if(getch()!=32) {printf("Значение: ");scanf("%s",&(mas+index)->xr.prname);fflush(stdin);}
puts("Частота процессора");
if(getch()!=32) {printf("Значение: ");scanf("%d",&(mas+index)->xr.pr);fflush(stdin);}
puts("Обьем оперативной памяти");
if(getch()!=32) {printf("Значение: ");scanf("%d",&(mas+index)->xr.ram);fflush(stdin);}
puts("Обьем винчестера");
if(getch()!=32) {printf("Значение: ");scanf("%d",&(mas+index)->xr.hd);fflush(stdin);}
}
void main()
{
int i,k=0,n=0, tmp;//Обьявляем переменные
comp *mas=NULL;
setlocale(LC_ALL,"rus");//Подключаем русский язык
while(1)
{
printf("Какую операцию вы хотите выполнить: \n1 - записать информацию нажмите \n2 - для просмотра информации\n3 - поиск \n4 - удаление\n5 - редактирование\n6 - сортировка данных\n0 - выйти\n");
switch(getch())
{
case '1':{system("cls"); n++; mas=vvod(mas,n-1); break;}
case '2':{system("cls"); for(i=0;i<n;i++) vivod(mas,i); break;}
case '3':{system("cls"); poisk(mas,n); break;}
case '4':{system("cls"); printf("Введите номер записи для удаления (всего записей %d):",n); scanf("%d",&tmp);fflush(stdin);system("cls");mas=mydel(mas,n--,tmp); break;}
case '5':{system("cls"); printf("Введите номер записи для редактирования: ");scanf("%d",&tmp);fflush(stdin);edit(mas,tmp);break;}
case '6':{system("cls");
printf("\n1 - Сортировка по цене \n2 - Сортировка по обьему винчестера \n3 - Сортировка по частоте процессора\n4 - Сортировка по обьему памяти видео карты\n0 - выйти\n");
switch(getch())
{
case '1':{system("cls"); sortby_cost(mas,n) ; break;}
case '2':{system("cls"); sortby_hd(mas,n) ; break;}
case '3':{system("cls"); sortby_pr(mas,n) ; break;}
case '4':{system("cls"); sortby_graf(mas,n) ; break;}
case '0': return; //Выходим из программы.
default: {system("cls"); printf("Выбран ошибочный режим, повторите \n");}
}
break;//Выходим из под меню.
}
case '0': return; //Выходим из программы.
default: {system("cls"); printf("Выбран ошибочный режим, повторите \n");}
}
}
}