Оптимизация мою машинку проектов репетитора с++


Я в первом семестре класс кодирование и с использованием C++. Я недавно закончил этот проект, чтобы создать клавиатурный тренажер и получил полный кредит, но я хочу, чтобы найти способы и мнения, чтобы оптимизировать его так как моя цель-улучшить. И полный кредит без профессор не поможет мне.

Целью является случайным пяти-длина строки, которая может включать в себя дикий символ [0-9] 10% времени, а другой дикий [%-!] любой символ alphanum остальные 10% времени. Остальные 80% - это верхние и строчные буквы. (с помощью ASCII)...

Вы получаете 500 очков, правильно вписав в 10 секунд и терять очки в зависимости от прохождения 10-секундной метки или ввода неверного символа. Штраф за неправильную персонаж АБС(разница между запрашиваемой ASCII и ввод ASCII)...

Я не ищу никого, чтобы переписать его, просто какой-то местности или увольнения и советы о том, как можно сократить код.

#include <iostream>
#include <chrono>
#include <ctime>
#include <cmath>
#include <string>
using namespace std;

string generate(const int length);
string interpret(string generated);
int scoreOffset(string inputString,string randoString);
void withinInterval(int offset, int time);
void intervalFail(int offset, int time);

int main()
{
    int totalScore = 2000;
    int offset,totalTime;
    srand(time(0));
    string randoString;
    string inputString;
    string interpreted;

    while(totalScore > 0 && totalScore < 5000)
    {
        randoString = generate(5);
        interpreted = interpret(randoString);
        cout << "Your current points " << totalScore << ", just type -> " << randoString << ": ";
        chrono::steady_clock::time_point begin = chrono::steady_clock::now();
        cin >> inputString;
        chrono::steady_clock::time_point end= chrono::steady_clock::now();
        totalTime = chrono::duration_cast<chrono::milliseconds>(end - begin).count();


        if (totalTime <= 10000)
        {
            offset = scoreOffset(interpreted,inputString);
            if(offset == 0)
            {
                totalScore += 500;
                withinInterval(offset,totalTime);
            }
            else
            {
                totalScore -= offset;
                withinInterval(offset,totalTime);
            }
        }

        else
        {
            offset = scoreOffset(interpreted,inputString);
            totalScore -= (totalTime-10000);
            if(offset == 0)
            {
                totalScore += 500;
                intervalFail(offset,totalTime);
            }
            else
            {
                totalScore -= offset;
                intervalFail(offset,totalTime);
            }
        }
    }

    if(totalScore < 0)
        cout << "You lose..." << endl;
    else
        cout << "You win..." << endl;

}

string generate(const int length)
{
    string str = "";

    for(int i=0; i<length; i++)
    {
        int randomElement = (rand() % 100 + 1);
        if (randomElement <= 40)
            str += (rand() % 26 + 65);
        else if (randomElement <= 80)
            str += (rand() % 26 + 97);
        else if (randomElement <= 90)
        {
            str += "[%-!]";
        }
        else
        {
            str+= "[0-9]";
        }
    }
    return str;
}

string interpret(string generated)
{
    int length = generated.length();
    string str;
    for(int i=0; i<length; i++)
        {
            if(generated[i] == '[' && generated[i+1] == '0')
            {
                str += '0';
                i+=4;
            }
            else if(generated[i] == '[' && generated[i+1] == '%')
            {
                str += '*';
                i+=4;
            }
            else
                str += generated[i];
        }
    return str;
}


int scoreOffset(string randoString,string inputString)
{
    int offset = 0;
    int length = randoString.length();
    for(int i = 0; i<length;i++)
    {
        if(isupper(randoString[i]))
        {
            if(isupper(inputString[i]))
                offset += 0;
            else
                offset += abs((char(inputString[i])) - (char(randoString[i])));
        }
        else if(islower(randoString[i]))
        {
            if(islower(inputString[i]))
                offset += 0;
            else
                offset += abs((char(inputString[i])) - (char(randoString[i])));
        }
        else if(isdigit(randoString[i]))
        {
            if(isdigit(inputString[i]))
                offset += 0;
            else
                offset += abs((char(inputString[i])) - (char('0')));

        }
        else if(isalnum(randoString[i]) == false)
        {
            if(isalnum(inputString[i]) == false)
                offset += 0;
            else
                offset += abs((char(inputString[i])) - int(char('*')));
        }
    }
    return offset;
}

void withinInterval(int offset,int time)
{
    cout << time << " milliseconds, you made it within the interval of 10,000..." << endl;
    if(offset != 0)
        cout << "String offset is " << offset << ", your total penalty is " << offset << endl;
}

void intervalFail(int offset, int time)
{
    cout << time << " milliseconds, you *failed* it within the interval of 10,000..." << endl;
    if(offset != 0)
        cout << "String offset is " << offset << ", your total penalty is " << offset << endl;
}


123
1
c++
задан 22 марта 2018 в 05:03 Источник Поделиться
Комментарии
1 ответ

Случайных Чисел

Старый генератор случайных чисел:

srand()
rand()

Были заменены на C++ версий (это из старой библиотеки C). Они, как известно, не очень-то случайны и имеют несколько проблем, которые делают их трудно использовать правильно.

Вы думаете, это даст вам равномерное распределение чисел в диапазоне 1..100 ?

 (rand() % 100 + 1)

Не совсем. Поскольку максимальное случайное число-это MAX_RAND (предположим 32768 для этого обсуждения, но в документации). В основном первые 68 номеров имеют немного более высокую вероятность, чем последний 21 числа.

Что вы должны были сделать было:

 int r = rand();
while(r > 32700) {
r = rand();
}
int result = r % 100 + 1;

Или вы могли бы разделить на MAX_RAND, чтобы получить число в диапазоне [0-1).

 double result = rand() / MAX_RAND;

Но даже лучше, чем все это было бы использовать новый генератор случайных чисел.

std::default_random_engine         generator;
std::uniform_int_distribution<int> distribution(1, 100);
int result = distribution(generator);

Сухой код

Не повторяйся (сухой)

Часть кода является чрезмерно многословен. Я думаю, что вы можете затянуть кое-что из этого.

    if (totalTime <= 10000)
{
offset = scoreOffset(interpreted,inputString);
if(offset == 0)
{
totalScore += 500;
withinInterval(offset,totalTime);
}
else
{
totalScore -= offset;
withinInterval(offset,totalTime);
}
}

else
{
offset = scoreOffset(interpreted,inputString);
totalScore -= (totalTime-10000);
if(offset == 0)
{
totalScore += 500;
intervalFail(offset,totalTime);
}
else
{
totalScore -= offset;
intervalFail(offset,totalTime);
}
}
}

Может быть записано в таком виде:

    offset = scoreOffset(interpreted,inputString);

if (totalTime <= 10000)
{
if(offset == 0)
{
totalScore += 500;
}
else
{
totalScore -= offset;
}
withinInterval(offset,totalTime);
}
else
{
totalScore -= (totalTime-10000);
if(offset == 0)
{
totalScore += 500;
}
else
{
totalScore -= offset;
}
intervalFail(offset,totalTime);
}
}

Обратите внимание, как я вытащил общих элементов из если блоки на более высоком уровне. Теперь, когда мы сделали это, это становится легче для чтения и ведет к более почистить.

    offset = scoreOffset(interpreted,inputString);

if (totalTime <= 10000)
{
totalScope = totalScore + (offset == 0) ? 500 : -offset;
withinInterval(offset,totalTime);
}
else
{
totalScore -= (totalTime-10000);
totalScope = totalScore + (offset == 0) ? 500 : -offset;
intervalFail(offset,totalTime);
}
}

ОК. Еще один убирать.

    offset = scoreOffset(interpreted,inputString);
totalScope = totalScore + (offset == 0) ? 500 : -offset;

if (totalTime <= 10000)
{
withinInterval(offset, totalTime);
}
else
{
totalScore -= (totalTime - 10000);
intervalFail(offset, totalTime);
}
}

Всегда используйте фигурные скобки

    if (randomElement <= 40)
str += (rand() % 26 + 65);
else if (randomElement <= 80)
str += (rand() % 26 + 97);

Там технически ничего плохого с настоящим Кодексом. Но не хватает скобок может привести к трудно найти ошибки (особенно когда есть с макросами вокруг). Так просто чтобы быть на безопасной стороне, всегда использовать фигурные скобки вокруг подблоки (хорошая привычка).

    if (randomElement <= 40) {        // I have started using this style for sub-blocks.
str += (rand() % 26 + 65); // But use what you like.
}
else if (randomElement <= 80) {
str += (rand() % 26 + 97);
}

Еще один сухой ситуации

Эти две выглядят одинаково. Я уверен, что вы можете вынесем одинаковые части в свои собственные функции.

void withinInterval(int offset,int time)
{
cout << time << " milliseconds, you made it within the interval of 10,000..." << endl;
if(offset != 0)
cout << "String offset is " << offset << ", your total penalty is " << offset << endl;
}

void intervalFail(int offset, int time)
{
cout << time << " milliseconds, you *failed* it within the interval of 10,000..." << endl;
if(offset != 0)
cout << "String offset is " << offset << ", your total penalty is " << offset << endl;
}

4
ответ дан 22 марта 2018 в 07:03 Источник Поделиться