Предсказать число - PullRequest
       18

Предсказать число

0 голосов
/ 12 октября 2010

Я хочу, чтобы пользователь ввел 4-значное число, и программа должна сказать, что это 4-значное число, то есть сгенерировать это 4-значное число с помощью атаки грубой силы. Но в строке, указанной ниже, компилятор сообщает недопустимое косвенное обращение. хотел бы получить некоторые комментарии о том, как я это реализую, это хорошая практика?

#include<stdio.h>
void BruteForceAttack(int *arr);
int main()
{
 int *arr,i;
 printf("Enter 4 digits ,press enter after entring each digit:\n");
 for(i=0;i<4;i++)
 scanf("%d",arr+i);
 BruteForceAttack(arr);
 getchar();
 return 0;
}
void BruteForceAttack(int *arr)
{
 int i,j,k,l;
 for(i=0;;i++)
 {
  for(j=0;;j++)
  {
   for(k=0;;k++)
   {
    for(l=0;;l++)
    {
      if((*(arr+0)==i)&&(*(arr+1==j))&&(*(arr+2==k))&&(*(arr+3)==l))   /*Here the compiler says invalid indirection*/
     {
      printf("The number is %d%d%d%d",i,j,k,l);
      return;
     }
    }
   }
  }
 }
}

Ответы [ 6 ]

4 голосов
/ 12 октября 2010

Всего 3 проблемы:

Задача 1:

Ваш arr является висящим указателем, и вы разыменовываете его в scanf.

Вам нужно:

int arr[4]; 

вместо

int *arr;

Задача 2:

Сравнение, включающее j и k, неправильно искажено:

&&(*(arr+1==j))&&(*(arr+2==k))

должно быть

&&(*(arr+1)==j)&&(*(arr+2)==k)
          ^              ^

Задача 3:

Даже с вышеприведенными 2 исправлениями ваша программа будет работать в бесконечном цикле , потому что ваши циклы for имеют без завершающих условий.

Поскольку вы просите пользователя ввести 4 цифры, весь ваш цикл должен идти от 0 до 9 как:

for(i=0;i<10;i++)
        ^^^^^

Добавьте аналогичную проверку и для других 3-х циклов.

3 голосов
/ 12 октября 2010

Я также хотел бы получить некоторые комментарии о том, как я реализую это, является ли это хорошей практикой?

Что касается этой конкретной части вашего вопроса, рассмотрите алгоритмВы пытаетесь реализовать на мгновение.Вам доступны номера, сохраненные в arr.Если пользователь выберет число 9999, вы перебираете 10000 номеров, прежде чем достигнете его.И наоборот, если вы перебираете каждую цифру по одной и останавливаетесь, когда находите правильную цифру (поскольку она известна заранее), вы перебираете 40 раз.

С точки зрения математической сложности ваш текущий алгоритм имеет худшийпроизводительность 10 n , тогда как она может быть реализована как 10n.

2 голосов
/ 12 октября 2010

Ваши скобки неуместны. *(arr+1==j) должно быть *(arr+1)==j и т. Д. Это исправит предупреждение компилятора, но arr[1]==j (и т. Д.) Будет еще лучше.

2 голосов
/ 12 октября 2010

Я вижу пару проблем:

  1. Вы не выделяете память для *arr.Возможно, вы должны определить arr как

    int arr[4];
    

    Затем в scanf вы можете сделать что-то вроде:

    scanf("%d", &arr[i]);
    
  2. Вы можете просто использовать смещения массиваобозначение на проблемной линии:

    if(arr[0] == i && arr[1] == j && arr[2] == k && arr[3] == l)
    
1 голос
/ 12 октября 2010

Рассмотрим ваш внутренний цикл

for(l=0;;l++)
    {
      if((*(arr+0)==i)&&(*(arr+1==j))&&(*(arr+2==k))&&(*(arr+3)==l))   /*Here the compiler says invalid indirection*/
     {
      printf("The number is %d%d%d%d",i,j,k,l);
      return;
     }
    }

Если число, введенное пользователем, - это число, которое не начинается с 000 - как этот цикл будет завершен? Не будет ли это продолжаться бесконечно зацикливаться для i, j, k == 0?

0 голосов
/ 12 октября 2010

Вы не выделили места для обр!Выделите место, используя malloc.

...
int *arr,i;
arr = (int *) malloc(4*sizeof(int));
...

Кроме того, вы конвертируете логическое значение (int в c) в адрес!В строке ошибки указаны неправильные скобки.

...
if((*(arr+0)==i)&&((*(arr+1)==j))&&((*(arr+2)==k))&&((*(arr+3)==l))
..
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...