Как решить эту ошибку при попытке вычислить вопрос о кодировании двух сумм в C - PullRequest
0 голосов
/ 02 апреля 2020

Учитывая массив целых чисел, вернуть индексы двух чисел так, чтобы они складывались до заданной c цели.

Учитывая числа = [2, 7, 11, 15], цель = 9 ,

Поскольку nums [0] + nums [1] = 2 + 7 = 9, возвращают [0, 1].

#include<stdio.h>
int* twoSum(int* nums, int numsSize, int target);

int main(){

    int*array;
    int arraySize;
    scanf("%d",&arraySize);
    for (int i=0;i<arraySize;i++){
        scanf("%d",&array[i]);
    }

    int target;
    scanf("%d",&target);
    int* positions=twoSum(array, arraySize, target);
    printf("The positions are: %p",positions);
    return 0;
}


int* twoSum(int* nums, int numsSize, int target){
    int *returnSize = NULL;
    for(int i=0,sum=0;i<numsSize;i++){
        for(int j=0;j<numsSize;j++){
            sum =sum+nums[i]+nums[j];
            if(sum==target){
                returnSize[0]=nums[i];
                returnSize[1]=nums[j];
            }
            else 
                returnSize[0]= -1;
                returnSize[1]= -1;
        }
    }
    return returnSize;
}

Полученная ошибка ссылается на строку это пусто в моем коде. Пожалуйста, помогите

Ответы [ 3 ]

1 голос
/ 02 апреля 2020

в этом коде есть ошибки. Сначала вы должны выделить память для int*array;, взяв int arraySize; в качестве входных данных, вы можете сделать это следующим образом

array = malloc(sizeof(int) * arraySize);

, тогда здесь %p не подходит, вместо этого используйте %d. Посмотрите здесь для получения дополнительной информации о %p % p спецификаторе формата , а также, поскольку вы хотите напечатать 2 позиции, вам нужно вызвать два аргумента в printf, например, printf("The positions are: %d %d", positions[0], positions[1]);

В вашей функции twoSum вам нужно выделить память для int* returnSize ; следующим образом returnSize = malloc(sizeof(int) * 2);

, и здесь вы не возвращаете позиции найденных элементов, вы сами возвращаете элементы.

            if(sum==target){
                returnSize[0]=nums[i];
                returnSize[1]=nums[j];
            }

также вам нужно добавить return в этом if-statement другом случае, вы полностью пройдете массив, и returnSize элементы снова станут -1 (если ответ не является слишком последним элементом массива)

так что if должно быть таким:

            if (sum == target) {
                returnSize[0] = i;//num[i] is not position. it is element of array
                returnSize[1] = j;//num[j] is not position .it is element of array
                return returnSize;//otherwise it will traverse array compeltely and they -1 again
            }

также только если вы кодируете одну строку для if,else,while,for,... (условные операторы), вы можете избежать использования фигурных скобок, в противном случае только одна строка вашего кода будет выполняется, если это условие становится истинным, поэтому вы должны добавить блок для этого else:

            else
            {
                returnSize[0] = -1;
                returnSize[1] = -1;
            }//coding more than one line so your else should be in a block

, а также здесь sum=sum+num[i]+num[j]; неверно, вы должны изменить это на sum=num[i]+num[j];, потому что вы хотите только проверить сумму в два o текущий номер или, что лучше, вообще не используйте сумму, только проверьте равенство цели с num[i]+num[j]

, вот полный код:

int* twoSum(int* nums, int numsSize, int target);

int main() {

    int* array;
    int arraySize;
    scanf("%d", &arraySize);
    array = malloc(sizeof(int) * arraySize);//allocate memory for array
    for (int i = 0; i < arraySize; i++) {
        scanf("%d", &array[i]);
    }

    int target;
    scanf("%d", &target);
    int* positions = twoSum(array, arraySize, target);
    printf("The positions are: %d %d", positions[0], positions[1]);//%p is for not for content of array
    return 0;
}


int* twoSum(int* nums, int numsSize, int target) {
    int* returnSize ;
    returnSize = malloc(sizeof(int) * 2);
    for (int i = 0; i < numsSize; i++) {
        for (int j = 0; j < numsSize; j++) {             
            if (nums[i] + nums[j] == target) {
                returnSize[0] = i;//num[i] is not position. it is element of array
                returnSize[1] = j;//num[j] is not position .it is element of array
                return returnSize;//otherwise it will traverse array compeltely and they -1 again
            }
            else
            {
                returnSize[0] = -1;
                returnSize[1] = -1;
            }//coding more than one line so your else should be in a block
        }
    }
    return returnSize;
}

0 голосов
/ 02 апреля 2020

Вот ваш код:

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

int* twoSum(int* nums, int numsSize, int target);
void print_pos(int * arr, int i) {
    printf("test %d\n", i);
    if (arr != NULL) {
        printf("position 1 = %d, position 2 = %d\n", arr[0], arr[1]);
    } else
        printf("Not found\n");
}

int main(){

    int array[5] = {5, 6, 2 ,1 ,3} ;

    int target1 = 11, target2 = 9, target3 = 15;
    int * positions1=twoSum(array, 5, target1);
    int * positions2=twoSum(array, 5, target2);
    int * positions3=twoSum(array, 5, target3);

    print_pos(positions1, 1);
    print_pos(positions2, 2);
    print_pos(positions3, 3);

    return 0;
}


int* twoSum(int* nums, int numsSize, int target){
    int *return_arr = malloc(sizeof(int) * 2);
    bool found = false;
    for(int i=0;i<numsSize;i++){
        for(int j=0;j<numsSize;j++){
            if((nums[i]+nums[j])==target){
                return_arr[0]= i;
                return_arr[1]= j;
                found = true;
            }
        }
    }
    if (found)
        return return_arr;
    else {
        free(return_arr);
        return NULL;
    }
}
0 голосов
/ 02 апреля 2020

В вашем коде есть некоторые ошибки:

выделение памяти

Вы объявляете указатели на int для хранения данных для обработки и результата, но не выделяете память: malloc предназначен для РАСПРЕДЕЛЕНИЯ Памяти:

array = malloc(sizeof *array * arraySize);

и

int *returnSize = malloc(sizeof *returnSize * 2);

Лог расчета суммы c

sum значение

In twoSum функция, переменная sum становится все больше и больше: sum =sum+nums[i]+nums[j];

Вместо этого простой if (target == nums[i] + nums[j]) выполнит требуемый тест.

sum test

В вашем коде каждый раз, когда sum не равен target, вы сбрасываете returnSize[0] на -1

Вам не нужно иметь предложение else: вы можете инициализировать returnSize до for l oop.

отсутствует {...}

Посмотрите на свой первый код: для любого значения суммы и цели returnSize[1] установлено на -1 потому что вы забыли ставить почести после else (но, как написано ранее, вам даже не нужно else)

gcc может предупредить вас о такой проблеме (-Wmisleading-indentation, или лучше -Wall)

    for(int j=0;j<numsSize;j++){
        sum =sum+nums[i]+nums[j];
        if(sum==target){
            returnSize[0]=nums[i];
            returnSize[1]=nums[j];
        }
        else 
            returnSize[0]= -1;
        returnSize[1]= -1;
    }

Учитывая это, вы можете написать код, который делает то, что вы хотели.

Будьте осторожны, вы должны проверить scanf и malloc возвращать значения тоже ...

#include <stdio.h>
#include <stdlib.h>
int *twoSum(int *nums, int numsSize, int target);

int main()
{
    int *array;
    int arraySize;

    // TODO: test that scanf returned 1
    scanf("%d", &arraySize);

    // TODO: test that arraysize is at least 2

    /* allocate array to store the numbers*/
    array = malloc(sizeof *array * arraySize);

    for (int i = 0; i < arraySize; i++) {
        // TODO: test that scanf returned 1
        scanf("%d", &array[i]);
    }

    int target;
    // TODO: test that scanf returned 1
    scanf("%d", &target);
    int *positions = twoSum(array, arraySize, target);
    printf("The positions are: %d(%d) %d(%d)\n", positions[0], array[positions[0]], positions[1], array[positions[1]]);


    /* memory has been allocated? free it */
    free(positions)
    free(array)

    return 0;
}

int *twoSum(int *nums, int numsSize, int target)
{
    int *returnSize = malloc(sizeof *returnSize * 2);

    returnSize[0] = returnSize[1] = -1;

    for (int i = 0; i < numsSize; i++) {
        for (int j = 0; j < numsSize; j++) {
            if (target ==nums[i] + nums[j] ) {
                returnSize[0] = i;
                returnSize[1] = j;
                return returnSize;
            }
        }
    }
    return returnSize;
}
...