Простая «база данных» в C ++ - PullRequest
0 голосов
/ 04 мая 2010

Моя задача состояла в том, чтобы создать псевдобазу в c ++. Приведено 3 таблицы: название магазина (char *), возраст (int) и пол (bool). Напишите программу, позволяющую:
- добавить новые данные в таблицы
- показать все записи
- сортировать таблицы с критериями:
- увеличение / уменьшение имени
- возраст увеличивается / уменьшается
- секс

Использование шаблонов функций обязательно. Также размер массивов должен быть переменным, в зависимости от количества записей.

У меня есть код, но там все еще есть проблемы. Вот что у меня есть: Функция tabSize () для возврата размера массива. Но в настоящее время он возвращает размер указателя, я думаю:

#include <iostream>
using namespace std;

template<typename TYPE> int tabSize(TYPE *T)
{
   int size = 0;  
   size = sizeof(T) / sizeof(T[0]);
   return size;
}

Как сделать так, чтобы он возвращал размер массива, а не его указатель?

Далее самое важное: add () для добавления новых элементов. Сначала я получаю размер массива (но, следовательно, он возвращает значение указателя, а не размер, который сейчас бесполезен: /). Тогда я думаю, что я должен проверить, если тип данных является символом. Или я не прав?

// add(newElement, table)
template<typename TYPE> TYPE add(TYPE L, TYPE *T)
{   
   int s = tabSize(T);
//here check if TYPE = char. If yes, get the length of the new name
       int len = 0;
       while (L[len] != '\0') {
           len++;
       }
//current length of table   
   int tabLen = 0; 
   while (T[tabLen] != '\0') {
       tabLen++;
   }    
//if TYPE is char   
//if current length of table + length of new element exceeds table size create new table      
   if(len + tabLen > s)
   {
        int newLen = len + tabLen;
        TYPE newTab = new [newLen];
        for(int j=0; j < newLen; j++ ){
            if(j == tabLen -1){
                for(int k = 0; k < len; k++){
                    newTab[k] = 
                }
            }
            else {
                newTab[j] = T[j];
            }
        }
   }
//else check if tabLen + 1 is greater than s. If yes enlarge table by 1.               
}

Я правильно здесь думаю?

Последние функции show () верны.

template<typename TYPE> TYPE show(TYPE *L)
{
   int len = 0;
   while (L[len] == '\0') {
       len++;
   }

   for(int i=0; i<len; i++)
   {
      cout << L[i] << endl;
   }    
}

и проблема с sort () заключается в следующем: Как я могу повлиять, если сортировка уменьшается или увеличивается? Я использую пузырьковую сортировку здесь.

template<typename TYPE> TYPE sort(TYPE *L, int sort)
{
   int s = tabSize(L);               

   int len = 0; 
   while (L[len] == '\0') {
       len++;
   }
//add control increasing/decreasing sort
    int i,j;
    for(i=0;i<len;i++)
    {
        for(j=0;j<i;j++)
        {
            if(L[i]>L[j])
            {
                int temp=L[i];
                L[i]=L[j];
                L[j]=temp;
            }
        }
    }   
}

И основная функция для его запуска:

int main()
{
    int sort=0;
    //0 increasing, 1 decreasing
    char * name[100];
    int age[10];
    bool sex[10];

    char c[] = "Tom";  
    name[0] = "John";
    name[1] = "Mike";

    cout << add(c, name) << endl;

    system("pause");
    return 0;
}

Ответы [ 2 ]

2 голосов
/ 04 мая 2010

В вашем проекте у вас должна быть переменная, которая поддерживает размер массива. Это значение будет корректироваться при добавлении или удалении элементов. Язык C ++ не имеет средств для получения размера переменной массива.

Кроме того, предпочитайте использовать std::string вместо char *. Если ваш инструктор говорит использовать char *, предоставьте его в качестве параметра для ваших функций, но преобразуйте в std::string внутри функций и классов. Это сделает вашу жизнь намного проще.

Не реализуйте свои собственные алгоритмы сортировки. Предпочитаю использовать std::sort и сравнивать разные функции . Алгоритм std::sort был протестирован и сэкономит ваше время и усилия.

Реализация шаблона проектирования Visitor. Это позволит вам получить доступ к вашим таблицам по-разному без написания новых методов в классе таблицы. Например, с помощью базового класса Visitor вы можете извлекать классы для чтения из файлов, записи в файлы и отображения содержимого без изменения класса таблицы.

Наконец, не используйте system("pause"), который может быть не переносимым. Вместо этого предпочтите cin.ignore, который можно найти в std::istream::ignore.

0 голосов
/ 04 мая 2010

Если у вас нет своего рода терминатора для массива, нет простого способа получить размер массива, на который указывает T.

Вам придется выполнить цикл по массиву, указанному T, и подсчитывать элементы, пока не найдете терминатор. (Например, '\0' для char *)

...