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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Функцию, принимающую в качестве параметра количество строк и столбцов в таблице умножения http://www.cyberforum.ru/cpp-beginners/thread595624.html
Пожалуйста помогите, завтра экзамен!!! Написать функцию, принимающую в качестве параметра количество строк и столбцов в таблице умножения. Функция должна создать двумерный массив целых чисел размера, достаточного для хранения таблицы умножения и заполнить массив элементами таблицы умножения. Функция должна вернуть адрес первого элемента массива. Заголовок функции: int *...
C++ Разбор кода CSharp К сожалению с сями не знаком!(( Что знаю по коду. То он из *.dat файла выдергивает нужные данные. Вот прошу помочь с разбором кода. Чтобы я смог переписать его под Delphi public class StatsFile { public const short RANK_VERSION = 11; public class StatsEntry { http://www.cyberforum.ru/cpp-beginners/thread595611.html
C++ Код Хэмминга
Всем привет, разбираю пример кода Хмминга, подскажите плз, что это за фрагменты void PackFile(char* in, char* out) { ifstream inFile(in,ios::binary); //связываем входной файл cBitStream bs((unsigned char*)out, mWrite); //создаем объект класса cBitStream с режимом чтения char tmp; //создаем перем-ую темп while (inFile >> tmp) // ЧТО ЭТО значит?? { bs.WriteBitField((unsigned...
C++ РГЗ ПО С++
Создать файл, содержащий сведения о студентах. Структура записи: группа, фамилия студента с его инициалами, пол, признаки успеваемости по дисциплинам (1 – тройки и четверки, 2 – тройки, четверки и пятерки, 3 – четверки и пятерки, 4 – отлич-ник), владение специальностью (0 – нет, 1 – повар, 2 – каменщик, 3 – бетонщик, 4 – плотник). Разработать программу, позволяющую отобрать студентов для...
C++ Маленькие игры на Си++ для консолили(только псевдографика).(нужен совет) http://www.cyberforum.ru/cpp-beginners/thread595593.html
Доброго времени суток. Дело вот такое, сдавал я экзамен по Си, сдал очень плохо. Решил провести работу над ошибками. Но не могу найти материалов по теме. Задачи на экзамен были такие: написать игру "змейка", "арканоид", "тетрис", "морской бой" , и тп. Но только не виндовс форм, а именно в консоли. Как его грамотно написать я без понятия, также не могу найти ни какого пособия, с примерами...
C++ Динамическая память (строки), деструктор Привет. Бьюсь уже час, помогите разобраться. Написал программу, в одной функции память выделил, в другой освобождаю. После выполнения программы вылетает ошибка (вложение) понял что ошибка в деструкторе. но конкретнее? что конкретно не так делаю??? речь про класс alcohol ! fluid работает отлично (тоже странно, одинаковые же блин!) help! zad1.h #pragma once подробнее

Показать сообщение отдельно
ps10n1ck
 Аватар для ps10n1ck
53 / 47 / 2
Регистрация: 10.11.2010
Сообщений: 132
05.06.2012, 03:51     Олимпийские игры
Финальная версия (хотя ее можно улучшать и улучшать):
Олимпийские игры

Сам код:
[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
 
Текущее время: 14:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru