Технологии

Решено

Я ещё только 2 месяца изучаю язык СИ, поэтому у меня очень много ошибок. Я не вижу здесь ошибок, но написано что что-то не так с IF, программа не закончена, но должно работать: - вопрос №1684237

#include «stdio.h»void main (){int a, b, c, i, f;for (i=0;i<5;i++){printf («Vvedite perviy mnozhitel:»);scanf ("%d", &a);printf («Vvedite vtoroy mnozhitel:»);scanf ("%d",&b);printf («Vvedite proizvidenie:»);scanf ("%d",&c);if (c=a*b){i++};}}

октябрь 28, 2015 г.

  • Всего ответов: 4

  • another anonymous - аватарка

    another anonymous

    9-й в

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

    2 — в язике Си принято использовать выравнивание — так легче читать — видна структура кода

    #include «stdio.h»
    void main ()
    {
      int a, b, c, i, f;
      for (i=0;i<5;i++)
      {
        printf («Vvedite perviy mnozhitel:»);
        scanf ("%d", &a);
        printf («Vvedite vtoroy mnozhitel:»);
        scanf ("%d",&b);
        printf («Vvedite proizvidenie:»);
        scanf ("%d",&c);
        if (c=a*b)
        {
          i++
        };
      }
    }

    3 — в некоторых диалектах Си этот код должен и компилироваться без ошибок (в классическом Си логическое значение проверяется на целочисленном), и выполняться (у вас в ифе произойдет присвоение в С произведения А и В, и его результат может быть интерпретирован ифом… в старых Си)… но… в нем пока некоторый напряг со смыслом...

    что бы понять где ошибка, надо знать ЧТО Вы вообще хотите запрограммировать? (тот самый смысл, Вы кстати его тоже не сообщили, так что приходится додумывать)

    если тут произведение вводит пользователь, а программа его проверяет (не дурак ли пользователь?)

    тогда вероятно Вам нужно не присвоение делать

    c=a*b

    а сравнение на равенство?

    c==a*b

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

    ==

    октябрь 28, 2015 г.
    Ответ понравился автору
    Лучший ответ по мнению автора
  • Виталий - аватарка

    Виталий

    2-й в Технологиях

    Добрый день.

    if (c=a*b) — в данном случае будет вычислено логически (т.е. c присвоено a*b и т.к. присвоение успешно, то результат if будет true),
    В с/c++ правильно сравнивать
    if (c == a*b)
    И да, после i++ должна быть точка с запятой
    {i++;}


    октябрь 28, 2015 г.
  • another anonymous - аватарка

    another anonymous

    9-й в

    о точке с запятой — последний оператор в блоке не требут точки с запятой

    {
          i++
    };

    тут ошибки нет

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

    октябрь 28, 2015 г.
  • another anonymous - аватарка

    another anonymous

    9-й в

    уточнение о присвоении:

    ни в коем случае присвоение не порождает true

    if (c=a*b)

    с будет содержать произведение — какое то целое число

    но исторически в СИ, целые интерпретировались как истина, если больше и ли равно 0, и как ложь — если отрицательное

    но если это компилятор С++, тогда в зависимости от опций он может требовать «настоящего» логического выражения

    если это классический Си — все откомпилируется без ошибок… но на СМЫСЛОВУЮ ошибку может указать преподаватель к примеру

    зы еще уточнение (полностью эквивалентный код) вот что будет происходить на самом деле

    c=a*b
    if ( с )

    с — целое, а значит это допустимо в традиционном Си, и истинность определяется всего лишь знаком

    октябрь 28, 2015 г.

Похожие вопросы

Решетка Кардано

ноябрь 19, 2012 г.

Технологии

счетчик нажатий на кнопку.

декабрь 11, 2011 г.

Технологии