Мой код C для вычисления наименьшего значения k, для которого сумма больше, чем пользовательский ввод n, не дает мне ожидаемого результата? - PullRequest
0 голосов
/ 18 февраля 2019

Я практикую написание C-кодов для моего предстоящего теста.Подсказка:

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

(1/1 + 1/2 + 1/3 + ... + 1 / k)> n

Итак, n= 2.0 должен вернуть k = 4, поскольку (1/1 + 1/2 + 1/3 + 1/4) = 2.08> 2

Я не уверен, что я делаю неправильно, потому что когда яЗапустите программу, она ничего не печатает.

#include <stdio.h>
#include <math.h>
int main()
{
    int k=1;    
    double n, sum;  
    printf("Enter a value ");
    scanf("%lf", &n); //n=2     

    while(sum>=0 && sum<=n) //when n=2, 1=<1<2
    {
        sum= (1/k); 
        sum=sum++;  
        k++;        //when sum= 0    -> sum = 1 ,               k=1
                    //when sum= 1    -> sum = 1+ 1/2  = 1.5,    k=2
                    //when sum= 1.5  -> sum = 1.5 + 1/3 = 1.83, k=3
                    //when sum= 1.83 -> sum = 1.83 +1/4 = 2.8,  k=4
                    //sum is now 2.8 
                    //2.8>2 , k=4 so loop terminates    
    }

    printf("%d\n", k); //4  but it doesn't print anything???    
    return 0;           
}

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

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Было несколько проблем с вашим кодом.

sum= (1/k); вычисляет целое деление 1 на k, и оно всегда дает 0. Преобразуйте его в удвоенное, чтобы получить правильное значение

sum=sum++; Не уверен, что ты хотел сделать.sum++ означает sum=sum+1 уже.

И, вероятно, вы хотели сделать следующее:

sum = sum + (1.0/k) 1.0 гарантирует, что результат деления будет удвоен.

Инициализация отсутствует для суммы.

Кроме того, вы посчитали одну дополнительную итерацию.Лучше начинать с k = 0 и увеличивать в начале цикла.

#include <stdio.h>
#include <math.h>
int main()
{
    int k=0;    
    double n, sum=0.0;  
    printf("Enter a value ");
    scanf("%lf", &n); //n=2     

    while(sum>=0 && sum<=n) //when n=2, 1=<1<2
    {
        k++;        
        sum+=(1.0/k); 
                    //when sum= 0    -> sum = 1 ,               k=1
                    //when sum= 1    -> sum = 1+ 1/2  = 1.5,    k=2
                    //when sum= 1.5  -> sum = 1.5 + 1/3 = 1.83, k=3
                    //when sum= 1.83 -> sum = 1.83 +1/4 = 2.8,  k=4
                    //sum is now 2.8 
                    //2.8>2 , k=4 so loop terminates    
    }

    printf("%d\n", k); //4  but it doesn't print anything???    
    return 0;           
}
0 голосов
/ 18 февраля 2019

В вашей программе много ошибок:

  • в состоянии while, программа считывает значение sum, но эта переменная никогда не инициализировалась ранее.

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

  • sum = 1/k

    Инициализирует сумму 0,0, поскольку k имеет тип int.

  • sum = sum++

    Снова неопределенное поведение, поскольку вы записываете два значения в переменную sum во время одного оператора.

В качестве общего совета, существуют языки программирования, отличные от C, которые предотвратят все вышеперечисленные ошибки, отказавшись запускать эту программу.Может быть, хорошей идеей будет сначала написать программу на таком безопасном языке и после ее завершения перевести эту программу на C. (Примеры более безопасных языков программирования - Java, Go, Kotlin.)

...