2013-07-08 2 views
-1

Мой английский не очень хорошо, но, надеюсь, вы поймете меня. Я знаю, что превращение строки в код невозможно в C++, но я просто не вижу другого способа решить мою проблему.Чтобы превратить строку в код

У меня есть массив структур. Вы можете сказать, что это база данных. Задача состоит в том, что пользователь должен выполнить комбинированный запрос. В консоли пользователь выбирает два параметра структуры и делает комбинированный запрос. Что-то вроде этого

 cout<<"\nВыберите первый параметр для поиска:" // Choose first parameter 
      <<"\n1. processor" 
      <<"\n2. videocard"      
      <<"\n3. display" 
      <<"\n4. RAM" 
      <<"\n5. size"<<endl; 
     int first; 
     cin>>first; 
     cout<<"\nВыберите второй параметр для поиска:" // Choose second parameter 
      <<"\n1. processor" 
      <<"\n2. videocard" 
      <<"\n3. display" 
      <<"\n4. RAM" 
      <<"\n5. size"<<endl;  
     int second; 
     cin>>second; 

     cout<<"enter searchkey for first value: " 
     string search1; 
     cin>>search1; 
     cout<<"enter searchkey for second value: " 
     string search2; 
     cin>>search2; 

     string parameters[ 5 ] = { "processor", "videocard", "display", "RAM", "size" }; 
     for (i = 0; i < size; i++) // And that's where it all goes wrong. 
     if (arrayOfStructs.parameters[ first ] == search1 && arrayOfStructs.parameters[ second ] == search2) 
       cout<<"found a match"<<endl; 

Я знаю, почему код не работает. Я действительно уверен, что существует решение, похожее на мое. Мое «решение» похоже на перечисление, но перечисление в этом случае не подходит. Если вы знаете решение, напишите ниже.

Полный код моей программы

#include <iostream> 
#include <iomanip> 
#include <fstream> 
#include <string> 
#include <sstream> 
using namespace std; 

struct computer 
{ 
    string processor; 
    string videocard; 
    string display; 
    string RAM; 
    string size; 

    string getFieldValue(int); 
}; 

string computer::getFieldValue(int fieldNumber) 
{ 
    stringstream str; 

    switch (fieldNumber) 
    { 
     case 1: str<<this->processor; 
     case 2: str<<this->videocard; 
     case 3: str<<this->display; 
     case 4: str<<this->RAM; 
     case 5: str<<this->size; 
    } 

    return str.str(); 
} 

void coutAndWrite(computer aStruct, ofstream &aFile); 

int main() 
{ 
    setlocale(0, ""); 
    computer sklad[ 30 ]; 
    computer temp; 
    int i = 0, j; 

    ifstream fromFile("structury.txt"); 
    while (!fromFile.eof()) 
    { 
     fromFile>>sklad[ i ].processor 
       >>sklad[ i ].videocard 
       >>sklad[ i ].display 
       >>sklad[ i ].RAM 
       >>sklad[ i ].size; 
     i++; 
    } 
    fromFile.close(); 
    ofstream rezultaty("rezultaty.txt"); 

    for (i = 0; i < 30; i++) 
      for (j = 0; j < 29; j++) 
       if (sklad[ j + 1 ].processor[ 0 ] < sklad[ j ].processor[ 0 ]) 
       { 
        temp = sklad[ j + 1 ]; 
        sklad[ j + 1 ] = sklad[ j ]; 
        sklad[ j ] = temp; 
       } 

    while (1) 
    { 
     cout<<"\nВыберите тип запроса:" 
      <<"\n1. Простой" 
      <<"\n2. Составной" 
      <<"\n0. Выход из программы\n"; 
     int prostoiIliSostavnoi; 
     cin>>prostoiIliSostavnoi; 

     if (prostoiIliSostavnoi == 0) 
      break; 
     if (prostoiIliSostavnoi == 1) 
     { 
      cout<<"\nВыберите параметр для поиска:" 
       <<"\n1. processor" 
       <<"\n2. videocard" 
       <<"\n3. display" 
       <<"\n4. RAM" 
       <<"\n5. size"<<endl; 
      int parametr; 
      cin>>parametr; 

      cout<<"Введите ключ поиска: "; 
      string poisk; 
      cin>>poisk; 
      cout<<"Результаты поиска: "; 
      for (i = 0; i < 30; i++) 
       if (sklad[ i ].getFieldValue(parametr) == poisk) 
        coutAndWrite(sklad[ i ], rezultaty); 
     } 

    } 

    system("pause"); 
} 

void coutAndWrite(computer aStruct, ofstream &aFile) 
{ 
    cout<<"\nprocessor: "<<aStruct.processor 
     <<"\nvideocard: "<<aStruct.videocard 
     <<"\ndisplay: "<<aStruct.display 
     <<"\nRAM: "<<aStruct.RAM 
     <<"\nsize: "<<aStruct.size<<endl<<endl; 

    aFile<<setw(15)<<aStruct.processor 
     <<setw(15)<<aStruct.videocard 
     <<setw(20)<<aStruct.display 
     <<setw(10)<<aStruct.RAM 
     <<setw(10)<<aStruct.size<<endl; 
} 
+0

Итак, вы перечислить ряд пунктов, и ожидаем, что пользователю ввести в одном из них, а затем вы хотите найти соответствующий пункт в 'struct' - так что если пользователь говорит' processor' , вы хотите 'arrayOfStructs [i] .processor'? –

+2

В чем вопрос? Что ты пытаешься сделать? Что вы хотите, чтобы конечный результат был? –

+0

Маты Петерсон. Пользователь не должен указывать, что пользователь «процессор» вводит соответствующее количество элементов. – eoLithic

ответ

3

разбить его на куски. Давайте игнорировать петлю и двойной поиск, и сосредоточиться на основных проблемах: получение значения полевого, когда у вас есть свой номер поля (или имя):

string Computer::getFieldValue(int fieldNumber) 
{ 
    stringstream str; 

    switch (fieldNumber) { 
     case 1: str << this->processor; break; 
     case 2: str << this->videocard; break; 
     case 3: str << this->display; break; 
     case 4: str << this->RAM;  break; 
     case 5: str << this->size;  break; 
    } 

    return str.str(); 
} 

Учитывая это вспомогательная функцию, то теперь можно написать проверку код.

for (int i = 0; i < size; ++i) { 
    if (computers[i].getFieldValue(first) == search1 && 
     computers[i].getFieldValue(second) == search2) 
    { 
     cout << "found a match" << endl; 
    } 
} 
+0

"получение значения поля при наличии номера поля (или имени)". Спасибо, вы объяснили мою проблему лучше, чем я. – eoLithic

+0

Код не компилируется, но концепция работает - поскольку в полях есть несколько типов 'int' и' string'. Я подозреваю, что мы могли бы вернуть «строку» из значений «int» с небольшими дополнительными усилиями. –

+0

Я изменил свой код с заданными функциями, но моя программа не работает. Он компилируется, но не работает. Я повторно заполнил полную программу в основном сообщении для вас. Он не находит совпадений :( – eoLithic

Смежные вопросы