Большой Воронежский Форум
Страница 2 из 2
< 12
» Программирование>Динамический массив на С/С++
Webaib 19:58 25.01.2010

Сообщение от Part!zan:
Имхо, код должен быт в первую очередь рабочим, а только уже потом комментированным и красивым. Метросексуалы в программировании не нужны.

А это уже дело юнит и прочих тестов определять - работает код или нет. Пока тесты не пройдет - зарплату не выдавать ))) [Ответ]
DeniSS1 20:04 25.01.2010
Код:
#include "stdafx.h"
#include <fstream>
using namespace std;
ifstream input("input.txt");
ofstream output("output.txt");
double Hz[1000];
char words[1000];
int n;
double _min, _max;
int main(int argc, char* argv[])
{
	input >> n;
	input >> Hz[0];
	_min = 30.0; _max = 4000.0;

	char bufer[20];
	for(int i=1;i<n;i++){
		input >> Hz[i] >> bufer;
		double midHz=(Hz[i]+Hz[i-1])/2;
        if(bufer[0]=='c'){
			if(Hz[i]>Hz[i-1]){
               if(_min<midHz){
				  _min=midHz;
			   }
			}
			else{
			   if(_max>midHz){
			      _max=midHz;
			   }
			}
		}
		else if(bufer[0]=='f'){
            if(Hz[i]>Hz[i-1]){
			   if(_max>midHz){
			      _max=midHz;
			   }
			}
			else{
			   if(_min<midHz){
				  _min=midHz;
			   }
			}
		}
	}
    output << (double)_min;
	if((double)_min==(int)_min){output << ".0";}
	output << " " << (double)_max;
	if((double)_max==(int)_max){output << ".0";}
	return 0;
}
Тестов, которые были там, я не знаю, но я видел те ответы, что должны получаться, и те, что выводятся у меня. Ответ должен быть с точностью не хуже 10^-6, а у меня максимум до тысячных. Вот пример входного файла

Сообщение от :
3
440.0005
220.0006 closer
300.009 further

т.к. в программе используются средние значения этих чисел, то по-любому должны быть нехилые дроби! Однако их нет... [Ответ]
Yandex 20:50 25.01.2010
Насколько я помню ситуация с округлением примерно такая: плавающее число должно разместить в задданом количестве байт (обычно 8 для double). Число разделяется на знаки до и после запятой. При этом сначала располагаются "наибольшая часть числа", а на оставшаяся, что не помещается, отбрасывается. Соответсвенно, если умножили на что то большое, то мы потеряли знаки после запятой. Поделив на это большое, мы не получим исходного.

В твоем случае, мне кажется проблема в вычислениях, а именно в конвертации типов - 10 знаков после запятой вроде не проблема для С++.
Чтобы говорить подробнее, напиши в чем была задача, ну и пример исходного файла кинь. [Ответ]
Webaib 21:04 25.01.2010
http://openbook.galileocomputing.de/...701f1341d99a96
http://openbook.galileocomputing.de/...4bd11f8fa21209 [Ответ]
Part!zan 21:15 25.01.2010
DeniSS1, используй тег PHP, в CODE портится разметка. И, как я уже говорил, не сравнивай числа с плавающей точкой через равно. в твоем случае правильное сравнение это что-то типа
Код:
if((double)_min-(int)_min<1e-6)
Во, блин, добрые админы убрали PHP... сцуки... [Ответ]
dr-sm 21:43 25.01.2010
DeniSS1

Сообщение от :
При выполнении бинарных операций производятся преобразования по умолчанию для приведения операндов к одному и тому же типу, который потом используется как тип результата:

если один из операндов имеет тип long double, другой тоже преобразуется в long double;
в противном случае, если один операнд имеет тип double, то второй операнд преобразуется к типу double;
в противном случае, если один операнд имеет тип float, то второй операнд преобразуется к типу float;
в противном случае над обоими операндами производится интегральное продвижение, а именно: значения типов char, signed char, unsigned char, short int и unsigned short int преобразуются в int, если int может представить все значения исходных типов, в противном случае они преобразуются в unsigned int; bool преобразуется в int.
затем если один операнд имеет тип unsigned long, то второй операнд преобразуются к типу unsigned long;
в противном случае, если один из операндов относится к типу long int, а другой к типу unsigned int, то если long int может представить все значений типа unsigned int, unsigned int преобразуется в long int, иначе оба операнда преобразуются в unsigned long int;
в противном случае, если один операнд имеет тип long int, то второй операнд преобразуются к типу long int;
в противном случае, если один операнд имеет тип unsigned int, то второй операнд преобразуются к типу unsigned int;
в противном случае оба операнда имеют тип int.

12345678 [Ответ]
DeniSS1 09:25 28.01.2010
Дело оказалось не в приведении типов, а в том, что входной поток почему-то читается до 2-3 знаков после запятой. Почему? [Ответ]
dr-sm 12:07 28.01.2010
DeniSS1, как ты это определил?, приведи пример кода демонстрирующего проблему. [Ответ]
DeniSS1 14:12 28.01.2010

Сообщение от :
#include <iostream>
#include <fstream>
using namespace std;
ifstream input("input.txt");
double Hz[1000];
int main(int argc, char* argv[])
{
input >> Hz[0];
cout << Hz[0] << endl;
system("PAUSE");
return 0;
}

Входной файл

Сообщение от :
67.3576587

В консоль выводится

Сообщение от :
67.3577

Т.е. округление идёт ещё на этапе считывания. [Ответ]
aerin 14:28 28.01.2010
Мне кажется, что считывается там все нормально.
И подозреваю, что cout.precision( 10 ); перед cout << Hz[0] << endl; спасет отца русской демократии [Ответ]
Страница 2 из 2
< 12
Вверх