Большая Тёрка / Мысли / Личная лента Mixnsk /
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <time.h>
#define N 20
//---Структура для хранения дат
struct date {
int dd,mm,yy;
int np;
};
date *V;
date *V1;
//---Очередная структура, необходима для сортировки
//---Главная структура для хранения данных
struct stud{
char name[10];
int id;
int np;
date back;
char book_name[10];
date P[N];
};
stud *D; // Указатель на ДМ строк таблицы
stud *C; //структура для поиска(дополнительная)
int n=0,sz=10; // кол-во строк и размерность ДМ (глобальные)
//---проверка на переполнение ДМ и расширение
void extend(){
if (n!=sz) return;
sz=sz*2;
stud *q=new stud[sz];
for (int i=0;i<sz/2;i++) q[i]=D[i];
delete D;
D=q;
}
//---Преобразование ТД char->int
int StringToInt(char c[]){
int a,i;
for (i=0; !(c[i]>='0' && c[i]<='9'); i++)
if (c[i]=='\0') return 0; // Поиск первой цифры
for (a=0; c[i]>='0' && c[i]<='9'; i++) // Накопление целого
a = a * 10 + c[i] - '0'; // «цифра за цифрой»
return a;
}
//---Функция для обработки даты при вводе с клавиатуры
void get_date(date &V){
scanf("%d%d%d",&V.dd,&V.mm,&V.yy);
}
void put_date(date &V){
printf("%d.%d.%d\t",V.dd,V.mm,V.yy);
}
//---Функция для записи даты в файл
void get_fdate(FILE *fd, date &V){
fscanf(fd,"%d%d%d",&V.dd,&V.mm,&V.yy);
}
void put_fdate(FILE *fd, date &V){
fprintf(fd,"%d %d %d\n",V.dd,V.mm,V.yy);
}
//---сравнение дат <0 ==0 >0
int cmp_date(date &V, date &V1){
if (V.yy!=V1.yy) return V.yy-V1.yy;
if (V.mm!=V1.mm) return V.mm-V1.mm;
return V.dd-V1.dd;
}
//---Функция для добавление данных в структуру
void add(){
extend(); // не переполнен ли ДМ
char c[80];
printf("\nname:"); scanf("%s",D[n].name);
gets(c);
printf("\nbook_name:"); scanf("%s",D[n].book_name);
gets(c);
printf("\nback_date:"); get_date(D[n].back);
n++;
}
//---Вспомогательная функция для удаления данных(получение id строки)
int get_num(){
int m;
do {
printf("\nEnter id="); scanf("%d",&m);
} while (m<1 || m>n);
return m-1;
}
//---Функция для отображения данных которые содержит структура
void show(){
printf("\nId |\tName|\t\tBack date|\tBook name|\n");
printf("---------------------------------------------------\n");
for (int i=0;i<n;i++){
printf("%-3d %-20s",i+1,D[i].name);
put_date(D[i].back);
printf("%s\n",D[i].book_name);
if((i+1)%20==0) getch();
}
printf("---------------------------------------------------\n");
}
//---Функция для записи данных в файл(почти работает)
void save(char f[]){
FILE *fd=fopen(f,"w");//Открываем файл для записи
fprintf(fd,"%d\n",n);//Колличество строк для чтения
for (int i=0;i<n;i++){
fprintf(fd,"%s\n",D[i].name);
put_fdate(fd,D[i].back);
fprintf(fd,"%s\n",D[i].book_name);
for (int j=0;j<D[i].np;j++)
put_fdate(fd,D[i].P[j]);
}
fclose(fd);//закрываем файл
}
//---Функция для загрузки данных из файла для последущей работы с ними.
void load(char f[]){
FILE *fd=fopen(f,"r");
if (fd==NULL) return;
int m;
fscanf(fd,"%d",&m);
for (;m!=0;m--,n++){
extend();
fscanf(fd,"%s",D[n].name);
get_fdate(fd,D[n].back);
fscanf(fd,"%s",D[n].book_name);}
fclose(fd);
}
//---Функция для редактирования структуры
void edit(){
int i=0;
printf("\nEnter id:");
scanf("%d",&i);
printf("\nname: %s:\n",D[i-1].name);
scanf("%s",D[i-1].name);
printf("\nBook_name:");
printf("%s:\n",D[i-1].book_name);
scanf("%s",D[i-1].book_name);
printf("\nback_date:\n");
put_date(D[i-1].back);
get_date(D[i-1].back);
}
//---Функция для полной очистики структуры
void clear(){
int i;
for(i=n;i>0;i--)
{
D[i-1]=D[i];
n--;
}
}
// Функция используется для реобразования даты к формату time_t , чтобы потом можно было легко сравнивать даты
//Дату нужно вводить в формате дд мм гггг !!! Сортировка по датам работает с датами до 19.01.2038 !!!!!
time_t set_time(stud a) //п
{
struct tm t;
t.tm_year = a.back.yy - 1900;
t.tm_mon = a.back.mm;
t.tm_mday = a.back.dd;
t.tm_hour = 0;
t.tm_min = 0;
t.tm_sec = 0;
t.tm_isdst = 0;
time_t aaa= mktime(&t);
return mktime(&t);
}
//---Попытка создать сортировку(Пока неудачная попытка И вообще незнаю когданить она сделаецо или нет)
void sort(){
int i=0,j;
C = new stud[sz];
V1 = new date[sz]; // ты жжошь, массивы создал, к кто их будет инициализировать? =)
C = D;
stud tmp; // используем при сортировке
printf("\nEnter order (1-name, 2-book_name, 3-date): ");
switch(getch()){
case '1':
//Как бы сортируем по именам. Предполагаем, что чем меньше код начального символа имени, тем оно выше по списку
// т.е. А = 65, В = 66, Z = 90, потом идут несколько спец символов [,], ' ... а далее маленькие буквы
//по хорошему нужно проверку на пробелы, спец. символы, ДАТУ (можно же задать что попало =)) ) и т.д. Но это надо делать на этапе ввода информации =)
//делаем сортировку и результат в массиве С
for(i=0; i<n; i++)
{
for(j=i+1;j<n;j++)
{
if(strcmp(C[i].name, C[j].name)>0)
{
tmp = C[i];
C[i]=C[j];
C[j]= tmp;
}
}
}
D = C; //переписываем результат сортировки в основной массив
//я вообще не врубаюсь, нафига ты сделал отдельный массив для сортировки, ну да ладно =)
break;
case '2': //делаем финт ушами и тупо переписываем все, что было ранее, меняя name на book_name =))
stud tmp;
for(i=0; i<n; i++)
{
for(j=i+1;j<n;j++)
{
if(strcmp(C[i].book_name, C[j].book_name)>0)
{
tmp = C[i];
C[i]=C[j];
C[j]= tmp;
}
}
}
D = C;
break;
case '3' :
/* Все бы конечно здорово, но юзаешь ты не V и V1, а D.back.mm и т.д.
следовательно нужно писать либо функцию работы с V и V1 либо их не юзать
for (i=0; i < n-1; i++){
if (V[i].dd > V[i+1].dd){
V1[i] = V[i];
V[i] = V[i+1];
V[i+1] = V1[i];
}}
*/
struct tm v1, v; //две структурки для работы с датой-временем
time_t t1, t;
double dt;
for(i=0; i<n; i++)
{
for(j=i+1;j<n;j++)
{
dt = difftime(set_time(C[i]),set_time(C[j])); //разница дат в сек.
if(dt > 0) //меняем. сортируем от более ранней к более поздней
{
tmp = C[i];
C[i]=C[j];
C[j]= tmp;
}
}
}
D = C;
break;
}}
void search(){
int i;
printf("\nEnter type of search (1-name, 2-book_name, 3-back_date): ");
switch(getch()){
case '1':
char name[10];
printf("\nEnter name: ");
scanf("%s", &name);
for(i=0; i<n; i++){
if(!strcmp(D[i].name,name)){ //Если находит такую строку
printf("\nId |\tName|\t\tBack date|\tBook name|\n");
printf("---------------------------------------------------\n");
printf("%-3d %-20s",i+1,D[i].name);
put_date(D[i].back);
printf("%s\t", D[i].book_name);
printf("\n---------------------------------------------------\n");
break;
}
}
break;
case '2':
printf("\nEnter book_name: ");
scanf("%s", &name);
for(i=0; i<n; i++){
if(!strcmp(D[i].book_name,name)){ //Если находит такую строку
printf("\nId |\tName|\t\tBack date|\tBook name|\n");
printf("---------------------------------------------------\n");
printf("%-3d %-20s",i+1,D[i].name);
put_date(D[i].back);
printf("%s\t", D[i].book_name);
printf("\n---------------------------------------------------\n");
break;
}
}
break;
case '3':
printf("\nEnter date: ");
scanf("%d", &V[1].dd);
for(i=0; i<n; i++){
if(V[i].dd == V[1].dd){ //Если находит такую строку
printf("\nId |\tName|\t\tBack date|\tBook name|\n");
printf("---------------------------------------------------\n");
printf("%-3d %-20s",i+1,D[i].name);
put_date(D[i].back);
printf("%s\t", D[i].book_name);
printf("\n---------------------------------------------------\n");
break;
}}break;
}}
//---Отображение меню, подсказок, вызовы функций
void main(){
int k,i;
D = new stud[sz];
//---Бесконечный цикл для отображения и работы с меню
while(1){
printf("1 - add\n2 - show\n3 - edit\n4 - save\n5 - load\n6 - delete\n7 - delete all\n8 - search\n9 - sort\nBrain, chto mu budem delat?:\n");
switch(getch()){
//"Горячие" клавиши
case '1': add(); break;
case '2': show(); break;
case '3': edit(); break;
//Работа с файлами
case '4': save("a.txt"); break;
case '5': load("a.txt"); break;
//Функция для удаления данных из структуры
case '6': if (n==0) break;
k=get_num();
for (i=k;i<n-1;i++) D[i]=D[i+1];
n--; break;
case '7': clear(); break;
case '8': search(); break;
case '9': sort();break;
//Если энтер то вывести меню сново
case 27: return;
}}
}