Учусь C++

#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;

int main()
{
    bool question;
    setlocale(0, "");
    cout << "Здравствуйте! Вы проходите тест "Кто хочет стать милионером ? ". У вас есть право на одну подсказку, она будет появляться каждые 5 вопросов. Ну что ж, начнём?" << endl;
    cout << "Сколько патентов на изобретения Томас Эдисон получил в США?" << endl;
    if (question == 1903)
        cout << "Верно! Переходим к следующему этапу..."
    else {
        cout << "Подумайте ещё.";
        get_pass();
    }
    cout << "В какой год после основания Рима родился Иисус?" << endl;
    if (question == 753)
        cout << "Верно! Переходим к следующему этапу..." << endl;
    else {
        cout "Подумайте ещё.";
        get_pass();
    }
    cout << "Сколько лет было самому старому человеку в мире?" << endl;
    if (question == 256)
        cout << "Верно! Переходим к следующему этапу..." << endl;
    else {
        cout "Подумайте ещё.";
        get_pass();
    }
    cout << "Какая галактика движется прямо на нашу, Млечный Путь?" << endl;
    if (question == "Галактика Андромеды")
        cout << "Верно! Переходим к следующему этапу..." << endl;
    else {
        cout "Подумайте ещё.";
        get_pass();
    }
    cout << "Сумма чисел от 1 до 1000. Вы можете использовать подсказку!" << endl;
    if (question == 500500)
        cout << "Верно! Переходим к следующему этапу..." << endl;
    else if (question == "Подсказка")
        cout << "Эту цифру можно разделить на две 500." << endl;
    else {
        cout "Подумайте ещё.";
        get_pass();
    }
    cout << "Самый популярный пароль в мире." << endl;
    if (question == "qwerty")
        cout << "Верно! Переходим к следующему этапу..." << endl;
    else if (question == "password")
        cout << "Верно! Переходим к следующему этапу..." << endl;
    else {
        cout "Подумайте ещё.";
        get_pass();
    }
    system("pause");
    return 0;
}

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

Зачем задавать глупые вопросы? Код неправильный. И это покажет первая же попытка его откомпилировать. Или даже раньше IDE (если это достаточно интеллектуальная IDE, например MS Visual Studio) подчеркнёт ошибки.

Из всех многочисленных ляпов откомментировать хочу два:

  1. В программе нет ни одного оператора, который получал бы ввод от пользователя. Поэтому вся эта викторина — штучка сама в себе.

  2. Переменная question нигде не получает значения. Т.е. в общем случае содержит случайное значение. Сравнивать значение типа bool с числом в данном случае бессмысленно: целое, отличное от 0, всегда будет интерпретироваться как true, в противном случае, как false. Сравнение значение типа bool с const char * — синтаксическая ошибка.

Сократить код можно, если наборы из вопроса, правильного ответа и подсказки представить в виде массива. Т.е получится либо массив экземпляров структур или классов (что предпочтительнее), либо двумерный массив.

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

Ещё совет: в качестве контейнеров для текстовых строк используй класс string из STL. Это избавит от головной боли при выделении буфера для С-строк, контроле за границей буфера, сравнении С-строк и пр.

Ещё совет: всегда используй для ответов строки. В данном случае тебе не нужны числа, как числа. Хватит и их символьного представления. Этим ты избавишься от разного типа данных при получении и обработке ответа пользователя.

Ещё совет: почитай статью «Символы кириллицы в консоли Windows». Судя по всему ты пользуешься именно этой осью.

PS. А для проверки ответов, по хорошему, лучше использовать регулярные выражения. Но тут уж грузить не буду ))

Подскажите как правильно записать м=??

#include<iostream>
using namespace std;

int main()
{
    setlocale(0, "");
    int a, b, c;
    char d = 's';
    char p = 'k';
    cout << "Введите первое число:";
    cin >> a;
    cout << "Введите символ:";
    cin >> d;
    cout << "Введите второе число:";
    cin >> b;
    cout << "Введите символ:";
    cin >> p;
    cout << "Введите третие число:";
    cin >> c;
    int m=
    cout << "m=" << m << endl;
    system("pause");
    return 0;
}

Правильно

int m = 0;

А далее, если имеется ввиду «первое число» «символ операции-1» «второе число» «символ операции-2» «третЬе число», то надо либо дважды использовать оператор switch для выбора операции между первым и вторым операндом, и результатом первой операции и третьим операндом, либо, что лучше, написать функцию, которая принимает три аргумента: два операнда и символ операции, и возвращает результат операции над операндами и применить её дважды.

У меня скопилось еще несколько вопросов:

1)что означает "string"?
2)почему "std" записывается перед "string" и между ними ставиться :?
3)что означают строки:
using std ::cout;
using std ::cin;
using std ::endl;
4)что такое int arr?
5)что значат эти строки?
cout<<"["<<i+1<<"]"<<":";
cin>>arr[i];
cout<<"\n Ваш массив:";
6)что такое n?
в чем отличие ++i от i++?
cout<<arr[i]?
7)Почему мы пишем в массивах for (int i=0),а не for (i=0)?

И еще, можно посмотреть пример кода? (лучше, написать функцию, которая принимает три аргумента: два операнда и символ операции, и возвращает результат операции над операндами и применить её дважды.)

Stiv@Vits, ответы на эти твои вопросы и ещё на множество других есть в книгах. Например, Герберт Шилдт «Полный справочник по C++». Гугл тебе в помощь.

Пример кода (не проверял):

#include <stdexcept>

// ...

double expr(double op1, double op2, char operation) {
    double result = 0.0;
    switch (operation) {
    case '+': result = op1 + op2; break;
    case '-': result = op1 - op2; break;
    case '*': result = op1 * op2; break;
    case '/': 
        if (op2 == 0.0)
            throw invalid_argument("division by zero");
        result = op1 + op2; break;
    default:
            throw invalid_argument("illegal operation");
    }
    return result;
}

// ...

    try {
        double m = expr(expr(a, b, d), c, p);
        cout << "m = " << m << endl;
    }
    catch (invalid_argument &ex) {
        cout << ex.what() << endl;
    }

Читал, Герберт Шилдт «Полный справочник по C++», похоже этот справочник для программистов знающих хотя бы основы программирования и которым есть с чем сравнить. Я там почти ничего не понял из его объяснений. Все сумбурно. Может подскажете книгу для начинающих программистов?

Slonopotam, спс за наводку. Пока читаю Стефана Р.Дэвиса, потом может и до них доберусь.)

Пока дошёл до 4 урока «Циклы».
И решил ввести значение переменной i в ручную (не через код)
Через цикл for все работает а через do while нет. Не много погодя пришла мысль что do while не пременим к такой раскладке. Код напишу вручную т.к. с мобилки.

#include <iostream>
using namespace std;

int main (){
setlocale (0,"");
int i;
int sum;
cout<<"Введите значение переменной i "<<endl;
cin>>i;
do {i++;
sum += i;}
while (i>1000)
cout<<"Сумма чисел от "<<i<<"до 1000 ="<<sum<<endl;
return 0;
}

За флуд ссори. Так вот, правильная, нет мысль?

Александр, (1) оформляй код в соответствии с правилами разметки! (2) Пиши с соблюдением правил орфографии и пунктуации. Отмаз про мобилу не принимается. (3) Циклом do-while сэмулировать работу цикла for можно, но уж совсем коряво. Поскольку цикл for проверяет условие продолжения цикла до выполнения тела цикла, а цикл do-whileпосле. А вот цикл while — вполне себе годится.

Подскажите, что такое профамма??? в интернете так и не понял опечатка это или так называют все программы которые являются программами вычисления. В википедии об этом ни слова...

Здравствуйте. Подскажите пожалуйста где ошибка?

#include <iostream>
int main()
{
std::cout << "Hello Kamil!";

system ("PAUSE >> void");
}

Stiv@Vits, судя по Гуглу, «профамма» — это неправильно распознанное OCR слово «программа». Забей.

sam, собственно говоря, в программе ошибки нет. Есть ошибка в команде MSDOS-shell: команда должна звучать так "pause >nul". Но лично я считаю, что вывод подсказки Press any key for continue... более чем оправдан.

#include <iostream>
int main()
std::cout;
std::endl;
{
cout << "Hello Kamil!";

system ("PAUSE >> void");
}

чтобы не писать везде std::
перед int main(void main) нужно написать: using namespace std;

чтобы не писать везде std:: перед int main(void main) нужно написать:
using namespace std;
Согласен. И тогда можно использовать просто system("pause");

(void main)

Не переносимо

нужно написать: using namespace std;

Только если понимаете что Вы действительно делаете,
в т.ч. учесть, что имена будут не квалифицированными.

И тогда можно использовать просто system(«pause»);

И без этого можно было + не переносимая команда.

чтобы не писать везде std::

Много писать чтоли?
Или просто здорового кода не видели?

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.