2009-11-17 4 views
4

С помощью других, я переделал код с нуля из-за них, указав многочисленные ошибки и все, что не сработает. Таким образом, я изменил код в массовом порядке.струнная программа для магазина мороженого (Отредактировано снова)

У меня есть программа, которая отличается от двух настроек форматирования, и я не могу понять, как работать.

Мне нужно только распечатать «DAILY SCOOP REPORT» один раз в верхней части вывода, но я переместил его, но из-за того, как настроены массивы, я не знаю, куда его поместить.

Вот мой код:

#include <iostream> 

включает

включает

включают

включают

включают

с использованием namespace std;

int main() { string flavor_input, Capitalize; струнные ароматы [] = {«Шоколад», «Ваниль», «Клубника», «Монетный двор», «Роки-роуд», «Мокка»}; int scoop_count [6] = {0, 0, 0, 0, 0, 0}, scoops = 0, j, k;

bool valid_option; 

cout << "Welcome to Frozen Tongue Ice Cream Shop\n"<<endl; 
cout << "Flavors avaliable: "<<endl; 
cout << "Chocolate "<<endl; 
cout << "Valnilla "<<endl; 
cout << "Strawberry "<<endl; 
cout << "Mint "<<endl; 
cout << "Rocky Road "<<endl; 
cout << "Mocha \n"<<endl; 

while(true) { 

    cout << "Please enter the flavor of icecream sold or 'STOP' to exit.\n"<<endl; 
    getline (cin, flavor_input); // getline causes rocky road to be accepted with a space between the words. 


    string::iterator it(flavor_input.begin()); //converting the first letter of input to uppercase if not already. 

    if (it != flavor_input.end()) 
     flavor_input[0] = toupper((unsigned char)flavor_input[0]); 

    while(++it != flavor_input.end()) 
    { 
     *it = tolower((unsigned char)*it); 
    } 


    if (flavor_input == "STOP" || flavor_input == "Stop") 
     break; 

    valid_option = false; 

    for(int i=0;i<6;i++) //Checks to see if input matches those of possible inputs. 
     if(!flavor_input.compare(flavors[i])) 
     { 
      valid_option = true; 
      break; 
     } 

     if(!valid_option) 
     { 
      cout << "Invalid Flavor. Try again.\n\n"; 
      flavor_input.clear(); 
      continue; 
     } 

     for(int i=0;i<6;i++) 
     { 
      if(!flavor_input.compare(flavors[i])) 
      { 
       cout << "Enter how many scoops were sold: "; 
       cin >> scoops; 
       cin.ignore(); 
       scoop_count[i] += scoops; 
       scoops = 0; 
       cout << '\n'; 
       break; 
      } 
     } 
} 


for(int i=0;i<6;i++) 
{ 
    if(!scoop_count[i]) 
     continue; 
    else 
    { 
     cout << "\nDAILY SCOOP REPORT: "<<endl; 
     cout << setiosflags(ios::left) 
      << setw(11) << flavors[i] 
     << resetiosflags(ios::left) 
      << setw(4) << scoop_count[i] << endl; 

    } 
} 


cin.get(); 
return 0; 

}

Еще раз спасибо за все помощи. Это очень ценно.



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

Я выяснил, почему он не работал, когда я переместил строку «DAILY SCOOP REPORT». Я переименовал файл, и когда я его скомпилировал, он выдавал «последнюю рабочую конфигурацию», если это имеет смысл. Поэтому я создал новый проект (файл .cpp должен иметь определенное имя для отправки) и поместить в него код. Теперь строка печатается только один раз.

В нижнем кодовом блоке у меня есть он, где он опускает корпус для всех других букв, кроме первого или около того, как это кажется. Причина, по которой я имею дело, кодирующую то, как я это делаю, заключается в том, что инструкции требуют, чтобы отчет о вкусе распечатывался с первой буквой каждого слова и ниже. Я собираюсь изучить, как укусить 2-й «R» в Rocky Road, но кроме игнорирования пробела я действительно не знаю, как это сделать. Нужно ли разбирать строку?

Любой, кто указал бы мне в правильном направлении, был бы оценен.

Я пробовал, но он дает ошибку, что в первом случае "синтаксическая ошибка: идентификатор" flavor_input ".

//converting the first letter of input to uppercase if not already. 

string :: iterator it (flavor_input.начать());

if flavor_input = "rocky road" 
     (it != flavor_input.end()) 
     flavor_input[6] = toupper((unsigned char)flavor_input[6]); 

    if (it != flavor_input.end()) 
     flavor_input[0] = toupper((unsigned char)flavor_input[0]); 

    while(++it != flavor_input.end()) 
    { 
     *it = tolower((unsigned char)*it); 
    } 
+0

Вы говорите, что вы не можете получить программу для компиляции. Пожалуйста, опубликуйте ошибки компилятора. Кроме того, это домашнее задание? – atk

+0

Это должно быть помечено как задание домашней работы. –

+5

+1 для совершения покупок перед публикацией. –

ответ

5

switch не работает со строками.

Вы должны использовать оператор ==, чтобы выбрать правильный выбор так:

string count = // ... something 
if (count == "choc") { 

} 
else if (count == "van") { 

} 
else if (count == "str") { 

} // .. etc 

Несколько других вещей: убедитесь, что вы записываете string с последовательным случае, нижним регистром и без верхнего регистра. String - это нечто иное, чем string.

Убедитесь, что вы окружаете строки двойными кавычками "" и не одинарные кавычки ''. одинарные кавычки предназначены для одиночных символов, таких как 'a' или 'b'. двойные кавычки для нескольких символов строки, как "abc" и "hello"

Имея слово count, как и имя функции и имя аргумента, вероятно, плохая идея, и не будет компилироваться, так как то же самое имя означает две разные вещи.

Вы не можете вернуть несколько значений из функции. писать что-то вроде return a,b,c; не означает, что вы, вероятно, хотите, чтобы это означало. оператор запятая (,) позволяет несколько выражений, которые будут оцениваться в том же заявлении, и результатом является значение последнего выражения так писать return 1,2,3; точно так же, как написание return 3;

1

C++ не может переключиться на строку. Замените switch(count) {...} инструкциями if/else if. Кроме того, правильный формат для строки - «строка», а не «строка» (одиночные кавычки обозначают один символ, например: «a»). Кроме того, убедитесь, что вы всегда используете правильный корпус для строковых объектов (string, а не String, как у вас есть как возвращаемые значения)

Кроме этого, было бы полезно увидеть ошибки компилятора, которые вы получаете.

1

Я не смотрел на все это, но это не будет делать то, что вы хотите:

if (flavor = 'STOP' || 'stop') 

Я думаю, что вам нужно:

if (flavor.compare("STOP") == 0 || flavor.compare("stop") == 0) 
1

Другая вещь, которую я заметил в ваш источник: вам придется опускать точку с запятой (-Cola?) в конце следующие строки:

cout << "Please enter the flavor of icecream sold or 'STOP' to exit.\n"<<endl 
    << "Flavors avaliable:\n"<<endl 
    << "chocolate\n"<<endl 
    << "valnilla\n"<<endl 
    << "strawberry\n"<<endl 
    << "mint\n"<<endl 
    << "rocky road\n"<<endl 
    << "mocha\n"<<endl 
    << "Enter flavor : "; 

Это только один огромный ехр ression. То же самое относится и к

cout << "\nDAILY SCOOP REPORT: \n"<<endl 
    << "chocolate :"<<chocolate<<"\n"<<endl 
    << "vanilla :"<<vanilla<<"\n"<<endl 
    << "strawberry :"<<strawberry<<"\n"<<endl 
    << "mint :"<<mint<<"\n"<<endl 
    << "rocky road :"<<rocky_road<<"\n"<<endl 
    << "mocha :"<<mocha<<"\n"<<endl; 

также: endl и "\n" являются избыточными. Вы увидите, что выбор разделяется пустыми строками.

0

Давайте рассмотрим проблемы, которые я вижу.

String count (string& flavor, string& count, string& chocolate, string& vanilla, string& strawberry, string& mint, string& rocky_road, string& mocha); 

Вы используете String здесь, я уверен, что вы имели в виду std::string или просто string.

Внутри функции count (SO усекает код при вставке), вы заканчиваете линию точкой с запятой после endl, но пытаетесь продолжить вывод потока. Я думаю, что вы имели в виду

Далее:

if (flavor = 'STOP' || 'stop') 

Я думаю, что вы имели в виду использовать operator== вместо operator=, что назначение не сравнение. Кроме того, нет никаких переходов в C++, так что вам придется написать, что, как:

if (flavor == 'STOP' || flavor == 'stop') 

Следующая:

switch (count) { case 'choc' : 

две проблемы. Во-первых, вы можете использовать команды plain-old-data (pod) в операторах switch. Использование std :: string в коммутаторе не будет автоматически вызывать operator ==; вам нужно будет использовать инструкции if/else. Кроме того, строковые литералы заключаются в двойные кавычки, тогда как символьные литералы одинарны.

Следующая:

chocCount + count; 

Это на самом деле не утверждение. Я уверен, что вы имели в виду chocCount += count;

Следующая:

if (flavor = chocolate) chocCount + count; 

Опять же, вы хотите использовать == и chocCount += count;.

Большинство из этих проблем повторяются. Вы должны исправить каждую из этих проблем везде, где они существуют. Могут быть и другие проблемы, но я в основном собирал это в своей голове.

Я не читал все это, чтобы найти семантические проблемы, но ваша функция подсчета явно не возвращает счет (по крайней мере, то, что я сейчас вижу в курсе). Вы возвращаете строку, которая, как я полагаю, означает строку.

Вот и все, что этот человеческий компилятор решит для 1 задания на домашнюю работу. Я бы порекомендовал вам пойти читать good C++ tutorial.