编辑:新问题,现在我得到的输出完全不同于我需要的输出。以下是我如何编写,分配说明在底部,请大家谢谢!
#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和排名,用空格分隔。将排名重绕到两位小数。导师必须按类别列出如下:敏捷,其次是两个战斗,然后是两个隐身。战斗和隐形导师都必须按排名的降序排列。
答案 0 :(得分:0)
首先:
'程序编译但是“program.exe已停止工作”
我很遗憾地告诉你这是通常的行为。编写代码并使其编译是微不足道的,与使其完成您想要的工作所需的努力和技能相比。测试和调试是99%的软件开发技能。这就是调试器存在的原因。
下一步:
始终检查所有系统调用的结果。在你的情况下,特别是fopen()。
...............
[sigh]'在我将未初始化的变量设置为0之后,但现在我得到一个完全不同的输出然后我需要的那个'
见上文,特别是提示:'这就是调试器存在的原因'。解决问题要比通过文本交换使用SO贡献者远程调试更容易。你有实际的代码,(即不是你原来提出的那样),环境,测试文件等等。无论你在做什么和得到什么,我们都有你滴灌我们的东西:( / p>
在编写更多代码行之前,您必须学习现在进行调试。如果您无法调试,则无法开发程序,不应尝试:(
答案 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修复它部分。如果有人可以检查,并告诉我他们是否看到任何问题,请。谢谢大家的帮助!