Премини към съдържанието
Kristian Panov

C++ Шанс за падане на дадено число.

Препоръчан отговор


Здравейте!
Искам да попитам, как може да се направи така, че примерно да задам на еди кои си числа по-голям шанс да се паднат от други.
Всмисъл, имам една програма, която генерира 6 числа, които са от 1 до 47.
Та може ли така да стане, че на пример 14, 15, 44 да имат по-голям шанс да се паднат отколкото останалите.
Ето я програмата с генерирането:

 

#include <fstream>
#include <iostream>
#include <windows.h>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <ctime>

using namespace std;

void setcolor(unsigned short color)
{
    HANDLE hcon = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hcon,color);
}

static void getSix (int *dst)
{
    int sz, pos, i, src[47];
    for (i = 0; i < sizeof(src) / sizeof(*src); i++)
        src = i + 1;
    sz = 47;
    for (i = 0; i < 6; i++)
    {
        pos = rand() % sz;
        dst = src[pos];
        src[pos] = src[sz - 1];
        sz--;
    }
}

int main()
{

    system("chcp 1251 > nul");
    system("title LotteryWin");

    ofstream myfile("Data.dat", ios::app);
    string date;
    string line;

    int choice;
    cout << "1.Generate Ticket Numbers" << endl;
    cout << "2.List Previous Ticket Numbers" << endl;
    cout << "3.Exit" << endl << endl;
    cout << "Please, enter your choice: ";
    cin >> choice;

    if(choice == 1)
    {
        system("cls");

        cout << "Please, enter the date." << endl;
        cout << "Date: ";
        cin.clear();
        cin.ignore(0xffff, '\n');
        getline(cin, date);

        system("cls");

        srand (time (NULL));
        int i, numbers[6];
        getSix (numbers);

        setcolor(10);
        cout << "Numbers are:" << endl;
        setcolor(7);

        for (i = 0; i < sizeof(numbers) / sizeof(*numbers); i++)
        {
            cout << numbers << " ";
        }

        myfile << "[" << date << "]" << "\n";
        myfile << "Numbers: ";
        for (i = 0; i < 6; i++) myfile << numbers << " ";
        myfile << "\n";
        myfile << "------------------------------" << "\n";
        myfile.close();
    }
    if(choice == 2)
    {

        system("cls");
        setcolor(15);

        ifstream myfile ("Data.dat");
        if(myfile.is_open())
        {
            while(getline(myfile, line))
            {
                cout << line << '\n';
            }
            myfile.close();
        }
        else
        {

            setcolor(12);
            cout << "Unable to open file";

        }


    }
    if(choice == 3)
    {

        return 0;

    }

    system("pause > nul");
    return 0;
}
 

Редактирано от Kristian Panov (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Това се прави, като се генерира по-голям диапазон числа от нужните ти и съответствие между число от диапазона и желано число. Например ако искаш тези числа, които си казал да се падат двойно по-вероятно, генерираш числа от 1 до 50 вместо от 1 до 47 и ако се падне 48 връщаш 14, за  49 -15 и така. По този начин, за 14 имаш две числа 14 и 48, съответно двойно по-голяма вероятност. В зависимосто от това какво искаш си смяташ нужния диапазон и мапването. За толкова малко числа и множител цяло число, най-лесно е с look-up таблица.

Редактирано от flare (преглед на промените)
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 10 минути, flare написа:

Това се прави, като се генерира по-голям диапазон числа от нужните ти и съответствие между число от диапазона и желано число. Например ако искаш тези числа, които си казал да се падат двойно по-вероятно, генерираш числа от 1 до 50 вместо от 1 до 47 и ако се падне 48 връщаш 14, за  49 -15 и така. По този начин, за 14 имаш две числа 14 и 48, съответно двойно по-голяма вероятност. В зависимосто от това какво искаш си смяташ нужния диапазон и мапването. За толкова малко числа и множител цяло число, най-лесно е с look-up таблица.

Ок, мерси!

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
на 8/18/2016 в 18:34, flare написа:

Това се прави, като се генерира по-голям диапазон числа от нужните ти и съответствие между число от диапазона и желано число. Например ако искаш тези числа, които си казал да се падат двойно по-вероятно, генерираш числа от 1 до 50 вместо от 1 до 47 и ако се падне 48 връщаш 14, за  49 -15 и така. По този начин, за 14 имаш две числа 14 и 48, съответно двойно по-голяма вероятност. В зависимосто от това какво искаш си смяташ нужния диапазон и мапването. За толкова малко числа и множител цяло число, най-лесно е с look-up таблица.

Ох, не, чакай, нещо не ти схващам мисълта.

 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 7 часа, Kristian Panov написа:

Ох, не, чакай, нещо не ти схващам мисълта.

Ами кажи какво си и какво не си разбрал  за да дообясня.

Ето елементарен пример за идеята. Искаш да имаш числата от 1 до 4, като 2 и 3 са с двоен шанс. Ми хвърляш зарче и ако се падне до 4 го взимаш както е, ако се падне 5 приемаш, че се е паднало 2, ако се падне 6 приемаш, че се е паднало 3.

Ако искаш да кажем числата от 1 до 10 като 7 е с 10% по-голям шанс от другите, правиш да се падат числата от 1 до 101. ако се падне от 1 до 10 връщаш 1, ако се падне от 11 до 20 - 2 и така. Трика е като се падне 101 - тогава връщаш 7. и така за всички числа ще имаш 10 отговарящи стойности, освен за 7 за което имаш 11 - т.е. с 10% повече. Като може диапазоните да са последователно или разбъркани - няма значение, ако началната ти (псевдо)случайна ти функция ги генерира равновероятни. Важното е съответствието паднало-се-число към прието-число да отговаря на изискванията ти.

Редактирано от flare (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 15 часа, flare написа:

Ами кажи какво си и какво не си разбрал  за да дообясня.

Ето елементарен пример за идеята. Искаш да имаш числата от 1 до 4, като 2 и 3 са с двоен шанс. Ми хвърляш зарче и ако се падне до 4 го взимаш както е, ако се падне 5 приемаш, че се е паднало 2, ако се падне 6 приемаш, че се е паднало 3.

Ако искаш да кажем числата от 1 до 10 като 7 е с 10% по-голям шанс от другите, правиш да се падат числата от 1 до 101. ако се падне от 1 до 10 връщаш 1, ако се падне от 11 до 20 - 2 и така. Трика е като се падне 101 - тогава връщаш 7. и така за всички числа ще имаш 10 отговарящи стойности, освен за 7 за което имаш 11 - т.е. с 10% повече. Като може диапазоните да са последователно или разбъркани - няма значение, ако началната ти (псевдо)случайна ти функция ги генерира равновероятни. Важното е съответствието паднало-се-число към прието-число да отговаря на изискванията ти.

Това че 7 се среща 10% по-често (10% * 10 + 10=11) не означава, че шансът да се падне е с 10% по-голям, в случая той е с малко под 1% повече.

Това е така, защото за всяко число освен 7 шансът е 10/101 или 9.9%, а за 7 е 11/101=10.8%.

Ако числата са 111, като за диапазона 91-111 връщаме 7,
тогава шансът да се падне 7 е 21/111=18.9%, а за другите числа е 10/111=9% .

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 20 минути, programprogram написа:

Това че 7 се среща 10% по-често (10% * 10 + 10=11) не означава, че шансът да се падне е с 10% по-голям, в случая той е с малко под 1% повече.

Това е така, защото за всяко число освен 7 шансът е 10/101 или 9.9%, а за 7 е 11/101=10.8%.

Отначало реших че си прав, ама не е така. Но дай да си сверим дефинициите за "шансът да се падне е с 10% по-голям." Може да е така ако си решил че имам предвид 10% по-голям от равновероятния, а аз имам предвид 10% по-голям от другите при същото теглене - както е условието:

на 8/18/2016 в 18:14, Kristian Panov написа:

че примерно да задам на еди кои си числа по-голям шанс да се паднат от други.

Според моята 10/101 * 1.1 = 11/101 тоест, число чийто шанс да се падне е 11/101 има точно с 10% шанс да се падне повече. Или да го кажа с други думи, ако направим достатъчно много опити с функцията която аз предложих, най-накрая ще имаме с 10% повече седмици, отколкото която и да е друга цифра.

Но уточнението ти е може да е важно за автора - да си изясни какво точно иска да получи.

 

Редактирано от flare (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

 

преди 23 часа, flare написа:

Отначало реших че си прав, ама не е така. Но дай да си сверим дефинициите за "шансът да се падне е с 10% по-голям." Може да е така ако си решил че имам предвид 10% по-голям от равновероятния, а аз имам предвид 10% по-голям от другите при същото теглене - както е условието:

Според моята 10/101 * 1.1 = 11/101 тоест, число чийто шанс да се падне е 11/101 има точно с 10% шанс да се падне повече. Или да го кажа с други думи, ако направим достатъчно много опити с функцията която аз предложих, най-накрая ще имаме с 10% повече седмици, отколкото която и да е друга цифра.

Но уточнението ти е може да е важно за автора - да си изясни какво точно иска да получи.

 

Ами, това, което искам да се получи е да се направи на пример една извиквателна функция (void), която ще е примерно void Chance(), и като се извика преди генерирането на числата:

Chance(число, шанс в проценти) /ПРИМЕР/

Chance(39, 40%);

Chance(9, 20%);

for (i = 0; i < sizeof(numbers) / sizeof(*numbers); i++)
        {
            cout << numbers << " ";
        }

 

Редактирано от Kristian Panov (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

  • Разглеждащи това в момента   0 потребители

    Няма регистрирани потребители разглеждащи тази страница.

  • Горещи теми в момента

  • Подобни теми

    • от BWB. Eclipto
      Търся помощ за курсовата си работа по програмиране, защото отсъствах близо два месеца поради операция, а не се имам с колегите си.
      задачата гласи :"Съставете алгоритъм и напишете програма за въвеждане координатите на точки и извеждане на екрана координатите на онези от тях, които не лежат в защрихованата област.Въвеждането се прекратява, когато броят на въведените точки стане най-малко М и броят на лежащите в защрихованата област стане N."

      помощ!!
    • от Ester007
      Ако може някой да  се отзове.
      Имам два въпроса:
      Как да изведа брой отличници и студенти със слаб успех?
      Как да изкарам средния успех на групата?
      #include<math.h>//matematicheski funkcii #include <iostream>//vhodno izhodni potoci #include <windows.h>//za system #include <fstream> //za zapis i chetene na fail using namespace std; int main() { int students; int ocenki; int tochki; char ime[30]; SetConsoleOutputCP(1251); SetConsoleCP(1251); int oc2=2; int oc3=3; int oc4=4; int oc5=5; int oc6=6; char otnovo = 'd'; while (otnovo == 'Д' || otnovo == 'д' || otnovo == 'D' || otnovo == 'd') { do { cout << endl << "Моля, въведете брой студенти в групата - от 10 до 16: ";// cin >> students; } while (students < 10 || students >16); for (int i = 1; i < students; i++) { cout << endl << "Студент номер: " << i << endl << endl; for (int i = 0; i < 1; i++) { tochki = rand() % (100 - 30 + 1) + 30; cout << endl << "Точки: " << tochki; } if (tochki <= 49) { cout <<endl<< "Слаб : "<<oc2; } else if (tochki <= 59) { cout << endl << "Среден: "<<oc3; } else if (tochki <= 75) { cout << endl << "Добър: "<<oc4; } else if (tochki <= 89) { cout << endl << "Много добър: "<<oc5; } else if (tochki <= 100) { cout << endl << "Отличен: "<<oc6; } else { cout << "Натиснете клавиш."; } } cout << endl << endl << "Искате ли да започнете отново? Д/Н " << endl << endl; cin >> otnovo; } return(0);  
    • от Ester007
      Здравейте!
      Опитвам се да съставя програма, с която да бъдат записвани часове. Ето и кода, който имам.

      #include <iostream>
      #include<fstream>
      #include<windows.h>
      #include<conio.h>
      #include<stdio.h>

      using namespace std;

      class kabinet
      {
          string day;
          int hour;
          string exam;
          char name[50];
          char address[50];
          int phone[10];
          int age[3];//години
      public:
          void main_menu();//главно меню
          void type_examin();//вид преглед
          void setDay();//въвеждане на  ден
          void setHour();//назоваването на часа
          int check(int);
          void price_menu();//ценова листа на предлаганите услуги
          void showHour();//показване на свободните часове
          void edit();//опция за промяна
          void modifyHour();//промяна на часа
          void delete_hour();//изтриване на запазения час
          void showDisp();//изписване на информацията относно прегледа

      };
      void kabinet::main_menu()
      {
          system("color D1");
          setlocale(LC_ALL, "bulgarian");    //за използване на български език
          system("chcp 1251>0");

          int choice = 0;
          while (choice != 5)
          {
              system("cls");
              
              cout << "                              /      1.Записване на час                 / /  /" << endl;
              cout << "                             /      2.Показване записани часове        / /  /" << endl;
              cout << "                            /      3.Промяна на час                   / /  /" << endl;
              cout << "                           /      4.Ценоразпис                       /  \_/" << endl;
              cout << "                          /      5.Изход                            /    *" << endl;
              cout << "                         /                                         /  " << endl;
              cout << "                        /                                         /  " << endl;
              cout << "                       /                                         /  " << endl;
              cout << "                      /_________________________________________/  " << endl
                  << endl << endl << endl << "Моля въведете своя избор." << endl;
              cin >> choice;

              switch (choice) {
              case 1:system("cls");;
                  type_examin();
                  break;
              case 2: system("cls");;
                  showHour();
                  break;
              case 3: system("cls");;
                  modifyHour();
                  break;
              case 4: system("cls");;
                  price_menu();
                  break;
              case 5:
                  default: {
                  cout << "Благодарим Ви!";
                  cout << "Благодарим Ви, че използвахте нашата система за записване." << endl;
                  _getch();
              }
              }

          }
      }
      void kabinet::type_examin()
      {
          system("cls");
          system("color F6");
          int choiExam = 0;
          string exam;
          while (choiExam != 7)
          {
              cout << endl << endl << endl;

              
              cout << "                               /     1.Медицински преглед                / /  / *" << endl;
              cout << "                              /     2.Диспансерен преглед               / /  /" << endl;
              cout << "                             /     3.Профилактичен преглед             / /  /" << endl;
              cout << "                            /     4.Детска консултация                / /  /" << endl;
              cout << "                           /     5.Женска консултация                /  \_/" << endl;
              cout << "                          /     6.Издаване на документи             /    *" << endl;
              cout << "                         /                                         /  " << endl;
              cout << "                        /     7.Изход                             /  " << endl;
              cout << "                       /                                         /  " << endl;
              cout << "                      /_________________________________________/  " << endl
                  << endl << endl << endl << "Моля въведете своя избор." << endl;
              cin >> choiExam;
              string exam;
              switch (choiExam)
              {
              case 1:
                  exam = "Медицински преглед";
                  setDay(); break;
              case 2: exam = "Диспансерен преглед";
                  setDay(); break;
              case 3: exam = "Профилактичен преглед ";
                  setDay(); break;
              case 4: exam = "Детска консултация";
                  setDay(); break;
              case 5: exam = "Женска консултация ";
                  setDay(); break;
              case 6:  exam = "Издаване на документи ";
                  setDay(); break;
              case 7:break;
              default:
              {
                  cout << "Благодарим Ви!";
                  _getch();
              }
              }
          }
      }
                      void kabinet::setDay()
                      {
                          system("cls");
                          system("color B2");
                          int day;
                          string date;
                          while (day!=5) {
                              cout << endl << endl << endl;
                              cout << "                                  __________________________________   " << endl;
                              cout << "                                 /                                 /  " << endl;
                              cout << "                                /                                 /  " << endl;
                              cout << "                               /     1.Понеделник                /  " << endl;
                              cout << "                              /     2.Вторник                   /  " << endl;
                              cout << "                             /     3.Сряда                     /  " << endl;
                              cout << "                            /     4.Четвъртък                 /  " << endl;
                              cout << "                           /     5.Петък                     /  " << endl;
                              cout << "                          /                                 /  " << endl;
                              cout << "                         /                                 /  " << endl;
                              cout << "                        /_________________________________/  " << endl
                                  << endl << endl << endl << "Моля въведете своя избор." << endl;
                              cin >> day;

                              switch (day)
                              {
                              case 1:
                                  date = " Понеделник ";
                                  setHour();
                                  break;
                              case 2: date = " Вторник ";
                                  setHour();
                                  break;
                              case 3: date = " Сряда ";
                                  setHour();
                                  break;
                              case 4: date = " Четвъртък ";
                                  setHour();
                                  break;
                              case 5: date = " Петък ";
                                  setHour();
                                  break;
                              default:{
                                  cout << "Грешен избор";
                                  _getch();
                              }
                          }
                      }
                  }

                  void kabinet::setHour()
                  {
                      system("cls");
                      system("color C3");
                      string custumer;
                      string day;

                      int c, flag;

                      ofstream fout("Записани", ios::app);
                      cout << endl << endl << " Въведете час: ";
                      cin >> c;
                      flag = check(c);
                      if (flag)
                      {
                          cout << "-----------------------------------" << endl;
                          cout << "   Избраният от Вас час е зает.    " << endl;
                          cout << "-----------------------------------" << endl;
                          cout << "      Моля, въведете друг.         " << endl;
                          cout << "-----------------------------------" << endl;
                      }
                      else
                      {
                      hour = c;
                      cout << endl << endl << "Въведете име и фамилия: ";
                      gets(name);
                      cout << "Адрес: ";
                      gets(address);
                      cout << " Телефонен номер: ";
                      gets(phone);
                      cout << endl << endl << "Възраст: ";
                      gets(age);
                      fout.write((char*)this, sizeof(kabinet));
                      cout << "Успешно записан час!";
                  }
                      cout << "Натиснете, който и да е клавиш, за да продължите!!!";
                      _getch();
                      fout.close();
              }
      void kabinet::price_menu()
                      {

                          cout << endl << endl << endl;
                          cout << "                                  _______________________________________________  " << endl;
                          cout << "                                 /                                              /  " << endl;
                          cout << "                                /                                              /  " << endl;
                          cout << "                               /  Медицинско за работа - 15 лева.             /  " << endl;
                          cout << "                              /  Медицинско за шофьорска книжка              /  " << endl;
                          cout << "                               /                        - 20 лева.            /  " << endl;
                          cout << "                            /  Оформяне на документи за застраховка        /  " << endl;
                          cout << "                           /                       - 50 лева.             /  " << endl;
                          cout << "                          /   Потребителски такси:                       /  " << endl;
                          cout << "                         /           за пенсионери - 1лев.              /  " << endl;
                          cout << "                        /            за осигурени лица - 2,90лева.     /  " << endl;
                          cout << "                       /                                              /  " << endl;
                          cout << "                      /   Преглед за лица, които не са осигурени     /  " << endl;
                          cout << "                     /                       - 20 лева.             /  " << endl;
                          cout << "                    /  1.Назад към главното меню                   /  " << endl;
                          cout << "                   /______________________________________________/  " << endl;
                          cout << "Натиснете, който и да е клавиш, за да продължите!!!";
                          _getch();
                          fout.close();
              }
              void kabinet::showHour();
              {
                  system("cls");
                  system("color B1");
                  ifstream fin("Записани данни: ", ios::in);
                  int c, flag;
                  cout << "Въведете запазен час: ";
                  cin >> c;
                  while (!fin.eof())
                  {
                      fin.read((char*)this, sizeof(kabinet));
                      if (hour == c)
                      {
                          system("cls");
                          cout << " Данни на пациента. ";
                          cout << "--------------------" << endl;
                          cout << "Имена: " << name;
                          cout << "Адрес: " << address;
                          cout << "Телефонен номер: " << phone;
                          cout << "Записан час за: " << date << "Час: " << hour;
                          flag = 1;
                          break;
                      }
                  }
                  if (nomb== 0)
                      cout << "Търсеният от вас номер не фигурира!!!";
                  cout << "Натиснете, който и да е клавиш, за да продължите!!!";
                  _getch();
                  fin.close();
              }

              void kabinet::edit()
              {
                  system("cls");
                  system("color A3");
                  int c, flag;

                  cout << "\n Меню за промяна";
                  cout << "\n ***************";
                  cout << "\n 1.Промяна на час ";
                  cout << "\n 2.Изтриване на запазен час";
                  cout << "Моля, изберете: ";
                  cin >> choise;
                  system("cls");
                  cout << "\n Въведете запазен час: ";
                  cin >> c;
                  switch (choice)
                  {
                  case 1: modifyHour(c);
                      break;
                  case 2:
                       delete_hour(c);//изтриване на запазения час
                      break;
                  default: cout << "\n Грешен избор!!";
                  }
                  cout << "\n  Натиснете, който и да е клавиш, за да продължите!!!";
                  _getch();
              }
              int kabinet::check(int c)
              {
                  system("color F2");
                  int flag = 0;
                  ifstream fin("Записи: ", ios::in);
                  while (!fin.eof())
                  {
                      fin.read((char*)this, sizeof(hotel));
                      if (hour== c)
                      {
                          flag = 1;
                          break;
                      }
                  }
                  fin.choice();
                  return (flag);
      }
              void kabinet::modifyHour(int c)
              {
                  system("color C3");
                  long pos, flag = 0;
                  fstream file("Record.dat", ios::in | ios::out | ios::binary);
                  while (!file.eof())
                  {
                      pos = file.tellg();
                      file.read((char*)this, sizeof(kabinet));
                      if (hour == c)
                      {
                          cout << "\n Въведете данните наново";
                          cout << "\n ***********************";
                          cout << "\n Име: ";
                          gets(name);
                          cout << " Адрес: ";
                          gets(address);
                          cout << " Телефонен номер: ";
                          gets(phone);
                          file.seekg(pos);
                          file.write((char*)this, sizeof(kabinet));
                          cout << "\n Данните Ви са променени!!!";
                          flag = 1;
                          break;
                      }
                  }
                  if (flag == 0)
                      cout << "\n Часът не е намерен!";
                  file.close();

              }
              void kabinet::delete_hour(int c)
                  int flag = 0;
              char ch;
              ifstream fin("Record.dat", ios::in);
              ofstream fout("temp.dat", ios::out);
              while (!fin.eof())
              {
                  fin.read((char*)this, sizeof(kabinet));
                  if (hour == c)
                  {
                      cout << "\n Име: " << name;
                      cout << "\n Адрес: " << address;
                      cout << "\n Телефонен номер: " << phone;
                      cout << "\n\n Искате ли да изтриете данните? (y/n): ";
                      cin >> ch;
                      if (ch == 'n')
                          fout.write((char*)this, sizeof(kabinet));
                      flag = 1;
                  }
                  else
                      fout.write((char*)this, sizeof(kabinet));
              }
              fin.close();
              fout.close();
              if (flag == 0)
                  cout << "\n Часът не е намерен.";
              else
              {
                  remove("Record.dat");
                  rename("temp.dat", "Record.dat");
              }
      }
      int main()
      {

          kabinet h;
          system("color A4"
              system("cls");
          cout << "\n\t\t\t*********************************";
          cout << "\n\t\t\t*    Проект за запис на час     *";
          cout << "\n\t\t\t*********************************";
          Sleep(200);
          char text[] = { "\n\n\n\n\t\t };
          for (int p = 0; p < strlen(text); p++)   
              cout << text[p];
              Sleep(40);
          }
          cout << "\n\n\tНатиснете който и да е клавиш!!";
          _getch();
          h.main_menu();
      }
    • от Chris Panov
      Здравейте, 
      В момента пиша една програма, в която в една от функциите ми се налага да излезна по-рано при определено условие. Функцията връща string впрочем.
      Ето кодът:
       
      #include "stdafx.h" #include <iostream> #include <string> #include <sstream> #include <vector> #define CONSOLE_LOG(x) std::cout << x #define COMMAND_END command[0] #define COMMAND_SUM command[1] #define COMMAND_SUBTRACT command[2] #define COMMAND_CONCAT command[3] #define COMMAND_DISCARD command[4] #define COMMAND_DISPSEQ command[5] template <typename T> void top_back(std::vector<T>& v) {     v.erase(v.end() - 1); } std::string sum(std::string& x, std::string& y, std::vector<std::string>& vec) {     int xInt = atoi(x.c_str());     int yInt = atoi(y.c_str());     int result = xInt + yInt;     std::ostringstream os;     std::string strResult;     os << result;     strResult = os.str();     top_back(vec);     top_back(vec);     return strResult; } std::string subtract(std::string& x, std::string& y, std::vector<std::string>& vec) {     int xInt = atoi(x.c_str());     int yInt = atoi(y.c_str());     int result = xInt - yInt;     std::ostringstream os;     std::string strResult;     os << result;     strResult = os.str();     top_back(vec);     top_back(vec);     return strResult; } std::string concat(std::string& x, std::string& y, std::vector<std::string>& vec) {     if (atoi(x.c_str()) < 0)     {         return;     }     else {         std::string concatStr = y + x;         top_back(vec);         top_back(vec);         return concatStr;     } } void dispseq(std::vector<std::string>& vec) {     std::vector<std::string>::const_iterator iter;     for (iter = vec.begin(); iter != vec.end(); iter++)     {         std::cout << *iter << std::endl;     } } void enterSequence() {     std::vector<std::string> command =     {         "end",         "sum",         "subtract",         "concat",         "discard",         "dispseq"     };     std::vector<std::string> sequence;     std::string input;     std::string a;     std::string b;     do     {         std::cin >> input;         sequence.emplace_back(input);         if (input == COMMAND_END)         {              top_back(sequence);         }         if (input == COMMAND_SUM)         {             top_back(sequence);             a = sequence[sequence.size() - 1];             b = sequence[sequence.size() - 2];             sequence.emplace_back(sum(a, b, sequence));         }         if (input == COMMAND_SUBTRACT)         {             top_back(sequence);             a = sequence[sequence.size() - 1];             b = sequence[sequence.size() - 2];             sequence.emplace_back(subtract(a, b, sequence));         }         if (input == COMMAND_CONCAT)         {             top_back(sequence);             a = sequence[sequence.size() - 1];             b = sequence[sequence.size() - 2];             sequence.emplace_back(concat(a, b, sequence));         }         if (input == COMMAND_DISCARD)         {             top_back(sequence);             top_back(sequence);         }         if (input == COMMAND_DISPSEQ)         {             top_back(sequence);             dispseq(sequence);         }     } while (input != COMMAND_END); } int main() {     enterSequence();     std::cin.get();     std::cin.get();     return 0; } И ето проблемната функция:
       
      std::string concat(std::string& x, std::string& y, std::vector<std::string>& vec) {     if (atoi(x.c_str()) < 0)     {         return;     }     else {         std::string concatStr = y + x;         top_back(vec);         top_back(vec);         return concatStr;     } }  
      Както виждате ако стрингът x(който естествено го превръщам в интиджър) е по-малък от 0, теоритично трябва да излезна от функцията, и това е единственият начин за който се сетих, с return;, обаче пък компилаторът иска функцията да връща стойност, понеже е от тип стринг.
      Как да съчетая двете? - да връща стринг ако всичко е по план, и да излиза ако е по-малко от 0.
    • от Chris Panov
      Здравейте,
      В момента имам сериозен проблем със взимането на броят на елементи в даден вектор.
      vec.size(); и  
      sizeof(vec) / sizeof(vec[0]); не работят. Програмата те пита за брой ключове за даден тест, въвеждаш ключовете, после въвеждаш и отговорите, които са били дадени, и програмата ги сравнява и в зависимост от това колко верни отговори имаш ти дава точки. Ключовете и дадените отговори са тип char. ("A", "B", "C" etc.)
      Ето го и кода, като повечето съм го направил на коментар за да си тествам само функцията която извежда броя на елементите.
      #include "stdafx.h" #include <iostream> #include <vector> #define CONSOLE_LOG(x) std::cout << x; std::vector<char> keys = {'A', 'B', 'C', 'D', 'E'}; std::vector<char> studentAnswers; int n, points = 0; char key, answer; template <typename T> T vecSize(std::vector<T>& vec) { T size = vec.size(); return size; } /* template <typename T1> void enterKeys(std::vector<T1>& k) { CONSOLE_LOG("Please enter the number of keys: "); std::cin >> n; for (int i = 0, counter = 1; i < n, counter <= n; i++, counter++) { CONSOLE_LOG("Key " << counter << ": "); std::cin >> key; k.emplace_back(key); } } template <typename T2> void enterAnswers(std::vector<T2>& stAns) { for (int i = 0, counter = 1; i < n, counter <= n; i++, counter++) { CONSOLE_LOG("Answer " << counter << ": "); std::cin >> answer; stAns.emplace_back(answer); } } template <typename T3> void getGrade(std::vector<T3>& x, std::vector<T3>& y) { for (int i = 0; i < n; i++) { if (x[i] == y[i]) { points++; } } CONSOLE_LOG("Points: " << points); } */ int main() { /* enterKeys(keys); enterAnswers(studentAnswers); getGrade(studentAnswers, keys); */ std::cout << keys.size() << std::endl; std::cout << vecSize(keys) << std::endl; std::cin.get(); std::cin.get(); std::cin.get(); return 0; } Опитах всевъзможни начини, и пак не става. Идеята е да заместя n променливата със броя на елементите от вектора. Програмата върви по един и същи начин, защото все пак в n променливата запазваме големината на вектора, но бих искал да си го направя с функция.
      Както виждате на края на програмата си извеждам тестове. Първият, който си е по конвенционалният метод си работи сам по себе си, но пък във for цикъл не бачка.
      А вторият е функцията която съм направил. Проблемът е че ми извежда непознат символ - "�"
      Проблемът е че типът на елементите във вектора е char, защото като го направих с int тип си работеше както трябва.
      Бих бил изключително благодарен ако някой може да ме насочи и да ми бутне едно рамо :)
  • Дарение

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.