Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > закидывает в компиляторе ошибками начиная с C2143


Автор: Volker 27.9.2017, 00:03
#include<stdio.h>
#include<math.h>
#include <locale.h>
main()
{
    setlocale(LC_ALL, "Rus");
    int g, 1<=m<=12, d=Kdm[m-1], n, N, Z, Kdm[m-1]={31,28,31,30,31,30,31,31,30,31,30,31};
    double a, y, k;

    printf("g=");
    scanf("%d", &g);

    if(g<1583)
    {
        printf("введите дату от начала работы Григорианского календаря(с 1583г. и выше)\n");
    }
    else
    {
        for(m=1;m==12;m++)
        {

            if((m==2)&&(g%4==0)&&(g%100!=0)||(g%400==0))
            {
                d=Kdm[m-1]+1;
            }
            else
            {
                d=Kdm[m-1];
            }

            a=(14-m)/12;
            y=g-a;
            k=m+12a-2;
            Z=7000+d+y+y/4+y/100+y/400+(31*k)/12;
            N=Z%7;

            if(N=3)
            {
                n++;
            }
        }

        printf("n=%d сред(ы\а) приходящихся на конец месяца в году\n");

}

Никак не пойму что не нравится компилятору в 7 и 8 строке. Подозреваю, что большинство остальных ошибок идут именно от туда, ибо не могут распознать переменные. Может кто посказать что не так в моей работе? (И желательно почему это не так) Заранее спасибо!

Автор: feodorv 27.9.2017, 12:39
Ох. Ну тут целый букет недоразумений.
  • Цитата(Volker @  27.9.2017,  00:03 Найти цитируемый пост)
    double a, y, k;
    Вам точно нужен double?
  • Цитата(Volker @  27.9.2017,  00:03 Найти цитируемый пост)
    1<=m<=12
    Что Вы этим хотели сказать? Что номер месяца может принимать значения от 1 до 12? Компилятор не знает таких тонкостей, он может понять только
    Код
    int m;
  • Цитата(Volker @  27.9.2017,  00:03 Найти цитируемый пост)
    int...d=Kdm[m-1]
    Массив Kdm еще не определен, и компилятор о нём ничего не знает.
  • Цитата(Volker @  27.9.2017,  00:03 Найти цитируемый пост)
     Kdm[m-1]={31,28,31,30,31,30,31,31,30,31,30,31}

    Почему m-1? Массив имеет вполне определённый размер - 12, поэтому
    Код
    int Kdm[12] = { ... }
  • Цитата(Volker @  27.9.2017,  00:03 Найти цитируемый пост)
    for(m=1;m==12;m++)
    Почему m==12? Наверное, Вы имели в виду m<=12, да?
  • Цитата(Volker @  27.9.2017,  00:03 Найти цитируемый пост)
    if((m==2)&&(g%4==0)&&(g%100!=0)||(g%400==0))
    У Вас получилось так: если (m==2 && g%4==0 && g%100!=0) или же (g%400==0)... Хотя, Вы хотели так: если (m==2) и ((g%4==0&&g%100!=0) или (g%400==0)). То есть отсутствует пара скобок () в нужном месте.
  • Цитата(Volker @  27.9.2017,  00:03 Найти цитируемый пост)
    if(N=3){n++;}
    Круто, но переменная n никак не инициализована (ей не присвоено никакое начальное значение, которое, как я предполагаю, должно быть нулём).
  • Цитата(Volker @  27.9.2017,  00:03 Найти цитируемый пост)
    if(N=3)
    Оператор сравнения в C/C++ - это ==, а не =, что есть оператор присваивания.
  • Цитата(Volker @  27.9.2017,  00:03 Найти цитируемый пост)
    printf("n=%d сред(ы\а)...";
    Если хотите вывести символ \ в printf, то его нужно удваивать (так как по совместительству он является ещё и экранирующим символом), а так у Вас получился вывод на экран несуществующего спецсимвола '\a'.
  • В языке программирования C функция main() требует по окончании возвращения какого-то значения (это код завершения программы, обычно - ноль), и лучше описывать main() как 
    Код
    int main()
  • что-то ещё, что вылетело из головы, пока писал эту простыню...
Короче, не берусь судить о корректности используемого Вами алгоритма, но по-моему Ваша программа должна иметь вид, похожий на следующий:
Код

#include <stdio.h>
#include <locale.h>

const int Kdm[12]={31,28,31,30,31,30,31,31,30,31,30,31};

int main()
{
  int g, m, d, n, N, Z;
  double a, y, k;

  setlocale(LC_ALL, "Rus");

  printf( "g=" );
  scanf( "%d", &g);

  if( g < 1583 )
  {
    printf( "введите дату от начала работы Григорианского календаря(с 1583г. и выше)\n" );
  }
  else
  {
    n = 0;

    for( m = 1; m <= 12; m++)
    {
      d = Kdm[m-1];
      if( (m == 2) && ((g % 4 == 0) && (g % 100 != 0) || (g % 400 == 0)) ) d++;

      a = (14 - m) / 12;
      y = g - a;
      k = m + 12 * a - 2;
      Z = 7000 + d + y + y/4 + y/100 + y/400 + (31*k)/12;
      N = Z % 7;

      if( N == 3 ) n++;
    }

    printf( "n=%d сред(ы\\а) приходящихся на конец месяца в году\n", n);
  }

  return 0;
}

Автор: Volker 27.9.2017, 15:56
Спасибо большое! ща все проанализирую и постараюсь исправиться

Автор: Volker 27.9.2017, 17:23
все исправил, все работает. примерно такое же как у вас и вышло

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)