1

Тема: Розробити програму яку забезпечує опрацювання структур даних

Розробити програму яку забезпечує опрацювання структур даних.
Забезпечити виконання таких операцій:
• додавання нового елементу;
• пошук елементу за значенням полів;
• послідовний перегляд елементів;
• модифікація значень полів елемену;
• видалення елементу;
• сортування за значеннями полів.
Структура:    Книга (назва, автор, видавництво, рік, кількість сторінок).
ось що поки вийшло

#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<fcntl.h>
#include <stdlib.h>
#define maxCountOfRecord 20
typedef struct library{
    char surname[10];
    char title[15];
    char publish[15];
    int  pnum;
    int year;
}lb;
int main(void) {
    int count;
    int i = 0;
    int flag = 1;
    while(flag){
        lb lib[maxCountOfRecord];
        info(2);
        count = rDB(&lib);
        lib[count].pnum=0;
        lb selected[maxCountOfRecord];
        int mod = getch()-48;
        switch(mod){
        case 1:
            display(&lib, count, 1);
            break;
        case 2:
            count = search(massage1(), &lib, &selected, count);
            display(&selected, count, 1);
            break;
        case 3:
            newRecord();
            break;
        case 9: system("@cls||clear"); break;
        case 0: flag = 0; break;
        }
    }
}
void display(lb lib[], int count, int mod){
    info(1);
    int i = 0;
    int flag= 1;
    while(flag){
        printf("\n   %s %s %s %d %d", lib[i].surname, lib[i].title, lib[i].publish, lib[i].pnum, lib[i].year);
        int next;
        switch(mod){
            case 1:{
                next = getch()-48;
                switch(next){
                    case 0: flag = 0;break;
                    case 1: if (i>0)i--;
                            else error(1);
                            break;
                            case 2: if((i+1)<count)
                                i++;
                            else
                                error(2);
                            break;
                    case 3: system("@cls||clear");
                        display(lib, count, 0);
                        flag = 0;break;
                    case 4: flag = 0;
                        changeRecord(&lib[i], lib);
                        break;
                    case 5: flag = 0;
                        deleteRecord(lib,i);
                        break;
                    case 9: info(1); i = 0; break;
                    default:error(0);break;
                }
                break;}
            default:    if((i+1)<count)i++;
                        else flag = 0;
                        break;
        }
    }
    printf("\n");
}
int rDB(lb **p){
    lb l[maxCountOfRecord];
    int i = 0;
    FILE *f2 = fopen("d1.txt","rb");
    long count= filelength(fileno(f2));
    count /=sizeof(lb);
    while(i<count){
        lb fp1;
        fread(&*(p+8*i), sizeof(lb), 1, f2);
        i++;
    }
    fclose(f2);
    return count;
}
int search(int mod, lb lib[], lb result[],int size){
    int count = 0;
    int i =0;
    char l[15] = "";
    char *key= &l;
    massage2(key);
    switch(mod){
        case 1:
            while (i<size){
                if (!strcmp(lib[i].surname, key)){
                    result[count] = lib[i];
                    count++;
                }
                i++;
            }
            break;
        case 2:
            while (i<size){
                if (!strcmp(lib[i].title, key)){
                    result[count] = lib[i];
                    count++;
                }
                i++;
            }
            break;
        case 3:
            while (i<size){
                char j[15];
                char *pnum = &j;
                itoa(lib[i].pnum, pnum, 10);
                if (!strcmp(pnum, key)){
                    result[count] = lib[i];
                    count++;
                }
                i++;
            }
            break;
        default: error(0); break;
    }
    return count;
}
void inputRecord(lb *library){
    printf("\nEnter surname\n");
    scanf("%s", &library->surname);
    printf("Enter title\n");
    scanf("%s", &library->title);
    printf("Enter publish\n");
    scanf("%d", &library->publish);
    printf("Enter pnum\n");
    scanf("%d", &library->pnum);
    printf("Enter year\n");
    scanf("%d", &library->year);
}
void newRecord(){
    lb library;
    inputRecord(&library);
    writeRecord(&library,1);
}
void writeRecord(lb *library, int mod){
    FILE *f2;
    if(mod==0)f2 = fopen("d1.txt","wb");
    else{
    f2 = fopen("d1.txt","ab");
    fwrite(library, sizeof(lb),1, f2);}
    fflush(f2);
    fclose(f2);
}
void changeRecord(lb *library, lb lib[]){
    modify(library, lib, -1);
}
void deleteRecord(lb lib[], int deleted){
    lb library;
    modify(&library, lib, deleted);
}
void modify(lb *library, lb lib[], int deleted){
    if(!(deleted+1))
    inputRecord(library);
    int size=0;
    while(lib[size].pnum>0){
        size++;
    }
    int i=0;
    writeRecord(&lib[0],0);
    while(i<size){
        if(!(i==deleted))
        writeRecord(&lib[i],1);
        i++;
    }
}
void error(int mod){
    switch(mod){
    case 0:printf("Input correct data\n");break;
    case 1:printf("It's a first record\n"); break;
    case 2:printf("It's a last record\n"); break;
    }
}
int massage1(){
    puts("\nChoose search mode");
    int mod = getch()-48;
    return mod;
}
void massage2(char *key){
    puts("Input key");
    char line;
    scanf("%s", &line);
    strcpy(key, &line);
}
void info(int mod){
    switch(mod){
    case 1: printf("\nPress 1 to previous record, 2 - next, 3 - get all, 0 - exit, 9 - info\n   4 - to modify, 5 - to delete\n"); break;
    case 2: printf("Press 1 to get records, 2 to search, 3 - new record, 9 - clean, 0 - exit\n"); break;
    }
}

проблема в тому, шо не можу толком зробити сортування і до того ж програма може видавати якісь неточності або помилки вже під час її запуску, тобто вже під час пошуку елементу чи його модифікації

2

Re: Розробити програму яку забезпечує опрацювання структур даних

0. Дякую за добре сформульоване питання. Хоча було б краще, якби ви навели приклади цих "якихось неточностей або помилок". Ну і мову ви не сказали - ніби ясно, що це C, але люди іноді плутають.
1. Назва змінної flag неінформативна. Зрозуміло, що це прапорець, але що він означає? do_exit чи should_exit було б краще. Ну, чи stay_in_loop, якщо хочеться зберегти умову без заперечень.
2. Ви проголошуєте масив lb в кожній ітерації циклу в main. Вам же ніби лише один масив потрібен?
3. Що відбувається в rDB? Змінна l не використовується; куди ви читаєте з файлу - взагалі не зрозуміло. fread може читати одразу кілька записів (третій параметр), тобто

int rDB(lb library[]){
    FILE *f2 = fopen("d1.txt","rb");
    long count= filelength(fileno(f2)) / sizeof(lb);
    fread(library, sizeof(lb), count, f2);
    fclose(f2);
    return count;
}

зробить те, що вам треба.
Взагалі запам'ятайте, що ідентифікатор масиву (майже) ідентичний вказівнику на нульовий елемент масиву: array == &array[0]. Тобто передаєте в функцію масив - передаєте вказівник на його початок.
4. Не зрозумів логіку changeRecord/deleteRecord/modify, але ви на них не скаржилися.
5. Англійською слово повідомлення буде message, а масаж - massage. Не плутайте :)
6. Сортування не працює, бо його немає. Реалізовуйте найпростіше - бульбашку чи вибір. Просто пам'ятайте, що вам треба рухати цілі структури, а не лише вказівники.

Подякували: olena23551

3 Востаннє редагувалося olena2355 (25.11.2018 17:57:51)

Re: Розробити програму яку забезпечує опрацювання структур даних

koala написав:

0. Дякую за добре сформульоване питання. Хоча було б краще, якби ви навели приклади цих "якихось неточностей або помилок". Ну і мову ви не сказали - ніби ясно, що це C, але люди іноді плутають.
1. Назва змінної flag неінформативна. Зрозуміло, що це прапорець, але що він означає? do_exit чи should_exit було б краще. Ну, чи stay_in_loop, якщо хочеться зберегти умову без заперечень.
2. Ви проголошуєте масив lb в кожній ітерації циклу в main. Вам же ніби лише один масив потрібен?
3. Що відбувається в rDB? Змінна l не використовується; куди ви читаєте з файлу - взагалі не зрозуміло. fread може читати одразу кілька записів (третій параметр), тобто

int rDB(lb library[]){
    FILE *f2 = fopen("d1.txt","rb");
    long count= filelength(fileno(f2)) / sizeof(lb);
    fread(library, sizeof(lb), count, f2);
    fclose(f2);
    return count;
}

зробить те, що вам треба.
Взагалі запам'ятайте, що ідентифікатор масиву (майже) ідентичний вказівнику на нульовий елемент масиву: array == &array[0]. Тобто передаєте в функцію масив - передаєте вказівник на його початок.
4. Не зрозумів логіку changeRecord/deleteRecord/modify, але ви на них не скаржилися.
5. Англійською слово повідомлення буде message, а масаж - massage. Не плутайте :)
6. Сортування не працює, бо його немає. Реалізовуйте найпростіше - бульбашку чи вибір. Просто пам'ятайте, що вам треба рухати цілі структури, а не лише вказівники.

ой, з message справді дуже протупила)
сортування ще тут не робила, хоітла запитатись, можливо, хтось знає як реалізувати його з цими даними не дуже об'ємним способом)
а щодо неточностей чи помилок, то ось одна з них:
вводжу дані, щоб сворити новий запис, а воно банально не зчитує ні рік, ні кількість сторінок, а в кінцевому результуті ще й кидає всяке з буферу, тобто ось
http://replace.org.ua/misc.php?action=pun_attachment&amp;item=1956&amp;download=0

Post's attachments

rozraha.png 11.73 kb, 66 downloads since 2018-11-25 

4

Re: Розробити програму яку забезпечує опрацювання структур даних

olena2355 написав:
koala написав:

0. Дякую за добре сформульоване питання. Хоча було б краще, якби ви навели приклади цих "якихось неточностей або помилок". Ну і мову ви не сказали - ніби ясно, що це C, але люди іноді плутають.
1. Назва змінної flag неінформативна. Зрозуміло, що це прапорець, але що він означає? do_exit чи should_exit було б краще. Ну, чи stay_in_loop, якщо хочеться зберегти умову без заперечень.
2. Ви проголошуєте масив lb в кожній ітерації циклу в main. Вам же ніби лише один масив потрібен?
3. Що відбувається в rDB? Змінна l не використовується; куди ви читаєте з файлу - взагалі не зрозуміло. fread може читати одразу кілька записів (третій параметр), тобто

int rDB(lb library[]){
    FILE *f2 = fopen("d1.txt","rb");
    long count= filelength(fileno(f2)) / sizeof(lb);
    fread(library, sizeof(lb), count, f2);
    fclose(f2);
    return count;
}

зробить те, що вам треба.
Взагалі запам'ятайте, що ідентифікатор масиву (майже) ідентичний вказівнику на нульовий елемент масиву: array == &array[0]. Тобто передаєте в функцію масив - передаєте вказівник на його початок.
4. Не зрозумів логіку changeRecord/deleteRecord/modify, але ви на них не скаржилися.
5. Англійською слово повідомлення буде message, а масаж - massage. Не плутайте :)
6. Сортування не працює, бо його немає. Реалізовуйте найпростіше - бульбашку чи вибір. Просто пам'ятайте, що вам треба рухати цілі структури, а не лише вказівники.

ой, з message справді дуже протупила)
сортування ще тут не робила, хоітла запитатись, можливо, хтось знає як реалізувати його з цими даними не дуже об'ємним способом)
а щодо неточностей чи помилок, то ось одна з них:
вводжу дані, щоб сворити новий запис, а воно банально не зчитує ні рік, ні кількість сторінок, а в кінцевому результуті ще й кидає всяке з буферу, тобто ось

або ось таку помилку видає, не зчитуючи прізвище чи назву
http://replace.org.ua/misc.php?action=pun_attachment&amp;item=1957&amp;download=0

Post's attachments

rozraha.png 17.12 kb, 57 downloads since 2018-11-25 

5

Re: Розробити програму яку забезпечує опрацювання структур даних

Рядок 10:

char publish[15];

Рядок 142:

scanf("%d", &library->publish);

Так у вас навряд чи вийде прочитати масив символів.

6

Re: Розробити програму яку забезпечує опрацювання структур даних

koala написав:

Рядок 10:

char publish[15];

Рядок 142:

scanf("%d", &library->publish);

Так у вас навряд чи вийде прочитати масив символів.

ой, тут справді щось не догледіла
в мене тепер нова проблема)
вводжу дані, потім натискаю "press 1 to get records" і ось що видає
http://replace.org.ua/misc.php?action=pun_attachment&amp;item=1959&amp;download=0

Post's attachments

rozraha.png 15.28 kb, 60 downloads since 2018-11-25 

7

Re: Розробити програму яку забезпечує опрацювання структур даних

#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<fcntl.h>
#include <stdlib.h>
#define maxCountOfRecord 20
typedef struct library{
    char surname[10];
    char title[15];
    char publish[15];
    int  pnum;
    int year;
}lb;
int main(void) {
    int count;
    int cntr=0;
    int i = 0, j=0;
    int res;
    int flag = 1;
    while(flag){
        lb lib[maxCountOfRecord];
        info(2);
        count = rDB(&lib);
        lib[count].year=0;
        lb selected[maxCountOfRecord];
        int mod = getch()-48;
        switch(mod){
        case 1:
            display(&lib, count, 1);
            break;
        case 2:
            count = search(message1(), &lib, &selected, count);
            display(&selected, count, 1);
            break;
        case 3:
            newRecord();
            break;
        case 9: system("@cls||clear"); break;
        case 0: flag = 0; break;
        }
    }
}
void display(lb lib[], int count, int mod){
    info(1);
    int i = 0;
    int flag= 1;
    while(flag){
        printf("\n   %s %s %s %d %d", lib[i].surname, lib[i].title, lib[i].publish, lib[i].pnum, lib[i].year);
        int next;
        switch(mod){
            case 1:{
                next = getch()-48;
                switch(next){
                    case 0: flag = 0;break;
                    case 1: if (i>0)i--;
                            else error(1);
                            break;
                            case 2: if((i+1)<count)
                                i++;
                            else
                                error(2);
                            break;
                    case 3: system("@cls||clear");
                        display(lib, count, 0);
                        flag = 0;break;
                    case 4: flag = 0;
                        changeRecord(&lib[i], lib);
                        break;
                    case 5: flag = 0;
                        deleteRecord(lib,i);
                        break;
                        case 6: flag=0;
                        res=strcmp(lib[i].surname, lib[j].surname);
                          if(res>0)
                hold = lib[i];
                lib[i] = lib[j];
                lib[j] = hold;

                        break;
                    case 9: info(1); i = 0; break;
                    default:error(0);break;
                }
                break;}
            default:    if((i+1)<count)i++;
                        else flag = 0;
                        break;
        }
    }
    printf("\n");
}
int rDB(lb library[]){
    FILE *f2 = fopen("d1.txt","rb");
    long count= filelength(fileno(f2)) / sizeof(lb);
    fread(library, sizeof(lb), count, f2);
    fclose(f2);
    return count;
}

int search(int mod, lb lib[], lb result[],int size){
    int count = 0;
    int i =0;
    char l[15] = "";
    char *key= &l;
    message2(key);
    switch(mod){
        case 1:
            while (i<size){
                if (!strcmp(lib[i].surname, key)){
                    result[count] = lib[i];
                    count++;
                }
                i++;
            }
            break;
        case 2:
            while (i<size){
                if (!strcmp(lib[i].title, key)){
                    result[count] = lib[i];
                    count++;
                }
                i++;
            }
            break;
        case 3:
            while (i<size){
                char j[15];
                char *pnum = &j;
                itoa(lib[i].pnum, pnum, 10);
                if (!strcmp(pnum, key)){
                    result[count] = lib[i];
                    count++;
                }
                i++;
            }
            break;
        default: error(0); break;
    }
    return count;
}
void inputRecord(lb *library){
    printf("\nEnter surname\n");
    scanf("%s", &library->surname);
    printf("Enter title\n");
    scanf("%s", &library->title);
    printf("Enter publish\n");
    scanf("%s", &library->publish);
    printf("Enter pnum\n");
    scanf("%d", &library->pnum);
    printf("Enter year\n");
    scanf("%d", &library->year);
}
void newRecord(){
    lb library;
    inputRecord(&library);
    writeRecord(&library,1);
}
void writeRecord(lb *library, int mod){
    FILE *f2;
    if(mod==0)f2 = fopen("d1.txt","wb");
    else{
    f2 = fopen("d1.txt","ab");
    fwrite(library, sizeof(lb),1, f2);}
    fflush(f2);
    fclose(f2);
}
void changeRecord(lb *library, lb lib[]){
    modify(library, lib, -1);
}
void deleteRecord(lb lib[], int deleted){
    lb library;
    modify(&library, lib, deleted);
}
void modify(lb *library, lb lib[], int deleted){
    if(!(deleted+1))
    inputRecord(library);
    int size=0;
    while(lib[size].pnum>0){
        size++;
    }
    int i=0;
    writeRecord(&lib[0],0);
    while(i<size){
        if(!(i==deleted))
        writeRecord(&lib[i],1);
        i++;
    }
}
void error(int mod){
    switch(mod){
    case 0:printf("Input correct data\n");break;
    case 1:printf("It's a first record\n"); break;
    case 2:printf("It's a last record\n"); break;
    }
}
int message1(){
    puts("\nChoose search mode");
    int mod = getch()-48;
    return mod;
}
void message2(char *key){
    puts("Input key");
    char line;
    scanf("%s", &line);
    strcpy(key, &line);
}
void info(int mod){
    switch(mod){
    case 1: printf("\nPress 1 to previous record, 2 - next, 3 - get all, 0 - exit, 9 - info\n 4 - to modify, 5 - to delete, 6 - to sort\n"); break;
    case 2: printf("Press 1 to get records, 2 to search, 3 - new record, 9 - clean, 0 - exit\n"); break;
    }
}

намагалась зробити сортування, але так нічого й не вийшло
чи могли б з цим допомогти?

8

Re: Розробити програму яку забезпечує опрацювання структур даних

Не бачу спроби. В яких рядках ваше невдале сортування?

9

Re: Розробити програму яку забезпечує опрацювання структур даних

72-79
намагалась посортувати за іменем

10

Re: Розробити програму яку забезпечує опрацювання структур даних

Почитайте про алгоритми сортування. Вам буде найлегше робити "бульбашку".
А що має функція display робити, вибачте? За назовою - виводити, а по факту ви там половину програми в неї запхали.