Prateek Krishna Ответов: 2

Что не так в этом коде? На выходе выходит, чтобы быть неправильно ansswer.


вот ссылка на этот вопрос:
SPOJ.com - проблема PCC15D[^]

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

#include <iostream>
#include<iomanip>
#include<string.h>
using namespace std;

int main() {
	char s[100],z[10];
	double c,q;
	int ctr=1,t,n ;
	cin>>t;
	while(t>0)
	{
	    cin>>n;
	    double p=0;
	    double g=0;
	    while(n>0)
	    {
	        cin>>s;
	        cin>>q;
	        cin>>c;
	        cin>>z;
	        p+=q*c;
	        if(strcmp(z,"SR")==0)
	        {
	            g+=q*c*0.06;
	        }
	        n--;
	    }
	    cout<<"case #"<<ctr<<":\n";
	    cout<<"Total Amount Include GST: ";
	    std::cout << std::fixed << std::setprecision(2) << p+g << std::endl;
	    cout<<"Total Amount GST Paid: ";
	    std::cout << std::fixed << std::setprecision(2) << g << std::endl;
	    ctr++;
	    t--;
	}
	
	return 0;
}

Richard MacCutchan

В чем вопрос и в чем проблема?

CPallini

Пожалуйста, подробно опишите "неправильный вывод": я попробовал вашу программу, ее вывод выглядит правильным для меня.

2 Ответов

Рейтинг:
2

KarstenK

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

Проблема может заключаться в том, что расчет "SR" не выполняется правильно.

совет: используйте более описательные имена переменных и некоторые комментарии.


Рейтинг:
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" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!