функция, которая работает с элементами массива - PullRequest
0 голосов
/ 13 декабря 2018

Мне нужно написать функцию, которая вычитает цифры.Если пользователь вводит 2345, выход должен быть 111 (5-4, 4-3, 3-2);другим примером будет 683, где вывод должен быть 25 (3-8 (взято значение abs), 8-6).

Я написал следующий код, который работает только тогда, когда размер массиваобъявлено.

int subtraction(int arr[], int size) {
int sub = 0;
for (int i = 0; i < size-1; i++) {
    sub = sub * 10 + abs(arr[i] - arr[i+1]);
}
return sub;
}

Однако число, которое вводит пользователь, является случайным и может иметь различные цифры, поэтому я не знаю, какой предел ввести в цикл for.

Например,:

    int arr[] = {1, 2, 55, 56, 65, 135}, i;
    subtraction(arr, 6);
    for (i=0; i<6; i++)
         printf("%d ", arr[i]);

ожидаемый вывод: 0 0 0 1 1 22 * ​​1011 *

Предполагается, что функция должна вычитать последнюю или последнюю цифру из последней, кстати, / из правойвлево / от случайного числа, которое вводит пользователь;например, если вход 5789, выход должен быть 211 (9-8, 8-7, 7-5);если пользователь вводит отрицательное число, программа должна принять его абсолютное значение, а затем выполнить вычитание.Если пользовательский ввод представляет собой однозначное число, результат должен быть 0.

Функция, которую я написал, работает, только когда объявлен размер массива.Я не знаю, как заставить это работать, когда размер не объявлен (я полагаю, что нужны указатели и malloc, поскольку это то, что мне удалось выяснить, прибегая к помощи в поисках товаров, но, к сожалению, я не знаю, как это сделать).

пожалуйста, помогите?

Ответы [ 4 ]

0 голосов
/ 13 декабря 2018

Также как для массива неопределенного размера .Вероятно, вам понадобится динамически распределенный массив .

. Здесь мы получаем количество элементов массива, основанное на вводе пользователем, конечно, в определенных пределах.сначала мы получим число от пользователя, используя fgets(), который даст нам строку, затем мы будем использовать strtol(), чтобы преобразовать числовую часть в скаляр (int).Вы можете использовать scanf("%d", &n), если хотите.

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

#include <stdio.h>
#include <stdlib.h>     //for strtol(), malloc() and NULL guaranteed
//you may also want to add 
#include <limits.h>
#include <errno.h>

#define MAX_STRLEN  12   // can hold all digits of INT_MAX plus '\0' and a posible, AND very likely, '\n'
#define DEC 10           // for strtol base argument

/*
 * I'm lending you my old get_n_dits() function that I used to count decimal digits.
 */
int get_n_dits(int dnum) {

    unsigned char stop_flag = 0;    //we'll use to signal we're done with the loop.

    int  num_dits = 1, dpos_mult = 1;  //num_dits start initialized as 1, cause we're pretty sure that we're getting a number with at least one digit
                                       //dpos_mult stands for digital position multiplier.
    int check_zresult;  //we'll check if integer division yields zero.

    /**
     * Here we'll iterate everytime (dnum / dpost_mult) results in a non-zero value, we don't care for the remainder though, at least for this use.
     * every iteration elevates dpost_mult to the next power of ten and every iteration yielding a non-zero result increments n_dits, once we get
     * the zero result, we increment stop_flag, thus the loop condition is no longer true and we break from the loop.
     */

    while(!stop_flag) {

        dpos_mult *= 10;
        check_zresult = dnum / dpos_mult;
        (check_zresult) ? num_dits++ : stop_flag++;
    }

    return num_dits;
} 


int main(void) {

    int num, ndits;                    //we'll still using int as per your code. you can check against INT_MAX if you want (defined in limits.h)
    int *num_array = NULL;      //let's not unintentionally play with an unitialized pointer.
    char *num_str = malloc(MAX_STRLEN);     //or malloc(sizeof(char) * MAX_STRLEN); if there's any indication that (sizeof(char) != 1)

    printf("please enter a number... please be reasonable... or ELSE!\n");
    printf(">>> ");
    if(!fgets(num_str, MAX_STRLEN, stdin)) {
        fprintf(stderr, "Error while reading from STDIN stream.\n");
        return -1;
    }

    num = (int)strtol(num_str, NULL, DEC);  //convert the string from user input to scalar.
    if(!num) {
        fprintf(stderr, "Error: no number found on input.\n");
        return -1;
    }

    ndits = get_n_dits(num);

    if(ndits <= 0) {
        fprintf(stderr, "Aw, crap!\n");
        return -1;
    }

    printf("number of digits: %d\n", ndits);

    num_array = malloc(sizeof(int) * ndits);        //now we have our dynamically allocated array.

    return 0;

}  
0 голосов
/ 13 декабря 2018
#include <stdio.h>
#include <stdlib.h>

int subtract(int n)
{
  int factor = 1;
  int total = 0;
  int lastPlace = n%10;
  n /= 10;
  while (n>0)
  {
      total += (factor * abs((n%10) - lastPlace));
      factor *= 10;
      lastPlace = n%10;
      n /= 10;
  } 
  return total;
}

void subtractArray(int* arr, unsigned int size)
{
  for (int i=0; i<size; ++i)
  {
    if (arr[i] < 0)
      arr[i] = abs(arr[i]);
    arr[i] = subtract(arr[i]);
  }
}

int main()
{
  int arr[] = {1, 2, 55, 56, 65, 135};
  int size = sizeof(arr)/ sizeof(arr[0]);
  subtractArray(arr, size);
  for (int i=0; i<size; ++i)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}
0 голосов
/ 13 декабря 2018

Вот простой код, который решает вашу проблему:)

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

int *subtraction(int arr[], int size) 
{
    int *sub = calloc(sizeof(int*) , size), i = 0, rev;              //allocating memory 
    for (i = 0; i < size; i++)
    {    
        rev = 0;
        arr[i] = abs(arr[i]);

        for (int a = 0; arr[i] != 0; arr[i] /= 10)
            rev = (rev * 10) + (arr[i] % 10);

        for (i; (rev / 10) != 0; rev /= 10)             //the loop ends when rev = 0
            sub[i] = ((sub[i] * 10) + abs( (rev % 10) - ((rev / 10) % 10) ));    //easy math => for example rev = 21 > sub[i] = (0 * 10) + ( (21 % 10) - ((21 / 10) %10)) = abs(1 - 2) = 1;
    }
    return sub;
}


int main()
{
    int arr[] = {-9533, 7, -19173}, i;
    int len = sizeof(arr)/sizeof(arr[0]);  //size of arr
    int *sub = subtraction(arr, len);

    for(int i = 0; i < len; i++)   //for test
        printf("%d ", sub[i]);

    return 0;
}

вывод для {1, 2, 55, 56, 65, 135}:

0 0 0 1 1 22

вывод для{987654321, 123456789, 111111111}:

11111111 11111111 0

выход для {38279}:

5652

выход для {-9533, 7, -19173}:

420 0 8864
0 голосов
/ 13 декабря 2018

Вы на самом деле не меняете никаких значений, вот строка, которую вам нужно посмотреть.

sub = sub * 10 + abs(arr[i] - arr[i+1]);

Поскольку вы печатаете массив, вам действительно нужно снова сохранить вычисленное значение в массиве.

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