C двоичная программа для простых чисел не хочет запускаться - PullRequest
0 голосов
/ 19 сентября 2018

У меня проблема с выполнением моей программы.Я компилирую его с помощью gcc, используя: gcc -std=c89 -Wall -Wextra -lm main.c.Та же проблема с clang, и я еще не пробовал с tcc, но буду, когда программа будет закончена.Я хотел бы, чтобы он был компилируемым с компилятором c89, это объясняет некоторые из моих выборов.У меня нет ошибок при компиляции, но проблема при выполнении.Как и то, что написано в некоторых моих комментариях в моем коде, при выполнении обычно у меня будет ошибка из-за деления на 0 (с переменной k), но я думаю, что у меня есть ошибка в "do ... while"цикл (потому что остальная часть моей функции проверена), и перед делением на k.Мне потребовалось несколько часов для отладки (особенно с помощью gdb (опция -g добавить в команду компиляции и run -v в gdb), но я все еще заблокирован.

/*librairies*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/*main function*/
int main(){
    int N, b, i, j, h, k;
    int *t; /*pointer which will become an array (see in another after comment)*/
    float l, m, a;
    k = 0;   /*Problem with k because we will see later an error*/
    printf("Your number : ");
    scanf("%d", &N);
    if (N>1){
        a = sqrt(N);
        b = a; /*we convert float into int and it rounds under, normal*/ 
        t = malloc(N * sizeof(int)); /*manual dynamic memory allocation for the array to respect C89*/
        if (t==NULL){ /*t is null when you have not enough ram for a too big value for N*/
            exit(0);
        }
        for (i=1;i<N;i++){ /*function to fill the array with 2,3..N*/
            j = i + 1;
            h = i - 1;
            t[h] = j;
        }

        do{
            if (t[k]==0){
                k = k + 1;
            } else{
                for (i=1;i<N;i++){          /*problem nearby, because the division by 0 error does not come know at the execution = 0*/
                    h = i - 1;   
                    if (t[h]!=0){
                        l = (float)t[h] / (float)k; /*It's going to be a problem because in the first loop, k = 0*/
                        m = l - (int)l;
                        if (m==0.0f){
                            t[h] = 0;
                        }
                    }
                }
            }
        } while (k<b);
        h = 0;
        for (i=1;i<N;i++){
            h = i - 1; 
            printf("%d\n", t[h]); /*printf to test before continuing the program*/
        }

    } else{
        printf("Your number is not valid\n");
    }
    return 0;
}

Информация: эта программа простоПерсональный проект, чтобы проиллюстрировать для меня курс математики, который у меня был (о простых числах, а также о том, что для решения поставленной задачи и для решения k проблемы должен отображаться:

Your number: N /*N is a valid (positive integer) stdin input*/
0 /*and 0 until the k<b prime values are passed but I will make them to be displayed*/
a prime number
0 
the next prime number
0 
the next prime number
0 
the next prime number
0 
the next prime number
0 
.
.
the last prime number (which can be N if N is a prime one)

Теорема, используемая для этой программы:

  • Вы выбираете число
  • Вы вычисляете его квадратный корень
  • 1, здесь не учитывается простое число, поскольку оно делит все простые числа.
  • Вы записываете все числа от 2 до числа, которое вы выбираете
  • Вы удаляете все кратные простые числа (здесь используются простые числа под квадратным корнем) в любом месте записанного списка (здесь массивгде мы пишем 0, потому что я пока не знаю, как использовать структуры (список?).
  • Все числа, которые остаются, являются простыми числами под выбранным вами (остальное? извините за мой плохой английский)

Спасибо.

1 Ответ

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

следующий предложенный код:

  1. безупречная компиляция
  2. выполняет желаемую функциональность
  3. НЕ эффективна
  4. показывает правильный отступ
  5. показывает значимые имена переменных
  6. правильно передает выделенную память `free_ перед выходом
  7. , правильно проверяет успешное выполнение scanf()

и теперь,предлагаемый код:

/*librairies*/
#include <stdio.h>
#include <stdlib.h>


/*main function*/
int main( void )
{
    size_t targetNum;
    size_t i;  // index
    size_t j;  // index



    size_t *primeArray = NULL; /*pointer which will become an array (see in another after comment)*/

    printf("Enter Your target number : ");
    if( scanf("%lu", &targetNum) != 1 )
    {
        fprintf( stderr, "scanf failed to read target number\n" );
        exit( EXIT_FAILURE );
    }

    if ( targetNum > 1 )
    {
        primeArray = malloc( targetNum * sizeof( size_t ) ); 

        if ( !primeArray )
        { 
            perror( "malloc failed" );
            exit( EXIT_FAILURE );
        }

        // initialize array of prime numbers
        for ( i = 0; i < targetNum; i++ )
        { 
            primeArray[i] = 1;
        }

        primeArray[0] = 0;
        primeArray[1] = 0;

        // find primes and zero multiples
        for( i = 0; i < targetNum; i++ )
        {
            // skip any multiples of primes (which have already been zero'd
            if( !primeArray[i] )
            {
                continue;
            }

            // zero multiples
            for( j = i+i; j < targetNum; j+=i )
            {
                primeArray[j] = 0;
            }
        }

        // print primes
        for ( i = 0; i < targetNum; i++ )
        {
            if( primeArray[i] )
            {
                printf( "%lu\n", i ); 
            }
        }

        free( primeArray );
    } 

    else
    {
        printf("Your number is not valid\n");
    }

    return 0;
}

с учетом следующего ввода:

4

на выходе:

Enter Your target number : 4
2
3
...