вычисление х для власти у, используя для цикла - PullRequest
1 голос
/ 27 января 2020

Я пытался использовать for l oop для вычисления x в степень y. Программа работает, но выдает ошибки.

Насколько мне известно, ошибка должна быть в выражении "z", но я не могу понять это. Помогите мне, если вы столкнетесь с моими ошибками.

#include<stdio.h>
#include<conio.h>

void main()
{

    int x,y,i;
    long int z=x;

    printf("Enter the values of x and y: ");
    scanf("%d %d",&x,&y);

    for(i=2;i<=y;i++)   
        z*=x;     ```
                  /*e.g-  Let x=2, y=3, then as per intialization z=x=2
                          since,from the for condition, (i=2)<=3, which is true
                          z= z*x =>2*2 => 4 now z=4
                          now i++ => i=3
                          (i=3)<=3,which is true
                          z= z*x =>4*2 => 8
                          therefore, 2 to power 3 is 8 */ 

    printf("%d to power %d is %ld",x,y,z);
    getch();

}

Ответы [ 3 ]

4 голосов
/ 27 января 2020

Вы присваиваете z для x, прежде чем x будет присвоено значение. z тогда имеет неопределенное значение, что приводит к неправильному вычислению мощности.

Вам нужно подождать, пока x не будет назначено из пользовательского ввода, прежде чем использовать его значение для инициализации z.

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

if(scanf("%d %d", &x, &y) != 2)
{
    // x and y were not properly read - handle error
}

z = x;

РЕДАКТИРОВАТЬ: @chux - Восстановить Монику, указанную в комментарии, что если y == 0 код все еще имеет проблему. Все в степени нуля (кроме самого нуля, так как x y не является непрерывным в начале координат) равно 1. Вы должны также обработать этот особый случай.

3 голосов
/ 27 января 2020

Вы инициализируете переменную z (равную x) до того, как вы присвоили значение x! Чтобы это исправить, переместите объявление / инициализацию z в после вашего scanf вызова:

    //..
    int x,y,i;
//  long int z=x; // Means nothing: as "x" is here undefined, so "z" will also be!

    printf("Enter the values of x and y: ");
    scanf("%d %d",&x,&y);
    long int z = x; // Here, we have (probably) a value for "x" so we can copy it to "z"
    //..

РЕДАКТИРОВАТЬ: Может быть, я немного дрейфую 'off-topi c 'здесь, но вы можете иметь опыт работы с языками программирования, которые используют reference переменные (C ++ или C#)? На таких языках то, что вы пытаетесь сделать , может работать! Например, в C ++ у вас может быть int& z = x; (где у вас есть текущая декларация), и это может работать в некоторых обстоятельствах (хотя в вашем коде это на самом деле не будет, как указано в комментариях). Однако в «старом C» код выполняется там, где вы его поместили, и «ссылочной переменной» не существует такого понятия.

1 голос
/ 27 января 2020

Сначала вы можете инициализировать эти переменные

long int x = 0, y = 0;
long int z = 0;

Здесь вы должны проверить, успешно ли scanf

printf("Enter the values of x and y: ");
scanf("%ld %ld",&x,&y);

О scanf возвращаемое значение. Начиная с cppreference

Возвращаемое значение 1-3) Количество успешно назначенных аргументов-получателей (может быть равным нулю в случае сбоя сопоставления до назначения первого аргумента-получателя), или EOF, если ошибка ввода произошла до того, как был назначен первый принимающий аргумент. 4-6) То же, что и (1-3), за исключением того, что EOF также возвращается в случае нарушения ограничения времени выполнения.

Теперь проблема в том, что вы присваиваете z значение x до того, как они будут правильно инициализированы. Так что это неопределенное поведение.

Это то, что вы хотите

long int x = 0, y = 0;
long int z = 0;

printf("Enter the values of x and y: ");
scanf("%ld %ld",&x,&y);

z = x;

Также вы можете определить новую переменную int внутри l oop. Лично я нахожу этот метод лучше.

for(int i = 2; i <= y; i++) 
    z *= x;

Для оператора print вы можете использовать формат %ld для long int

printf("%ld to power %ld is %ld",x,y,z);
...