Babbu Mishra Ответов: 2

Почему я получаю адрес как ans для первого


#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    int t,i=0,j=0,g,b[i],n;
    float y;
    float a[j];
    scanf("%d",&t);
    g=t;
    while(t--)
    {
        float s,d;
        s=1;d=0;
        scanf("%d",&n);
        b[j]=pow(2,n);
        while(n--)
        {
            y=(s+d)/2;
            s=d;
            d=y;


        }
        a[j]=y;

        j++;
    }


    for(i=0;i<g;i++)
    {
        printf("%g %d ",a[i]*b[i],b[i]);
    }

return 0;
}


Что я уже пробовал:

в то время как я ставлю вход 5 в качестве тестового кейса и 1 2 3 4 5 в качестве входного сигнала я получаю выход 5.25861 e+008 1051721728 1 4 3 8 5 16 11 ,неправильный 1-й, но до тестового случая 4 он приходит Райт

Mohibur Rashid

это c? вы не должны быть в состоянии скомпилировать.

Babbu Mishra

да,почему???я скомпилировал его с помощью codeblock.

CPallini

Для чего требуется ваш код?

Babbu Mishra

решение должно быть 1 2 1 4 3 8 5 16 11 32 например, 1/2,1/4,3/8,5/16,11/32 для 5 тестовых случаев и ввода 1 2 3 4 5 в основном я должен найти среднее значение предыдущих двух терминов, берущих 0 и 1 изначально, как (1+0)/2 , (0+t1)/2,(t1+t2)/2 и так далее.

CPallini

Извини, я тебя не понимаю.:
первый член, а именно (0+1)/2 = 1/2-это нормально.
второй срок (разве это не должно быть (1/2+2)/2=5/4 ?) ?
третий срок ?

Babbu Mishra

нет, я взял a=1 ,b=0,d=(a+b)/2, после этого я в цикле изменил a=b,b=d и так далее до конца цикла. то есть (1+0)/2,(0+раствор 1-го)/2,(Соль 1-го +соль 2-го)/2 и так далее.

спасибо за внимание ,была какая-то ошибка в объявлении массива, теперь все в порядке..........,

2 Ответов

Рейтинг:
13

Richard MacCutchan

int t,i=0,j=0,g,b[i],n;

Вы объявляете массив b целочисленным массивом с нулевыми элементами, но затем пытаетесь заполнить его значениями двойной точности. Так что любые результаты, которые вы получите, обязательно будут мусором. И все эти однобуквенные имена переменных делают ваш код невозможным для понимания.


Babbu Mishra

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

Рейтинг:
1

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

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

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поместите точку останова в первую строку метода и запустите приложение. Когда он достигнет точки останова, отладчик остановится и передаст управление вам. Теперь вы можете запускать свой код построчно (так называемый "одноступенчатый") и просматривать (или даже изменять) содержимое переменных по мере необходимости (черт возьми, вы даже можете изменить код и повторить попытку, если вам это нужно).
Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!