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

Дейтел - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.62
undertacker
 Аватар для undertacker
9 / 9 / 0
Регистрация: 28.04.2013
Сообщений: 55
30.04.2013, 00:48     Дейтел #1
Используйте двумерный массив для решения следующей задачи. Компания
имеет четырех продавцов (их номера с 1 по 4), которые продают 5 разных продуктов
(их номера с 1 по 5). Раз в день каждый продавец заносит в регистрационную
карточку (отдельную для каждого типа проданных продуктов) следующие
сведения:
1. Номер продавца.
2. Номер продукта.
3. Общую выручку в долларах за проданный в этот день продукт.
Таким образом, каждый продавец заполняет от 0 до 5 карточек продажи в день.
Допустим, что в наличии имеется информация обо всех регистрационных
карточках за последний месяц. Напишите программу, которая считывает всю эту
информацию о продажах за последний месяц и суммирует общую продажу по
продуктам и по продавцам. Все итоги должны храниться в двумерном массиве
sales. После обработки всей информации за последний месяц, напечатайте
результат в табулированном формате, представляя в каждом столбце отдельного
продавца и в каждой строке отдельный продукт. Общий итог каждой строки
должен давать сумму продаж каждого продукта за последний месяц; общий итог
каждого столбца должен давать сумму продаж каждого продавца за последний
месяц. Ваши табулированные выходные данные должны включать эти итоги
справа от суммируемых строк и внизу суммируемых столбцов.

вообщем скорей всего не пойму условия, может кто-то делал уже такое, есть решение или просто понять ход решения , заранее спасибо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
30.04.2013, 09:31     Дейтел #2
Крайне примитивно:
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
#include <ctime>
#include <cstdlib>
#include <iostream>
#include <iomanip>
 
void printSalesCard(int salesCard[][3], int numberOfRows) {
  std::cout <<
    "+----------+----------+----------+" << std::endl <<
    "| Salesman |  Article |    Total |" << std::endl <<
    "+----------+----------+----------+" << std::endl;
  for (int i = 0; i < numberOfRows; ++i) {
    std::cout << "| " <<
      std::setw(8) << salesCard[i][0] + 1 << " | " <<
      std::setw(8) << salesCard[i][1] + 1 << " | " <<
      std::setw(8) << salesCard[i][2] << " |" << std::endl;
  }
  std::cout << "+----------+----------+----------+" << std::endl;
}
 
void printSalesTableHorizontalLine(int width) {
  for (int i = -1; i < width; ++i) {
    std::cout << "+-------";
  }
  std::cout << "+" << std::endl;
}
 
void printSalesTableHeader(int width) {
  printSalesTableHorizontalLine(width + 1);
  std::cout << "|      ";
  for (int i = 0; i < width; ++i) {
    std::cout << " | " << std::setw(5) << (i + 1);
  }
  std::cout << " | Total |" << std::endl;
  printSalesTableHorizontalLine(width + 1);
}
 
template <int HEIGHT, int WIDTH>
int rowSum(int (&salesTable)[HEIGHT][WIDTH], int row) {
  int result = 0;
  for (int i = 0; i < WIDTH; ++i) {
    result += salesTable[row][i];
  }
  return result;
}
 
template <int HEIGHT, int WIDTH>
int colSum(int (&salesTable)[HEIGHT][WIDTH], int col) {
  int result = 0;
  for (int i = 0; i < HEIGHT; ++i) {
    result += salesTable[i][col];
  }
  return result;
}
 
template <int HEIGHT, int WIDTH>
int tableSum(int (&salesTable)[HEIGHT][WIDTH]) {
  int result = 0;
  for (int i = 0; i < HEIGHT; ++i) {
    for (int j = 0; j < WIDTH; ++j) {
      result += salesTable[i][j];
    }
  }
  return result;
}
 
template <int HEIGHT, int WIDTH>
void printTotalByColumn(int (&salesTable)[HEIGHT][WIDTH]) {
  printSalesTableHorizontalLine(WIDTH + 1);
  std::cout << "| Total";
  for (int i = 0; i < WIDTH; ++i) {
    std::cout << " | " << std::setw(5) << colSum(salesTable, i);
  }
  std::cout << " | " << std::setw(5) << tableSum(salesTable) << " |" <<
    std::endl;
  printSalesTableHorizontalLine(WIDTH + 1);
}
 
template <int HEIGHT, int WIDTH>
void printSalesTable(int (&salesTable)[HEIGHT][WIDTH]) {
  printSalesTableHeader(WIDTH);
 
  for (int i = 0; i < HEIGHT; ++i) {
    std::cout << "| " << std::setw(5) << (i + 1);
    for (int j = 0; j < WIDTH; ++j) {
      std::cout << " | " << std::setw(5) << salesTable[i][j];
    }
    std::cout << " | " << std::setw(5) <<
      rowSum(salesTable, i) << " | " << std::endl;
  }
 
  printTotalByColumn(salesTable);
}
 
int main(int argc, char *argv[]) {
  srand(time(0));
 
  const int numberOfSalesmen = 4;
  const int numberOfArticles = 5;
 
  // карта продаж
  int salesCard[numberOfSalesmen * numberOfArticles][3];
 
  // установка продаж случайным образом
  for (int i = 0; i < numberOfSalesmen; ++i) {
    for (int j = 0; j < numberOfArticles; ++j) {
      int currentRowIndex = i * numberOfArticles + j;
      salesCard[currentRowIndex][0] = i;
      salesCard[currentRowIndex][1] = j;
      salesCard[currentRowIndex][2] = rand() % 100;
    }
  }
  
  // вывод на экран
  printSalesCard(salesCard, numberOfSalesmen * numberOfArticles);
  
  // таблица продаж
  int salesTable[numberOfArticles][numberOfSalesmen];
 
  // заполнение таблицы продаж
  for (int i = 0; i < numberOfSalesmen * numberOfArticles; ++i) {
    // наивно не проверяем, находятся ли индексы в допустимом
    // диапазоне
    salesTable[salesCard[i][1]][salesCard[i][0]] = salesCard[i][2];
  }
  
  printSalesTable(salesTable);
 
  return 0;
}
undertacker
 Аватар для undertacker
9 / 9 / 0
Регистрация: 28.04.2013
Сообщений: 55
30.04.2013, 14:33  [ТС]     Дейтел #3
lemegeton, спасибо конечно, но я не сам код хотел, но кое-чему научился)
есть то, что еще не учил
например
C++
1
2
3
4
5
template <int HEIGHT, int WIDTH> // не понял 
int rowSum(int (&salesTable)[HEIGHT][WIDTH], int row) { // не понял
  int result = 0;
  for (int i = 0; i < WIDTH; ++i) {
    result += salesTable[row][i];
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11823 / 6802 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
01.05.2013, 00:22     Дейтел #4
Цитата Сообщение от undertacker Посмотреть сообщение
C++
1
template <int HEIGHT, int WIDTH> // не понял
шаблон с двумя параметрами

Цитата Сообщение от undertacker Посмотреть сообщение
C++
1
int (&salesTable)[HEIGHT][WIDTH]
salesTable - ссылка на двумерный массив

Дойдете до шаблонов, будет понятнее
undertacker
 Аватар для undertacker
9 / 9 / 0
Регистрация: 28.04.2013
Сообщений: 55
01.05.2013, 16:59  [ТС]     Дейтел #5
lemegeton, и где описана переменная width
Цитата Сообщение от lemegeton Посмотреть сообщение
void printSalesTableHorizontalLine(int width)
не понял как работает
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
02.05.2013, 00:36     Дейтел #6
Цитата Сообщение от undertacker Посмотреть сообщение
lemegeton, и где описана переменная width
Эмм... Кэп как бы намекает, что переменная описана там, где объявлена. В описании объявления функции...
C++
1
void printSalesTableHorizontalLine(int width) {
Цитата Сообщение от undertacker Посмотреть сообщение
не понял как работает
По-дурацки работает. Рисует разделительную линию. С плюсиками. На один плюсик больше запрошенного.
undertacker
 Аватар для undertacker
9 / 9 / 0
Регистрация: 28.04.2013
Сообщений: 55
02.05.2013, 18:07  [ТС]     Дейтел #7
lemegeton, блин, стыдно, прости) но ничего только учусь)

Добавлено через 6 часов 6 минут
lemegeton, все же... чему равна переменная width, row, col
и как они работают , если мы им не даем никаких значений?
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
02.05.2013, 22:51     Дейтел #8
Это параметры функции. И значения они получают при вызове функции. Перечитайте самые основы про функции.
undertacker
 Аватар для undertacker
9 / 9 / 0
Регистрация: 28.04.2013
Сообщений: 55
04.05.2013, 13:35  [ТС]     Дейтел #9
lemegeton, почитал, но так и не понял как именно работает, если эти ф-ии не вызываются, я не понял как, если не сложно прокоментируй код, спасибо
undertacker
 Аватар для undertacker
9 / 9 / 0
Регистрация: 28.04.2013
Сообщений: 55
08.05.2013, 01:12  [ТС]     Дейтел #10
может кто-либо другой знает как?
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
08.05.2013, 01:58     Дейтел #11
undertacker, Я делал какой параграф и номер задачи скажи я тебе покажу свое примитивное решение.

Добавлено через 21 минуту
Нашол какая задача.
Ну ты я уже так смотрю далеко дошол 7 глава.
Я сам по Дейтелу С++ учил.
Вот код год назад делал. Гомнокодец. Даже сейчас не смотрел чо там написано . Мне в то время было главное просто сделать.
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
//Использование двумерного массива для решения задачи
#include <iostream>
using std::cout;
using std::endl;
 
#include <cstdlib>//содержит прототипы функций для srand и rand
using std::rand;
using std::srand;
 
#include <ctime>//содержит прототип для функции time
using std::time;
 
int main()
{
    //засеять генератор случайных чисел текущим временем 
    srand(time(0));
    int sales[5][4]={0};
    int mas[100][3]={0};
    for(int i=0;i<100;i++)
        for(int j=0;j<3;j++)
        {
            if(j==0)
                mas[i][j]=0+rand()%4;//продавец(от 1 до 4)
            if(j==1)
                mas[i][j]=0+rand()%5;//товар(от 1 до 5)
            if(j==2)
                mas[i][j]=10+i*2*j;//сумма продажы   
        }
    for(int i=0;i<100;i++)
        for(int j=0;j<3;j++)
        {
            cout <<"mas["<<i<<"]["<<j<<"]= "<<mas[i][j]<<endl;   
        }
    for(int i=0;i<100;i++)
        sales[mas[i][0]][mas[i][0+1]]=mas[i][0+2];
        
    for(int i=0;i<4;i++)
        for(int j=0;j<5;j++)
        {
            cout <<"sales["<<i<<"]["<<j<<"]= "<<sales[i][j]<<endl;   
        } 
    for(int i=0;i<4;i++)
    {
        int sum=0;
        cout <<i+1<<" ";
        for(int j=0;j<5;j++)
        {
            cout <<sales[i][j]<<" "; 
            sum+=sales[i][j];  
        } 
        cout <<sum<<endl;
    } 
        
    
    return 0;   
}
undertacker
 Аватар для undertacker
9 / 9 / 0
Регистрация: 28.04.2013
Сообщений: 55
08.05.2013, 14:07  [ТС]     Дейтел #12
спасибо, но мне не понятно как
lemegeton, использует шаблоны, не подключая их. В Дейтеле сказано, что шаблоны необходимо создавать в отдельном файле, и при их необходимости просто вызывать в ф-ии, а тут он не создал отдельного файла и получается, что работает вот и не пойму как это...
вот как я понял данный код
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
#include <ctime>
#include <cstdlib>
#include <iostream>
#include <iomanip>
 
void printSalesCard(int salesCard[][3], int numberOfRows) { // задаем 2 параметра, 1 массив 2 количество строк
  std::cout <<
    "+----------+----------+----------+" << std::endl <<
    "| Salesman |  Article |    Total |" << std::endl <<
    "+----------+----------+----------+" << std::endl;
  for (int i = 0; i < numberOfRows; ++i) {
    std::cout << "| " <<
      std::setw(8) << salesCard[i][0] + 1 << " | " << // продавец
      std::setw(8) << salesCard[i][1] + 1 << " | " << // товар + 1 для того, что бы начиналось с 1
      std::setw(8) << salesCard[i][2] << " |" << std::endl; // рандомом любое число 
  }
  std::cout << "+----------+----------+----------+" << std::endl;
}
 
void printSalesTableHorizontalLine(int width) { // тут мы делаем рамочку, не понял откуда width и чему равно оно 
  for (int i = -1; i < width; ++i) { 
    std::cout << "+-------";
  }
  std::cout << "+" << std::endl;
}
 
void printSalesTableHeader(int width) {
  printSalesTableHorizontalLine(width + 1);
  std::cout << "|      ";
  for (int i = 0; i < width; ++i) {
    std::cout << " | " << std::setw(5) << (i + 1);  // продавцы ( их номера )
  }
  std::cout << " | Total |" << std::endl; 
  printSalesTableHorizontalLine(width + 1); // мы зделали подчеркивание ( ниже тотала )
}
 
template <int HEIGHT, int WIDTH>
int rowSum(int (&salesTable)[HEIGHT][WIDTH], int row) { // делаем ссылку на salesTable salesTable [Article][Prodavec], чему равно row ???
  int result = 0;
  for (int i = 0; i < WIDTH; ++i) {  
    result += salesTable[row][i]; // как я понял считается сумма строк 
  }
  return result;
}
 
template <int HEIGHT, int WIDTH>
int colSum(int (&salesTable)[HEIGHT][WIDTH], int col) {
  int result = 0;
  for (int i = 0; i < HEIGHT; ++i) {
    result += salesTable[i][col];// как я понял считается сумма столбцов  
  }
  return result; //как єто все работает не пойму...
}
 
template <int HEIGHT, int WIDTH>
int tableSum(int (&salesTable)[HEIGHT][WIDTH]) {
  int result = 0;
  for (int i = 0; i < HEIGHT; ++i) {
    for (int j = 0; j < WIDTH; ++j) {
      result += salesTable[i][j]; // общая сумма 
    }
  }
  return result;
}
 
template <int HEIGHT, int WIDTH> // не понял как работает
void printTotalByColumn(int (&salesTable)[HEIGHT][WIDTH]) {
  printSalesTableHorizontalLine(WIDTH + 1);
  std::cout << "| Total";
  for (int i = 0; i < WIDTH; ++i) {
    std::cout << " | " << std::setw(5) << colSum(salesTable, i);
  }
  std::cout << " | " << std::setw(5) << tableSum(salesTable) << " |" <<
    std::endl;
  printSalesTableHorizontalLine(WIDTH + 1);
}
 
template <int HEIGHT, int WIDTH> // не понял как работает
void printSalesTable(int (&salesTable)[HEIGHT][WIDTH]) {
  printSalesTableHeader(WIDTH);
 
  for (int i = 0; i < HEIGHT; ++i) {
    std::cout << "| " << std::setw(5) << (i + 1);
    for (int j = 0; j < WIDTH; ++j) {
      std::cout << " | " << std::setw(5) << salesTable[i][j];
    }
    std::cout << " | " << std::setw(5) <<
      rowSum(salesTable, i) << " | " << std::endl;
  }
 
  printTotalByColumn(salesTable);
}
 
int main(int argc, char *argv[]) {
  srand(time(0));
 
  const int numberOfSalesmen = 4; //продавцов 
  const int numberOfArticles = 5;//продуктов 
 
  // карта продаж
  int salesCard[numberOfSalesmen * numberOfArticles][3]; 
 
  // установка продаж случайным образом
  for (int i = 0; i < numberOfSalesmen; ++i) { // для вывода строк 
    for (int j = 0; j < numberOfArticles; ++j) { // для вывода столбцов 
      int currentRowIndex = i * numberOfArticles + j; 
      salesCard[currentRowIndex][0] = i;
      salesCard[currentRowIndex][1] = j;
      salesCard[currentRowIndex][2] = rand() % 100;
    }
  }
  
  // вывод на экран
  printSalesCard(salesCard, numberOfSalesmen * numberOfArticles);
  
  // таблица продаж
  int salesTable[numberOfArticles][numberOfSalesmen];
 
  // заполнение таблицы продаж
  for (int i = 0; i < numberOfSalesmen * numberOfArticles; ++i) {
    // наивно не проверяем, находятся ли индексы в допустимом
    // диапазоне
    salesTable[salesCard[i][1]][salesCard[i][0]] = salesCard[i][2];
  }
  
 printSalesTable(salesTable);
 system("Pause void");
  return 0;
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11823 / 6802 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
08.05.2013, 14:40     Дейтел #13
Цитата Сообщение от undertacker Посмотреть сообщение
В Дейтеле сказано, что шаблоны необходимо создавать в отдельном файле, и при их необходимости просто вызывать в ф-ии, а тут он не создал отдельного файла и получается, что работает вот и не пойму как это...
Написанно, что обязательно должен быть в отдельном файле?
C++
1
2
template <int HEIGHT, int WIDTH>
void printSalesTable(int (&salesTable)[HEIGHT][WIDTH])
Шаблонная функция описана.
undertacker
 Аватар для undertacker
9 / 9 / 0
Регистрация: 28.04.2013
Сообщений: 55
08.05.2013, 15:19  [ТС]     Дейтел #14
Croessmah, значит я наверное до этого еще не дошел. Не знаю как она работает.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
08.05.2013, 18:11     Дейтел #15
Цитата Сообщение от undertacker Посмотреть сообщение
если эти ф-ии не вызываются
Стоп. Как это не вызываются? Каждая описанная функция в моем коде вызывается. С параметрами. Вот эти параметры в коде функции и используются.

rowSum, например, используется в коде функции printSalesTable.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <int HEIGHT, int WIDTH>
void printSalesTable(int (&salesTable)[HEIGHT][WIDTH]) {
  printSalesTableHeader(WIDTH);
 
  for (int i = 0; i < HEIGHT; ++i) {
    std::cout << "| " << std::setw(5) << (i + 1);
    for (int j = 0; j < WIDTH; ++j) {
      std::cout << " | " << std::setw(5) << salesTable[i][j];
    }
    std::cout << " | " << std::setw(5) <<
      rowSum(salesTable, i) << " | " << std::endl;
  }
 
  printTotalByColumn(salesTable);
}
Добавлено через 58 секунд
С шаблонами я сделал потому, что просто так многомерный массив в функцию не передать без указаний его границ (кроме последней) константыми выражениями. А с помощью шаблонов можно.

Добавлено через 1 минуту
Цитата Сообщение от undertacker Посмотреть сообщение
В Дейтеле сказано, что шаблоны необходимо создавать в отдельном файле
Неправда. Во-первых, так не сказано, во вторых, это и не является необходимым.

Перечитайте. Если сказано, что шаблонный класс/функция должны обязательно быть описаны в отдельном файле, то выбросьте нафиг эту книгу, она вам врет.
Смотрите не перепутайте "должен" с "может быть".
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
08.05.2013, 18:18     Дейтел #16
undertacker, В lemegeton У него там сильно сложно. Попробуй мой пример там без шаблонов попроще.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2013, 11:09     Дейтел
Еще ссылки по теме:

C++ Непонятный пример из книги Дейтел Как программировать на C++
C++ Где можно купить эту книгу Дейтел Х., Дейтел П. - Как программировать на C++?
C++ Классовая диаграмма (Дейтел контр. вопр)

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

Или воспользуйтесь поиском по форуму:
undertacker
 Аватар для undertacker
9 / 9 / 0
Регистрация: 28.04.2013
Сообщений: 55
09.05.2013, 11:09  [ТС]     Дейтел #17
ninja2, да, спасибо, но не в этом дело, я просто хочу понять как метод lemegeton, работает.
Yandex
Объявления
09.05.2013, 11:09     Дейтел
Ответ Создать тему
Опции темы

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