LINUX.ORG.RU

Баг в программе.

 ,


1

3

Программа должна проводить вычисление, но выдаёт не тот результат, который ожидается.

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include <math.h>

int small(int v[], int size){
	int result=0;
	for(int i=0; i<size; i++){
		if(v[i]<result) result=v[i];
	}
	
	return result;
}
bool is_high(long int mis,int t, int s[], int v[], int num_raws){
	float time=0;
	for(int i=0; i<num_raws; i++){
		if(v[i]+(mis/10000000)<=0) return true;
		time+=s[i]/(v[i]+(mis/10000000));
	}
	if(time>=t) return true;
	 return false;
}

int main(){
	int time, num_raws;
	scanf("%d %d", &num_raws, &time);
	
	int v[num_raws];
	int s[num_raws];
	for(int i=0; i<num_raws; i++) scanf("%d %d", &s[i],&v[i]);
	int mis=-small(v, num_raws)+1;
	
	for(int i=0; i<=7;i++){
		while(is_high(mis, time, s, v, num_raws)){
			mis+=pow(10,7-i);
		}
		mis-=pow(10,7-i);
	}
	printf("%f\n", (double)mis/10000000);
	
	return 0;
}

А вот вводимые данные. Первое число количество рядочков. Второе время езды, каждый следующий содержит расстояние и скорость с которым ехал водитель. Загвоздка в том, что в скорости везде отклонение на некую константу, которую и надо узнать.

4 10

5 3

2 2

3 6

3 1

Буду очень благодарен, если поможете, а то сроки горят.



Последнее исправление: Nullum (всего исправлений: 1)

По-моему, тут лучше использовать какой-нибудь готовый решатель, например Maxima:

(%i1) ev(realroots(5/(x+3) + 2/(x+2) + 3/(6+x) + 3/(1+x) = 10), float);
(%o1) [x = - 5.768621414899826, x = - 2.643814653158188, 
                             x = - 1.778910547494888, x = - 0.5086533725261688]

Корней находит много, но подходит только -0.5086533725261688, потому что иначе x+1 получается отрицательным.

i-rinat ★★★★★
()

Лень разбираться, дам совет - запусти дебаг и смотри, что происходит.

Meyer ★★★★★
()

ТС, не стыдно? Либо в Job пиши, либо описывай что ты посчитать хочешь и по какому алгоритму. А с нынешней формулировкой задачи я могу только одно написать:

Я надеюсь, что Вы сможете исправить свой код, чтобы он выдавал тот результат, который ожидается.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от Nullum

только как это на си прописать?

Сначала выясняешь, как искать решение уравнения численно. Потом пишешь код на Си. Ты ведь понимаешь, что суть задания состоит в том, чтобы ты сам разобрался, без помощи других.

i-rinat ★★★★★
()
Ответ на: комментарий от Nullum

Глянул я всё-таки твой код. В принципе, подход должен сработать, хотя и сделано достаточно дубово. Лучше было бы искать решение делением отрезка пополам. А ошибка у тебя из-за того, что mis у тебя целое, и при делении на 10000000 ты получаешь явно не то, что ожидал. Скастуй к double.

i-rinat ★★★★★
()
Ответ на: комментарий от Nullum

Только это левак, а не правильный ответ

ЕМНИП, в Си, если в делителе целочисленное, то и результатом деления будет целое число.

cPunk ★★
()
Ответ на: комментарий от i-rinat

Корней находит много, но подходит только -0.5086533725261688, потому что иначе x+1 получается отрицательным.

задом ехал

dikiy ★★☆☆☆
()
Ответ на: комментарий от i-rinat

не сработает. Стоит чуть-чуть увеличить количество слагаемых или уменьшить расстояние между корнями и все.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

Вы, математики, странные.

Кстати, там «расстояние», а не «перемещение».

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

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

dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 1)

Нашло то оно правильно, только как это на си прописать?

так просто не пропишешь. Бо максима по предварительно ищет корни аналитически. Сначала разлагает полином на сомножители, а потом каждый уже решает отдельно. Вообще задача достаточно нетривиальная.

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

dikiy ★★☆☆☆
()

Тебе осталось изменить один символ

$ gcc -Wall -Wextra main.c -o main -lm
$ ./main
4 10 5 3 2 2 3 6 3 1
-0.508653
#include <stdio.h>
#include <math.h>

#define PREC 7

int min(double *v, int size) {
    double minv = v[0];
    for(int i = 1; i < size; i++) {
        if(v[i] < minv) {
            minv = v[i];
        }
    }
    return minv;
}

double calc_time(double mis, double *s, double *v, int num_rows) {
    double time = 0;
    for(int i = 0; i < num_rows; i++) {
        time += s[i] / (v[i] + mis);
    }
    return time;
}

int main(){
    int num_rows;
    double time;
    scanf("%d %lf", &num_rows, &time);

    double v[num_rows];
    double s[num_rows];
    for (int i = 0; i < num_rows; i++) {
        scanf("%lf %lf", s + i, v + i);
    }
    double mis = -min(v, num_rows);

    for (int i = 0; i <= PREC; i++) {
        double add = pow(10, +i);
        while (calc_time(mis + add, s, v, num_rows) > time) {
            mis += add;
        }
    }

    printf("%lf\n", mis);
    return 0;
}
d ★★★★★
()
Ответ на: комментарий от dikiy

Чувство прекрасного не выдержало. А сделать нормально лень не дала. Но уже лучше, чем было.

d ★★★★★
()
Ответ на: Тебе осталось изменить один символ от d

Cпасибо, не представляешь насколько выручил. Я нашёл всё таки ошибку. В последний момент благодаря тебе успел сдать. Добрые вы тут. Хорошо, когда есть спросить у кого.

Nullum
() автор топика

сроки горят

В программировании два вершка от горшка, зато словарём матёрого макакича вовсю разбрасываешься. Молодец, чо, только пацаны купола на первоходе не поймут.

рядочков

Тебе на replace.org.ua.

bodqhrohro_promo
()
Ответ на: комментарий от dikiy

Сначала делаем square-free нахождением НОД(f, f'), потом теоремой Штурма находим число действительных корней, затем дихотомией, а лучше Ньютоном находим численные значения.

unanimous ★★★★★
()
Ответ на: комментарий от unanimous

А вообще есть подход с диагонализацией polynomial companion matrix, коэффициентики вычислить только надо.

unanimous ★★★★★
()
Ответ на: комментарий от dikiy

Вы оба в теме, а помог ТС другой, хотя вы, конечно, разобрали задачу по косточкам. Сразу видно, математики :)

Virtuos86 ★★★★★
()
Ответ на: комментарий от Nullum

Добрые вы тут. Хорошо, когда есть спросить у кого.

В следующий раз сроси загодя. Будет время еще и самому понять.

dikiy ★★☆☆☆
()
Ответ на: комментарий от unanimous

а я бы фильтровал измерения скорости по модели

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.