2010-05-03 7 views
0

Ma tâche était de créer une pseudodatabase en C++. Il y a 3 tables données, le nom du magasin (char *), age (int) et sex (bool). Ecrire un programme permettant de:
- ajouter de nouvelles données aux tables
- afficher tous les enregistrements
- tables de tri avec vos critères:
- nom croissant/décroissant
- âge croissant/décroissant
- sexeSimple 'base de données' en C++

L'utilisation de modèles de fonctions est un must. La taille des tableaux doit également être variable, en fonction de la quantité d'enregistrements.

J'ai du code mais il y a encore des problèmes. Voici ce que j'ai: Fonction tabSize() pour retourner la taille du tableau. Mais actuellement, il retourne la taille du pointeur je suppose:

#include <iostream> 
using namespace std; 

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

Comment faire revenir la taille du tableau, pas son pointeur?

Ensuite, le plus important: add() pour ajouter de nouveaux éléments. À l'intérieur d'abord j'obtiens la taille du tableau (mais par conséquent il renvoie la valeur du pointeur, et pas la taille c'est inutile maintenant: /). Ensuite, je pense que je dois vérifier si TYPE de données est char. Ou ai-je tort ?

// 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.    
} 

Est-ce que je pense correct ici?

Dernières fonctions show() est correct, je suppose:

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

et problème avec tri() est le suivant: Ho je peux influencer si le tri est croissant ou décroissant? J'utilise le genre de bulle ici.

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

et fonction principale pour l'exécuter:

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

Répondre

0

Sauf si vous avez une sorte de terminaison sur le tableau, il n'y a pas moyen facile d'obtenir la taille d'un tableau pointé par T.

Vous devez faire une boucle dans le tableau pointé par T et compter les éléments jusqu'à ce que vous trouviez un terminateur. (E.G. '\0' pour char *)

2

Dans votre conception, vous devez disposer d'une variable qui conserve la taille de la matrice. Cette valeur sera ajustée à mesure que des éléments sont ajoutés ou supprimés. Le langage C++ n'a aucun moyen d'obtenir la taille d'une variable de tableau. En outre, préférez utiliser std::string au lieu de char *. Si votre instructeur dit d'utiliser char *, alors fournissez-le comme un paramètre à vos fonctions, mais convertissez en std::string à l'intérieur des fonctions et des classes. Cela rendra votre vie beaucoup plus facile. Ne pas implémenter vos propres algorithmes de tri. Préfèrent utiliser std::sort et différents comparer fonctions. L'algorithme std::sort a été testé et vous épargnera du temps et fais les efforts.

Implémentez le modèle de conception Visitor. Cela vous permettra d'accéder à vos tables de différentes manières sans écrire de nouvelles méthodes dans la classe de la table. Par exemple, avec une classe de base Visitor, vous pouvez dériver des classes pour lire des fichiers, écrire dans des fichiers et afficher du contenu sans modifier la classe de la table.

Enfin, n'utilisez pas system("pause") qui peut ne pas être portable. Au lieu de cela, préférez cin.ignore qui peut être trouvé dans std::istream::ignore.

+1

Je ne suggère pas de stocker en tant que 'std :: string' en interne si l'affectation dit d'utiliser' char * 'sauf si vous demandez d'abord à votre instructeur (ou TA). Alors que dans n'importe quel scénario réel, vous voudriez utiliser 'std :: string', une partie du but de l'affectation pourrait être d'apprendre la gestion manuelle de la mémoire, et s'ils lisent votre code et trouvent' std :: string', vous pourriez perdre le crédit pour cela. –

Questions connexes