C:无法获得我需要的正确输出

时间:2017-03-24 19:21:47

标签: c

编辑:新问题,现在我得到的输出完全不同于我需要的输出。以下是我如何编写,分配说明在底部,请大家谢谢!

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


int main() {

   FILE * ifp = NULL;
   char filename[20];
        printf("What is the name of the input file?\n");
        scanf(" %s", &filename);

   while (ifp == NULL){

        /*PROMPT USER FOR INPUT FILENAME*/
        printf("What is the name of the input file?\n");
        scanf(" %s", &filename);

        /*OPEN INPUT FILE*/
        ifp = fopen(filename, "r");
        }

   int totalSize = 0;
          fscanf(ifp, "%d",  &totalSize);

   int id[totalSize];
   char category[totalSize];
   int handCombatPt[totalSize];
   int distCombatPt[totalSize];
   int observationPt[totalSize];
   int concealPt[totalSize];
   int agilityPt[totalSize];
   float ranking[totalSize];

   int row=0;
   for (row=0; row<totalSize; row++) {
       fscanf(ifp, "%d %c %d %d %d %d %d\n", id+row, category+row, handCombatPt+row, distCombatPt+row, observationPt+row, concealPt+row, agilityPt+row);
   }

   for (row=0; row<totalSize; row++) {
       if (category[row] == 'A') {
           ranking[row] = (handCombatPt[row] + distCombatPt[row]*2 + observationPt[row]*2 + concealPt[row] + agilityPt[row]*5)/10.0;
       }
       if (category[row] == 'C') {
           ranking[row] = (handCombatPt[row]*5 + distCombatPt[row]*5 + observationPt[row] + concealPt[row] + agilityPt[row]*2)/10.0;
       }
       if (category[row] == 'S') {
           ranking[row] = (handCombatPt[row] + distCombatPt[row] + observationPt[row]*5 + concealPt[row]*5 + agilityPt[row]*2)/10.0;
       }
   }

   int firstA, firstS, secondS, firstC, secondC;

   for (row=0; row<totalSize; row++) {
       if (category[row]=='A' && ranking[firstA] < ranking[row]) {
           firstA = row;

       }

       if (category[row]=='S' && ranking[firstS] < ranking[row]) {
           secondS = firstS;
           firstS = row;

       }
       else if (category[row]=='S' && ranking[secondS] < ranking[row]) {
           secondS = row;

       }

       if (category[row]=='C' && ranking[firstC] < ranking[row]) {
           secondC = firstC;
           firstC = row;

       }
       else if (category[row]=='C' && ranking[secondC] < ranking[row]) {
           secondC = row;

       }
   }

   printf("A : %d %f \n", id[firstA], ranking[firstA]);
   printf("C : %d %f \n", id[firstC], ranking[firstC]);
   printf("C : %d %f \n", id[secondC], ranking[secondC]);
   printf("S : %d %f \n", id[firstS], ranking[firstS]);
   printf("S : %d %f \n", id[secondS], ranking[secondS]);

return 0;
}

这里是input.txt文件:

10
14 A 447 252 68 34 978
2 C 230 299 597 180 9
27 A 318 220 97 28 1317
32 C 563 450 547 112 28
8 C 669 260 200 36 171
11 S 179 45 1342 732 174
19 S 74 249 861 1165  6 
21 A 757 240 97 119 2032
15 S 275 177 588 577 52
6 C 886 401 327 109 48

程序需要输出以下内容:

A: 21 1171.00
C: 6 696.70
C: 32 578.00
S: 11 1094.20
S: 19 1046.50

非常感谢任何帮助!

编辑:以下是帮助任何人了解我尝试做什么的作业

问题:导师 是时候让你的朋友选择他们的忍者导师吧!忍者学生可以从高年级的学生中选择几位导师来学习特殊技能。技能分为隐身(S),战斗(C)和敏捷(A)。您的朋友将获得一份年龄较大的学生档案,其中包含不同技能的名称和排名。然后他们可以选择5位导师来学习。为了提供帮助,您的课程应该阅读所有学生的信息,并打印出两位最佳训练导师,两位最佳隐形导师和最佳敏捷导师。如果您的朋友是一名勤奋的学生,他们将能够选择这些最佳选择!如果没有,他们将需要在列表中选择其他导师.Combat技能分为手到手和距离。隐身技能分为观察和结合。敏捷是一个单一的范畴。

输入文件格式 输入文件的第一行将包含一个整数n(5≤n≤100),表示潜在导师的数量,文件中列出了这些信息。以下n行将包含所有导师的所有信息,其中一个导师的信息在一行上。每行将具有以下格式:ID类别HandCombatPts DistanceCombatPts ObservationPts ConcealPts AgilityPtsID将是一个表示潜在导师的正整数。 类别将是一个单一的字符,或者&#39; C&#39;&#39; S&#39;或者&#39; A&#39;分别用于战斗,隐身或敏捷.HandCombatPts将是一个整数,表示去年由他们的手部战斗教练给予学生的点数。 DistanceCombatPts将是一个整数,表示他们的远程战斗教练去年给予学生的分数.ObservationPts将是一个整数,表示去年学生获得的分数

他们的观察和间谍技巧讲师。

ConcealPts将是一个整数,表示去年学生的

分数

隐瞒和伪装指导员。 AgilityPts将是一个整数,表示去年由学生和杂技教师给予学生的分数。

如何计算排名 对于每个潜在的导师,他们的排名将是按其类别加权的总和。如果他们是潜在的战斗导师,他们的排名应该是:( HandCombatPts * 5 + DistanceCombatPts * 5 + ObservationPts + ConcealPts + AgilityPts * 2)/ 10如果他们是潜在的隐形导师他们的排名应该是:(HandCombatPts + DistanceCombatPts + ObservationPts * 5 + ConcealPts * 5 + AgilityPts * 2)/ 10如果他们是潜在的敏捷导师,他们的排名应该是:(HandCombatPts + DistanceCombatPts * 2 + ObservationPts * 2 + ConcealPts + AgilityPts * 5)/ 10

程序规范 您必须使用数组来解决问题。 您的程序应首先提示用户输入文件的名称。然后,你的程序应该处理输入文件并为你的朋友写下五个最好的导师。每行应分别列出导师的类别,ID和排名,用空格分隔。将排名重绕到两位小数。导师必须按类别列出如下:敏捷,其次是两个战斗,然后是两个隐身。战斗和隐形导师都必须按排名的降序排列。

2 个答案:

答案 0 :(得分:0)

首先:

'程序编译但是“program.exe已停止工作”

我很遗憾地告诉你这是通常的行为。编写代码并使其编译是微不足道的,与使其完成您想要的工作所需的努力和技能相比。测试和调试是99%的软件开发技能。这就是调试器存在的原因。

下一步:

始终检查所有系统调用的结果。在你的情况下,特别是fopen()。

...............

[sigh]'在我将未初始化的变量设置为0之后,但现在我得到一个完全不同的输出然后我需要的那个'

见上文,特别是提示:'这就是调试器存在的原因'。解决问题要比通过文本交换使用SO贡献者远程调试更容易。你有实际的代码,(即不是你原来提出的那样),环境,测试文件等等。无论你在做什么和得到什么,我们都有你滴灌我们的东西:(

在编写更多代码行之前,您必须学习现在进行调试。如果您无法调试,则无法开发程序,不应尝试:(

答案 1 :(得分:0)

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


int main() {

   FILE * ifp = NULL;
   char filename[20];

    while (ifp == NULL){


        printf("What is the name of the input file?\n");
        scanf(" %s", &filename);

        ifp = fopen(filename, "r");
        }


   int totalSize = 0;
          fscanf(ifp, "%d",  &totalSize);

   int id[totalSize];
   char category[totalSize];
   int handCombatPt[totalSize];
   int distCombatPt[totalSize];
   int observationPt[totalSize];
   int concealPt[totalSize];
   int agilityPt[totalSize];
   float ranking[totalSize];

   int row=0;
   for (row=0; row<totalSize; row++) {
       fscanf(ifp, "%d %c %d %d %d %d %d\n", id+row, category+row, handCombatPt+row, distCombatPt+row, observationPt+row, concealPt+row, agilityPt+row);
   }

   for (row=0; row<totalSize; row++) {
       if (category[row] == 'A') {
           ranking[row] = (handCombatPt[row] + distCombatPt[row]*2 + observationPt[row]*2 + concealPt[row] + agilityPt[row]*5)/10.0;
       }
       if (category[row] == 'C') {
           ranking[row] = (handCombatPt[row]*5 + distCombatPt[row]*5 + observationPt[row] + concealPt[row] + agilityPt[row]*2)/10.0;
       }
       if (category[row] == 'S') {
           ranking[row] = (handCombatPt[row] + distCombatPt[row] + observationPt[row]*5 + concealPt[row]*5 + agilityPt[row]*2)/10.0;
       }
   }

   int firstA=0, firstS=0, secondS=0, firstC=0, secondC=0;

   for (row=0; row<totalSize; row++) {
       if (category[row]=='A' && ranking[firstA] < ranking[row]) {
           firstA = row;

       }

       if (category[row]=='S' && ranking[firstS] < ranking[row]) {
           secondS = firstS;
           firstS = row;

       }
       else if (category[row]=='S' && ranking[secondS] < ranking[row]) {
           secondS = row;

       }

       if (category[row]=='C' && ranking[firstC] < ranking[row]) {
           secondC = firstC;
           firstC = row;

       }
       else if (category[row]=='C' && ranking[secondC] < ranking[row]) {
           secondC = row;

       }
   }

   printf("A : %d %f \n", id[firstA], ranking[firstA]);
   printf("C : %d %f \n", id[firstC], ranking[firstC]);
   printf("C : %d %f \n", id[secondC], ranking[secondC]);
   printf("S : %d %f \n", id[firstS], ranking[firstS]);
   printf("S : %d %f \n", id[secondS], ranking[secondS]);

return 0;
}

这很有效,我将所有内容初始化为0并为文件名做了一个while循环,现在它输出corerctly,虽然小数点后的数字比我需要的多,但我想我可以用变量打印中的.lf修复它部分。如果有人可以检查,并告诉我他们是否看到任何问题,请。谢谢大家的帮助!