Тема: потрібна допомога для виконання задачі на мові Си

Напишіть будь ласка підзказку,як потрібно виконувати задачі такого типу.Мені не потрібне виконання,лише деяка допомога,щоб я рухався в правильному напрямку(дякую).

Задане ціле n > 0 та послідовність з n дійсних чисел. Визначити скільки раз у цій послідовності змінюється знак. Наприклад, у послідовності 1, -34, 8, 14, -5 знак

2

Re: потрібна допомога для виконання задачі на мові Си

Ну я придумав як це можна зробити в лоб. Створюєм масив заповнюємо даними, потім створюємо змінну в яку будем записувати кількість змінів знаку. Потім робимо якийсь цикл щоб перебрати всі елементи в масиві. В середині циклу дістаєм поточний елемент і попередній. Дивимось якщо знак в поточному елементі відрізняється від знаку в попередньому елементі додаєм в змінну в яку записуємо кількість знаків одиничку, коли ми пройдем по всіх елементах колекції в нас в цій змінній буде те значення яке нам потрібно знайти.


тут як я це робив але краще не підглядати ))
#include <iostream>
#include <string>
#include <vector>

int main()
{
  std::vector<double> array = { 1, -34, 8, 14, -5 };
  int countOfChanges = 0;
  
  for(std::size_t i = 1; i < array.size(); ++i)
  {
      auto firstNumber = array[i-1];
      auto secondNumber = array[i];
      
      bool isFirstPositive = firstNumber > 0;
      bool isSecondPositive = secondNumber > 0;
      
      if (isFirstPositive ^ isSecondPositive)
      {
          countOfChanges++;
      }
  }
  std::cout<< "Count of sign changes: " << countOfChanges << std::endl;
}
Подякували: koala1

3

Re: потрібна допомога для виконання задачі на мові Си

truesupport добре описав алгоритм; однак є невирішена проблема - що робити з нулем. Поки нулів немає - алгоритм працює. Але скільки разів змінюється знак у послідовності (1,0,-1)? А в (1,0,1) чи (-1,0,-1)? Нарешті, в (0,0,0)?
В принципі, це має бути роз'яснене в умові, але там такого немає. Я б запропонував замість ознак, виведених truesupport, використовувати щось на кшталт

int first_sign = (firstNumber  > 0) ? 1 : ((firstNumber  < 0) ? -1 : 0);
int second_sign = (secondNumber  > 0) ? 1 : ((secondNumber  < 0) ? -1 : 0);
if(first_sign !=second_sign )...

Тоді буде трохи не інтуїтивно, що (1,0,-1) - дві зміни знаку. Але десь воно все одно буде дивно.

4

Re: потрібна допомога для виконання задачі на мові Си

Можна ще простіше за допомогою signbit
перевіряти і це, напевне, буде більш
правильно, якщо мова про перевірку знака.
https://en.cppreference.com/w/cpp/numeric/math/signbit

Подякували: leofun011

5

Re: потрібна допомога для виконання задачі на мові Си

Але тоді можна дістати зміну знака на (0.0, -0.0)

6 Востаннє редагувалося wander (09.10.2019 10:25:12)

Re: потрібна допомога для виконання задачі на мові Си

Ну, так, -0 зі знаком, то і результат signbit
був би правильним.

7

Re: потрібна допомога для виконання задачі на мові Си

adziri написав:

Ну, так, -0 зі знаком, то і результат signbit
був би правильним.

Але не для дійсних чисел. Для чисел з рухомою комою. А в умові - дійсні.

8 Востаннє редагувалося wander (09.10.2019 17:35:51)

Re: потрібна допомога для виконання задачі на мові Си

Ем, так, дійсні числа, на наш лад це real numbers, так?
Наскільки я пам'ятаю числа з рухомою комою (мова про floating-points?)
це одна з форм дійсних чисел?
То ж число з рухомою комою є теж дійсним, чи я щось не так зрозумів?

9

Re: потрібна допомога для виконання задачі на мові Си

adziri написав:

Ем, так, дійсні числа, на наш лад це real numbers, так?
Наскільки я пам'ятаю числа з рухомою комою (мова про floating-points?)
це одна з форм дійсних чисел?
То ж число з рухомою комою є теж дійсним, чи я щось не так зрозумів?

Ні. Дійсні числа - це математичне поняття. Числа з рухомою комою - один зі способів представлення певної підмножини дійсних чисел в комп'ютерах. Очевидно, що якщо задана множина в комп'ютері, то це будуть числа з рухомою комою; але також очевидно, що якщо в умові питають про дійсні числа, то всі дії з ними мають якомога точніше імітувати дії з дійсними числами, а не з їхнім представленням в комп'ютері.

10

Re: потрібна допомога для виконання задачі на мові Си

Гм, все ще не розумію в чому проблема?
В тому, що ми можемо дістати знак з -0.0?

11

Re: потрібна допомога для виконання задачі на мові Си

Проблема в невизначеності умови. Там йдеться про математичне поняття дійсного числа, і не зрозуміло, що мається на увазі під "зміною знаку". Якби було сказано "дійсних ненульових чисел", було б простіше.

Подякували: wander, leofun012