Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2011, 13:59   #1
vlados92
Пользователь
 
Регистрация: 22.02.2011
Сообщений: 12
По умолчанию Структуры, С++. Нужна небольшая подсказка

Вывод на консоль сформированной ведомости и выписки из ведомости для видов продукции, объем поставки которых в стоимостном выражении находится в интервале, границы которого вводятся с консоли.
Записи ведомостей должны быть отсортированы по возрастанию
объема поставки в стоимостном выражении.


sdfef.cpp
#include <iostream>
#include <iomanip>
#include <locale.h>
#include "fun.h"

int main()
{
setlocale(LC_ALL,".1251");

int i,j,n;

do
{
cout << "Введите количество элементов продукции: ";
cin >> n;
}
while (n<1);

Postavki *produkcia = new Postavki [n];

//ввод данных с клавиатуры
inputprodukciaODZ(produkcia, n);

//сортировка
for (i=0; i<n-1; i++)
for (j=i+1; j<n; j++)
if ( (*(produkcia+i)).post > (*(produkcia+j)).post )
Pswap( produkcia+i, produkcia+j );

//выводить все или некоторые записи?
char how;
cout << endl << "Для вывода всего списка введите 0,\nдля выборочного вывода - любой другой символ: ";
cin >> how;
prnt(produkcia, how, n);

delete []produkcia;

cout << endl << endl;
system("pause");
return 0;
}



Непойму что неправильно когда делаю интервал объёма поставки! Когда нажимаю любой символ, то нормально задаю интервал. Но когда нажимаю 0, тоже просит задавать интервал! Что неправильного? Как лучше сделать? Исправьте код пожалуйста.
vlados92 вне форума Ответить с цитированием
Старый 23.03.2011, 14:00   #2
vlados92
Пользователь
 
Регистрация: 22.02.2011
Сообщений: 12
По умолчанию

fun.h


#ifndef FUN_H
#define FUN_H

using namespace std;

//объявление структуры
struct Postavki
{
char prod[15];
double shifr;
double post;
double cena;
double obem;
};

// циклы do-while предназначены для корректного ввода данных
void inputprodukciaODZ(Postavki produkcia[], const int n)
{
for (int i=0; i<n; i++)
{
cout << endl << "Ввод информации о " << (i+1) << " продукции:";

do
{
cin.clear();
cout << endl <<"Название продукции (не более 15 символов): ";
cin >> (*(produkcia+i)).prod;
}
while ( strlen((*(produkcia+i)).prod) > 15 );

do
{
cout << "Шифр продукции (числовой): ";
cin >> (*(produkcia+i)).shifr;
}
while ( (*(produkcia+i)).shifr < 0 );

do
{
cout << "Обьём поставки, шт: ";
cin >> (*(produkcia+i)).post;
}
while ( (*(produkcia+i)).post < 0 );

do
{
cout << "Оптовая цена, грн: ";
cin >> (*(produkcia+i)).cena;
}
while ( (*(produkcia+i)).cena < 0 );

(*(produkcia+i)).obem = (*(produkcia+i)).post * (*(produkcia+i)).cena;
}
}

//меняем местами два значения объёма
void dswap(double &a, double &b)
{
double tmp;
tmp=a;
a=b;
b=tmp;
}

//меняем местами две структуры
void Pswap(Postavki *i, Postavki *j)
{
char ctmp[15];
strcpy(ctmp, i->prod);
strcpy(i->prod, j->prod);
strcpy(j->prod, ctmp);

dswap( i->shifr, j->shifr);
dswap( i->post, j->post );
dswap( i->cena, j->cena );
dswap( i->obem, j->obem );
}

//конечный вывод
void prnt(const Postavki *produkcia, char how, const int n)
{
int interv=0, i, min, max;
bool is=0;
double shifrS=0, postS=0, cenaS=0, obemS=0;

//если выводить только некоторые, то какие?
if (how!='0')

cout << "Введите начальную границу интервала,\nв котором находится обьём поставки: ";
cin >> min;

cout << "Введите конечную границу интервала,\nв котором находится обьём поставки: ";
cin >> max;

for (interv=min; interv<=max; interv++)



cout << endl << "+------------------------------------------------------------------------------+"
<< endl << "| Обьём поставки продукции |"
<< endl << "|------------------------------------------------------------------------------|"
<< endl << "| № | Продукция | Шифр | Обьём поставки | Оптовая цена | Обьём |"
<< endl << "+------------------------------------------------------------------------------+";

for (i=0; i<n; i++)
{
if ( interv && interv < (*(produkcia+i)).post ) continue;

//есть записи, удовлетворяющие условию
is=1;

shifrS += (*(produkcia+i)).shifr;
postS += (*(produkcia+i)).post;
cenaS += (*(produkcia+i)).cena;
obemS += (*(produkcia+i)).obem;

cout << endl << "| " << setw(1) << (i+1)
<< " | " << setiosflags(ios::left) << setw(15) << (*(produkcia+i)).prod << setiosflags(ios::right)
<< " | " << setw(6) << setprecision(8) << (*(produkcia+i)).shifr
<< " | " << setw(14) << setprecision(8) << (*(produkcia+i)).post
<< " | " << setw(12) << setprecision(8) << (*(produkcia+i)).cena
<< " | " << setw(13) << setprecision(8) << (*(produkcia+i)).obem
<< " |";
}

//если ни одна запись не удовлетворяет условию
if ( !is && i==n )
cout << endl << "| Ни у одной продукции обьём продукции не меньше, |"
<< endl << "| чем сумма, введенная вами |";

else
{
cout << endl << "+------------------------------------------------------------------------------+"
<< endl << "| | ВСЕГО: | | "
<< setw(12) << setprecision(8) << postS << " | "
<< setw(12) << setprecision(8) << cenaS << " | "
<< setw(13) << setprecision(8) << obemS << " | ";
}

cout << endl << "+-------------------------------------------------------------------------------+";
}

#endif


СРЕДА РАЗРАБОТКИ Висуал Студио 2010
vlados92 вне форума Ответить с цитированием
Старый 24.03.2011, 14:26   #3
vlados92
Пользователь
 
Регистрация: 22.02.2011
Сообщений: 12
По умолчанию

никто не знает?
vlados92 вне форума Ответить с цитированием
Старый 24.03.2011, 14:57   #4
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Цитата:
Код:
//если выводить только некоторые, то какие?
if (how!='0')

cout << "Введите начальную границу интервала,\nв котором находится обьём поставки: ";
cin >> min;

cout << "Введите конечную границу интервала,\nв котором находится обьём поставки: ";
cin >> max;
операторные скобки где?! if работает только на первый cout.

И здесь:
Цитата:
Код:
for (interv=min; interv<=max; interv++)



cout << endl << "+------------------------------------------------------------------------------+"
<< endl << "| Обьём поставки продукции |"
<< endl << "|------------------------------------------------------------------------------|"
<< endl << "| № | Продукция | Шифр | Обьём поставки | Оптовая цена | Обьём |"
<< endl << "+------------------------------------------------------------------------------+";
У тебя в цикле будет несколько раз печататься шапка таблицы, а потом уйдет на следующий цикл.

И еще одно -- если ты хочешь получать ответы на свои вопросы, озаботься правильно оформлять код в сообщениях.
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 24.03.2011, 21:23   #5
vlados92
Пользователь
 
Регистрация: 22.02.2011
Сообщений: 12
По умолчанию

Можете написать как правильно должен выглядеть код чтобы правильно работало!
vlados92 вне форума Ответить с цитированием
Старый 25.03.2011, 21:03   #6
vlados92
Пользователь
 
Регистрация: 22.02.2011
Сообщений: 12
По умолчанию

Пожалуйста, можете исправить код так чтобы все правильно работало.
vlados92 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна небольшая подсказка. BobBarker Microsoft Office Excel 3 04.02.2011 23:18
Нужна небольшая подсказка по клавиатурному хуку LittleDimON Общие вопросы Delphi 0 16.02.2010 23:28