我的程序返回错误的值

时间:2013-11-17 17:55:31

标签: c linux

我正在制作一个程序,用于计算飞行的最低和最高飞行成本(应该是一个简单的考试练习计划),使用单独的功能来计算飞行成本。 代码是这样的:

#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 ...... 我一直在检查一切,但找不到什么问题。 有什么想法吗?

顺便说一下,我正在使用linux机器运行该程序,不知道它是否有所作为......

3 个答案:

答案 0 :(得分: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:

 % 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 :(得分:2)

由于kfloat,这是错误的:

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)

通常情况下,“乘客”拼写为一个“a”和两个“e”。

cost()函数是否写得恰当并不完全清楚。它需要一个float和两个int值并将它们组合在一起,并将结果分配给int,然后再将其作为float返回。如上所述,它将起作用。这是否是你想要的是另一回事。由于costmincostmax的类型为int,因此对于这些值的最佳类型还存在另一层次的不确定性。

此外,通常避免输出中的尾随空白。 \n之前的空格几乎总是......好吧,如果没有错,那就多余了。不过,我几乎总是错的。 (但是你用新行结束消息是好的 - 这比尾随空白更糟糕,但在Windows上的C世界中很普遍。)

答案 2 :(得分:1)

首先,我看不到文件的阅读。你的所有读数都来自控制台(stdin)。 此外,您调用成本函数的次数太多,有时您不会从中获益,例如:

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

我建议你用以下方法替换指定的电话:

float c = cost(k,ck,n);

然后使用c进行检查/分配,而不是再次调用cost()。

另外,您要在多个位置为int赋值:

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

在某些地方,您在scanf和printf中使用“%d”来读取/打印浮动。你应该使用“%f”。