1

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

Допоможіть мені створити базу даних за допомогою черги використовуючи структуру(через контейнер <queue> не можна). Проблема полягає в тому що я не можу реалізувати введення даних і їх виведення, бо не знаю як звернутися до кожного елемента окремо. Я не знаю чи мій код працює правильно оскільки не можу перевірити виведення даних.

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<math.h>
#include<conio.h>
#include<cctype>
#include<stdlib.h>
#include<cstring>
#include<fstream>
#include<iomanip>
#include<type_traits>
#include<Windows.h>
#include<stdio.h>
#include<string.h>
using namespace std;
struct Factory
{
    char name[50];
    char ownership[50];
    char area[50];
    char workers[50];
    Factory* dali;
};
Factory* first, * element;
void AddNew(Factory* first);
void Show(Factory* first);
bool MyAudit(const char* string)
{
    const char* temp = "0123456789-+.";
    unsigned int number = 0;

    for (int i = 0; i < strlen(string); i++)   //strlen(string) -- функція що повертає розмір рядка 'string'
    {
        if ((i > 0) && (string[i] == '+' || string[i] == '-')) //шукаємо '+' або '-' в рядку 'string'
        {
            return false;
        }
        if (string[i] == '.') //шукаємо крапку 
        {
            number++;
            if (number > 1) //перевіряємо чи не більше однієї крапки в рядку
            {
                return false;
            }
        }
        if (strchr(temp, string[i]) == 0) //ми перевіряємо наш рядок 'string' на цифри і на "+-."
        {
            return false;
        }
    }
    return true;
}
void main()
{
    first = NULL;
    int size = 0;
    bool index = false;
    while (index != true)
    {
        cout << "\t Menu: \n";
        cout << "1.View the list of factorys\n";
        cout << "2.Add a new factory\n";
        cout << "3.Exit\n";
        cout << "---------------\n";
        cout << "Enter the number" << endl;
        int menu;
        cin >> menu;
        system("cls");
        switch (menu)
        {
        case 1:
        {
            Show(first);
            system("cls");
            break;
        }
        case 2:
        {
            AddNew(first);
            system("cls");
            break;
        }
        case 3:
        {
            index = true;
            break;
        }
        default:
        {
            cout << "A non-existent menu item is selected\n";
        }
        }
    }
}
void AddNew(Factory* first)
{
    char a[50];
    char b[50];
    char c[50];
    char d[50];
    cout << "Enter the factory name: ";
    cin >> a;
    cout << "The types of property: N - national, P - private, C - cooperative";
    cout << "\nEnter the type of property: ";
    cin >> b;
    cout << "Enter the area of land(hectares): ";
    cin >> c;
    while (MyAudit(c) != true)
    {
        cout << "\nError! Enter a correct value: ";
        cin >> c;
    }
    cout << "Enter the number of workers: ";
    cin >> d;
    while (MyAudit(d) != true)
    {
        cout << "\nError! Enter a correct value: ";
        cin >> d;
    }
    element = new(Factory);
    element->dali = first;
    first = element;
    strcpy(element->name, a);
    strcpy(element->ownership, b);
    strcpy(element->area, c);
    strcpy(element->workers, d);
}
void Show(Factory* first)
{ 
}

2

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

В мене є реалізація цієї бази даних за допомогою масиву структур але потрібно зробити її через чергу

3

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

спочатку визначся з мовою

4 Востаннє редагувалося Mirek7098 (10.11.2020 20:22:25)

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

Не зрозумів про мову. Мова коду англійська, є коментарі українською якщо тебе це цікавить

5

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

*FACEPALM*

6

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

Mirek7098 написав:

Мова коду англійська

:D аж чай носом пішов.

Подякували: 0xDADA11C7, koala2

7

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

Про мову: просять визначитися, C чи C++.
Сумісність (яка є) між ними зроблена, щоб можна було використовувати бібліотеки, написані на C, у C++, а не змішувати їх.
Розділіть операції введення-виведення та роботи з чергою. Не AddNew, де ви вводите, а, наприклад,

Factory * read_factory()
{
    //тут всі операції з cin і new
}
void add_to_queue(Factory *first, Factory* new_factory)
{
    //тут додаєте в чергу
}
і потім
add_to_queue(first, read_factory());

Буде значно менше плутанини. А ще краще там, де new, зробити конструктором, це вже третя функція.

А так у вас черга на зв'язному списку - от і виводьте зв'язний список.

Подякували: Mirek7098, leofun012

8

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

Щодо мови то це С, в завданні написано робити тільки за допомогою структур(ніяких класів чи контейнерів). А щодо введення і виведення то я просто не зовсім розумію як використовувати вказівники (dali, first, element)

9

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

Я не знаю як за допомогою них можна почергово звернутися до кожного елемента черги

10

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

Чесно кажучи не дійшов до єдиного висновку (тут мої роздуми)

проход 1
for (int i = 0; i < strlen(string); i++)   
    {
        if ((i > 0) && (string[i] == '+' || string[i] == '-')) //навіщо? 
        {
            return false;//повертаємо якщо ЗНАЙДЕНО
        }
        if (string[i] == '.') 
        {
            number++;
            if (number > 1) 
            {
                return false;
            }
        }
        if (strchr(temp, string[i]) == 0) //якщо треба це, тоді навіщо перша перевірка? до того ж, 0-ве значення повертається якщо нічого НЕ знайдено
        {
            return false;//повертаємо якщо НЕ ЗНАЙДЕНО
        }
    }

Чому i має бути <=0, навіщо це перевіряти? Якщо це проблеми із ОЗУ то клонуйте операцію (треба помістити дані в іншу область, не знаю як).

bool MyAudit(const char* string)
{
    const char* temp = "0123456789-+.";//крапку прибрати або перевірку прибрати
    unsigned int number = 0;
    
    for (int i = 0; i < strlen(string); i++)  
    {
        if (string[i] == '.') //крапка вже перевіряється із temp, треба прибрати
        {
            number++;
            if (number > 1)
            {
                return false;
            }
        }
        if (strchr(temp, string[i]) == 0)//якщо НЕ знайдено
       // if (strchr(temp, string[i]) != 0)//якщо ЗНайдено
        {
            return false;
        }
    }
    return true;
}
проход 2

Далі void New:

void AddNew(Factory* first)
{
    char a[50];//чому саме 50?
    char b[50];
    char c[50];
    char d[50];
    cout << "Enter the factory name: ";
    cin >> a;
    cout << "The types of property: N - national, P - private, C - cooperative";
    cout << "\nEnter the type of property: ";
    cin >> b;
    cout << "Enter the area of land(hectares): ";
    cin >> c;
    while (MyAudit(c) != true)
    {
        cout << "\nError! Enter a correct value: ";
        cin >> c;
    }
    cout << "Enter the number of workers: ";
    cin >> d;
    while (MyAudit(d) != true)
    {
        cout << "\nError! Enter a correct value: ";
        cin >> d;
    }
    element = new(Factory);
    element->dali = first;
    first = element;
    strcpy(element->name, a);
    strcpy(element->ownership, b);
    strcpy(element->area, c);
    strcpy(element->workers, d);
}

"Enter the number of workers: " number! MyAudit(d) перевіряє на крапки, цифри, +-. А якщо користувач введе букву? Може треба робити перевірку "навпаки?"

bool MyAudit(const char* string)
{
    const char* temp = "0123456789";//тільки цифри
    unsigned int number = 0;
    int st1=strlen(string);
    int st2=strlen(temp);
    for (int i = 0; i < st1; i++)  
    {
        for (int j=0; j<st2; j++) if(temp[j]==string[i]) number++;
        if(number==0) return false; else number=0;
    }
    return true;
}

unsigned int можна замінити на bool.

проход 3

Замість 50 хоча б на початку програми (після #include)

#define MY_MAX_SYMB 50

І трохи по іншому

void AddNew(Factory* first)
{
    char **a=new char*[4];
    for (int i=0; i<4; i++) a[i]=new char[MY_MAX_SYMB);
    cout << "Enter the factory name: ";
    cin >> a[0];
    cout << "The types of property: N - national, P - private, C - cooperative";
    cout << "\nEnter the type of property: ";
    cin >> a[1];
    cout << "Enter the area of land(hectares): ";
    cin >> a[2];
    while (MyAudit(a[2]) != true)
    {
        cout << "\nError! Enter a correct value: ";
        cin >> a[2];
    }
    cout << "Enter the number of workers: ";
    cin >> a[3];
    while (MyAudit(a[3]) != true)
    {
        cout << "\nError! Enter a correct value: ";
        cin >> a[3];
    }
    element = new(Factory);
    element->dali = first;
    first = element;
    strcpy(element->name, a[0]);
    strcpy(element->ownership, a[1]);
    strcpy(element->area, a[2]);
    strcpy(element->workers, a[3]);
}
проход 4

Далі iostream - використовується тільки в C++ це заміна stdio.h (тобто містить аналогічні, але різні за "іменами" функції)

#include<iostream>
#include<fstream>
#include<iomanip>
#include<type_traits>
проход 5

printf/scanf замість cout/cin

void AddNew(Factory* first)
{
    char **a=new char*[4];
    for (int i=0; i<4; i++) a[i]=new char[MY_MAX_SYMB];
    printf("Enter the factory name: ");
    scanf ("%s", a[0]);
    printf("The types of property: N - national, P - private, C - cooperative");
    printf("\nEnter the type of property: ");
    scanf ("%s", a[1]);
    printf("Enter the area of land(hectares): ");
    scanf ("%s", a[2]);
    while (MyAudit(a[2]) != true)
    {
        printf("\nError! Enter a correct value: ");
        scanf ("%s", a[2]);
    }
    printf("Enter the number of workers: ");
    scanf ("%s", a[3]);
    while (MyAudit(a[3]) != true)
    {
        printf("\nError! Enter a correct value: ";
        scanf ("%s", a[3]);
    }
    element = new(Factory);
    element->dali = first;
    first = element;
    strcpy(element->name, a[0]);
    strcpy(element->ownership, a[1]);
    strcpy(element->area, a[2]);
    strcpy(element->workers, a[3]);
}
void main()
{
    first = NULL;
    int size = 0;
    bool index = false;
    while (index != true)
    {
        printf("\t Menu: \n");
        printf("1.View the list of factorys\n");
        printf("2.Add a new factory\n");
        printf("3.Exit\n");
        printf("---------------\n");
        printf("Enter the number\n");
        int menu;
        scanf("%d", menu);
        system("cls");
        switch (menu)
        {
        case 1:
        {
            Show(first);
            system("cls");
            break;
        }
        case 2:
        {
            AddNew(first);
            system("cls");
            break;
        }
        case 3:
        {
            index = true;
            break;
        }
        default:
        {
            printf("A non-existent menu item is selected\n");
        }
        }
    }
}

Можна було б пройтися ще (зробити перевірку N - national, P - private, C - cooperative):

char* check="NPC";
int found=0;
for (int i=0; i<strlen(check); i++) if(a[2]==check[i]) found=1, break;
while()//зрозуміло

І перейменувати функцію MyAudit у check1() напр., або скористатися вбудованими (якщо вони є)
Цікаво, що скаже koala

11

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

Допоможіть мені будь-ласка. Я не знаю чому моя програма вилітає коли я нажимаю пункт 1 у своєму меню. Функція Show має виводити мені дані об'єктів. Швидше за все я неправильно звертаюся до елементів черги і через це програма вилітає.

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<conio.h>
#include<cctype>
#include<stdlib.h>
#include<cstring>
#include<fstream>
#include<iomanip>
#include<type_traits>
#include<Windows.h>
#include<stdio.h>
#include<string.h>
using namespace std;
struct Factory
{
    char name[50];
    char ownership[50];
    char area[50];
    char workers[50];
    Factory* next;
};
bool MyAudit(const char* string)
{
    const char* temp = "0123456789-+.";
    unsigned int number = 0;

    for (int i = 0; i < strlen(string); i++)   //strlen(string) -- функція що повертає розмір рядка 'string'
    {
        if ((i > 0) && (string[i] == '+' || string[i] == '-')) //шукаємо '+' або '-' в рядку 'string'
        {
            return false;
        }
        if (string[i] == '.') //шукаємо крапку 
        {
            number++;
            if (number > 1) //перевіряємо чи не більше однієї крапки в рядку
            {
                return false;
            }
        }
        if (strchr(temp, string[i]) == 0) //ми перевіряємо наш рядок 'string' на цифри і на "+-."
        {
            return false;
        }
    }
    return true;
}
int IsEmpty(Factory** first) //перевірка пустоти черги
{
    if (first == NULL)
    {
        return 1;
    }        
    else
    {
        return 0;
    }
        
}
void AddNew(Factory** last, Factory** first)
{    
    if (first = NULL)
    {
        *first = new(Factory);
        last = first;       
        cout << "Enter the factory name: ";
        cin >> (*first)->name;
        cout << "The types of property: N - national, P - private, C - cooperative";
        cout << "\nEnter the type of property: ";
        cin >> (*first)->ownership;
        cout << "Enter the area of land(hectares): ";
        cin >> (*first)->area;
        while (MyAudit((*first)->area) != true)
        {
            cout << "\nError! Enter a correct value: ";
            cin >> (*first)->area;
        }
        cout << "Enter the number of workers: ";
        cin >> (*first)->workers;
        while (MyAudit((*first)->workers) != true)
        {
            cout << "\nError! Enter a correct value: ";
            cin >> (*first)->workers;
        }
        (*first)->next = 0;
    }
    else
    {        
        Factory* temp = new(Factory);
        temp->next = 0;
        cout << "Enter the factory name: ";
        cin >> temp->name;
        cout << "The types of property: N - national, P - private, C - cooperative";
        cout << "\nEnter the type of property: ";
        cin >> temp->ownership;
        cout << "Enter the area of land(hectares): ";
        cin >> temp->area;
        while (MyAudit(temp->area) != true)
        {
            cout << "\nError! Enter a correct value: ";
            cin >> temp->area;
        }
        cout << "Enter the number of workers: ";
        cin >> temp->workers;
        while (MyAudit(temp->workers) != true)
        {
            cout << "\nError! Enter a correct value: ";
            cin >> temp->workers;
        }       
        (*last) = temp;
    }
}
void Show(Factory* first)
{
    Factory* tmp = first->next;
    while (tmp != NULL)
    {        
        cout << "\n" << tmp->name;
        cout << "\n" << tmp->ownership;
        cout << "\n" << tmp->area;
        cout << "\n" << tmp->workers;
        tmp = tmp->next;        
    }    
    _getch();
}
void main()
{
    Factory* first = NULL;
    Factory* last = NULL;   
    int size = 0;
    bool index = false;
    while (index != true)
    {
        cout << "\t Menu: \n";
        cout << "1.View the list of factorys\n";
        cout << "2.Add a new factory\n";
        cout << "3.Exit\n";
        cout << "---------------\n";
        cout << "Enter the number" << endl;
        int menu;
        cin >> menu;
        system("cls");
        switch (menu)
        {
        case 1:
        {
            if (IsEmpty(&first) == 1)
            {
               cout << "Database is empty";
            }                
            else
            {                
                Show(first);                
            }            
            system("cls");
            break;
        }
        case 2:
        {
            AddNew(&last, &first);
            size++;
            system("cls");
            break;
        }
        case 3:
        {
            index = true;
            break;
        }
        default:
        {
            cout << "A non-existent menu item is selected\n";
        }
        }
    }
}

12 Востаннє редагувалося ch0r_t (12.11.2020 00:32:54)

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

Щодо мови то це С

А це тоді, що таке? :

#include<iostream>

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

13

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

Я хочу використовувати сout i cin а для цього якщо я не помиляюся потрібна бібліотека <iostream>. А щодо помилки, то програма компілиться нормально але під час роботи вилітає(заторможує і пише що вікно програми не відповідає)

14

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

Mirek7098 написав:

це С

Mirek7098 написав:

використовувати сout i cin

Ні, вибачте, або хрестик, або труси. Або C, або класи. Одночасно не виходить. Звісно, можна як навчальне завдання в C++ реалізувати чергу чи список руками; але в C++ є ще велика купа способів спростити собі життя, таких, як std::string і конструктори. Чому б ними не скористатися?

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

15

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

#include<cstring>
#include<string.h>

Наркоман

Подякували: /KIT\, Chemist-i2

16

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

Гаразд. Я затру все що пов'язано з С. Заміню структуру на клас. Але звичайний сішний рядок символів я на string міняти не буду тому що тоді доведеться змінювати мою функцію перевірки(MyAudit) і крім того ми по програмі до контейнерів не дійшли так що нам їх поки що заборонено використовувати. Але як не крути, а проблема з реалізацією черги залишається.

17 Востаннє редагувалося koala (12.11.2020 10:36:07)

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

"MyAudit" - загальновживаний термін тут validate. Звісно, регулярними виразами було б краще, але якщо ще не вчили - то не вчили. Тільки винесіть перевірку на знак з циклу (вона ж потрібна, фактично, один раз, потім + чи - - помилка), і замініть strchr на стандартний isdigit з <ctype.h>. І strlen лише один раз викликайте, якщо треба, а ще краще - самостійно перевіряйте на '\0'. strlen - це цикл від початку до останнього '\0'.
А що взагалі має бути у workers? Число працівників? Якийсь середній показник? Чому там не double (і не int)?

18

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

Функція MyAudit працює ідеально, я не бачу сенсу її переробляти. А щодо Workers  і Area то це число працівників і площа землі відповідно. Вони вводяться користувачем як цифри але обробляються в коді як рядки символів, а функція MyAudit дозволяє мені виключити усі помилки при введенні. Якби ці два поля мали б тип даних int або double то користувач ввівши замість цифри символ спричинив би краш програми(я так гадаю). А коли це масив символів то користувач вводить що завгодно, а помилки я перевіряю і змушую користувача вводити рядок до тих пір доки він не введе правильно.

19 Востаннє редагувалося koala (12.11.2020 12:41:54)

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

І це ви дуже правильно робите, але ще краще було б після перевірки коректності все ж записувати їх у числа. І для цього є всі можливості у стандартній бібліотеці. Десь так:

while(scanf("%d",&a)!=1) //намагаємося прочитати a; scanf повертає кількість прочитаних змінних, якщо буде не 1 - помилка
{
    if(ferror(stdin))  //якщо помилка введення (наприклад, файл скінчився) - виходимо, більше нема чого вводити
        return -1;     //або exit(-1) або ще якось
    while(getchar()!='\n') //читаємо до кінця рядка, де була помилка
        ;                  //порожній цикл - ставимо ; в наступному рядку, щоб було видно
    printf("Reading failed, try again!\n");
}

20

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

Ну я звісно можу перевести ці рядки в double за допомогою функції atof але нащо мені це?