2015-01-10 2 views
0

ВОПРОС: http://www.hpcodewars.org/past/cw17/problems/Prob02--CheckDigit.pdfHP Code Wars Проверьте ошибку алгоритма цифры

Вот мой код:

int checkdigit(){ 

    int n,i,j,sum1,sum2,k; 

    char ch; 
    printf("Enter the number of lines.Then enter ther the codes!"); 
    scanf("%d",&n); 
    char *codes[n]; 
    int msum[n]; 
    int fsum[n]; 
    for(i=0;i<n;++i){ 
     scanf("%s",codes[i]); 
    } 
    for(i=0;i<n;++i){ 
      for(j=0,k=3;j<21;j+=3,k+=3){ 
     char *num; 
     num=codes[i]; 
     ch=num[j]; 
     sum1+=atoi(ch); 
     if(k<21) 
     ch=num[k]; 
     sum2+=atoi(ch); 
    } 
    msum[i]=sum1*3; 
    fsum[i]=((msum[i]+sum2)%10); 
    if(fsum[i]!=0) 
     fsum[i]-=10; 
} 
     for(k=0;k<sizeof(fsum);k++){ 
      printf("%s %d",codes[k],fsum[k]); 
     } 

return 0; 
} 

Кодекс в настоящее время выходит из строя после приема первого кода UPC в качестве входных данных.

+0

Да, msum это имя массива –

+1

'зсапЕ ("% s", коды [я]);': 'коды [я]' ISN» t указывает на llocated memory. – BLUEPIXY

ответ

0

Изменить

fsum[i]=((msum+sum2)%10); 

к

fsum[i]=((msum[i]+sum2)%10); 

Это потому, что msum представляет собой массив целых чисел, и msum[i] представляет собой целое число. Как msum массив, он имеет тип int* и не совместим с int для бинарного оператора %

+0

Да, я получил это, но вы можете объяснить мне, почему он падает после первого кода UPC. –

+0

@pradyumnarahul Мне очень жаль, чтобы сказать вам, что это отдельный вопрос, поскольку он не связан с вашим вопросом, и вам придется задать новый вопрос. Если вы считаете, что этот ответ решил ваш нынешний вопрос, примите это как ответ, чтобы большее сообщество узнало, что на этот вопрос был дан ответ. Простите еще раз. –

0

Здесь

char *codes[n]; 

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

+0

Так что вы предлагаете делать. –

+0

@pradyumnarahul предлагает использовать 'int codes [n] [11];' или '' int codes [n] [12]; '' – BLUEPIXY

+0

Не помогает в результате получить больше ошибок. –

0
#include <stdio.h> 

int checkdigit(int data[12]){ 
    int i, even, odd, result; 

    even = odd = 0; 
    for(i = 0; i < 11; ++i){ 
     if(i & 1) 
      even += data[i]; 
     else 
      odd += data[i]; 
    } 
    result = (odd * 3 + even) % 10; 
    if(result) 
     result = 10 - result; 
    return data[11] = result; 
} 

int main(){ 
    int n; 
    scanf("%d", &n); 
    int codes[n][12]; 
    int i, j; 
    for(i = 0; i < n; ++i){ 
     for(j = 0; j < 11; ++j){ 
      scanf("%d", &codes[i][j]); 
     } 
     checkdigit(codes[i]); 
    } 
    for(i = 0; i < n; ++i){ 
     for(j = 0; j < 12; ++j){ 
      if(j) putchar(' '); 
      printf("%d", codes[i][j]); 
     } 
     putchar('\n'); 
    } 
    return 0; 
} 
+0

Что делать, если (i & 1) означает –

+0

'if (i% 2 == 1)' средняя цифра четного числа. – BLUEPIXY

+0

Спасибо, если у меня возникнут какие-либо дополнительные вопросы, я отступлю от вас. –