Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] оптимизация программы (http://forum.oszone.net/showthread.php?t=226920)

virus8 02-02-2012 22:59 1850431

оптимизация программы
 
вот сама программа( угадай число))) )

Код:

#include <iostream>
#include <ctime>

int main()
{
        srand( (unsigned) time(0) );
        setlocale(LC_ALL, "Russian");

        int a, b, c, d; //генерация случайных чисел
        a = rand() % 9;
        b = rand() % 9;
        c = rand() % 9;
        d = rand() % 9;
        //std::cout << a << b << c << d;
        std::cout << "\t\tИгра числа\n\n";
        std::cout << "В этой игре нужно угадать 4х значное число число\n";
        std::cout << "генерируем число\n";
        int x, y , z , w ;
        std::cout << "Введите ваш выбор(цифры вводите через пробел)\n";
       
        do
        {
                std::cin >> x >> y >> z >> w;
                if(x == a)
                        std::cout <<"Первое число = " << a << "\n";
               
                if(y == b)
                        std::cout << "Второе число = " << b << "\n";
               
        if(z == c)
                        std::cout << "Третье число = " << c << "\n";
               
                if(w == d)
                        std::cout << "Четвертое число = " << d << "\n";
                }while( (a + b + c + d) != (x + y + z + w));
        std::cout << "Вы справились\n";
       
        std::cin.get();
        std::cin.get();

        return 0;
}

Она рабочая, интересно просто как её можно оптимизировать? Так чтоб цифры нужно было не через пробел вводить??
П.С. - сильно не горит, просто нужно для себя(разобраться)!!!

ferget 02-02-2012 23:37 1850453

для начала напишите после инклудов

Код:

using namespace std;
и можете писать просто cin и cout

Цитата:

Цитата virus8
Так чтоб цифры нужно было не через пробел вводить?? »

непонятно

Drongo 03-02-2012 03:12 1850547

Цитата:

Цитата ferget
Так чтоб цифры нужно было не через пробел вводить?? »
непонятно »

У него перегружен cin, соответственно приходится вводить: 2 3 4 5 и подтверждать ввод Enter.
Цитата:

Цитата virus8
std::cin >> x >> y >> z >> w; »

Нужно так, после каждого ввода числа подтверждать ввод Enter.
Код:

cin >> x;
cin >> y;
cin >> z;
cin >> w;

Я вот только это условие суммирования не пойму никак. :dont-know
Цитата:

Цитата virus8
while( (a + b + c + d) != (x + y + z + w)); »

Я когда-то на этапе изучения, писал программу угадайку чисел. Загадывается число программой от 1 до 1000 после чего отгадывающий пишет свой вариант, и на основе больше\меньше результат будет примерно так если использовать технику бинарного поиска, Х это искомое число.
Код:

1 < X 1000
512 < X 1000
512 < X < 768

Исходник привёл также каким он был во время написания.
Угадай-ка
Код:

// Задачи главы 3. Задача 3.38 и 3.39
//Угадай-ка число
#include <iostream>
using std::cout;
using std::cin;
using std::endl;

#include <iomanip>
using std::setw;

#include <cstdlib>

#include <ctime>
using std::time;

int main()
{
  int a=0,
      num,
      otvet,
      z,
      min = 1,
      max = 1000;
     
  cout<<"  DLIA PRODOLGENIA PRESS '0'. FINISH '-1':  ";        // Для продолжения введите '0'. Для завершения '-1':
  cin>>z;
  while(z != -1){
      srand(time(0));
      num = 1 + rand() % 1000;
      cout<<"\n  MY NUMBER IN DIAPAZON 1 - 1000: \n\n";                // Моё число находится в диапазоне 1 - 1000:
      cout<<setw(4)<<min<<" < "<<" X "<<" < "<<max;
      cout<<"  DOGADKA:  ";                // Введите пожалуйста Вашу догадку:
      cin>>otvet;
      while(otvet != num){
        if(otvet < num){
            cout<<"    MALOVATO\n\n ";        // Маловато пожалуй
            min = otvet;
            cout<<setw(4)<<min<<" < "<<" X "<<" < "<<max;
            cout<<"  DOGADKA:  ";        // Введите пожалуйста Вашу догадку:
            cin>>otvet;
            a++;
          }
      if(otvet > num){
        cout<<"    MNOGOVATO\n\n ";                // Многовато будет
        max = otvet;
        cout<<setw(4)<<min<<" < "<<" X "<<" < "<<max;
        cout<<"  DOGADKA:  ";                // Введите пожалуйста Вашу догадку:
        cin>>otvet;
        a++;
      }
    }
  if(otvet == num){
    a++;
    cout<<"\n"<<setw(10)<<min<<" < "<<otvet<<" < "<<max;
    cout<<"  URA VERNO !!! "<<"  OTGADAL ZA  "<<a<<"  POPITOK\n"<<endl;        // Ура Верно !!! Отгадано за  Х попыток
    a = 0;
    min = 0;
    max = 0;
  }
    cin>>z;
  }
  return 0;
}
//---------------------------------------------------------------------------



Цитата:

Цитата Drongo
Я вот только это условие суммирования не пойму никак.
Цитата virus8:
while( (a + b + c + d) != (x + y + z + w)); » »

Всё, въехал, сумма загаданых и сумма вариантов не совпадают. Значит не угадано число. :)

virus8 03-02-2012 11:29 1850712

Ой извините условие не расписал!!! Получается так есть число 4х значное, нужно угадать 4 цифры, но когда ты угадываешь 1 цифру программка те пишет угадана 2 или 3 цифра. Вопрос у меня для того чтоб разобраться можно ли как нибудь сделать чтоб ввел 4х значное число - без пробела (cin не дает этого сделать ) может почитать про другие операторы вывода??? если чего хотябы намекните )))

:) Исходник привёл также каким он был во время написания.
Угадай-ка -------
веселая программка - многовато - маловато))
за исходник спасибо - почитал))

У меня сейчас этот период обучения проходит - тока я дома сам пыхчу и спросить кроме букваря некого!


для начала напишите после инклудов

Код:

using namespace std;

и можете писать просто cin и cout - друг посоветовал сразу себя к этому не приучать )))

Delirium 03-02-2012 11:47 1850723

Цитата:

Цитата virus8
друг посоветовал сразу себя к этому не приучать »

Это почему же? Зачем писать полные именования.
Я бы посмотрел на твоего друга при создании приложения на C#. Как бы он постоянно писал нечто вроде System.Windows.Forms.MessageBox вместо простого usage в начале и в коде просто MessageBox.

Сокращенные имена это плюс, а не минус программирования.

virus8 03-02-2012 17:13 1851016

))) О_о приятно пообщаться с программером настояшим (если чего не поймите за издевку)! Я просто учу с++ мне так захотелось......

Друг говорит, что когда буду учить STL(что такое STL знаю пока не много) - пригодится --- если не прав поправьте (хотелось бы услышать побольше мнений) - просто говорит один человек - опыта почеркнуть больше не у кого !!!!

ferget 03-02-2012 18:02 1851051

Цитата:

Цитата virus8
когда буду учить STL(что такое STL знаю пока не много) - пригодится »

мне кажется, что поставить два двоеточия, не такая сложная задача и вы сможете написать list<int>::, даже если сейчас не будете писать std::

Delirium 06-02-2012 02:56 1852585

virus8, именовать переменные надо так, чтобы через месяц, открыв старый исходник, ты сразу понял, что это за переменные и что они делают. Однобуквенные и непонятные переменные исключаются(за исключением мелкого цикла вроде for(int i=0;i<10;i++)). В остальном как душе угодно.

virus8 06-02-2012 09:47 1852672

Оке! спс я только над этим начал задумываться !!

virus8 10-02-2012 21:46 1855877

Думаю может кому интересно будет!!
Решил я эту задачку таким вот образом, если кому интересно будет - вот код:

Код:

#include <iostream>
#include <ctime>
using namespace std;
int main()
{
        srand( (unsigned) time(0) );
        setlocale(LC_ALL, "Russian");

        int var_С, a, b, c, d, z, y, x, v; // генерация случайного числа
        var_С = rand() %10000;
        cout << var_С;
        cout << "\t\tИгра числа\n\n";
        cout << "В этой игре нужно угадать 4х значное число \n";
        cout << "генерируем число\n";
        cout << "Введите ваш выбор\n";
       
        int varС = var_С;
        a = varС/1000; // разбиваем var на числа
        varС = varС%1000;
        b = varС/100;
        varС = varС%100;
        c = varС/10;
        varС = varС%10;
        d = varС;
       
        int var_U;
       
       
        int i = 0;
        do
        {
                cin >> var_U;

            int varU = var_U;
            x = varU/1000; // разбиваем var на числа
            varU = varU%1000;
            y = varU/100;
            varU = varU%100;
            z = varU/10;
            varU = varU%10;
            v = varU;
               
                if(x == a)
                        cout <<"Угадали первое число = " << a << "\n";
                               
                if(y == b)
                        cout << "Угадали второе число = " << b << "\n";
               
        if(z == c)
                        cout << "Угадали третье число = " << c << "\n";
               
                if(v == d)
                        cout << "Угадали четвертое число = " << d << "\n";
                else
                        cout << "нет совпадений\n";
                i++;
                }while( (x+y+z+v) != (a+b+c+d));
        cout << "Вы справились\n";
       
        cin.get();
        cin.get();

        return 0;
}


Drongo 11-02-2012 00:16 1855975

virus8,
Цитата:

Цитата virus8
int varU = var_U;
x = varU/1000; // разбиваем var на числа
varU = varU%1000;
y = varU/100;
varU = varU%100;
z = varU/10;
varU = varU%10;
v = varU; »

Цитата:

Цитата virus8
int varС = var_С;
a = varС/1000; // разбиваем var на числа
varС = varС%1000;
b = varС/100;
varС = varС%100;
c = varС/10;
varС = varС%10;
d = varС; »

Много лишнего, посмотрите тему - Разбить число с перестановкой разрядов числа по убыванию на предмет лучшего разбивания числа на разряды.

Busla 11-02-2012 11:57 1856133

virus8, правильная формулировка задачи - уже половина решения.
Вы путаете понятия число и цифра.
Я бы в этой задаче работал со строками, а не числами.
И проверка на правильность решения в вашем случае должна выглядеть так:
while( (a * 1000 + b * 100 + c * 10 + d) != (x *1000 + y * 100 + z * 10 + w))


Время: 20:19.

Время: 20:19.
© OSzone.net 2001-