Помогите с кодом для задачи

Олимпиадные задачки чужими руками решаем? Ну-ну...

А что нужно проверить? Корректность записи или её правильность( 2+5=7 )?

Вот здесь я написал только проверку на правильность выражения( знаю что говнокод, но что я с этим поделаю? :( ).
Думаю, что проверку на корректность ввода добавить будет не сложно.

#include <iostream>
#include <cstring>
#include <sstream>
#include <vector>

using namespace std;

double str_to_d( const string& );
void get_tokens( const string&, vector< string >&, const char* );

int main()
{
    string in;
    getline( cin, in );
    vector< string > tokens_val;
    vector< string > tokens_smb;
    get_tokens( in, tokens_val, " -=*/+" );
    get_tokens( in, tokens_smb, "0123456789 " );
    if ( tokens_val.size() == 2 )
    {
        double a, b;
        a = str_to_d( tokens_val[0] );
        b = str_to_d( tokens_val[1] );
        if ( tokens_smb[0] == "=" )
            cout << ( ( a == b )? "YES" : "NO" ) << endl;
    }
    else if ( tokens_val.size() == 3 )
    {
        double a, b, c;
        a = str_to_d( tokens_val[0] );
        b = str_to_d( tokens_val[1] );
        c = str_to_d( tokens_val[2] );
        if ( tokens_smb[0] == "+" )
            a += b;
        else if ( tokens_smb[0] == "-" )
            a -= b;
        else if ( tokens_smb[0] == "*" )
            a *= b;
        else if ( tokens_smb[0] == "/" )
            a /= b;
        if ( tokens_smb[1] == "=" )
            cout << ( ( c == a )? "YES" : "NO" ) << endl;
    }
    return 0;
}

double str_to_d( const string &str )
{
    stringstream ss;
    ss << str;
    double val;
    ss >> val;
    return val;
}

void get_tokens( const string &source, vector< string > &out, const char *d )
{
    out.clear();
    char *buffer = new char[ source.length() + 1 ];
    strcpy( buffer, source.c_str() );
    char *tok_ptr = strtok( buffer, d );
    string temp;
    if ( tok_ptr )
        out.push_back( temp = tok_ptr );
    while ( (tok_ptr = strtok( NULL, d ) ) )
    {
        temp = tok_ptr;
        out.push_back( temp );
    }
    delete []buffer;
    return;
}


UPD

А вы где, кстати, эту задачку взяли?

Погуглите на тему «Вам необходимо проверить домашнюю работу Васи Пупкина» )))

По нагугленным ссылкам посмотрите форумы. Там не все так просто.

  1. Погугли. См. мой предыдущий пост )))
  2. На Паскале ты можешь эту задачу решить? Реши. А перевести с Паскаля на С — обычно плёвое дело. Кстати, по ссылочкам (см. п.1) есть сайтики, где можно отослать свой код (и на Паскале тоже) для автоматической проверки на вшивость.

Nikita1881, как то так?:

#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

void Message( const char* );

template< typename T >
bool f_in( istream&, T& );

int main()
{
    ifstream in( "INPUT.txt", ios::in );
    if ( !in )
        exit( 1 );

    long a, b, c, n = 0;
    char ch, ch2;
    //Следующий кусок кода вызывает у меня очень большие сомнения 
    //Скорее всего, его можно и нужно переписать лучше, но я не знаю как :(
    n = f_in( in, a ) + f_in( in, ch ) + f_in( in, b ) + f_in( in, ch2 ) + f_in( in, c );
    in.close();

    if( n < 4 )
        Message( "Выражение некорректно" );
    else
    {
        switch ( ch )
        {
            case '+':
                a += b;
                break;

            case '-':
                a -= b;
                break;

            case '*':
                a *= b;
                break;

            case '/':
                if ( !b )
                    Message( "Неверно" );
                //Почему, если есть остаток, значит выражение неверно?
                if ( a % b )
                    Message( "Неверно" );
                a /= b;
                break;
        }
        if ( a == c )
            Message( "Верно" );
        else
            Message( "Неверно" );
    }
    return 0;
}

void Message( const char *msg )
{
    ofstream out( "OUTPUT.txt", ios::out | ios::trunc );
    if ( !out )
        exit( 1 );
    out << msg;
    out.close();
    exit( 0 );
}

template< typename T >
bool f_in( istream &stream, T &var )
{
    return ( stream >> var )? true : false;
}

Кстати, ваша программа на запись «5=5» реагирует фразой «Выражение некорректно». Хотя по условия такая форма записи возможна.

Nikita1881, если тупо и в лоб, просто что бы программа компилировалась в MS Visual C++, то так

#include <stdio.h>
#include <stdlib.h>

using namespace std;

long a,b,c,n;
char ch;

void Message(char *msg) {
    FILE *f=fopen("OUTPUT.TXT","w");
    fprintf(f,"%s",msg);
    fclose(f);
    exit(0);
}

void main() {
    FILE *f=fopen("INPUT.TXT","r");
    n=fscanf(f,"%ld%c%ld=%ld",&a,&ch,&b,&c);
    fclose(f);

    if(n<4) Message("выражение не корректно");

    switch(ch) {
        case '+': n=a+b; break;
        case '-': n=a-b; break;
        case '*': n=a*b; break;
        case '/': if(!b) Message("неверно");
            if(a%b) Message("неверно");
            n=a/b; break;
        default : Message("выражение не корректно");
    }

    if(n==c) Message("верно"); else Message("неверно");
}

Тока она всё равно у тебя работает неправильно. Даже учитывая, что я убрал повторный case '/'. Кстати, а нафига тебе ее было тащить под VC++? Borland C++ — кульный компилятор, кроме шуток! Такие программки на нем писать и отлаживать — милое дело.

porshe, не выпендривайся! Человек пишет программу на кондовом С. А ты с темплейтами и потоковым вводом-выводом ))

от еще 2 задачки если можете помогите решить пожалуйста. И вопрос почему используется int main а не void main?
Даны радиус круга и сторона квадрата. У какой фигуры площадь больше?
Дано натуральное число. Определить номер цифры 8 в нем, считая от конца числа. Если такой цифры нет, ответом должно быть число 0, если таких цифр в числе несколько — должен быть определен номер самой левой из них.

Даны радиус круга и сторона квадрата. У какой фигуры площадь больше?

С этой задачей все просто и понятно.

  1. Объявляешь и инициализируешь константу для числа ПИ;
  2. Инициализируешь переменные для радиуса круга и стороны квадрата;
  3. Вычисляешь площадь круга (если мне не изменяет память, ПИ * r квадрат);
  4. Вычисляешь площадь квадрата (сторона * сторону);
  5. Сравниваешь площади фигур.

Дано натуральное число. Определить номер цифры 8 в нем, считая от конца числа. Если такой цифры нет, ответом должно быть число 0, если таких цифр в числе несколько — должен быть определен номер самой левой из них.

Не, Alf, 6-ой пункт не катит. оно у тебя выйдет из цикла по самой правой восьмерке. А нужно по самой левой. Значит по-любому надо доделить чмсло на 10 до нуля.

Макар, ошибку понял (не дочитал до конца) :)
В общем Денис решение может быть таким.

#include <iostream>
using std::cout;
using std::cin;

const int NUMBER = 8;

int main()
{
    cout << "Enter any integer: ";

    int number;

    cin >> number;

    int temp = number;
    int digits = 1;

    while (temp /= 10)
        digits++;

    temp = 10;

    bool flag = true;
    int answer;

    do{
        if (number % temp == NUMBER){
            answer = digits;
            flag = false;
        }

        number /= temp;
        digits--;

    }while (digits);

    if (flag){
        cout << "There is no " << NUMBER << " in your number.\n";
    }
    else{
        cout << "Number " << NUMBER << " is " << answer << " in range.\n";
    }

    return 0;
}

Alf, ты опять невнимательно прочитал условие задачи: номер цифры надо считать от конца числа, а ты считаешь от начала.

#include <iostream>

using namespace std;

const int THE_DIGIT = 8;
const int RADIX = 10;

int main() {

    unsigned int num;

    cout << "Enter integer: ";
    cin >> num;

    unsigned int the_digit_number = 0, digit_counter = 1;

    while (num != 0) {
        if (num % RADIX == THE_DIGIT)
            the_digit_number = digit_counter;
        ++digit_counter;
        num /= RADIX;
    }

    cout << "Answer: " << the_digit_number << endl;

    return 0;
}

А если расширить и на отрицательные числа, то так:

#include <iostream>

using namespace std;

const int THE_DIGIT = 8;
const int RADIX = 10;

int main() {

    int num;

    cout << "Enter integer: ";
    cin >> num;

    int the_digit_number = 0, digit_counter = 1;
    int digit;

    while (num != 0) {
        digit = num % RADIX;
        digit = digit >= 0 ? digit : - digit;  // для отрицательных чисел ))
        if (digit == THE_DIGIT)
            the_digit_number = digit_counter;
        ++digit_counter;
        num /= RADIX;
    }

    cout << "Answer: " << the_digit_number << endl;

    return 0;
}

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

Ответить

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

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

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

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

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

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