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

Вам необходимо проверить домашнюю работу Васи Пупкина, в которой он написал равенство. Например, запись вида «2+3=5» является правильной, а «237=421» неверная, но корректная. Корректной записью выражения будем называть последовательность: число, операция («+», «-», «», «/»), число, знак равенства, число. Т.е. если в записи не хватает цифр или же встречается неизвестный символ. Например, записи «2*=3», «173» и «2+2=a» некорректны.

Вот решение для простого и малого кода

int k=scanf(«%d%c%d=%d%s»,&a,&o,&b,&c,&s);

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

А что нужно проверить? Корректность записи или её правильность( 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

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

это препод мне такую задал,а я после паскаля в школе,не совсем ещё освоился с с++

P.S обратите внимание обновил условие

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

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

так вот понимаете,я 4 года работал на Паскале,тут прийшёл в универ мне дали эту задачу и я не знаю,что делать

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

Ребят помогите перевести с Borland C++ 3.1 в Visual c++

 #include <stdio.h>
    #include <stdlib.h>
    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;
    case '/': if(!b) Message("неверно");
          if(a%b) Message("неверно");
          n=a/b; break;
    default : Message("выражение не корректно");


    }


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

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;
}

вот код для моей задачи,запускал на с++ bulder всё работает,если нужна блок-схема или пояснения пишите

#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
bool x=false;
long a,b,c,n,z=0;
char ch;

void Message(char *msg){

  FILE *f=fopen("OUTPUT.TXT","w");

  fprintf(f,"%s",msg);

  fclose(f);

}


void main(){

  FILE *f=fopen("INPUT.TXT","r");

  n=fscanf(f,"%ld%c%ld=%ld",&a,&ch,&b,&c);

  fclose(f);

  if(n<4){cout << "ne korrektno"; Message("выражение не корректно");exit(0);}

  switch(ch){

    case '+': z=a+b; break;

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

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

    case '/': if(!b) {cout << "neverno"; Message("неверно,деление на нуль");x=true;break;} else

              if(a%b){cout << "neverno"; Message("неверно,деление с остатком");x=true;break;} else

              z=a/b; break;

    default : cout<<"neverno"; Message("выражение не корректно");
    }
  if(z==c) {cout<<"verno";Message("верно");} else{if (x==false) {cout<<"neverno"; Message("неверные вычисления");}}
 getch();
}

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

Ответить

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

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

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

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

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

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