Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > задача


Автор: Leere 20.9.2005, 11:06
Если сумма трех попарно различных действительных чисел x, y, z меньше единицы, то наименьшее из них заменить полусуммой двух других; в противном случае заменить меньшее из x и y полусуммой двух оставшихся.

И как это можно записать, я че- то даже в смысл въехать не могу...
Помогите, пожалуйста.

Автор: nikitao 20.9.2005, 12:58
Фрагмент кода функция в которую передаешь 3 указателя на эти числа.
Код

void XOXOXO(int 8x,int *y,int *z)
{
  if ((x==y)||(x==z)||(y==z))
  {
     printf("\aОшибка:найдено два или более  одинаклвых числа числа\n");
     return;
  }
   if(x+y+z<1)
   {
     if ((x<y)&&(x<z))
     {
        x=(y+z)/2;
     }
     else
     {
        if ((y<z)&&(y<z))
     {
        y=(x+z)/2;
     }
     else
      {
        z=(z+y)/2;
      }
      }
      }
     else
     {
       if (x<y)
         x=(y+z)/2;
       else
        y=(x+z)/2
      }  


Я где-то навярняка ошибся,ибо из галовы печатал,и с указателями сам разберись(я в C++ ссылками пользуюсь).Главное понять что "попарно разные числа x,y,z Это просто 3 разных числа(т е нет 2 одинаковых) а дальше все легко. smile Да не удивляйся насчет такого противного if,он нужен на всякий случай.Да навярника имеется ввиду не целые x,y,z,тогда просто замени тип int на тип float или double. smile

ЗЫ А ричем здесь системное програмирование и WinAPI.Тебе надо было писать или в центр помощи или в С++ общие вопросы smile (имхо)

Автор: Dreamer_0x01 20.9.2005, 14:00
nikitao

после выполнения команды if(x+y+z<1) в твоем коде будут весьма непредсказуемые варианты поведения. А точнее, это условие никгда не будет выполняться. Почему??? ;) Потому что это адреса. А их сумма всегда будет больше единицы. Но кроме того, с переменными на выходе функции ничего не сделается. Опять же по этой причине. Поэтому, переписываем код, обращая внимание на то, где мы используем указатель, а где саму переменную...И немного упрощаем для конкретной задачи.

Можно так:

Код

void XOXOXO(int *x,int *y,int *z)
{
int *min;
min=x;
if((*min)>(*y))min=y;
if((*x) +(*y)+(*z)<1)
{
if((*min)>(*z))min=z;
}
*min=((*x)+(*y)+(*z)-(*min))/2;
}



Это раз.

Leere. Твоя тема -
smile

Это два....

Автор: nikitao 20.9.2005, 14:52
Цитата
после выполнения команды if(x+y+z<1) в твоем коде будут весьма непредсказуемые варианты поведения. А точнее, это условие никгда не будет выполняться. Почему??? ;) Потому что это адреса

Да знаю я это,я так писал для скорости,не думая что я использую.Пусть сам думает smile .А вообще ты конечно же прав и код у тебя получше.

Цитата
Leere. Твоя тема -


Это два....

Это я согласен. Leere,smile

Автор: Leere 20.9.2005, 20:15
Ну вообще-то я -девушка. И это многое объясняет)))
Каюсь smile , что офф топ, в след. раз буду умнее!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)