2017-02-10 4 views
-1

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

#include <iostream> 
using namespace std; 

int main(){ 
char x; 
string supplies[4] = {"apple", "banana" , "egg", "love"}; 
string shopping_cart[4]; 
string wanted_goods[4]; 
string good; 

bool found; 
int gd_counter=0; 
int wd_counter=0; 

cout << "welcome to my shopping list, tap A to cont. and B to quit!" << endl; 
cin >> x; 

while(x == 'A' || x == 'B'){ 
    if(x == 'B'){ 
    break; 
    } 
    else{ 
    cout << "Type the name of the item!" << endl; 
    cin >> good; 
    for(int y=0; y<4; y++){ 
     if(good == supplies[y]){ 
     found = true; // edited 
     // continue; 
     } 
     if(found == true){ 
     shopping_cart[wd_counter++] = good; // edited 
     cout << "we have that item"; // edited 
     } 
     else{ 
     wanted_goods[wd_counter++] = good; // edited 
     cout << "we do not have that item!"; // edited 
     } 

    } 
    cout << "do you want to complete!?" << endl; 
    cin >> x; 
    } 
} 

for(int z=0; z<gd_counter; z++){ 
    cout << shopping_cart[z] << endl; // print out what the user has found in my shopping list 
} 

for(int c=0; c<wd_counter; c++){ 
    cout << wanted_goods[c] << endl; // print out the items that the user has not found it 
} 
} 

спасибо за помощь!

+0

Так что ваш вопрос? –

+0

Как исправить программу, я пробовал столько раз ... –

ответ

0

Следующая строка не работает, как вы ожидаете.

for(int y = 0; y < sizeof(supplies); y++){ 

Обратите внимание, что sizeof(supplies) не возвращает длину массива. Вместо этого вы должны использовать std::size.

for(int y = 0; y < std::size(supplies); y++){ 
+2

Или 'sizeof поставок/sizeof поставок [0]' –

+0

спасибо! , если я исправлю это, это сработает? –

+0

все еще не работает, я обновлю свой код новым –

0

Или _countof(supplies), он включен в stdlib.h на окнах.

(я не могу сделать комментарий, поэтому я разместил новый.)

+0

, он работает на 50%, но другая часть программы работает не очень хорошо, когда я печатаю то, что пользователь заказал, и какие вещи он не нашел он, он печатает дублированные элементы. –

2

Пожалуйста, обратите внимание, что вы всегда должны стараться, чтобы описать, что именно не работает и то, что вы пытались, чтобы исправить это. В большинстве случаев его списание помогает вам решить свои собственные ошибки. Тем не менее, вот несколько советов:

В коде есть как минимум 3 ошибки.

Первый заключается в том, что sizeof(supplies) возвращает размер расходных материалов в байтах, а не в количестве элементов. Так, как было предложено Привет, я Frogatto вы должны использовать либо std::size(supplies), либо sizeof(supplies)/sizeof(supplies[0]) (байты для всех элементов по размеру одного элемента равны количеству элементов).

Обратите внимание, что использование std::size требует C++ 17 и #include <iterator> согласно cppreference.com. Я настоятельно рекомендую использовать шаблон c++11std::array<>, который предлагает array.size(). Он широко поддерживается и в основном все средства лучше использовать, чем собственный массив при написании современного кода C++.

Вторая проблема заключается в том, что вы итерацию по списку элементов доступного и каждый раз вы пропустите один вы непосредственно добавить его в список не найдено вещей. Например. если вы входите в яблоко, то это не соответствует банану, яйцу и любви и будет добавлено в список вещей, которые мы не нашли три раза. Сначала вы должны перебрать список, чтобы узнать, был ли элемент в списке, сохраняя результат в логическом выражении, а затем добавьте его в список агрессивных ответов. Если вы не хотите самостоятельно его кодировать, вы можете взглянуть на std::find(), который прекрасно работает с std::array<>.

cout << "Type the name of the item!" << endl; 
cin >> good; 
bool found = false; 
for(int y=0; y < supplies.size(); y++) { 
    if(good == supplies[y]) 
    found = true; 
} 
if (found) { 
    shopping_cart[gd_counter++] = good; 
    cout << "we have that item!" << endl; 
} else { 
    wanted_goods[wd_counter++] = good; 
    cout << "we do not have that item!" << endl; 
} 

Третья проблема заключается в том, что вы позволяете пользователю вводить неограниченное количество элементов, в то время как ваши буфера имеют место только для четырех элементов. Как только кто-то вводит более 4 найденных или необоснованных элементов, ваши индексы исчерпывают область массивов и запускают segfault (или проблему безопасности с возможной инъекцией кода).

while (x == 'A' || x == 'B'){ 
    if(x == 'B'){ 
    break; 
    } 
    else { 
    // handle user input here 
    if (gd_counter < shopping_cart.size() 
     && wd_counter < wanted_goods.size()) { 
     cout << "do you want to complete!?" << endl; 
     cin >> x; 
    } else { 
     cout << "you can't add more items!" << endl; 
     break; 
    } 
    } 
} 

В целом код работает для меня, как это (вы можете попробовать это here):

#include <iostream> 
#include <array> 
#include <algorithm> 
using namespace std; 

int main(){ 
    char x; 
    std::array<string, 4> supplies{"apple", "banana" , "egg", "love"}; 
    std::array<string, 4> shopping_cart; 
    std::array<string, 4> wanted_goods; 
    string good; 

    int gd_counter=0; 
    int wd_counter=0; 

    cout << "welcome to my shopping list, tap A to cont. and B to quit!" << endl; 
    cin >> x; 

    while (x == 'A' || x == 'B'){ 
     if(x == 'B'){ 
     break; 
     } 
     else { 
     cout << "Type the name of the item!" << endl; 
     cin >> good; 
     if (std::find(supplies.begin(), supplies.end(), good) != supplies.end()) { 
      shopping_cart[gd_counter++] = good; 
      cout << "we have that item!" << endl; 
     } else { 
      wanted_goods[wd_counter++] = good; 
      cout << "we do not have that item!" << endl; 
     } 

     if (gd_counter < shopping_cart.size() 
      && wd_counter < wanted_goods.size()) { 
      cout << "do you want to complete!?" << endl; 
      cin >> x; 
     } else { 
      cout << "you can't add more items!" << endl; 
      break; 
     } 
     } 
    } 

    cout << "shopping card:" << endl; 
    for(int z=0; z<gd_counter; z++){ 
     cout << shopping_cart[z] << endl; // print out what the user has found in my shopping list 
    } 

    cout << "wanted goods:" << endl; 
    for(int c=0; c<wd_counter; c++){ 
     cout << wanted_goods[c] << endl; // print out the items that the user has not found it 
    } 
} 
+0

Если вам нужно больше советов о том, как улучшить кодирование, вы должны, вероятно, спросить на [codereview.stackexchange.com] (http: // http: //codereview.stackexchange.com/). Но, пожалуйста, убедитесь, что ваш код работает до публикации там. – Christoph

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