Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > найти товар по введенной цене


Автор: S3ndeR 15.6.2008, 15:45
Всем здрасти.
Есть у меня следующая задачка: Сформировать массив содержащий сведения об ассортименте товара супермаркета .Структурный тип содержит поля:название товара, цена, количество . Написать прогр. выдающую след. сведения: 1 стоимость самого дорогого товара и его наименование . 2 Название товара, которое не привышает Х руб. Значение Х вводится с клавиатуры.
Вобщем то не получается у меня решить только последнюю часть задания (вывести название товара(ов), цена которых не превышает Х руб.).
Вот мой код:
Код

#include <iostream.h>
#include <iomanip.h>
#include <string.h>
#define N 3
struct Supermarket
{
char tovar[30];
int cena;
int kolvo;
} Group[N];
int main()
{
for (int i=0; i<N; i++)
{
cout << "Vvedite nazvanie tovara : ";
cin >> Group[i].tovar;
cout << "Cena tovara : ";
cin >> Group[i].cena;
cout << "Kolvo tovara : ";
cin >> Group[i].kolvo;
}
cout << "\n____________________________________" << endl;
cout << "ExpTovar" << setw(20) << "Cena" << endl;
cout << "------------------------------------" << endl;

int INFO[N]={0};
for (i=0; i<N; i++)
{
for (int j=0; j<1; j++)
{
INFO[i] = INFO[i] + Group[i].cena;
}
}
int x=0, ExpTovar;
ExpTovar=INFO[0];
for (i=0; i<N; i++)
{
if (ExpTovar<INFO[i])
{
ExpTovar=INFO[i];
x=i;
}
}
cout << Group[x].tovar << setw(22) << Group[x].cena <<endl;
cout << "\n____________________________________" << endl;


int z=0, Skolko;
Skolko=INFO[0];
cout << "Vvedite max cenu : ";
cin >> Skolko;
{
for (int k=0; k<N; k++)
{
INFO[i]=INFO[i]+Group[i].cena;
}

for (i=0; i<N; i++)
{
if (Skolko<=INFO[i])
{
Skolko=INFO[i];
z=i;
}
}
cout << Group[i].tovar << endl;
}


return 0;
}

Подскажите пожалуйста что здесь неправильно. Что то никак у меня не получается решить. :(

Автор: LavYaAll 15.6.2008, 16:26
1) Надо ставить отступы и комменты. Если ты просишь чтоб помогли, то ты предполагаешь, что твою программу будут читать и другие люди кроме тебя. Понимаю что для тебя она очевидна, потому что ты с ней провозился добрый час. А нам вникать надо.

2) Что значит это?
Код

int INFO[N]={0};
for (i=0; i<N; i++)
{
for (int j=0; j<1; j++)
{
INFO[i] = INFO[i] + Group[i].cena;
}
}

Ты обьявляешь одномерный массив. Где тут в этой строчке:
INFO[i] = INFO[i] + Group[i].cena; есть j? А если нет, то зачем там еще один цикл for (int j=0; j<1; j++)? Избавься от этого. Иначе у тебя значение цены каждого товара l раз складывается.
Далее. Ты ведь, как я понял, просто хочешь назначить массиву INFO значения цен товаров. Зачем писать INFO[i] = INFO[i] + Group[i].cena; ? Зачем прибавлять к 0? Пиши просто INFO[i] = Group[i].cena;

3) В строке #52, что это за }? К чему она относится? Ты ее закрывешь в строке #67? Если так, то выходит строка #66 выполняется всего 1 раз.

4) У тебя Skolko обозначает максимальную цену, так? Значит сравнение идет неверно. 
Выводится товары будут те, у которых цена больше(или равно), чем максимальное значение.
Перепиши этот кусок так:
Код

for (int i=0; i < N; i++)
    if (INFO[i] <= Skolko)           
           cout << Group[i].tovar << endl;


5) Зачем копировать значение цен в массив INFO? Почему не работать с полями структуры?

Автор: susanin 15.6.2008, 16:27
Код

#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
#define N 3

struct Supermarket
{
string tovar;
int cena;
int kolvo;
} Group[N];

int main()
{
    for (int i=0; i<N; i++)
    {
        cout << "Vvedite nazvanie tovara : ";
        cin >> Group[i].tovar;
        cout << "Cena tovara : ";
        cin >> Group[i].cena;
        cout << "Kolvo tovara : ";
        cin >> Group[i].kolvo;
    }
/*cout << "\n____________________________________" << endl;
cout << "ExpTovar" << setw(20) << "Cena" << endl;
cout << "------------------------------------" << endl;*/
int maxcena;
string tovarWithMaxCena;
maxcena=Group[0].cena;
tovarWithMaxCena = Group[0].tovar;
for(int i=1;i<N;i++)
{
    if(Group[i].cena>maxcena)
    {
        maxcena=Group[i].cena;
        tovarWithMaxCena = Group[i].tovar;
    }
}
cout<<"Max Cena: " << maxcena<<" tovar: "<<tovarWithMaxCena<<endl;
int definedCena;
cout<<"Enter defined cena: ";
cin>>definedCena;
for(int i=0;i<N;i++)
{
    if(Group[i].cena<definedCena)
    {
        cout<<"tovar: "<<Group[i].tovar<<" cena: "<<Group[i].cena<<endl;
    }
}
return 0;
}


вот набросал немного..кстати совет.. если пишешь на с++ то используй лучше в таких случаях string вместо массивов char[]

Автор: S3ndeR 15.6.2008, 17:46
Рассказываю: это задание я делал на примере похожего. В инсте была курсовая с такими заданиями, я своё задание делал с большой помощью преподавателя, она практически всё написала сама, в том числе и эти вот INFO[], хотя я слабо понял для его это тут. Поэтому данное задание делал просто немного изменяя/дополняя код от похожей задачки. Сам я в C++ не силён, поэтому делал тем способом которым знал. Поэтому, LavYaAll,  на твои вопросы про INFO[] и прочее я толком ответить не смогу. smile Но за код с максимальным значением спасибо.)
Теперь susanin, тебе тоже огромное спасибо, всё работает. Вот только есть вопрос. Что делает строка 4 (using namespace std;) ? Она нужна для того что бы сделать стрингом tovar и прочие переменные ?

ЗЫ - еще раз ОГРОМНОЕ вам спасибо.)

Автор: susanin 15.6.2008, 17:51
S3ndeR ,строка using namespace std говорит что библиотеки надо брать из стандартного пространства имен... заметь, у меня написано include <iostream> а не <iostream.h>....

Добавлено через 1 минуту и 44 секунды
Цитата(S3ndeR @  15.6.2008,  17:46 Найти цитируемый пост)
для того что бы сделать стрингом tovar

подключается библиотека <string>.... это отдельный тип переменной...

Автор: S3ndeR 15.6.2008, 18:00
ок. а что тогда надо сделать, что бы было написано <iostream.h> и не было строки using namespace std ?
Если просто удалить эту строку и к инклюдам дописать .h , то ничего не работает.  

Автор: susanin 15.6.2008, 18:05
S3ndeR, а чем тебе мешает эта строчка? 

Автор: LavYaAll 15.6.2008, 18:51
S3ndeR, 
Насчет задания, ясно.
Насчет кода. Если будешь использовать класс string, то использования std(хотя бы 1 раз) не избежать.

Автор: S3ndeR 15.6.2008, 18:55
2susanin: да в принципе ничем. Она мне даже нравится.) Просто думаю вдруг препод скажет сделать без этой строки или спросит что она делает.
Ну ладно, думаю всё норм будет.  smile 
2LavYaAll: аа, вот оно в чем дело. Теперь понятно.)
Спасибо.

Автор: susanin 15.6.2008, 18:56
S3ndeR, думаю что просить сделать без нее не потребует, а что эта строчка делает мы тебе уже кажется объяснили! smile 

Автор: S3ndeR 15.6.2008, 19:01
Ну да, всё теперь понятно.  smile 

Автор: anatox91 15.6.2008, 19:45
Цитата(S3ndeR @  15.6.2008,  18:55 Найти цитируемый пост)
2susanin: да в принципе ничем. Она мне даже нравится.) Просто думаю вдруг препод скажет сделать без этой строки или спросит что она делает.

скажи тогда что это подключается пространство имен std  smile 
а лучше сделать так
Код

using std::string;
using std::cout;
using std::cin;
using std::endl;

 smile  (хотя конечно в идеале лучше обращаться к ним через std::, без using'a)

Автор: susanin 15.6.2008, 19:52
Цитата(anatox91 @  15.6.2008,  19:45 Найти цитируемый пост)
а лучше сделать так

согласен! smile  
зачем тащить лишний мусор в программу... но для новичка я думаю и так пойдет...

Автор: Rififi 16.6.2008, 12:23
Цитата(S3ndeR @  15.6.2008,  15:45 Найти цитируемый пост)
Вобщем то не получается у меня решить только последнюю часть задания (вывести название товара(ов), цена которых не превышает Х руб.).


Код
// сравнение цены
template <typename T>
struct less_price : public std::unary_function<T, bool>
{
    less_price(int price) : price_(price) {}
    bool operator()(const T& product) const
    { return product.cena < price_; }
    const int price_;
};

// вывод на экран названия товара
template <typename O>
inline O& operator<< (O& os, const Supermarket& prod)
{
    return os << prod.tovar;
}

// вывод на экран товаров, цена которых меньше указанной
void print(const Supermarket* arr, const size_t N, const int price)
{
    std::remove_copy_if(arr, arr+N, std::ostream_iterator<Supermarket>(std::cout, " "), std::not1(less_price<Supermarket>(price)));
    std::cout << std::endl;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)