Обсуждают в коллекции

Фильм «Фонтан» 81


Сейчас обсуждают

Друзья

Его(1) Общие(0) Хотят дружить(2)


  • alkin

  • error-help

  • mrTeo

  • login

  • login

  • login

На странице: 24 48 96

Большая Тёрка / Мысли /

Личная лента

фото

Mixnsk

Портрет жителя

Mixnsk подружился с alkin

#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;

}}

}