Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > [C++] Неправильно работает программа


Автор: lrad 20.1.2007, 23:59
Помогите найти ошибку

Код

#include<iostream.h>
#include<iomanip.h>
#include<conio.h>
//Прототипы функций
void inputmas(float[15],char);
float raschet(float [15]);
void printrez(float [15],char);

   void main()
   {
    cout <<"Задача № 1  \n";
    cout <<"Даны вещественные массивы А[15]F[15] \n";
    cout <<"Для каждого массива определить наибольшее \n";
    cout <<"из отрицательных значений" << endl;
    cout<<"\nДля вывода результатов вам нужно самостоятельно заполнить массив!\n";

   // Объявление массива и переменных
   float a[15],f[15];
   // Обращение
   inputmas(a,'a'); // в функцию в качестве аргумента
   inputmas(f,'f'); // передается массив и его имя
                       // вызов функции, возращающей 1 значение

   printrez(a,'a');
   printrez(f,'f');
   cout<<"Нажмите любую клавишу...";
   getch();

   return;
   }

// Определение функции ввода массива inputmas()

   void inputmas(float x[15],char name)
   {

    cout <<"Вводим массив  " << name << endl;
  int i;
  for ( i=0;i<15;i++)
  {
  cout <<"Введите элемент массива  " << name <<"["<<i<<"]=";
  cin >>x[i];
  }
  }
// Определение расчетной функции raschet()
float raschet(float m[15])
{
float max=0;

for (int i=0;i<15;i++)
if (m[i]>max && m[i] <0)
max=m[i];

return max;
}

 //     //Вывод массива и результата

void printrez(float x[15],char name)
{
cout<<"Исходный массив "<<name<<":"<<endl;
for (int i=0;i<15;i++)
cout<<setw(5)<<x[i];

float res=raschet(x);
if(res!=0)
cout<<endl<<"Наибольшее отрицательное значение в массиве "<<name<<" равно " <<raschet(x)<< endl;
else
cout<<endl<<"Отрицательных значений нет";
}

Автор: nworm 21.1.2007, 00:03
Пробуй пошаговую отладку F7, F8, F4.

Хорошо ещё написать, что выдаёт компилятор. А то не очень хочетсся 70 строк смотреть из-за какойни-будь запятой.

Автор: zkv 21.1.2007, 00:06
Код

float raschet(float m[15])
{
float max=0;
for (int i=0;i<15;i++)
if (m[i]>max && m[i] <0)
max=m[i];
return max;
}

Цитата(lrad @  20.1.2007,  23:59 Найти цитируемый пост)
    cout <<"Для каждого массива определить наибольшее \n";
    cout <<"из отрицательных значений" << endl;

float max=0; - max теперь больше любого отрицательного значения, естественно в массиве ничего не находится так как условие  (m[i]>max && m[i] <0) никогда не выполнится, в следующий раз пиши, что именно не получается

Автор: PoloS 21.1.2007, 00:06
Код

max = 0;


ты ищешь нибольшее из отрицательных, и как 1 значение берешь заведомо большее число.

надо так
Код

max = m[0];
for (inti i = 1; i < 15; i++)...
...
...

Автор: lrad 21.1.2007, 00:07
Программа эта под dos
Она компилируется и компонуется нормально!!!
Результат работы самой программы неправильный
Тоесть ответ выдает неправильный

Автор: PoloS 21.1.2007, 00:07
Цитата(zkv @ 21.1.2007,  00:06)
float max=0; - max теперь больше любого отрицательного значения, естественно в массиве ничего не находится так как условие  (m[i]>max && m[i] <0) никогда не выполнится, в следующий раз пиши, что именно не получается

в одну секунду с тобой ответили  smile  smile  smile 

 smile 

Автор: lrad 21.1.2007, 00:09

Пробовал и так
а где гарантия что 1 элемент будет отрицательным?
Код


#include<iostream.h>
#include<iomanip.h>
#include<conio.h>
//Прототипы функций
void inputmas(float[15],char);
int raschet(float [15]);
void printrez(float [15],char);

   void main()
   {
    cout <<"Задача № 1  \n";
    cout <<"Даны вещественные массивы А[15]F[15] \n";
    cout <<"Для каждого массива определить наибольшее \n";
    cout <<"из отрицательных значений" << endl;
    cout<<"\nДля вывода результатов вам нужно самостоятельно заполнить массив!\n";

   // Объявление массива и переменных
   float a[15],f[15];
   // Обращение
   inputmas(a,'a'); // в функцию в качестве аргумента
   inputmas(f,'f'); // передается массив и его имя
   // вызов функции, возращающей 1 значение

   printrez(a,'a');
   printrez(f,'f');
   cout<<"Нажмите любую клавишу...";
   getch();

   return;
   }

// Определение функции ввода массива inputmas()

   void inputmas(float x[15],char name)
   {

    cout <<"Вводим массив  " << name << endl;
  int i;
  for ( i=0;i<15;i++)
  {
  cout <<"Введите элемент массива  " << name <<"["<<i<<"]=";
  cin >>x[i];
  }
  }
// Определение расчетной функции raschet()
 int raschet(float m[15])
  {
      int i,max;
      max=m[0];

    for (i=0;i<15;i++)
    if (m[i] >max&& m[i] <0)
    max=m[i];

 return max;

  }

 //     //Вывод массива и результата

 void printrez(float x[15],char name)
 {

 cout<<"Исходный массив  "<<name<<":"<<endl;
 for (int i=0;i<15;i++)
 cout<<setw(5)<<x[i];
 cout<<endl<<"Наибольшее отрицательное значение в массиве  "<<name<<" равно " <<raschet(x)<< endl;


 }



Автор: PoloS 21.1.2007, 00:11
точно! тогда те нужно завести флаг 
1)first = false; 
2)нашел отрицательный
3) смотришь first == false, если да то max = этому числу и first = true;
иначе сравниваешь с max и максимальное заносишь в max

Добавлено @ 00:13 
Код

// Определение расчетной функции raschet()
 int raschet(float m[15])
  {
      int i,max;
bool f = false;
    for (i=0;i<15;i++)
    if (m[i] < 0)
   {
    if (f == false) max = m[i], f = true;
    else 
         {if (max < m[i]) max = m[i];}
   }
 return max;
  }

Автор: zkv 21.1.2007, 00:13
Цитата(lrad @  21.1.2007,  00:09 Найти цитируемый пост)
а где гарантия что 1 элемент будет отрицательным?

конечно нет гарантий, так что теперь писать заведомо неработающие варианты, можно например в каждой итерации проверять max == 0 и если равно и текущий элемент отрицательный, то писать его значение в max

Автор: lrad 21.1.2007, 00:23
Цитата



Код

// Определение расчетной функции raschet()
 int raschet(float m[15])
  {
      int i,max;
bool f = false;
    for (i=0;i<15;i++)
    if (m[i] < 0)
   {
    if (f == false) max = m[i], f = true;
    else 
         {if (max < m[i]) max = m[i];}
   }
 return max;
  }



Это не то
надо более простое решение
P.S. слишком заумно для студента 1 курса smile 

Автор: PoloS 21.1.2007, 00:26
Цитата(lrad @ 21.1.2007,  00:23)

Это не то
надо более простое решение
P.S. слишком заумно для студента 1 курса smile

я сам первокурсник  smile  и ничего замутного тут не вижу... можешь сделать как zkv предложил, смысл такой же и доп. переменную не надо вводить:
Код

// Определение расчетной функции raschet()
 int raschet(float m[15])
  {
      int i,max = 0;
    for (i=0;i<15;i++)
    if (m[i] < 0)
   {
    if (max) 
         if (max < m[i]) max = m[i];
    else 
         {max = m[i];}
   }
 return max;
  }


тока при воводе рез-та, рассматривай случай, когда функция возвращает 0. Это значит отриц. чисел нет

Автор: zkv 21.1.2007, 00:34
PoloS, 
Цитата(PoloS @  21.1.2007,  00:26 Найти цитируемый пост)
тока при воводе рез-та, рассматривай случай, когда функция возвращает 0

а у вас кстати функция в таком случае работать будет некорректно:
Цитата(PoloS @  21.1.2007,  00:11 Найти цитируемый пост)
int raschet(float m[15])
  {
      int i,max;
bool f = false;
    for (i=0;i<15;i++)
    if (m[i] < 0)
   {
    if (f == false) max = m[i], f = true;
    else 
         {if (max < m[i]) max = m[i];}
   }
 return max; //если не встретится отрицательных чисел, то в max - мусор
  }


Автор: PoloS 21.1.2007, 00:37
Цитата(zkv @ 21.1.2007,  00:34)
PoloS, 
Цитата(PoloS @  21.1.2007,  00:26 Найти цитируемый пост)
тока при воводе рез-та, рассматривай случай, когда функция возвращает 0

а у вас кстати функция в таком случае работать будет некорректно:
Цитата(PoloS @  21.1.2007,  00:11 Найти цитируемый пост)
int raschet(float m[15])
  {
      int i,max;
bool f = false;
    for (i=0;i<15;i++)
    if (m[i] < 0)
   {
    if (f == false) max = m[i], f = true;
    else 
         {if (max < m[i]) max = m[i];}
   }
 return max; //если не встретится отрицательных чисел, то в max - мусор
  }

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

Автор: Rockie 21.1.2007, 00:40
lrad, здесь
Код

float max=0;
 тебе нужно указывать не ноль и не первый эл-т, а первый найденный отрицательный элемент. Вот тебе ссылка в тему:

http://forum.vingrad.ru/topic-116769/unread-1/hl/%25D0%25BE%25D1%2582%25D1%2580%25D0%25B8%25D1%2586%25D0%25B0%25D1%2582%25D0%25B5%25D0%25BB%25D1%258C%25D0%25BD%25D0%25AB%25D0%25B9/index.html#go_p

p.s.: первая страница была куда забавнее smile

Добавлено @ 00:42 
все-таки первая. решения аналогичной задачи на второй =)


Автор: lrad 21.1.2007, 00:59
Rockie, Спасибо!
теперь то я уже разберусь smile 

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