2013-11-17 2 views
0

Я делаю программу, которая рассчитает минимальную и максимальную стоимость полета (предполагается, что это простая программа для экзамена) с использованием отдельной функции для расчета стоимости полета. код заключается в следующем:Моя программа возвращает неправильные значения

#include<stdio.h> 
#include<limits.h> 
float cost(float k, int ck, int n) 
{ 
    int x; 
    x = (k*ck)/n; 
    return x; 
} 
main() 
{ 
    int cont=1, n, nv, costmax = 0, costmin = INT_MAX, ck; 
    float k; 
    printf("Introduce the number of flights: \n"); 
    scanf("%d", &nv); 
    for(cont=1; cont <= nv; cont++) 
    { 
     printf("Introduce the number of passangers on flight %d:\n", cont); 
     scanf("%d", &n); 
     printf("Introduce the number of distance on flight %d:\n", cont); 
     scanf("%d", &k); 
     if(k < 500) 
     { 
      ck=50; 
     } 
     if(k > 500) 
     { 
      ck=80; 
     } 
     cost(k,ck,n); 
     if(cost(k, ck, n) < costmin) 
     { 
      costmin = cost(k, ck, n); 
     } 
     if(cost(k, ck, n) > costmax) 
     { 
      costmax = cost(k, ck, n); 
     } 
    } 
    printf("\nMinimum cost = %d \n", costmin); 
    printf("\nMaximum cost = %d \n", costmax); 
} 

, и мы должны использовать текстовый файл для ввода данных

156 397 798 375 489 901 937 519 797 205 883 247 1186 738 860 967 550 887 743 753 906 582 819 665 1112 231 1009 761 921 634 686 591 1027 646 1161 424 668 413 1190 423 840 381 431 559 455 496 1105 489 848 775 456 637 664 760 412 689 639 752 669 312 940 955 706 726 579 556 655 335 902 755 665 431 1093 627 569 310 647 327 943 354 647 733 979 711 504 443 509 266 833 856 667 603 1101 670 688 898 498 669 1149 601 808 934 718 880 1053 977 556 719 1012 286 665 882 456 623 437 632 475 320 494 672 775 548 678 935 984 464 1188 641 749 816 1191 528 1092 203 770 923 1153 220 929 321 789 350 720 745 694 790 687 669 826 372 1029 392 839 932 462 806 882 539 524 797 1084 516 449 218 1048 638 751 889 448 479 465 633 1123 862 904 383 494 472 1117 365 415 889 765 670 941 341 929 876 575 940 565 967 850 473 1119 632 953 904 815 316 409 364 959 287 848 584 574 998 915 826 558 877 858 376 817 591 1068 443 447 428 1081 823 1122 373 852 598 995 735 1028 313 623 820 981 505 753 529 574 433 699 875 1032 833 1068 765 949 691 1145 358 505 251 617 417 945 694 889 323 1028 986 567 269 605 337 1153 926 590 607 803 202 1101 232 771 855 759 776 1011 878 884 393 636 230 1098 788 1140 447 1076 537 1077 734 724 266 635 232 406 752 628 743 848 537 490 598 913 416 855 640 634 209 1172 329 705 249 881 882 817 

Программа не представляет каких-либо ошибок или предупреждений при компиляции, но когда я запустите его, он говорит, что минимальная стоимость и максимальная стоимость 0 ... Я проверяю все снова и снова и не могу найти, что не так. Любые идеи?

BTW, я использую Linux-машину, чтобы запустить программу, не знаю, если это имеет значение ...

+0

'cost()' возвращает float, но x is int. Как упоминают другие ответы, он будет платить, чтобы проверить типы, которые вы проходите. целочисленное деление обрезается до нуля, и это вызовет проблемы – ldrumm

+0

Я рекомендую более описательные параметры и имена переменных ... И затем используйте редактор или IDE, которые будут делать autocompletion/intellisense для вас, чтобы уменьшить соблазн использовать однобуквенную переменную имена. – hyde

ответ

2

Поскольку k является float, это неправильно:

scanf("%d", &k); 

Понадобится:

if (scanf("%f", &k) != 1) 
    break; 

Это использует правильный формат и проверки на наличие ошибок. Основной метод отладки заключается в том, чтобы распечатать значения, которые вы только что прочитали, чтобы убедиться, что программа получила то, что, по вашему мнению, должна была получить.


Есть и другие проблемы. Этот код является избыточным:

cost(k,ck,n); 
    if(cost(k, ck, n) < costmin) 
    { 
     costmin = cost(k, ck, n); 
    } 
    if(cost(k, ck, n) > costmax) 
    { 
     costmax = cost(k, ck, n); 
    } 

Вы вызываете функцию до 5 раз, чтобы получить один и тот же ответ каждый раз. Первый звонок, который вы игнорируете вообще. Вы должны, вероятно, использовать что-то вроде:

float new_cost = cost(k,ck,n); 
    if (new_cost < costmin) 
     costmin = new_cost; 
    if (new_cost > costmax) 
     costmax = cost_max; 

Вы должны также использовать явный тип возвращаемого main():

int main(void) 

Обычно, «пассажиров» пишется с одним «а» и два «Э.

Не совсем ясно, написана ли функция cost() надлежащим образом. Он принимает один float и два значения int и объединяет их и присваивает результат int, прежде чем возвращать его как float. Как написано, это сработает. То, что вы хотите, это другое дело. Поскольку costmin и costmax имеют тип int, существует еще один уровень неопределенности в отношении того, что является лучшим типом для этих значений.

Также, как правило, избегайте замыкания пробелов в вашем выходе. Пробел до \n почти всегда ... ну, если не ошибаюсь, лишний. Тем не менее, я бы почти всегда ошибался. (Но хорошо, что вы заканчиваете сообщения с помощью новой строки - это худшая проблема, чем конечные пробелы, но распространенная в мире C на Windows.)

+0

+1. Я бы дал еще один +1 для прототипа для 'main' – ldrumm

+0

Спасибо вам большое, даже не заметил, что я использовал% d, что заставляет меня чувствовать себя довольно глупо. я изменил его на% f, и он работал, даже не нужно было ломаться. –

1

Во-первых, я не вижу чтения из файла. Все ваши чтения из консоли (stdin). Кроме того, вы вызываете функцию стоимости слишком много раз, а иногда и не принимать никакой пользы от него, как здесь:

} 
    cost(k,ck,n); //<-- 
    if(cost(k, ck, n) < costmin) 

Я предлагаю вам заменить указанный вызов с:

поплавка с = стоимость (к , ck, n);

, а затем использовать c для проверки/принятия, а не для вызова стоимости() снова и снова.

Кроме того, вы присваиваете значение с плавающей точкой к междунар в нескольких местах:

costmax = cost(k, ck, n); 
costmin = cost(k, ck, n); 

В некоторых местах, можно использовать «% D» в зсапе и Printf для чтения/печати поплавка. Вы должны использовать «% f».

+0

Программы get run: './test_program

+0

спасибо, проблема была% d. это помогло много ... –

3

Скомпилировать с флагом -Wall, это поможет вам поймать ошибки самостоятельно.

Использование GCC:

% gcc t.c -Wall 
t.c:9:1: warning: return type defaults to ‘int’ [-Wreturn-type] 
main() 
^ 
t.c: In function ‘main’: 
t.c:20:9: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘float *’ [-Wformat=] 
     scanf("%d", &k); 
     ^
t.c:41:1: warning: control reaches end of non-void function [-Wreturn-type] 
} 
^ 

Использование лязг:

% clang t.c -Wall 
t.c:9:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int] 
main() 
^~~~ 
t.c:20:21: warning: format specifies type 'int *' but the argument has type 'float *' [-Wformat] 
     scanf("%d", &k); 
       ~~ ^~ 
       %f 
2 warnings generated. 

Clang предлагает вам заменить:

scanf("%d", &k); 

в

scanf("%f", &k); 

И даже если это не так важно, вы забыли определить тип возврата основной функции. Оба компилятора заменили его на int, но вы должны также return что-то в конце вашей программы.

Наконец, как предложено в комментариях, вы также можете использовать -Wextra. Я также рекомендую вам, хотя проекты достаточно малы и что вы все еще учитесь, уважать политику «0 предупреждений». Это поможет вам предотвратить ошибки.

+1

Кроме того, '-Wextra' (gcc, то же самое в clang?) тоже не повредит, особенно когда OP учится и должен избегать любых« опасных »вещей, насколько C позволяет ... – hyde

+0

hum ... пока не знаю ни одной из этих команд, но я уже решил это, большое спасибо –

+2

+1: «Если вы дадите мужчине рыбу, вы кормите его на день. Если вы научите человека ловить рыбу , ты накормишь его на всю жизнь ». –

Смежные вопросы