Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 867
от 04.10.2007, 22:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 480, Экспертов: 69
В номере:Вопросов: 2, Ответов: 5


Вопрос № 103731: Здравствуйте, Помогите решить такой вопрос. Есть цены за многодневный период времени. Для каждого дня две цены High и Low. Надо вычислить средний ежедневный диапазон цен (AverageDayRange) за последние n дней (например, 20 дней): ((High[21]-Lo...
Вопрос № 103794: Привет всем! Вот написал программу (см.приложение), но она не работает. Поэтому у меня три вопроса: 1) Почему программа не работает с десятичными числами (0.3 и т.п.), а сразу завершается? 2) Как сделать, чтобы после выполнения программы ...

Вопрос № 103.731
Здравствуйте,
Помогите решить такой вопрос. Есть цены за многодневный период времени. Для каждого дня две цены High и Low. Надо вычислить средний ежедневный диапазон цен (AverageDayRange) за последние n дней (например, 20 дней):
((High[21]-Low[21])/2 + (High[19]-Low[19])/2 +.......+ (High[1]-Low[1])/2)/20
Как это правильно записать на языке С, используя массивы, чтобы это было короче?
Отправлен: 28.09.2007, 21:37
Вопрос задал: Vend (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Лукьянчиков Дмитрий Алексеевич
Здравствуйте, Vend!

float High[n];
float Low[n];
float Sum=0;
float Average=0;
... // заполняются массивы High и Low

for (int i=1;i<=n;i++) //цикл от одного до n
{
Sum+=(High[i]-Low[i])/2 ; // считаем всю заработанную сумму за n дней (a+=b означает a=a+b)
}
Avarage= Sum/n; //считаем среднее значение


---------
Программирование, программирование и еще раз программирование...Говорил Страуструп!))
Ответ отправил: Лукьянчиков Дмитрий Алексеевич (статус: Заблокирован)
Ответ отправлен: 28.09.2007, 21:49
Оценка за ответ: 5

Отвечает: Lestat de Lionkur
Здравствуйте, Vend!
Вот примерный код Вашей программ.
Перед этими действиями необходимо инициализировать макрос MAX_DAYS и переменные nHigh и nLow.
Удачи!

Приложение:

Ответ отправил: Lestat de Lionkur (статус: 1-ый класс)
Ответ отправлен: 29.09.2007, 00:34
Оценка за ответ: 4

Отвечает: Maxim V.G.
Здравствуйте, Vend!
Хочу предложить ещё один вариант вычисления указанной задачи при помощи динамических массивов:

#include ........

.........................
.........................
.........................

int maxDay; // количество дней
fprintf(stdout, "Input maxDay:");
fscanf(stdin, "%d", &maxDay);

if (maxDay == 0){ // Проверка что пользователь действительно ввёл количество дней и не возникнет деление на 0.
cout << "Error: maxDay must be > 0" << endl;
return;
}

float *Hight = new float[maxDay]; //выделение памяти для динамических массивов
float *Low = new float[maxDay];

float Sum=0;
float Average=0;

//Цикл ввода и вычисление средне-дневной цены. Порядок ввода: первая максимальная, вторая миимальная цена
for (int i=0; i<maxDay; i++){
cout << "Input Hight price:" << endl;
fscanf(stdin, "%f", &Hight[i]);
cout << "Input Low price:" << endl;
fscanf(stdin, "%f", &Low[i]);

if (Low[i]>Hight[i]){ // проверка пользователя на соблюдение порядка ввода (первая максимальная, вторая миимальная цена). В случае ошибочного ввода пользователю предлагается ввести заново текущею строку.
cout << "Error: Low price > Hight price" << endl;
cout << "Plaese reinput value current string" << endl;
i--;
continue;
}
Sum+=(Hight[i]-Low[i])/2;
}

//Вычисление средне дневной цены за указанный период:
float Avarage= Sum/maxDay;
cout << Avarage << endl;

//Освобождение памяти.
delete[] Hight;
delete[] Low;

.....................................
......................................
......................................

Проверка верхней и нижней цены крайне важна. Так, как при её отсутствии можно получить отрицательный результат.
---------
Жить вредно - от неё умирают
Ответ отправил: Maxim V.G. (статус: 4-ый класс)
Ответ отправлен: 01.10.2007, 18:42


Вопрос № 103.794
Привет всем!
Вот написал программу (см.приложение), но она не работает. Поэтому у меня три вопроса:
1) Почему программа не работает с десятичными числами (0.3 и т.п.), а сразу завершается?
2) Как сделать, чтобы после выполнения программы окно не закрывалось, пока не нажмешь enter (писать в конце scanf ("%d",f) неэффективно и тупо :) )?
3) Как сделать "защиту от дурака", т.е. если будут введены не числа, а символы, например, выводить сообщение об ошибке?
Всем спасибо!

Приложение:

Отправлен: 29.09.2007, 21:00
Вопрос задал: LexXx (статус: Практикант)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 6)

Отвечает: Verena
Здравствуйте, LexXx!
1. Проставим формат в scanf-е для чисел типа float (вместо %d - %f).
2. Самое простое - поставить функцию getch () (или _getch()) - правда, она среагирует на любую нажатую клавишу.
3. Если вручную - над читать число в строку, проверять, все ли введённые символы - цифры (плюс один разделитель), и если это так, переводить строку в число с помощью специальной функции (например, atof (строка)).
Вот Ваш пример в рабочем варианте:

#include
#include
#include
int main()
{
float x,y,d;
int f;
printf ("Vvedite x:");
scanf ("%f",&x);
printf (" Vvedite y:");
scanf ("%f",&y);
if (fabs(y)<=1-2*fabs(x), d=1); else d=0;
printf (" d=%f",d);
printf (" Press to end");
_getch ();
return 0;
}

---------
Эта история - не для истории, понимаешь?
Ответ отправила: Verena (статус: Студент)
Ответ отправлен: 29.09.2007, 21:44
Оценка за ответ: 5
Комментарий оценки:
Спасибо!

Отвечает: Dutka M.M.
Здравствуйте, LexXx!
if (fabs(y)<=1-2*fabs(x), d=1); else d=0;??!!!

if (fabs(y)<=1-2*fabs(x)) d=1; else d=0;

scanf ("%d",&x)????

scanf ("%f",&x)!!!!!!!!!!!!!!!

scanf ("%d",f); => getch();
Ответ отправил: Dutka M.M. (статус: 1-ый класс)
Ответ отправлен: 01.10.2007, 02:04


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.60.10 от 27.09.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное