Поиск
 
 

Результаты :
 


Rechercher Расширенный поиск

Кто сейчас на форуме
Сейчас посетителей на форуме: 1, из них зарегистрированных: 0, скрытых: 0 и гостей: 1

Нет

[ Посмотреть весь список ]


Больше всего посетителей (9) здесь было Вс Фев 11, 2018 12:54 pm
Самые активные пользователи за неделю
Ярослав
 


Домашняя работа №9

Перейти вниз

Домашняя работа №9

Сообщение автор Gragory023 в Пн Фев 27, 2017 12:05 pm

Сделал первый номер дз, но программа не запускается, пишет result и intarray - не объявленные индикаторы. Когда в шаблоне и в меине, я объявил эти идентификаторы.
Код:
#include <iostream>

using namespace std;

template<typename T>
T average(T av[], int cout) {
   int reulst = 0;
   for (int i = 0; i < cout; i++)
      result = result+ intarray[i];
   int finish_result = result / cout;
   return finish_result;

}
int main() {
   
   
   int intarray[10] ={1,5,9,6,3,
                  8,9,3,5,9};
   cout << "Average array = " << average(intarray,10) << endl;
   

}

Вроде делал по аналогии работы в классе.

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №9

Сообщение автор Ярослав в Пн Фев 27, 2017 4:01 pm

С result просто — он в одном месте называет reUslt, поэтому не понимает.

Переменная intarray является локальной для main(). Только там она так называется. Внутри функции average она называется по-другому: av.
avatar
Ярослав
Admin

Posts : 591
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №9

Сообщение автор Gragory023 в Вт Фев 28, 2017 2:33 pm

С этим разобрался.
Второе задание сделал, но правильно ли я сделал как передаются коэф. уравнений?
И пару вопросов в коде , как сделать грамотней.
Код:
#include <iostream>
#include <math.h>

using namespace std;

float result(float a, float b) {
 float x = -b / a;
 return x;
}

float result(float a, float b, float c) {
 float d = (b*b) - 4 * a*c;
 if (d == 0) {
 float x = (-b - sqrt(d)) / (2 * a);
 return x;
 }
 else if (d > 0) {
 float x1 = (-b - sqrt(d)) / (2 * a);
 float x2 = (-b + sqrt(d)) / (2 * a);
 return x1; return x2;// Как можно вывести два значения?
 }
 //return cout << "doesnt have result" Как вывести с помощью return надпись?
}

int main() {
 cout << "ax + b = 0  x = " << result(2, 10) << endl;
 cout << "ax^2 + bx + c = 0  x = " << result(1, 6, 9) << endl;
}

И по поводу третьего задания. Не особо понял, как производить округление. Надо просто будет убрать знаки или именно округлить в большую или меньшую сторону?

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №9

Сообщение автор Ярослав в Вт Фев 28, 2017 3:13 pm

Во второй задаче нужно написать не просто функции, а шаблоны функций.
Коэффициенты передаются действительно так.

Функция не может вернуть 2 значения; придётся искать обходные пути.
1) Либо записывать ответ в 2 глобальные переменные
2) Либо передавать в функцию ещё массив из 2 элементов, и заполнять его в качестве ответа
3) Можно значения не возвращать, а просто печатать на экран

Вариант 1) отпадает из-за того, что мы пишем шаблоны функций.
avatar
Ярослав
Admin

Posts : 591
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №9

Сообщение автор Ярослав в Вт Фев 28, 2017 3:18 pm

В третьей задаче нужно округлять по правилам округления:

Если последняя цифра: 0, 1, 2, 3, 4 — округляем вниз
Если последняя цифра: 5, 6, 7, 8, 9 — округляем вверх

Самый простой способ сделать такое округление:

int (a + 0.5)

Добавляем 0.5 и округляем, отбрасывая дробную часть (работает только для положительных чисел). Помимо этого, в <math.h> есть библиотечные функции:

round(), ceil(), floor()

Как сделать округление до нужного знака после запятой? Надо использовать умножение и деление на степень десятки. Например, если мне дали число 0.16666 и просят округлить до 2 знака после запятой, я могу это сделать в три операции:

0.16666 * 100 = 16.666
округляю 16.666 по правилам округления до целого числа = 17
17 / 100 = 0.17
avatar
Ярослав
Admin

Posts : 591
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №9

Сообщение автор Gragory023 в Ср Мар 01, 2017 10:38 am

Сделал два шаблона, но как их вывести. Делаю прям по аналогии с пред. заданием.
Код:
#include <iostream>
#include <math.h>

using namespace std;

template<typename T>
T result(float a, float b) {
   float x = -b / a;
   return x;
}

template<typename T>
T result(float a, float b, float c) {
   float d = (b*b) - 4 * a*c;
   if (d == 0) {
      float x = (-b - sqrt(d)) / (2 * a);
      return x;
   }
   else if (d > 0) {
      float x[i];
      float x1 = (-b - sqrt(d)) / (2 * a);
      float x2 = (-b + sqrt(d)) / (2 * a);
      /как можно не возвращать значение, и сразу печатать?
   }
   //return cout << "doesnt have result" Как вывести с помощью return надпись?
}

int main() {
   cout << "ax + b = 0  x = " << result(2, 10) << endl;
   cout << "ax^2 + bx + c = 0  x = " << result(1, 6, 9) << endl;
}
Так же я все не понимаю, как выводить 2 числа, даже если использовать массив.
И как выводить, что решений нет

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №9

Сообщение автор Gragory023 в Ср Мар 01, 2017 11:27 am

С третьем, что то вообще все равно даже не могу представить, как делать.
Например int (a + 0.5), тут разве не float должен быть?
0.16666 * 100 = 16.666 // ну, как я понял тут можно использовать if else, грубо говоря если два знака выбрано умножаем на 100, но если будет изначально целое число, то тогда вообще получится не то.
округляю 16.666 по правилам округления до целого числа = 17 // тут воспользоваться ceil(), floor(), если да, то как определить в какую сторону? К примеру число 0,11178 округлить до 3 цифр, то получится 0,112, но как это отразить?
17 / 100 = 0.17

P.S. Что то меня это задание совершенно завело в тупик(((

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №9

Сообщение автор Ярослав в Ср Мар 01, 2017 1:49 pm

По второй:

T обязательно должно присутствовать в списке параметров:
Код:
T result (T a, T b, T c)
(При этом представляем себе, что T == float).

Функция не обязана возвращать значение T; это может быть void функция:
Код:
void result(T a, T b, T c)
Как она при этом отчитывается о результате своей работы? Печатая найденное x на экран:
Код:
cout << "x1 = " << x1 << endl;
cout << "x2 = " << x2 << endl;
Да, мы не сможем найденные x1 и x2 использовать в дальнейших вычислениях; но в нашей задаче достаточно того, что они оказываются распечатаны на экран.
avatar
Ярослав
Admin

Posts : 591
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №9

Сообщение автор Ярослав в Ср Мар 01, 2017 1:52 pm

По третьей:

Если нам задана точность == 1, то умножать / делать надо на 10
Если точность == 2, то умножать / делить надо на 100
Если точность == 3, то умножать / делать надо на 1000

Какая закономерность? Справа стоит число (десять в такой-то степени), а именно, в степени точности.

Эту степень можно посчитать вручную, с помощью цикла for; либо воспользоваться функцией pow(x, y) — возведение x в степень y.

Алгоритм получается такой:

1. Вводим число
2. Вводим точность
3. Находим множитель, равный 10 в степени точность
4. Умножаем число на множитель
5. Округляем число
6. Делим число на множитель
avatar
Ярослав
Admin

Posts : 591
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №9

Сообщение автор Gragory023 в Ср Мар 01, 2017 3:34 pm

Вроде получилось. но не понятно, что значит функция не обязана возвращать значение T; это может быть void функция. Я думал использование Т это шаблон, а void это просто функция. А в задании сказано перегруженный шаблон функций.
Так же в конце почему то выдает какое то число, не понятно откуда((((
Код:
template<typename T>
T result(T a, T b, T c) {
   float d = (b*b) - 4 * a*c;
   if (d == 0) {
      float x = (-b - sqrt(d)) / (2 * a);
      return x;
   }
   else if (d > 0) {
      float x1 = (-b - sqrt(d)) / (2 * a);
      float x2 = (-b + sqrt(d)) / (2 * a);
   cout << "ax^2 + bx + c = 0"<< endl;
   cout << "\tx1 = " << x1 << endl;
   cout << "\tx2 = " << x2 << endl;;
   }
   else
   cout << "error" << endl;;
}

int main() {
   cout << "ax + b = 0  x = " << result(3, 10) << endl;
   cout  << result(1, -70, 600) ;
}

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №9

Сообщение автор Ярослав в Ср Мар 01, 2017 5:38 pm

Указание типа возврата T перед функцией:
Код:
T result(T a, T b, T c)
означает: эта функция всегда, при любых условиях, сможет вернуть одно и только одно значение. Мы знаем, что в случае квадратного уравнения это не так.

Я рекомендую поменять тип возврата функции на void. Функция не будет возвращать никакого значения, ни в одном сценарии. Вместо этого она будет печатать "нет корней" / "единственный корень: x" / "два корня: x1, x2".

void функции нельзя встраивать в формулу вроде cout << f(). Вместо этого мы вызываем void функцию отдельным утверждением:

result(1, -70, 600);

Она внутри себя печатает то, что надо.
avatar
Ярослав
Admin

Posts : 591
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №9

Сообщение автор Gragory023 в Чт Мар 02, 2017 12:19 pm

Вроде получилось, все.
Во втором использовал сначала template потом void. Единственное не понял, что значит перегрузка функции((((
Код:
[center]#include <iostream>
#include <math.h>

using namespace std;

template<typename T>
T result(T a, T b) {
 float x = -b / a;
 return x;
}

void result(float a, float b, float c) {
 float d = (b*b) - 4 * a*c;
 if (d == 0) {
 float x = (-b - sqrt(d)) / (2 * a);
 cout << "ax^2 + bx + c = 0  x = " << x << endl;
 }
 else if (d > 0) {
 float x1 = (-b - sqrt(d)) / (2 * a);
 float x2 = (-b + sqrt(d)) / (2 * a);
 cout << "ax^2 + bx + c = 0,  x1 = " << x1 << ", x2 = " << x2 << endl;

 }
 else
 cout << "doesnt have result" << endl;
}

int main() {
 cout << "ax + b = 0  x = " << (float)result(2, 10) << endl;
 result(1, -70, 600);
}[/center]

В третьем сделал так, не знаю правильно или нет(
Код:
#include <iostream>
#include <math.h>

using namespace std;

void calculate(float number,int quality) {
 float result;
 int factor;
 factor = pow(10, quality);
 result = number*factor;
 result = round(result);
 result = result / factor;
 cout << result << endl;
}
int main() {
 float number, quality;
 cout << "Please enter number which you wont rounding" << endl;
 cin >> number;
 cout << " Please enter number after point" << endl;
 cin >> quality;
 calculate(number,quality);
}

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №9

Сообщение автор Ярослав в Чт Мар 02, 2017 2:18 pm

Язык C++ Перегрузка функций — это когда есть две функции с одинаковым названием. Чтобы это не было ошибкой компиляции, у функций должны быть разные списки параметров.

Лучший ответ на вопрос, правильно или неправильно — это потестировать программу с разными значениями.

Например:
1) Берём число с одним знаком после запятой и требуем округлить до целого
3.1 и 0 --> 3
4.5 и 0 --> 5
10.8 и 0 --> 11
Должно округляться по правилам школьного округления.

Если этот тест пройден, переходим ко второму:
2) Теперь попробуем округлять, оставляя 1 знак после запятой:
3.14 и 1 --> 3.1
3.15 и 1 --> 3.2
3.19 и 1 --> 3.2
После округления должна остаться 1 цифра после запятой, а округлится вверх или вниз, зависит от последующей цифры.

Если и этот тест пройден, то скорее всего, всё работает правильно, но можно для очистки совести потестировать ещё с числом знаков после запятой, например, 4:
3.1415926 и 4 --> 3.1416
avatar
Ярослав
Admin

Posts : 591
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №9

Сообщение автор Gragory023 в Чт Мар 02, 2017 2:38 pm

Понял, спасибо)

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №9

Сообщение автор Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения