В C моя программа для вывода числа, не входящего в пользовательский массив ввода или не являющегося суммой любых чисел в массиве, ничего не печатает - PullRequest
0 голосов
/ 23 марта 2019

Я делаю задание для класса.Подсказка:

Напишите программу, чтобы найти наименьшее положительное целое число, которое не отображается в массиве.Число не может быть образовано суммой двух разных или суммой одинаковых чисел из массива.для e1,2,3 и 4 появляются в этом массиве.4 можно сформировать как 3 + 1, 5 как 3 + 2, 6 как 3 + 3, 7 как 3 + 4 и 8 как 4 + 4 (можно использовать число дважды).9 не появляется в массиве и не может быть сформирована как сумма 2 чисел в массиве.Итак, 9 является решением для этого массива.Используйте функции

int issumof2(int data[], int size, int number)
int inarray(int data[], int size, int number)
  • issumof2 возвращает 1, если число является суммой 2 элементов в данных, и возвращает 0 в противном случае.
  • inarray возвращает 1, если число находится вданные и возвращает 0 в противном случае.
#include <stdio.h>
//function declaration
int issumof2(int data[], int size, int number);
int inarray(int data[], int size, int number);
int size = 7, sum2, sum, number, data[7], i, j;

int main()
{
    //get user input
    printf("Enter 7 numbers: ");
    for (i = 0; i < size; i++)
        scanf("%d", &data[i]);  
    //function call
    issumof2(data, size, number);
    inarray(data, size, number);
    number = 0;
    //loop while condition is true and stop when condition becomes false
    while (inarray(data, size, number) == 1 || issumof2(data, size, number) == 1)
    {
        number = number + 1;//increment number till loop stop
         //print smallest number
        printf("Smallest positive integer: %d\n", number);
    }
    return 0;
}
Expected output:
Enter 7 numbers
1 2 2 3 4 3 1
Smallest positive Integer = 9
//1,2,3,4 are in array. 3+1=4,3+2=5,3+3=6,3+4=7,4+4=8(number can be used twice).
//9 is not inarray or not a  sum of 2 numbers in the array
int issumof2(int data[], int size, int number)
{
    //add data numbers in array
    for (i = 0; i < size; i++)
    {
        for (j = 0 + i; j < size; j++)
        {
            sum = data[i] + data[i];//add same numbers        
            sum2 = data[i] + data[j];//add all 2 combinations of different number             
            if (sum == data[i] || sum2 == data[i])//comparing with data value          
                return 1;//if sum  or sum2 exists in data
        }
    }
    return 0;//if sum or sum2 don't exist
}
//goes to infinite loop
int inarray(int data[], int size, int number)
{
    for (number = 1; number <=size; number++)
    {
        printf("inarray number=%d\n", number);
        //loop through data array
        for (i = 0; i < size; i++)
        {
            printf("data[i]=%d\n", data[i]);
            if (number == data[i])//if this is true it goes to infinite loop
                                  //if false it just stops comparing
            {
                return 1;
                printf("\n");
            }
        }
    }
    return 0;
}

Ответы [ 3 ]

2 голосов
/ 23 марта 2019

Быстрый просмотр того, что вы опубликовали, на самом деле приводит к бесконечному циклу, если я что-то не пропустил. Я вижу пару ошибок:

  • Вы установили size равным трем, но затем используете его, чтобы попытаться отсканировать семь чисел.
  • В обеих функциях inarray и issumof2 есть условные выражения, которые возвращают один или ноль в зависимости от результата условного выражения, поэтому они всегда выполняют только одну итерацию самых внутренних циклов. Вы должны переместить операторы else за пределы циклов.
  • Наименьшее возможное целое число, которое соответствует критериям, заданным для входных данных выборки, фактически равно восьми.
  • Кажется, логика в обеих функциях отключена, поскольку они никогда не возвращают 1.
    • В issumof2 нет смысла number, но это то, с чем вы должны сравнивать любые суммы, если я не ошибаюсь. Кроме того, я думаю, что вы могли непреднамеренно использовать i вместо j или наоборот.

Вот часть вашего кода с комментариями, которые, надеюсь, приведут вас к исправлению ошибок:

int main() {
    int data[7];
    int i, number = 0;

    // size is three so we won't scan 7 integers if we enter them line by line.
    printf("Enter 7 numbers: ");
    for (i = 0; i < size; i++) 
        scanf("%d", &data[i]);

    // the problem states that both of these functions must return zero for the
    // expected answer, yet this loop breaks whenever number does not meet both
    // criteria, which isn't what we want.
    while(inarray(data, size, number) == 0 && issumof2(data, size, number) == 0) {
        number = number + 1;
        // if the conditional matched the problem statement, then we would print
        // this line for every integer that fails the criteria, but that isn't
        // what we want.
        printf("Smallest positive integer: %d\n", number);
    }
    return 0;
}

int issumof2(int data[], int size, int number) {
    int i, j, sum = 0;
    for (i = 0; i < size; i++) {
        // here we've doubled the value at i and saved within a temporary
        // variable -- but why? 
        sum2 =data[i]+data[i];
        for (j = 0; j < size; j++) {
            // here we're combining different values to test their sum against
            // number -- good job 
            sum = data[i] + data[j];
            // why are we comparing the data at i with twice itself (sum2), and
            // its addition with the data at j (sum)? we must compare sum2
            // against number.
            if (sum==data[i] || sum2==data[i])
                // here we return 1 if the condition is met. this would be good
                // if our conditional was representative of the problem.
                return 1;
            else
                // otherwise we return 0 -- why? i guess we don't need to check
                // any other sums...
                return 0;
        }
    }
    // alright we're done here. or are we? the prototype says we'll return an int
}

int inarray(int data[], int size, int number)
{
    int i;
    // so we're looping over all input -- good job
    for (i = 0; i < size; i++) {
        // here we test for equality of index i with the data at index i -- why?
        // we must compare the data at index i with number.
        if (i == data[i])
            return 1;
        else // again we can't just call it a day after checking just one number
            return 0;
    }
    // and as before we need to return some value if we complete the loop
}

А вот исправленное решение:

#include<stdio.h>

int issumof2(int[], int, int);
int inarray(int[], int, int);

int size = 7;

int issumof2(int data[], int size, int number) {
    int i, j;
    for (i = 0; i < size; i++) {
        for (j = 0; j < size; j++) {
            if (i == j)
               continue;
           if (data[i] + data[j] == number)
               return 1;
        }
    }
    return 0;
}

int inarray(int data[], int size, int number) {
    int i;
    for (i = 0; i < size; i++) {
        if (data[i] == number)
            return 1;
    }
    return 0;
}

int main() {
    int data[7];
    int i, number = 1;
    printf("Enter 7 numbers: ");
    for (i = 0; i < size; i++)
        scanf("%d", &data[i]);

    while(inarray(data, size, number) == 1 || issumof2(data, size, number) == 1)
        number++;

    printf("Smallest positive integer: %d\n", number);

    return 0;
}
1 голос
/ 23 марта 2019

Сначала Вот исправленный ответ для вашей логики

#include<stdio.h>

int issumof2(int data[], int size, int number);
int inarray(int data[], int size, int number);
int size=7,sum2;
int main()
{
   int data[7];
   int i, number=1;
   printf("Enter 7 numbers: ");
   for (i = 0; i < size; i++)
       scanf("%d", &data[i]);
   //I am a little confused about this part. I wasn't sure how to write it.
   while(inarray(data, size, number)==1 || issumof2(data, size, number)==1)//till functions are false
   {
        number=number+1;
   }

    printf("Smallest positive integer: %d\n", number);                      
    return 0;
}

int issumof2(int data[], int size, int number)
{
   int i, j, sum = 0;
   for (i = 0; i < size; i++)
   {
        sum2 =data[i]+data[i];
       for (j = 0; j < size; j++)
       {
           sum = data[i] + data[j];           
           if (sum==number || sum2==number) {
           return 1;

       }
       }

   }

   return 0;
}

int inarray(int data[], int size, int number)
{

   int i;
   for (i = 0; i < size; i++)
   {
       if (number == data[i]) {
           return 1;
       }
    }

   return 0;
}

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

#include<stdio.h>

int issumof2(int data[], int size, int number);
int inarray(int data[], int size, int number);
int size=7,sum2; // Size has be changed from 3 to 7 , since you want to check the for 7 numbers

int main()
{
   int data[7];
   int i, number=0;
   printf("Enter 7 numbers: ");
   for (i = 0; i < size; i++)
       scanf("%d", &data[i]);
   //I am a little confused about this part. I wasn't sure how to write it.
//   while(inarray(data, size, number)==0 && issumof2(data, size, number)==0)//till functions are false 

//   I feel its best to check the followin way
//   If any one of the condition is true, then that is not the required number, so increment it
//   else leave the loop which is the required number
   while(inarray(data, size, number)==1 || issumof2(data, size, number)==1)//till functions are false 
    {
        number=number+1;
        //printf("Smallest positive integer: %d\n", number);   
        // You will print the required number after the loop, not inside the loop

    }
        printf("Smallest positive integer: %d\n", number);                      
    return 0;
}

int issumof2(int data[], int size, int number)
{
   int i, j, sum = 0;
   for (i = 0; i < size; i++)
   {
        sum2 =data[i]+data[i];
       for (j = 0; j < size; j++)
       {
           sum = data[i] + data[j];           
//           if (sum==data[i] || sum2==data[i]) 
           if (sum==number || sum2==number)  // You are supposed to check the Sum with Number. Not with data irself
               return 1;
//            else
//                return 0; // Returning 0 here is not correct, It should be returned if all the condition are failed. 
       }
   }

   return 0; // Correct place to return 0;
}

int inarray(int data[], int size, int number)
{

   int i;
   for (i = 0; i < size; i++)
   {
//       if (i == data[i])
       if (i == number) // You are supposed to check with numbner not with data itself
           return 1;
//       else 
 //           return 0; // You are not supposed to return 0 here. Return is after all the condition is failed
    }

   return 0; // Corect place to return 0
}
0 голосов
/ 23 марта 2019

Я скомпилировал и запустил ваш код.Он будет печататься, но исчисляется сотнями тысяч.

$ gcc code.c
$ ./a.out
>Enter 7 numbers: 1 2 3 4 5 6 7 --press enter here--
...

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

...