Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2012, 02:05   #11
ezhidudek
Пользователь
 
Регистрация: 30.11.2012
Сообщений: 43
По умолчанию

SOS SOS SOS

Ответил препод.

вот,что он написалперевожу с другого языка,поэтому изложу только суть)
"Уже почти все в порядке.ПРограмма некорректно работает при задании типа "12/a" .Еще использована неудобная функция gets(),вместо нее лучше использовать fgets(),также лучше использовать getchar()
вместо getch(),после этого не нужно INCLUDOVAT(ИНКЛУДИРОВАТЬ,ВТФ ЧТО ЗА СЛОВО Я НЕ ЗНАЮ)нестандартный файл conio.h.
И последнее - обратите внимание на переменную в скобках цикла for - в СИ это не работает"
Вот версия,которую ты кинул в тему..Скажи пожалуйста,это сильно сложно исправить так,как он написал?
Код:
#include <math.h>
 #include <stdio.h>
 #include <conio.h>
 #include <string.h>

 int main()
 {
 float a,b;
 char ch;
 char str[50], buf[50];
 int k = 0;

 printf ("Zadejte vyraz:\n");

 gets(str);

 for(int i=0; i<strlen(str); i++)
 if(str[i] != ' ')
 buf[k++] = str[i];

 buf[k] = '\0';

 sscanf (buf, "%f%c%f",&a,&ch,&b);
 switch (ch)
 {
 case '+': printf("=%g",a+b); break;
 case '-': printf("=%g",a-b); break;
 case '*': printf("=%g",a*b); break;
case '/': if(b == 0) printf("Chyba: deleni nulou"); else printf("=%g",a/b);
 break;
 case '%': printf("=%g",fmod(a,b)); break;
 default: printf("Chyba: neplatne zadani");
 }
 getch();

 return 0;
 }

Последний раз редактировалось ACE Valery; 28.12.2012 в 21:04.
ezhidudek вне форума Ответить с цитированием
Старый 28.12.2012, 02:10   #12
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

Скажу по поводу 2 последних замечаний:
1) Не нужно писать #include <conio.h>
2) for(int i=0;... - так можно писать только начиная со спецификации C99 (не уверен в терминологии, но если простым языком, то в "обычном" си так нельзя).
Нужно написать int i; for (i=0;... и т.д.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 28.12.2012, 20:12   #13
ezhidudek
Пользователь
 
Регистрация: 30.11.2012
Сообщений: 43
По умолчанию

<BDA>,понял,а как быть с остальными замечаниями?
спасибо.
ezhidudek вне форума Ответить с цитированием
Старый 28.12.2012, 22:01   #14
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

Вместо gets(str); использовать fgets(str, 50, stdin);
Вместо getch(); использовать getchar();
Насчет неправильности 12/a.
Я бы сделал, как советовал <- DelpHIFanat ->, т.е. посимвольный разбор.
Буквально пару недель назад писал "красивый" разбор (с использованием scanf) строки на параметры для учебной задачи - 6 строчек кода потребовали около 2 часов времени (в этот день сделал только эти 6 строчек).

Вы должны обрабатывать количество распознанных параметров (число, которое возвращается sscanf).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 29.12.2012, 01:22   #15
ezhidudek
Пользователь
 
Регистрация: 30.11.2012
Сообщений: 43
По умолчанию

BDA,
вот что получилось,но теперь калькулятор не считает..где я ошибся?

Код:
#include <math.h>
 #include <stdio.h>
 #include <conio.h>
 #include <string.h>

 int main()
 {
 float a,b;
 char ch;
 char str[50], buf[50];
 int k = 0;

 printf ("Zadejte vyraz:\n");



   
   while(1)
   {
    
     if( scanf("%d %c %d ", &a, &ch, &b) == 3 ) break;
     printf("\"%c\" NE CISLO !!!\n", getchar());
     fflush(stdin);
   }
   getchar(); 
  
 

 fgets(str, 50, stdin);

 for(int i=0; i<strlen(str); i++)
 if(str[i] != ' ')
 buf[k++] = str[i];

 buf[k] = '\0';

 sscanf (buf, "%f%c%f",&a,&ch,&b);
 switch (ch)
 {
 case '+': printf("=%g",a+b); break;
 case '-': printf("=%g",a-b); break;
 case '*': printf("=%g",a*b); break;
case '/': if(b == 0) printf("Chyba: deleni nulou"); else printf("=%g",a/b);
 break;
 case '%': printf("=%g",fmod(a,b)); break;
 default: printf("Chyba: neplatne zadani");
 }
getchar();;

 return 0;
 }
ezhidudek вне форума Ответить с цитированием
Старый 30.12.2012, 01:38   #16
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

Код:
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <locale.h>
#include <ctype.h>

int
main() {
    struct lconv l_struct;
    struct lconv *l_ptr = &l_struct;
    l_ptr = localeconv();
    float a, b;
    char ch;
    char str[50], buf[50];
    int k = 0, i;
    printf ("Zadejte vyraz:\n");
    fgets(str, 50, stdin);
    for(i = 0; i < strlen(str); ++i) {
        if(isdigit(str[i]) ||
           str[i] == l_ptr->decimal_point ||
           str[i] == '+' ||
           str[i] == '-' ||
           str[i] == '*' ||
           str[i] == '/' ||
           str[i] == '%') {
            buf[k++] = str[i];
        } else if (!isspace(str[i])) {
            printf("ERROR\n");
            getchar();
            return 0;
        }
    }
    buf[k] = '\0';
    sscanf (buf, "%f%c%f", &a, &ch, &b);
    switch (ch) {
    case '+':
        printf("=%g",a+b);
        break;
    case '-':
        printf("=%g",a-b);
        break;
    case '*':
        printf("=%g",a*b);
        break;
    case '/':
        if(b == 0) printf("Chyba: deleni nulou");
        else printf("=%g",a/b);
        break;
    case '%':
        printf("=%g",fmod(a,b));
        break;
    default:
        printf("Chyba: neplatne zadani");
    }
    getchar();
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 03.01.2013, 15:43   #17
ezhidudek
Пользователь
 
Регистрация: 30.11.2012
Сообщений: 43
По умолчанию

ошибка..
ISO C++ forbids comparison between pointer and integer

и это же С++..а нельзя как-нибудь исправить то,что я прислал?.
ezhidudek вне форума Ответить с цитированием
Старый 03.01.2013, 16:10   #18
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

Во-первых, на какой строке выдается предупреждение?
Во-вторых, это Вы используете (имхо) с++ компилятор вместо с компилятора - в самом коде, имхо, нет никаких "фишек" с++.
В-третьих, это и есть Ваш исправленный код, просто во это:
Код:
   while(1)
   {
     if( scanf("%d %c %d ", &a, &ch, &b) == 3 ) break;
     printf("\"%c\" NE CISLO !!!\n", getchar());
     fflush(stdin);
   }
   getchar(); 
 fgets(str, 50, stdin);
- бред.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 03.01.2013 в 16:32.
BDA вне форума Ответить с цитированием
Старый 03.01.2013, 23:12   #19
ezhidudek
Пользователь
 
Регистрация: 30.11.2012
Сообщений: 43
По умолчанию

BDA,

ошибка выдается на 20 строчке.
str[i] == l_ptr->decimal_point ||

вот здесь



не буду с вами спорить,просто выглядит замудренно,не поверит,что я такое написал сам.
ezhidudek вне форума Ответить с цитированием
Старый 03.01.2013, 23:48   #20
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

Я добавил l_ptr->decimal_point, чтобы получать десятичный разделитель от системы, но Вы можете это выбросить:
Код:
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int
main() {
    float a, b;
    char ch;
    char str[50], buf[50];
    int k = 0, i;
    printf ("Zadejte vyraz:\n");
    fgets(str, 50, stdin);
    for(i = 0; i < strlen(str); ++i) {
        if(isdigit(str[i]) ||
           str[i] == '.' ||
           str[i] == '+' ||
           str[i] == '-' ||
           str[i] == '*' ||
           str[i] == '/' ||
           str[i] == '%') {
            buf[k++] = str[i];
        } else if (!isspace(str[i])) {
            printf("ERROR\n");
            getchar();
            return 0;
        }
    }
    buf[k] = '\0';
    sscanf (buf, "%f%c%f", &a, &ch, &b);
    switch (ch) {
    case '+':
        printf("=%g",a+b);
        break;
    case '-':
        printf("=%g",a-b);
        break;
    case '*':
        printf("=%g",a*b);
        break;
    case '/':
        if(b == 0) printf("Chyba: deleni nulou");
        else printf("=%g",a/b);
        break;
    case '%':
        printf("=%g",fmod(a,b));
        break;
    default:
        printf("Chyba: neplatne zadani");
    }
    getchar();
    return 0;
}
А код проверки, имхо, простой:
Считываем строку и переносим ее в буфер по правилам - если цифра или разрешенный символ, то переносим, иначе, если не пробельный символ, то ошибка.
На самом деле, можно было бы читать посимвольно в буфер.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
калькулятор Татьяна22 JavaScript, Ajax 9 06.05.2012 13:21
калькулятор Hilda Помощь студентам 2 28.04.2010 22:50
Калькулятор Hilda Помощь студентам 3 25.04.2010 16:04
Калькулятор manick Общие вопросы Delphi 8 23.04.2010 20:42
калькулятор Bat{CMD}_Men Общие вопросы Delphi 1 22.04.2010 09:36