Напишите функцию, чтобы проверить, является ли ее параметр (положительное целое число) идеальным квадратом. Затем примените эту функцию к вектору натуральных чисел - PullRequest
0 голосов
/ 31 октября 2018

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

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

int check(int a[],int n,int i )
{
    int j;
    for (j=0; j<n ; j++)
    {
    if(a[i]==j*j)
        return 1;
    else
        return 0;
    }
}
int main()
{
   int n,a[100],i;
   printf("\nThe size:\n");
   scanf("%d",&n);
   for(i=0; i<n; i++)
   {
    printf("\na[%d]=",i);
    scanf("%d",&a[i]);

    if(check(a,n,i)==1)
        printf("%d is a perfect square\n",a[i]);
    else
        printf("%d is not a perfect square\n",a[i]);

   }


return 0;
}

Мне удалось заставить его работать, но что-то не так, независимо от ввода (1,4,5,9 ...), оно всегда будет печатать: "не идеальный квадрат"

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Напишите функцию, чтобы проверить, является ли ее параметр (положительное целое число) идеальным квадратом

Что нужно, это:

bool check_if_perfect_square(unsigned n);

Простой поиск целочисленного квадратного корня . Целочисленные процедуры с квадратным корнем не слишком сложны для кодирования. Может быть:

#include <stdbool.h>

// Square root of t round toward 0
unsigned uisqrt(unsigned t) {
  unsigned s, b;
  for (b = 0, s = t; b++, s >>= 1) {
    ;
  }

  s = 1u << (b >> 1);
  if (b & 1) {
    s += s >> 1;
  }

  do {
    b = t / s;
    s = (s + b) >> 1;
  } while (b < s);

  return s;
}

Если вам не нравится этот продвинутый подход, код может медленно повторяться. Не нужно переходить к i<n, но к i <= n/i.

unsigned uisqrt(unsigned n) {
  unsigned i = 0;
  if (n > 0) {
    for (i = 1; i <= n/i; i++) {
      ;
    }
    i--; 
  }
  return i;
}

Тогда чек легко

#include <stdbool.h>

bool check_if_perfect_square(unsigned n) {
  unsigned sr = uisqrt(n);
  return sr*sr == n);
}

Затем примените эту функцию к вектору натуральных чисел

Вооруженный check_if_perfect_square(), просто переберите массив.

#include <stddef.h>
#include <stdio.h>

void square_root_test_array(unsigned *a, size_t array_length) {
  for (size_t i = 0; i<array_length; i++) {
    if (check_if_perfect_square(a[i])) {
      printf("%u is a perfect square\n",a[i]);
    } else {
      printf("%d is not a perfect square\n",a[i]);
    }
  }
}

Пример использования

int main() {
  printf("\nThe size:\n");
  unsigned n = 0;
  scanf("%u",&n);
  unsigned a[n];

  for(unsigned i=0; i<n; i++) {
    printf("a[%u] = ",i);
    scanf("%d",&a[i]);
  }

  // Now test array
  square_root_test_array(a, n);
  return 0;
}
0 голосов
/ 31 октября 2018

То, что вам нужно, это передать в функцию только число. Для этого вы можете просто сделать:

int check(int value, int n)
{
    for (int j=0; j<n ; j++)
        if(value==j*j)
            return 1;
    return 0;
}

и вызовите функцию следующим образом:

check(a[i], n)

Теперь вы передаете не весь массив, а только число, т. Е. Его i-е число.

На данный момент у вас есть функция для проверки одно число . Подумайте, что вам нужно сделать, чтобы проверить набор чисел. Как бы вы применили это check() к каждому числу вашего вектора?

PS: Важное и фундаментальное замечание заключается в том, что вы должны сделать отступ для своего кода , поскольку он делает все гораздо более читабельным (например, фигурные скобки выровнены).


Приложение:

Вы можете заставить свою начальную функцию работать так:

int check(int a[],int n,int i )
{
    int j;
    for (j=0; j<n ; j++)
    {
        if(a[i]==j*j)
            return 1;
    }
    return 0;
}

чтобы вы не прекратили зацикливание, когда условие не имеет значения, но продолжите проверять и другие записи.

Однако я настоятельно рекомендую использовать мое предложение выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...