2013-11-26 2 views
0

Я написал краткую программу (расчет заработной платы), чтобы помочь мне оставаться на скорости. По какой-то причине, когда я компилирую это, я продолжаю получать ошибку «53: синтаксическая ошибка до»; токен "ошибка синтаксиса перед ';' token

#include

int main() 
{ 
#define week 7; 
#define year 365; 
int jan,feb,mar,apr,may,june,july,aug,sep,oct,nov,dec; 
int wage; /* Upgrade to float in future */ 
char input,month; 

int holder; 

jan=mar=may=july=aug=oct=dec=31; 
apr=june=sep=nov=30; 
feb=28; 

for(;;) 
{ 
    if(input='y') 
    { 
     #define YEAR 366; 
     break; 
    } 
    else if(input='n') 
    { 
     break; 
    } 
    else 
    { 
     printf("Unable to understand input"); 
    } 
} 

printf("Enter wage/day in pounds.\n?\n"); 
scanf("%d",&wage);  /* unsure if I need to get string and then use atoi */ 
printf("Wage per day:\t%d\n",wage); 
printf("Wage per week:\t%d\n",wage*7); 
printf("Wage per month:\t%d\n",wage*30); 

holder=YEAR; 
printf("Wage per year:\t%d\n",wage*holder); 
printf("As months have varying day amounts, if you wish to view a specific month type:\n"); 
printf("A-Jan\nB-Feb\nC-Mar\nD-Apr\nE-May\nF-June\nG-July\nH-Aug\nI-Sep\nJ-Oct\nK-Nov\nL-Dec\nor type X-to EXIT"); 

month=getchar(); 

if((month=='A')||(month=='C')||(month=='E')||(month=='G')||(month=='H')||(month=='J')||(month=='L')){ 
    printf("Wage for this month will be:\t%d",wage*31); 
} 
else if((month=='D')||(month=='F')||(month=='I')||(month=='K')){ 
    printf("Wage for this month will be:\t%d",wage*30); 
} 
else if((month=='B')&&(year==365)){ 
    printf("Wage for this month will be:\t%d",wage*28); 
} 
else if((month=='B')&&(year==366)){ 
    printf("Wage for this month will be:\t%d",wage*29); 
} 
else if(month=='X'){ 
    exit(1); 
} 
return 0; 

}

Независимо от того, сколько раз я читаю его, мне просто не удается увидеть, что я делаю неправильно.

В качестве побочного примечания, если кто-то чувствует, что кричит/дает указатели на мой стиль, я ценю любые советы, которые могут привести к улучшению моих навыков.

Спасибо всем, что было в подавляющем большинстве случаев быстрого ответа, я получил код компилируется правильно, так что теперь я могу начать отладку ошибки во время выполнения (Прежде чем кто упоминает об этом. Да, я понимаю необходимость вымывать после ввода)

+4

'if (month == 'A' || 'C' || 'E' || 'G' || 'H' || 'J' || 'L') {' вы не можете сделать что. – Matthew

+1

if ((month == 'A') || (month == 'B') || ...) – Jekyll

+0

Там нет ';' токена как 53. Должно быть, что-то, что вы нам не показываете. Вы случайно определили «год» как макрос ??? – AnT

ответ

0

Ваш синтаксис неправильно, правильный способ написать это:

if((month=='A')||(month=='C')||(month=='E')||(month=='G')||(month=='H')||(month=='J')||(month=='L')){ 
printf("Wage for this month will be:\t%d",wage*31); 
} 

и так далее. Но вы можете подумать о переключателе, который, вероятно, легче читать.

switch(month) { 
    case 'A': 
    case 'C': 
    case 'E': 
    case 'G': 
    case 'H': 
    printf("statement A\n"); 
    break; 
    case 'K': 
    case 'D': 
    case 'F': 
    printf("statement B\n"); 
     break; 
    case 'B': 
    if(year == 365) { 
     printf("something else\n"); 
    } else if(year == 366) { 
     printf("something else\n"); 
    } else { 
     printf("Unexpected year %d\n", year); 
    } 
    break; 
    case 'X': 
    return -1; /* Note here return... not exit! */ 
    default: 
     printf("Why am I here?\n"); 
     break; 
} 

Теперь, когда вы редактировали другую ошибку, #define YEAR 365; Избавиться что «;». Вы можете предпочесть определение, что в качестве int вместо того, чтобы использовать препроцессор определить, EXPECIALLY , если вы собираетесь изменить его значение

2

вы не можете сделать

if (month=='A'||'C'||'E'||'G'||'H'||'J'||'L'){ 
    ... 
} 

Этого пути month=='A'||'C'||'E'||'G'||'H'||'J'||'L' вы сравниваете неправильные значения, т.е. <bool> || <char> || <char> ||..., который дает вам неверный синтаксис.

Попробуйте вместо этого,

if (month=='A' || 
    month=='C' || 
    month=='E' || 
    month=='G' || 
    month=='H' || 
    month=='J' || 
    month=='L') { 
    ... 
} 

Однако, как уже упоминалось @danfuzz, вопрос, кажется, лежит в другом месте ...

4

Одна ошибка (хотя и не один, который сразу же получил вам, кажется,) эта линия:

exit 1; 

в C, exit является регулярной функцией, и поэтому вы должны назвать это так:

exit(1); 

Как указано другими, использование вами || также неверно, хотя это, вероятно, дает вам предупреждения (если есть), а не ошибки.

+1

Вы правы в синтаксисе вызова 'exit', но в соответствии с OP компилятор выдает ошибку намного раньше, чем этот код. –

+1

В самом деле, спасибо. Я подберу свой ответ соответственно. – danfuzz

2

Есть много катастрофических проблем с кодом, но большинство из них (кроме exit 1 бит) формально компилируется. Они просто не делают то, что, по вашему мнению, делают.

Однако вы заявляете, что получаете ошибку компиляции задолго до этого exit 1. Если это так, то это должно быть вызвано тем, что вы не показываете нам, поскольку в строке 53 нет ;. Я предполагаю, что year определяется как макрос, содержащий ;.

EDIT: В комментариях вы сказали, что вы определили year в 365. Я подозреваю, что вы сделали это

#define year 365; 

Это то, что вызывает ошибку. Избавьтесь от этого ; после 365. Однако, если это так, я все равно не понимаю, почему вы бы сравнили свой year с 365 или 366, если вы уже определили его как 365.

EDIT: Итак, это точно так, как я догадался. Вам не нужны те ; после #define операторов для констант манифеста. Это ваша ошибка. Макросы замещаются текстовой подстановки значения, что в настоящее время ваш

if((month=='B')&&(year==365)){ 

переводится в

if((month=='B')&&(365;==365)){ 

, который является тем, что вызывает исходную ошибку. Если вы хотите определить year как макро константа, которая стоит за 365, она должна быть

#define year 365 

То же самое относится и к week, хотя вы не используете его в любом месте вашего кода.

Смежные вопросы