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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
lireg67
0 / 0 / 0
Регистрация: 03.06.2012
Сообщений: 7
#1

Олимпийские игры - C++

04.06.2012, 07:42. Просмотров 1080. Ответов 10
Метки нет (Все метки)

Разработать программу, которая подводит итоги Олимпийских игр. Программа должна получить от пользователя количество золотых, серебряных и бронзовых медалей, завоеванное каждой командой-участницей (принять количество команд равное 5). Далее по количеству медалей каждого достоинства необходимо вычислить соответствующее число очков команды. Количество очков вычисляется по следующему правилу: за золотую медаль команда получит семь очков, за серебряную — шесть, за бронзовую — пять очков. После таких расчетов список команд нужно упорядочить в соответствии с набранным количеством очков с помощью алгоритма сортировки обменом и вывести в диалоге. Построить также столбчатую диаграмму набранных очков с подписью названия каждой команды.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.06.2012, 07:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Олимпийские игры (C++):

Олимпийские игры - C++
Задача. Напишите программу, которая подводит итоги Олимпийских игр. Про-грамма должна получить от пользователя число медалей разного...

Олимпийские задачки - C++
Создать файл, в который записать не менее 20 целых чисел в диапазоне от -11 до 2. Вывести содержимое файла на экран. Предпоследний...

Олимпийские игры - Turbo Pascal
Сложные очень 1. Напишите программу, которая подводит итоги Олимпийских игр. Программа должна получить от пользователя число медалей...

Задача про Олимпийские Игры - C# WPF
Есть такая задача: Разработать программу, которая подводит итоги Олимпийских игр. Программа должна получить от пользователя...

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

Определить, проходили ли в заданный год олимпийские игры - Free Pascal
Нужна прога для вычисления когда проходили олимпийские игры 1 олимп были в 1986 г . 2 в 1900 каждие 4 года если пишеш год то чтоб...

10
ps10n1ck
54 / 48 / 2
Регистрация: 10.11.2010
Сообщений: 132
04.06.2012, 12:01 #2
для этого консольной программы достаточно? или нужно использование WinAPI или других библиотек для отображения GUI?
0
lireg67
0 / 0 / 0
Регистрация: 03.06.2012
Сообщений: 7
04.06.2012, 12:03  [ТС] #3
Да обычная консольная с коментариями
0
ps10n1ck
54 / 48 / 2
Регистрация: 10.11.2010
Сообщений: 132
04.06.2012, 12:46 #4
Цитата Сообщение от lireg67 Посмотреть сообщение
Да обычная консольная с коментариями
ближе к вечеру, или завтра утром выложу код с каментами....
1
ps10n1ck
54 / 48 / 2
Регистрация: 10.11.2010
Сообщений: 132
04.06.2012, 14:00 #5
с помощью алгоритма сортировки обменом и вывести в диалоге.
Тут я немного не понял по поводу вывода диалога, что за диалог? Просто вывод информации о командах в отсортированном виде по очкам?
Получается вот такой вот вариант:
Олимпийские игры
Построить также столбчатую диаграмму набранных очков с подписью названия каждой команды
и по поводу диаграммы, каким образом она должна выглядеть?
за 100% - берется наибольшее количество очков команды или общее количество очков?
1
ps10n1ck
54 / 48 / 2
Регистрация: 10.11.2010
Сообщений: 132
04.06.2012, 14:25 #6
По поводу диаграммы могу предложить горизонтальную столбчатую, что-то типа этого:
Название: data2.JPG
Просмотров: 116

Размер: 11.8 Кб
Или же опишите свой вариант.
Так же укажите: за 100% берется наибольшее количество очков команды или общее количество очков?
1
lireg67
0 / 0 / 0
Регистрация: 03.06.2012
Сообщений: 7
04.06.2012, 14:29  [ТС] #7
Оставьте как у вас в пример.
Если можно то тексты сделать на русском =)
Если возможно то обе диаграммы.Или 100% можно взять наибольшее количество очков.
0
ps10n1ck
54 / 48 / 2
Регистрация: 10.11.2010
Сообщений: 132
04.06.2012, 14:43 #8
ок, тогда утром (на данный момент просто времени нет) я выложу полный код с описанием
1
ps10n1ck
54 / 48 / 2
Регистрация: 10.11.2010
Сообщений: 132
04.06.2012, 21:11 #9
На данный момент имеется следующая картина:
Олимпийские игры
- ввод данных для команд
- вывод информации о командах
- сортировка методом "пузырька" (обменом)
- вывод диаграммы

Есть пару минусов:
- ввод названия команд только на английском (не помню уже как русский текст засунуть)
- криво отображается статистика (необходимо делать формат каждой строки отдельно - не сложно, но сейчас влом)
- нет проверки на введенные данные
Если эти минусы нужно устранить - тогда выложу код утром (ночью скорей всего доделаю), если эти минусы не играют значительной роли - выложу уже готовый код
1
lireg67
0 / 0 / 0
Регистрация: 03.06.2012
Сообщений: 7
04.06.2012, 21:58  [ТС] #10
Да в принципе можно и так. Спасибо.
0
ps10n1ck
54 / 48 / 2
Регистрация: 10.11.2010
Сообщений: 132
05.06.2012, 03:51 #11
Финальная версия (хотя ее можно улучшать и улучшать):
Олимпийские игры

Сам код:
[defines.h]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef DEFINES_H_
#define DEFINES_H_
 
typedef unsigned char UCHAR;
typedef unsigned short USHORT;
typedef unsigned int UINT;
 
const int nMaxTeamName = 30;                // максимальная длина названия команды
const int nTotalTeams = 5;                  // общее количество команд
const int nPtsPerGoldMedal = 7;         // очков за золотую медаль
const int nPtsPerSilverMedal = 6;       // очков за серебряную медаль
const int nPtsPerBronzeMedal = 5;       // очков за бронзовую медаль
 
#endif
[OlympicGames.h]
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
#ifndef OLYMPICGAMES_H_
#define OLYMPICGAMES_H_
 
 
#include <iostream>
#include <Windows.h>
#include "defines.h"
 
using std::cout;
using std::cin;
using std::endl;
 
// Структура для хранения данных о команде
struct OlympicTeamData{
    char pTeamName[nMaxTeamName];               // Название команды
    USHORT GoldMedals;                                  // Количество золотых медалей
    USHORT SilverMedals;                                // Количество серебрянных медалей
    USHORT BronzeMedals;                                // Количество бронзовых медалей
    USHORT nTotalPoints;                                // Количество очков команды
};
 
 
// прототип функции для ввода данных о команде
void EnterOlympicTeamData(OlympicTeamData DataArray[], int iTotalTeams);
 
// прототип функции нахождения максимального элемента в массиве
int iGetMaximumElement(OlympicTeamData DataArray[], int iTotalTeams);
 
// прототип функции для сортировки массива методом "пузырька"
void BubbleSortArray(OlympicTeamData DataArray[], int iTotalTeams);
 
// прототип функции для выравнивания текста (строки) по центру
void StringToCenter(char *cString, UINT iMaxLenght);
 
// прототип функции для отображения данных (статистики) о командах
void ShowOlympicTeamStats(OlympicTeamData DataArray[], int iTotalTeams);
 
// прототип функции для отображения данных в виде диаграммы
void ShowOlympicTeamChart(OlympicTeamData DataArray[], int iTotalTeams);
 
#endif
[OlympicGames.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
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
#include "OlympicGames.h"
 
/* =======================================================================================
Функция для ввода данных о команде
[in] DataArray[] - указатель на массив данных
[in] iTotalTeams - количество команд, для которых нужно ввести данные
======================================================================================= */
void EnterOlympicTeamData(OlympicTeamData DataArray[], int iTotalTeams){
    int iTmpCounter = 0;
    
    cout << "======== Введите информацию о командах ========" << endl;
    // запоминаем текущую кодировку ввода
    int cp = GetConsoleCP();
    // запоминаем текущую кодировку отображения ввода
    int cpo = GetConsoleOutputCP();
    // цикл ввода данных для всех команд
    while(iTmpCounter < iTotalTeams) {
        cout << "Название команды: ";
        // как установить правильную кодировку
        // [url]http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756.aspx[/url]
        // установка кодировки ввода
        SetConsoleCP(1251);
        // установка кодировки отображения ввода
        SetConsoleOutputCP(866);
        cin.getline(DataArray[iTmpCounter].pTeamName, nMaxTeamName);
        // возвращаем кодировку ввода в предыдущее значение
        SetConsoleCP(cp);
        // возвращаем кодировку отображения ввода в предыдущее значение
        SetConsoleOutputCP(cpo);
        // ввод данных о количестве медалей
        cout << "Количество золотых медалей: ";
        cin >> DataArray[iTmpCounter].GoldMedals;
        cout << "Количество серебряных медалей: ";
        cin >> DataArray[iTmpCounter].SilverMedals;
        cout << "Количество бронзовых медалей: ";
        cin >> DataArray[iTmpCounter].BronzeMedals;
        // вычисление очков команды исходя из количества медалей
        DataArray[iTmpCounter].nTotalPoints = DataArray[iTmpCounter].GoldMedals * nPtsPerGoldMedal +
            DataArray[iTmpCounter].SilverMedals * nPtsPerSilverMedal +
            DataArray[iTmpCounter].BronzeMedals * nPtsPerBronzeMedal;
        cout << endl;
 
        // очистка оставшихся символов в буффере ввода после cin.getline()
        cin.ignore();
        ++iTmpCounter;
    }
}
 
 
 
/* =======================================================================================
Функция для нахождения максимального элемента (максимальное количество очков) в массиве
[in] DataArray[] - указатель на массив данных
[in] iTotalTeams - количество команд, для которых нужно найти максимальное значение
======================================================================================= */
int iGetMaximumElement(OlympicTeamData DataArray[], int iTotalTeams){
    int iMaxElement = 0;
    int iTempCounter = 0;
    
    while(iTempCounter < iTotalTeams-1)
    {
        // проверяем если текущий максимальный элемент
        // меньше следующего элемента (количество очков) в массиве
        if(iMaxElement < DataArray[iTempCounter].nTotalPoints)
            // присваиваем его переменной
            iMaxElement = DataArray[iTempCounter].nTotalPoints;
 
        ++iTempCounter;
    }
 
    return iMaxElement;
}
 
 
 
/* =======================================================================================
Функция для сортировки массива методом "пузырька"
[in] DataArray[] - указатель на массив данных
[in] iTotalTeams - количество команд
======================================================================================= */
void BubbleSortArray(OlympicTeamData DataArray[], int iTotalTeams){
    // временная структура для обмена данными
    OlympicTeamData pTmpDataArray;
 
    for(int i = 0; i < iTotalTeams-1; ++i) {
        for(int j = 0; j < iTotalTeams-1; ++j) {
            // если текущий элемент (кол. очков) 
            // меньше следующего элемента (кол. очков) в массиве
            if(DataArray[j].nTotalPoints < DataArray[j+1].nTotalPoints) {
                // меняем местами эти элементы
                pTmpDataArray = DataArray[j+1];
                DataArray[j+1] = DataArray[j];
                DataArray[j] = pTmpDataArray;
            }
        }
    }
}
 
/* =======================================================================================
Функция для выравнивания текста (строки) по центру
[in] *cString - указатель на строку текста
[in] iMaxLenght - количество символов в общей строке (общая длина строки)
======================================================================================= */
void StringToCenter(char *cString, UINT iMaxLenght){
    // получаем длину текущей строки
    UINT iCurStringLenght = strlen(cString);
    // количество символов для вставки перед строкой
    UINT iBeginSpaceCounter = (iMaxLenght-iCurStringLenght)/2;
    // количество символов для вставки после строки
    UINT iEndSpaceCounter = iMaxLenght - iCurStringLenght - iBeginSpaceCounter;
    // вставка символа перед строкой
    for(UINT i = 0; i < iBeginSpaceCounter; ++i)
        cout << " ";
    // отображение строки
    cout << cString;
    // вставка символа после строки
    for(UINT i = 0; i < iEndSpaceCounter; ++i)
        cout << " ";
}
 
 
/* =======================================================================================
Функция для отображения данных (статистики) о командах
[in] DataArray[] - указатель на массив данных
[in] iTotalTeams - количество команд, для которых нужно выввести статистику
======================================================================================= */
void ShowOlympicTeamStats(OlympicTeamData DataArray[], int iTotalTeams){
    int iTmpCounter = 0;
    char cTmpBuf[10];
 
    cout << endl;
    cout << "+===========================================================================+" << endl;
    cout << "|                              Cтатистика команд                            |" << endl;
    cout << "|=======+==============================+========+=========+========+========|" << endl;
    cout << "| Место |       Название команды       | Золото | Серебро | Бронза |  Очки  |" << endl;
    cout << "+=======+==============================+========+=========+========+========+" << endl;
 
 
    // переменная iMaxLenght для функции StringToCenter() считается вручную для текущего столбика
    // считается количество знаков в текущем столбике не учитывая знаки "|"
    // например:
    // |       Название команды       |
    // |<---------- 30 -------------->|
    // StringToCenter(x, 30);
    while(iTmpCounter < iTotalTeams) {
        cout    << "|";
        sprintf_s(cTmpBuf, 10, "%d", iTmpCounter+1);
        StringToCenter(cTmpBuf, 7);
        cout    << "|";
        StringToCenter(DataArray[iTmpCounter].pTeamName, 30);
        cout    << "|";
        sprintf_s(cTmpBuf, 10, "%d", DataArray[iTmpCounter].GoldMedals);
        StringToCenter(cTmpBuf, 8);
        cout    << "|";
        sprintf_s(cTmpBuf, 10, "%d", DataArray[iTmpCounter].SilverMedals);
        StringToCenter(cTmpBuf, 9);
        cout    << "|";
        sprintf_s(cTmpBuf, 10, "%d", DataArray[iTmpCounter].BronzeMedals);
        StringToCenter(cTmpBuf, 8);
        cout    << "|";
        sprintf_s(cTmpBuf, 10, "%d", DataArray[iTmpCounter].nTotalPoints);
        StringToCenter(cTmpBuf, 8);
        cout    << "|" << endl;
        ++iTmpCounter;
    }
    cout << "+=======+==============================+========+=========+========+========+" << endl;
}
 
 
 
/* =======================================================================================
Функция для отображения данных в виде диаграммы
[in] DataArray[] - указатель на массив данных
[in] iTotalTeams - количество команд, для которых нужно построить диаграмму
[in] iResizeFactor - коэффициент для графического построения диаграммы
======================================================================================= */
void ShowOlympicTeamChart(OlympicTeamData DataArray[], int iTotalTeams){
    // максимальное количество знаков для диаграммы
    // макс. кол. знаков = 100% = максимальному элементу (кол. очков) в массиве
    int iTotalPointsPerRuler = 25 ;
 
    // получаем максимальный элемент (кол. очков) в массиве
    int iMaxArrayElement = iGetMaximumElement(DataArray, iTotalTeams);
 
    // текущее количество знаков в диаграмме
    int iCurrentPointsPerRuler = 0;
    
    // временные переменные
    int iTmpCounter = 0;
    char cTmpBuf[10];
    
    cout << endl;
    cout << "+===========================================================================+" << endl;
    cout << "|                            Диаграмма набранных очков                      |" << endl;
    cout << "|=======+==============================+========+===========================|" << endl;
    cout << "| Место |       Название команды       |    %   |          Диаграмма        |" << endl;
    cout << "+=======+==============================+========+===========================+" << endl;
    
    // переменная iMaxLenght для функции StringToCenter() считается вручную для текущего столбика
    // считается количество знаков в текущем столбике не учитывая знаки "|"
    // например:
    // |       Название команды       |
    // |<---------- 30 -------------->|
    // StringToCenter(x, 30);
 
    while(iTmpCounter < iTotalTeams) {
        // проверяем, если текущий элемент (кол. очков) 
        // равно максимальному элементу (кол. очков) в массиве
        if(DataArray[iTmpCounter].nTotalPoints == iMaxArrayElement)
            // если да, то 
            // текущее количество знаков в диаграмме = максимальному количеству знаков
            iCurrentPointsPerRuler = iTotalPointsPerRuler;
        else
            // если да, то 
            // текущее количество знаков в диаграмме вычитается по формуле
            // (кол. очков * максимальное кол. знаков в диаграмме) / максимальное кол. очков
            // x - 100%
            // y - ?
            // ? = (y * 100) / x
            iCurrentPointsPerRuler = (DataArray[iTmpCounter].nTotalPoints * iTotalPointsPerRuler) /
iMaxArrayElement;
 
        cout    << "|";
        sprintf_s(cTmpBuf, 10, "%d", iTmpCounter+1);
        StringToCenter(cTmpBuf, 7);
        cout    << "|";
        StringToCenter(DataArray[iTmpCounter].pTeamName, 30);
        cout    << "|";
        sprintf_s(cTmpBuf, 10, "%.2f", ((float)(100 * DataArray[iTmpCounter].nTotalPoints) /
iMaxArrayElement));
        StringToCenter(cTmpBuf, 8);
        cout << "| ";
        for(int i = 0; i < iCurrentPointsPerRuler; ++i)
            cout << "#";
        // число 26 посчитано вручную для текущего столбика
        // считается количество знаков в текущем столбике
        // |          Диаграмма        |
        //  <---------- 27 ----------->
        // 26 = 27-1 - т.к. один символ выделили перед диаграммой
        for(int i = 0; i < 26 - iCurrentPointsPerRuler; ++i)
            cout << " ";
        cout << "| ";
        cout << endl;
 
        ++iTmpCounter;
    }
    cout << "+=======+==============================+========+===========================+" << endl;
}
[main.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
#include "OlympicGames.h"
 
 
int main(){
    // Установка "локали" для отображения русского текста
    // как выбрать правильную "локаль"
    // [url]http://msdn.microsoft.com/en-us/library/cdax410z.aspx[/url]
    setlocale( LC_ALL, "rus" );
    
    // указатель на структуру описывающую данные команды
    OlympicTeamData *OlympicTeams;
    
    // выделения памяти для n-го количества структур 
    // описывающих данные команды
    OlympicTeams = new OlympicTeamData[nTotalTeams];
    
    // очистка консоли
    system("cls");
 
    // ввод данных о командах
    EnterOlympicTeamData(OlympicTeams, nTotalTeams);
    // сортировка данных по очкам
    BubbleSortArray(OlympicTeams, nTotalTeams);
    
    // очистка консоли
    // system("cls");
 
    // вывод информации о командах
    ShowOlympicTeamStats(OlympicTeams, nTotalTeams);
    // вывод диаграммы по очкам команды
    ShowOlympicTeamChart(OlympicTeams, nTotalTeams);
    
    // освобождаем выделенную память
    delete [] OlympicTeams;
    return 0;
}
+ отдельно сами файлы:
data.zip
1
05.06.2012, 03:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2012, 03:51
Привет! Вот еще темы с ответами:

Определить, будут ли проводить в заданном году зимние или летние олимпийские игры - Pascal
По году текущего десятилетия определить, будут ли проводить в этом году зимние или летние олимпийские игры ИЛИ год не олимпийский

"Летние Олимпийские игры" не включаются - Спортивные игры
Беда такая у меня. 2 года назад я скачал летние олимпийские игры, установил их все нормально играл...пока не надоела. прошел год я решил...

Олимпийские кольца - Delphi
Цель работы - создать программу, которая на поверхности формы рисует олимпийский флаг. И дан примерный код: unit Unit1; ...

Олимпийские кольца - Java
помогите пожалуйста :( Олимпийские кольца. Необходимо вывести на экран цветное изображение олимпийского логотипа в виде пяти...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru