Различные выходы преобразованной строки Atoi-> int - PullRequest
0 голосов
/ 12 мая 2018

Вот мой входной файл:

Plain Egg
1.45
Bacon and Egg
2.45
Muffin
0.99
French Toast
1.99
Fruit Basket
2.49
Cereal
0.69
Coffee
0.50
Tea
0.75

Это мой код.У меня нет проблем, когда люди заказывают 8 или 9 товаров, но как только они вводят 10 или более товаров, я получаю действительно странные результаты, а не распечатанный чек, который мне хотелось бы увидеть.Например, скажем, кто-то заказывает 8 товаров, и они вводят «12345678» для своего заказа.Я получаю это:

Click Here For Nice Check

Но если пользователь вводит то, что он хочет, скажем, 15 предметов, и они заказывают "123456781234567", я получаю ЭТО:

Click here for an ugly check

Даже когда они заказывают 10 предметов, я получаю только чек: /:

Click here for a blank check???

Что в мире происходит с моей программой?Это связано со мной, используя c-строки?Я хочу понять, что происходит внутри моего маленького компьютера, и понять, как мой компьютер думает.Если вы можете объяснить мне это очень простым способом (я действительно новичок, поэтому мне нужно что-то очень объяснительное с определениями ваших причудливых слов) и каким-то образом я могу понять, потому что, как я уже сказал, я действительно новичок в информатике,Спасибо.

    // Local Restaurant: The 5,000 Fed

#include <cmath>
#include <cstdlib>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <string>

using namespace std;

struct menuItemType {
    string menuItem;
    double menuPrice;
};

void getData(menuItemType list[]);
string showMenu(menuItemType list[]);
void printCheck(string y, menuItemType list[]);

int main() {
    string y;

    menuItemType menuList[8];
    cout << "Hello and welcome to the 5,000 fed. Your local Long Beach café, "
                    "whose                 name is inspired by Jesus' miraculous manifestation "
                    "of bread to feed the 5k! His disciples helped him in passing out "
                    "the bread, and so I am here, your waiter, to help you and assist "
                    "you with your order. ";

    getData(menuList);
    y = showMenu(menuList);
    printCheck(y, menuList);

    return 0;
}

void getData(menuItemType list[]) {

    string menupricet[8];

    ifstream inFile;
    inFile.open("menudata.txt");
    for (int i = 0; i < 8; i++) {
        getline(inFile, list[i].menuItem);
        getline(inFile, menupricet[i]);
    }

    for (int i = 0; i < 8; i++) {
        list[i].menuPrice = atof(menupricet[i].c_str());
    }
}

string showMenu(menuItemType list[]) {

    int amount;
    char number;
    string reps;
    string response = "y";
    string total = "";

    cout << fixed << setprecision(2);
    cout << endl << endl;
    cout << "Here is our wonderful menu. I do recommend the french toast, "
                    "similar to the bread that Jesus ate."
             << endl
             << endl;

    for (int i = 0; i < 8; i++) {
        cout << i + 1 << ". " << setw(13) << left << list[i].menuItem << setw(8)
                 << right << list[i].menuPrice << endl;
    }
    cout << endl;

    cout << "How to order: Write the number you would like and specify how many "
                    "you want of that item by typing it in multiple times. For instance "
                    "an input of \"1135777\" means that you want two plain eggs, one "
                    "muffin, one fruit basket, and three coffees."
             << endl
             << endl;

    cout << "How many items are you ordering total?: ";
    cin >> amount;
    cout << endl;

    cout << "Please input your order, and press enter after your order: ";

    for (int i = 0; i < amount; i++) {
        cin >> number;
        total += number;
    }

    return total;
}

void printCheck(string y, menuItemType list[]) {

    int k = 0;
    int temp = 0;
    double bill = 0;
    int newone = 0;

    k = atoi(y.c_str());

    while (k != 0) {
        newone = newone * 10;
        newone = newone + k % 10;
        k = k / 10;
    }

    cout << "Thank you for dining at the 5,000 fed. Here's your check:" << endl
             << endl
             << endl;

    cout << "_________________" << endl;

    while (newone > 0) {
        temp = newone % 10;
        newone /= 10;
        bill += list[temp - 1].menuPrice;

        cout << left << setw(15) << list[temp - 1].menuItem << right << setw(5)
                 << "|" << list[temp - 1].menuPrice << endl;
    }

    cout << fixed << setprecision(2);
    cout << left << setw(15) << "Amount Due:" << right << setw(10) << "|" << bill
             << endl
             << endl;
}

РЕДАКТИРОВАТЬ: Итак, кто-то попросил меня вставить вывод в виде текста вместо изображений, поэтому вот три вывода:

Они заказывают 8 элементов, таких как "12345678":

_________________
Plain Egg          |1.45
Bacon and Egg      |2.45
Muffin             |0.99
French Toast       |1.99
Fruit Basket       |2.49
Cereal             |0.69
Coffee             |0.50
Tea                |0.75
Amount Due:             |11.31

Они заказывают 15 предметов, таких как "123456781234567":

_________________
French Toast       |1.99
\365\277\357\376^ޝ-        
  YW\300\365\277\357\376all\377
\200\367\277\357\376
\370\277\357\376
\227\370\277\357\376
\331\370\277\357\376%\371\277\357\376\262 
   |0.00
    Coffee             |0.50
    Muffin             |0.99
\362\277\357\376x\362\277\357\376x\362\277\357\376x\362\277\357\376Plain Egg33333    |0.00
Plain Egg          |1.45
Cereal             |0.69
\365\277\357\376^ޝ-YW\300\365\277\357\376all\377\200\367\277\357\376\370\277\357\376\227\370\277\357\376\331\370\277\357\376%\371\277\357\376\262    |0.00
Cereal             |0.69
Amount Due:             |6.31

Они заказывают 10 предметов, таких как "1234567812":

_________________
Amount Due:             |0.00

1 Ответ

0 голосов
/ 12 мая 2018

Проблема в вашем коде связана с размером типа int.Вот решение, вы можете объявить k и new one как unsigned long int, чтобы они могли содержать до 4,294,967,295, который все еще содержит только 10 заказов.

В качестве решения вы можете использоватьstring y как есть вместо преобразования в int.Так что вы можете разместить столько заказов, сколько пожелаете.Чтобы пройти через ордера, вы можете использовать substr и length функции string.

Позвольте мне переписать функцию printCheck для, если можно

void printCheck(string y, menuItemType list[]) {
  double bill = 0;
  for(int i = 0; i< y.length(); i++)
  {
    string a = y.substr(i, 1);
    int kk = atoi(a.c_str());
    bill += list[kk - 1].menuPrice;

    cout << left << setw(15) << list[kk - 1].menuItem << right << setw(5)
             << "|" << list[kk - 1].menuPrice << endl;
  }
  cout << fixed << setprecision(2);
  cout << left << setw(15) << "Amount Due:" << right << setw(10) << "|" << bill << endl;

}

Надеюсь, это поможет.Привет.

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