Вопрос по С++

Пух

كنت بلهاء
Модератор
Знакомая задача…
у нас спор сложился в чём:
например имеем последовательность, которой элементы с индексами 15-23 отрицательные. Но 16-23, 17-23, 18-23 тоже подходят под условие(непрерывная последовательность больше 5). Лично я думаю, что нужно вывести только 15, т.к. там последовательность начинается, а все остальные числа (16,17 и т.д.) входят именно в эту последовательность, которая начинается с 15ти.
Задачка лёгкая, но не очень понятное условие.
 

akl

geek
Так как последовательностей может быть несколько, соответственно - несколько начальных будет индексов. Т.е. 15, я думаю нужно выводить.
 

Пух

كنت بلهاء
Модератор
float a,a1,a2,da;
for (a=a1;a<=a2;a+=da)
цикл идет до a=a2-da; (тоесть если а1=1,0; а2=2; da=0.2, то цикл доходит только до a=1.8).

Как правильно сделать?
так?

я так понимаю это всё из-за того, что тип float хранит число только с определенной точностью(вроде 7 или 8 знаков после запятой) и нельзя сравнивать 2 числа этого типа ?
 

dreamer

Member
цикл идет до a=a2-da; (тоесть если а1=1,0; а2=2; da=0.2, то цикл доходит только до a=1.8).

Как правильно сделать?

так?

я так понимаю это всё из-за того, что тип float хранит число только с определенной точностью(вроде 7 или 8 знаков после запятой) и нельзя сравнивать 2 числа этого типа ?
  1. К любой задаче можно придраться. Тут можно рассуждать как: если учитывать и подпоследовательности то каждая последовательность будет состоять из 1 элемента, а значит не будет иметь начальных индексов.
  2. Код:
    for (float x = start; x < end + 1e-5; x += delta);
 

quant

yeah
я так понимаю это всё из-за того, что тип float хранит число только с определенной точностью(вроде 7 или 8 знаков после запятой) и нельзя сравнивать 2 числа этого типа ?
Нафиг он тогда нужен если сравнивать нельзя ? :)
Можно, но проблема в мелких погрешностях возникающих при вычислении, особенно когда они накапливаются.
Переменные
Код:
float x = 3.;
float y = 9. / 3.;
могут быть разными! может где-то в последнем символе так что x = 3.00000000, а y = 2.999999999 но чуть-чуть разные, поэтому сравнивают их с погрешностью.
Пример сравнения на равность с погрешностью 10^-5:
Код:
if( fabs(x - y) < 1e-5 ) { puts("equal"); }
else { puts("distinct"); }
 

Пух

كنت بلهاء
Модератор
С. Есть код:
Код:
#include <conio.h>
#include <stdio.h>
#include <string.h>
#define n 2

int main(){
  struct student{
      char sur[20];
      char gr[6];
      int st;
      float ser;
   }x[n];

  int i;
  clrscr();

   for (i=0;i<n;i++) {
	 printf("Введите фамилию:");
	 scanf("%s",&x[i].sur);
	 printf("\nВведите группу:");
	 scanf("%s",&x[i].gr);
	 printf("\nВведите средний бал:");
	 scanf("%f",&x[i].ser);
	 clrscr();
    }
 getch();
 return 0;
}
не хочет присваивать x.ser какое-либо значение(на экране появляется "введите фамилию" и "введите группу", про средний бал компилятор "забывает"). Как только меняю тип
Код:
float ser;
на
Код:
int ser;
и строку
Код:
 scanf("%f",&x[i].ser);
на
Код:
 scanf("%d",&x[i].ser);
то всё работает правильно. В чём проблема?
 

akick

letter to god
желательно делать
Код:
fflush(STDIN);
 
Останнє редагування:

Пух

كنت بلهاء
Модератор
Видимо Borland C++. Есть в ней такой глюк. Лечится по-моему добавлением в самое начало программы чего-то вроде:
Код:
float some;
fscanf("%f", &some);
помогло, только не fscanf, a scanf.
fflush(stdin); не помогло...
завтра настигну препада, только врядли она что-то внятное сможет посоветовать)
p.s. да, Borland C++ 3.1
 
Зверху