Иначе утверждение вызывает неправильный вывод - PullRequest
0 голосов
/ 11 сентября 2018

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

Программа запрашивает у пользователя размер 2 массивов int, а затем предлагает пользователю ввести значенияэти массивы будут держать.Затем он запрашивает у пользователя диапазон индексов из массива 1 для добавления значений в массив 2 до заданной позиции.Затем генерируются еще 2 массива, чтобы показать новый массив 2 с новыми значениями, добавленными из массива один.

#include <stdio.h>

void fillArray(int x[], int size);

int main()
{
        int size1, size2, start, end, position;

        //getting input and creating array one
        printf("How big is array one?: ");
        scanf("%d", &size1);
        int inputArray1[size1];
        printf("Please enter the numbers for array one: ");
        fillArray(inputArray1, size1);

        //getting input and creating array two
        printf("How big is array two?: ");
        scanf("%d",&size2);
        int inputArray2[size2];
        printf("Please enter the numbers for array two: ");
        fillArray(inputArray2, size2);

        printf("Enter the start and end index of array one to be removed: ");
        scanf("%d %d", &start, &end);

        printf("Enter the position of array two to be added before: ");
        scanf("%d", &position);

        int size3 = ((end - start) + size2+1), size4 = (size1 - (end - start));
        int outputArray2[size3], kIterator=0; 


         for(int i=0; i<size3; i++){
                if(i == position){
                        for(int j=start; j<=end; j++){
                                outputArray2[i] = inputArray1[j];
                                i++;
                        }
                }else{
                //HERE IS WHERE I FIXED THE ERROR
                outputArray2[i] = inputArray2[kIterator];
                kIterator++;
                }
        }


        for(int i=0; i<size3; i++){
                printf("%d ", outputArray2[i]);
        }
        return 0;
}


//Function to fill an array with user inputs
void fillArray(int x[], int size){
        for(int i=0; i<size; i++)
                scanf("%d", &x[i]);
}

Насколько велик массив один ?: 8
Пожалуйста, введите числа для массива один: 912 8 41 38 12 67 49
Насколько велик массив два?: 3
Пожалуйста, введите числа для массива два: 11 27 6
Введите начальный и конечный индекс удаляемого массива один: 2 5
Введите позицию массива два, который будет добавлен ранее: 1
11 8 41 38 12 32767 27

Почему происходит этот вывод?Вывод должен быть: 11 8 41 38 12 27 6
Когда я удаляю блок else, но оставляю код, похожий на:

for(int i=0; i<size3; i++){
     if(i == position){
         for(int j=start; j<=end; j++){
              outputArray2[i] = inputArray1[j];
              i++;
         }
     }
     //HERE IS WHERE I FIXED THE ERROR
     outputArray2[i] = inputArray2[kIterator];
     kIterator++;

}

Внезапно вывод верный, и я не понимаю, чтобольшое количество.Почему это?

1 Ответ

0 голосов
/ 12 сентября 2018

Вы не назначаете 5-й член массива outputArray2. Размещение некоторых printfs:

     for(int i = 0; i < size3; i++){
            if (i == position) {
                    for(int j = start; j <= end; j++) {
                            printf("i=%d j=%d\n", i, j);
                            outputArray2[i] = inputArray1[j];
                            i++;
                    }
            } else {
                    printf("i=%d kIterator=%d\n", i, kIterator);
                    outputArray2[i] = inputArray2[kIterator];
                    kIterator++;
            }
    }

Вы видите:

i=0 kIterator=0
i=1 j=2
i=2 j=3
i=3 j=4
i=4 j=5
i=6 kIterator=1

i никогда не равно 5, поэтому outputArray2[5] никогда не инициализируется и имеет неинициализированное значение. Это почему? Потому что i увеличивается в два раза.
Представьте, что вы на линии outputArray2[i] = inputArray1[j]; в последний раз с i = 4 и j = 5 = end. Затем следующая строка i++ делает i = 5, затем j++ из for увеличивает j = 6, что больше end, поэтому for(int j = start; j <= end; j++) выходит. Затем выполняется оператор i++ из первого for(int i = 0; i < size3; i++) get, что увеличивает значение i во второй раз до 6! Вы также можете исправить код с помощью:

     for(int i = 0; i < size3; i++){
            if (i == position) {
                    for(int j = start; j <= end; j++) {
                            outputArray2[i] = inputArray1[j];
                            i++;
                    }
                    i--;
            } else {
                    outputArray2[i] = inputArray2[kIterator];
                    kIterator++;
            }
    }

Этот метод лучше, чем ваш код, потому что когда end == size3, тогда цикл не пытается присвоить значение вне границы для outputArray2 (то есть. outputArray2[size3] = smth). (Все это предполагает, что position+(end-start) <= size3, который вы все равно не проверяете).

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