Прогнозировать число
-
29-09-2019 - |
Вопрос
Я хочу, чтобы пользователь вводил 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;
}
}
}
}
}
}
Решение
Всего 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:
Даже с вышеупомянутыми исправлениями ваша программа столкнется с бесконечный цикл, потому что ты for
петли имеют нет прекращения условия.
Поскольку вы просите пользователя ввести 4 цифры, весь ваш цикл должен переходить от 0
пока 9
в виде:
for(i=0;i<10;i++)
^^^^^
Добавьте аналогичную проверку для других 3 петлей.
Другие советы
Я также хотел бы иметь несколько комментариев о том, как я их реализую, это хорошая практика?
Что касается этой конкретной части вашего вопроса, рассмотрите алгоритм, который вы пытаетесь реализовать на мгновение. У вас есть цифры, которые вам доступны, хранятся в arr
. Анкет Если пользователь выбирает номер 9999
Вы будете переходить через 10000 номеров, прежде чем добраться до него. И наоборот, если вы выполняете выполнение каждой цифры по одной и останавливаетесь, когда вы найдете правильную цифру (так как она известна заранее), вы итерации 40 раз.
С точки зрения математической сложности, ваш текущий алгоритм имеет худшую производительность 10N., тогда как это может быть реализовано как 10n.
Я вижу пару проблем:
Вы не распределяете память для
*arr
. Анкет Возможно, вам следует определитьarr
в видеint arr[4];
Затем в Scanf вы можете сделать что -то вроде:
scanf("%d", &arr[i]);
Вы можете просто использовать нотацию комплектов массива на проблемной линии:
if(arr[0] == i && arr[1] == j && arr[2] == k && arr[3] == l)
Ваши скобки неуместны. *(arr+1==j)
должно быть *(arr+1)==j
, и т. д., которые исправят предупреждение компилятора, но arr[1]==j
(и т. Д.) Было бы еще лучше.
Рассмотрим свою внутреннюю петлю
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?
Вы не выделили места для ARR! Выделите пространство, используя Malloc.
...
int *arr,i;
arr = (int *) malloc(4*sizeof(int));
...
Кроме того, вы преобразуете логический (int in c) в адрес! Брекеты неверны в линии ошибок.
...
if((*(arr+0)==i)&&((*(arr+1)==j))&&((*(arr+2)==k))&&((*(arr+3)==l))
..