2015-03-31 2 views
0

Привет Я пытаюсь создать массив из 6 случайных чисел в качестве моих номеров лотереи и сравнить их с моим билетом, чтобы узнать, сколько совпадений у меня есть. Я борюсь с пропущенными указателями как аргументы функций.Сравните два массива и напечатайте количество подходящих элементов

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 


int *get_lotto_draw(int n) 
    { 
     int i; 
     static int lotto[6]; 

     int lottery[50]; 
     int u,j,temp; 

     for (i =0; i<49; i++) 
      lottery[i] = i+1; 


     for (i =0; i<49; i++) 
     { 
      j = (rand()%49)+1; 

      temp = lottery[i]; 
      lottery[i] = lottery[j]; 
      lottery[j] = temp; 
     } 

      for (i =0; i<6; i++)  
      { 
       lotto[i] = lottery[i]; 
      } 

     return lotto;   
    } 

find_matches(int *lotto, int *ticket) 
    {  
     int arrayReturn[sizeof(lotto) + sizeof(ticket)]; 
     int count = 0; 
     int i; 
     int j; 
     for(i = 0; i < 6; i++) 
     { 
      for(j = 0; j < 6; j++) 
      { 
       if(lotto[i]==lotto[j]) 
       { 
        count = count + 1; 

       } 
      } 
     } 

     return count; 
    } 


int main(int argc, char *argv[]) 
{ 
    int i, n = 6; 
    int *lotto; 
    int ticket[6] = {5, 11, 15, 33, 42, 43}; 

    srand(time(NULL)); 

    lotto = get_lotto_draw(n); 

    int count = find_matches(&lotto[6], &ticket[6]); 

    printf("%d\n\n", count); 


    printf("Here is the array: "); 
    for(i = 0 ; i < n ; i++) { 
     printf("%d ", lotto[i]); 
    } 

    printf("\n\n"); 

    return 0; 
} 
+1

Это является Q/сайт. Без вопроса, это (в большинстве случаев) невозможно «ответить» –

+0

Если вы хотите, чтобы кто-то посмотрел ваш код, используйте разумные и последовательные отступ и расположение фигур. – Lundin

ответ

0

Вот код, чтобы сделать сравнение:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 


int *get_lotto_draw(int n) 
{ 
    int i; 
    static int lotto[6]; 

    int lottery[50]; 
    int j, temp; 

    for (i = 0; i<49; i++) 
     lottery[i] = i + 1; 


    for (i = 0; i<49; i++){ 
     j = (rand() % 49) + 1; 

     temp = lottery[i]; 
     lottery[i] = lottery[j]; 
     lottery[j] = temp; 
    } 

    for (i = 0; i<6; i++){ 
     lotto[i] = lottery[i]; 
    } 

    return lotto; 
} 

int find_matches(int *lotto, int *ticket) 
{ 
    int count = 0; 
    int i; 
    int j; 
    for (i = 0; i < 6; i++){ 
     for (j = 0; j < 6; j++){ 
      if (lotto[i] == ticket[j]){ 
       count++; 
      } 
     } 
    } 

    return count; 
} 


int main(int argc, char *argv[]) 
{ 
    int i, n = 6; 
    int *lotto; 
    int ticket[6] = { 5, 11, 15, 33, 42, 43 }; 
    int count = 0; 

    srand(time(NULL)); 

    lotto = get_lotto_draw(n); 
    printf("\nHere is the lotto array: "); 
    for (i = 0; i < n; i++) { 
     printf("%d ", lotto[i]); 
    } 
    printf("\nHere is the ticket array: "); 
    for (i = 0; i < n; i++) { 
     printf("%d ", ticket[i]); 
    } 

    count = find_matches(lotto, ticket); 

    printf("\ncount of matches: %d", count); 
    getchar(); 
    return 0; 
} 
+0

Большое спасибо, это было очень полезно –

0

Здесь:

int count = find_matches(&lotto[6], &ticket[6]); 

вы передаете адрес lotto[6] и ticket[6] который является недопустимым элементом массива. Вы на самом деле хотели написать

int count = find_matches(lotto, ticket); 

, которая является такой же, как

int count = find_matches(&lotto[0], &ticket[0]); 

как имена массивов «затухает», чтобы указатель на его первый элемент.

Есть и другие проблемы!

  1. Объявление функции:

    find_matches(int *lotto, int *ticket) 
    

    отсутствует тип возвращаемого значения. Зафиксируйте его с помощью

    int find_matches(int *lotto, int *ticket) 
    
  2. Декларации массива

    int arrayReturn[sizeof(lotto) + sizeof(ticket)]; 
    

    неправильно, как lotto и ticket является int*. Таким образом, оператор sizeof возвращает размер int*, а не размер всего массива. Вам придется либо жестко закодировать значения, либо передать размер в качестве аргумента функции.

  3. В функции get_lotto_draw, я не вижу причин, почему lottery имеет 50 индексов. Вам нужно только 6 из них. В любом случае, последний (49 th) индекс также не используется.
0

Ваш вызов неверен, и это приводит к неопределенному поведению:

int count = find_matches(&lotto[6], &ticket[6]); 

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

Правильный способ для вызова функции выглядит следующим образом:

int count = find_matches(lotto, ticket); 

или, если вы настроены на использование & оператора,

int count = find_matches(&lotto[0], &ticket[0]); 

Также отметим, что эта декларация

find_matches(int *lotto, int *ticket) ... 

является пре-ANSI, потому что возвращаемый тип функции опущен (в этом случае C compil er принимает int).Вы должны изменить объявление поставить тип возвращаемого значения в явном виде:

int find_matches(int *lotto, int *ticket) ... 
+0

Благодарим за разъяснение этой темы: –

+0

@AliDavies Добро пожаловать! Если вы не ищите дополнительной помощи по этому вопросу, подумайте о том, чтобы принять ответ, нажав на серое галочку рядом с ним. Это позволит другим посетителям сайта узнать, что ваша проблема решена, и заработайте новый значок в Stack Overflow. – dasblinkenlight

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