Форум программистов, компьютерный форум CyberForum.ru

Структуры, С++. Нужна небольшая подсказка - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.86
vlados92
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 28
23.03.2011, 14:04     Структуры, С++. Нужна небольшая подсказка #1
Вывод на консоль сформированной ведомости и выписки из ведомости для видов продукции, объем поставки которых в стоимостном выражении находится в интервале, границы которого вводятся с консоли.
Записи ведомостей должны быть отсортированы по возрастанию
объема поставки в стоимостном выражении.

Непойму что неправильно когда делаю интервал объёма поставки! Когда нажимаю любой символ, то нормально задаю интервал. Но когда нажимаю 0, тоже просит задавать интервал! Что неправильного? Как лучше сделать? Исправьте код пожалуйста.


sdfef.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#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;
}
 
[size="1"][color="grey"][I]Добавлено через 35 секунд[/I][/color][/size]
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

 Комментарий модератора 
Используйте теги форматирования кода и не дублируйте темы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2011, 14:04     Структуры, С++. Нужна небольшая подсказка
Посмотрите здесь:

Композиция (Нужна подсказка) C++
C++ нужна подсказка
Строки, нужна подсказка. C++
Нужна подсказка в разборе структуры файла C++
Нужна подсказка с ответами! C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vlados92
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 28
24.03.2011, 14:27  [ТС]     Структуры, С++. Нужна небольшая подсказка #2
Никто не знает? Помогите плиз
MopkoBHblu
10 / 10 / 0
Регистрация: 23.03.2011
Сообщений: 63
24.03.2011, 14:57     Структуры, С++. Нужна небольшая подсказка #3
может фигурных скобочек добавить в функции prnt?
vlados92
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 28
24.03.2011, 21:25  [ТС]     Структуры, С++. Нужна небольшая подсказка #4
Можете написать как правильно должен выглядеть код чтобы правильно работало!
MopkoBHblu
10 / 10 / 0
Регистрация: 23.03.2011
Сообщений: 63
24.03.2011, 21:45     Структуры, С++. Нужна небольшая подсказка #5
xD
ты наворотил - ты и исправляй xD у тебя мрачное форматирование кода и мне очень неприятно его читать.

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

C++
1
2
3
4
5
6
7
int g = 1
 
   if ( g > 3)
      cout << "G > 3";
      cout << "G is much larger than 3";
 
   cout << "Thats was simple..."
В этом случае, инструкция cout << "G > 3"; не будет выполнена, а следующие за ней будут выполнены.

C++
1
2
3
4
5
6
7
8
int g = 1
 
   if ( g > 3) {
      cout << "G > 3";
      cout << "G is much larger than 3";
   }
 
   cout << "Thats was simple..."
В этом случае, инструкции помещенные в фигурные скобки не будут выполнены, а инструкция cout << "Thats was simple..." будет.

Осознал? Тебе твой if в функции prnt нужно будет ПРАВИЛЬНО ограничить фигурными скобками...
vlados92
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 28
24.03.2011, 21:53  [ТС]     Структуры, С++. Нужна небольшая подсказка #6
С моим кодом если правильно поставить скобки работать будет?
MopkoBHblu
10 / 10 / 0
Регистрация: 23.03.2011
Сообщений: 63
24.03.2011, 22:05     Структуры, С++. Нужна небольшая подсказка #7
Цитата Сообщение от vlados92 Посмотреть сообщение
С моим кодом если правильно поставить скобки работать будет?
насчет полной работоспособности ничего не скажу, не вчитывался, но это спасет тебя от проблемы не работающего выбора...
vlados92
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 28
25.03.2011, 00:57  [ТС]     Структуры, С++. Нужна небольшая подсказка #8
if (how!='0') {

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

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

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

Вот так нужно чтобы было?
MopkoBHblu
10 / 10 / 0
Регистрация: 23.03.2011
Сообщений: 63
25.03.2011, 08:11     Структуры, С++. Нужна небольшая подсказка #9
Цитата Сообщение от vlados92 Посмотреть сообщение
if (how!='0') {

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

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

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

Вот так нужно чтобы было?
нет... тебе нужно ограничить всю область проверки интервала...
vlados92
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 28
25.03.2011, 10:28  [ТС]     Структуры, С++. Нужна небольшая подсказка #10
Можешь пожалуйста вчитаться в код и сделать так как надо, а то ничего не получается
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
25.03.2011, 11:53     Структуры, С++. Нужна небольшая подсказка #11
Цитата Сообщение от vlados92 Посмотреть сообщение
for (interv=min; interv<=max; interv++);
Убийственная строчка.)))
interv = max+1 написать слабо? .)))
vlados92
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 28
25.03.2011, 21:03  [ТС]     Структуры, С++. Нужна небольшая подсказка #12
Пожалуйста, можете исправить код так чтобы все правильно работало.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
26.03.2011, 05:44     Структуры, С++. Нужна небольшая подсказка #13
Вообще не пойму, что программа делает. Строка 141-145 удручает.
Попробуй описать алгоритм человеческими словами, может поймёшь в чём ошибка.
Читать листинг бесполезно, там непонятное неполно-что.
vlados92
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 28
26.03.2011, 09:58  [ТС]     Структуры, С++. Нужна небольшая подсказка #14
В задании написано что должна программа делать! Можешь под такое условие исправить?
MopkoBHblu
10 / 10 / 0
Регистрация: 23.03.2011
Сообщений: 63
26.03.2011, 10:00     Структуры, С++. Нужна небольшая подсказка #15
Цитата Сообщение от vlados92 Посмотреть сообщение
В задании написано что должна программа делать! Можешь под такое условие исправить?
ты, ведь не сам писал ее??? как можно такие банальные ошибки допустить написав такую кучу? xD
vlados92
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 28
26.03.2011, 10:05  [ТС]     Структуры, С++. Нужна небольшая подсказка #16
Какие ошибки? 141 строка это мне нужно чтобы в таблице вывело только те названия объм которых находится в промежутке который я ввожу с клавиатуры.
Ничего не пойму что не правильно.

Добавлено через 1 минуту
Чтобы удостоверились что сам можете любую строку спросить что делает, я объясню.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
26.03.2011, 10:06     Структуры, С++. Нужна небольшая подсказка #17
Ничего не пойму что не правильно.
Извиняюсь.) Не разглядел, что это одна строка. Скроллом не пользуюсь.)
vlados92
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 28
26.03.2011, 10:10  [ТС]     Структуры, С++. Нужна небольшая подсказка #18
Можешь выставить код чтобы правильно было
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
26.03.2011, 10:25     Структуры, С++. Нужна небольшая подсказка #19
Строка 133.

Добавлено через 3 минуты
Цикл 141 выводит шапку таблицы max-min раз. Смысл?

Добавлено через 2 минуты
Весь диапазон не выводится (когда 0), т.к. не инициализируются min, max для всего диапазона.
Скобочки поставь, короче, где положено.
Вообще, всегда ставь скобочки. Если не можешь корректно скобочки опускать, лучше всегда их рисуй. Две строчки текста не стоят стольких проблем.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.03.2011, 10:32     Структуры, С++. Нужна небольшая подсказка
Еще ссылки по теме:

C++ нужна подсказка
Нужна подсказка C++
While(i<=n) b[i]=a[i] i++. Нужна подсказка( C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
MopkoBHblu
10 / 10 / 0
Регистрация: 23.03.2011
Сообщений: 63
26.03.2011, 10:32     Структуры, С++. Нужна небольшая подсказка #20
Во-первых: у тебя проверка на попадание продукции в интервал, проходит после вывода результата.
Не думаешь что здесь есть определенное противоречие? Может сделать проверку сразу и не выводить эти тупые, никому не нужные, пустые таблицы???

Во-вторых: Прочитай мой пост о условном выборе. Оператор if у тебя не ограничивает никакую область. Т.е. если выбор пользователя не равен нулю, он абсолютно ничего не значит, но и если выбор пользователя равен нулю, он так же ничего не значит.

C++
1
2
3
4
5
6
7
8
9
10
11
void main(void) {
...
int intChoice;
 
   cout << "Please input your choice:" << endl;
   cin >> intChoice;
      if (intChoice) prnt(produkcia, how, n);  // так оператор if можно записывать, если у тебя только
                                                           // одна инструкция после него, если больше, то тебе
                                                           // нужно ограничить их все
...
}

Тебе же лучше делать всегда вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void main(void) {
...
int intChoice;
 
   cout << "Please input your choice:" << endl;
   cin >> intChoice;
 
      if (intChoice) {
 
         cout << "Your choice was 1. Results going to be printed..." << endl;
         prnt(produkcia, how, n);
 
      } else {
 
         cout << "Your choice was 0. Programm will be terminated" << endl;
 
      };
...
}
Используй в коде логичные переносы на новую строку, а не везде где попала, разделяй функциональные части между собой, чтобы они не сливались в одну. И никогда, повторяю, никогда не используй рунглиш xD лучше подучить английский.

Добавлено через 34 секунды
Цитата Сообщение от Deviaphan Посмотреть сообщение
Строка 133.

Добавлено через 3 минуты
Цикл 141 выводит шапку таблицы max-min раз. Смысл?

Добавлено через 2 минуты
Весь диапазон не выводится (когда 0), т.к. не инициализируются min, max для всего диапазона.
Скобочки поставь, короче, где положено.
Вообще, всегда ставь скобочки. Если не можешь корректно скобочки опускать, лучше всегда их рисуй. Две строчки текста не стоят стольких проблем.
Опердил ты меня xD
Yandex
Объявления
26.03.2011, 10:32     Структуры, С++. Нужна небольшая подсказка
Ответ Создать тему
Опции темы

Текущее время: 00:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru