该程序用于显示获胜团队,该团队在3x4阵列的3个团队中获得最高分。
input
或teamscore
功能有问题。我无法找到错误,input
函数中的输入无法在teamscore
功能中存储和计算。
void input(int a[NROW][NCOL])
{
int x,y;
double team;
for(x=0;x<NROW;x++)
{
printf("\nEnter your team: ");
scanf("%i",&team);
for(y=0;y<NCOL;y++)
{
printf("\nEnter the score: ");
scanf("%lf",&a[x][y]);
}
}
}
int teamscore(int a[NROW][NCOL])
{
int x,y,highest,team;
double sum;
for(x=0;x<NROW;x++)
{
for(y=0;y<NCOL;y++)
{
sum = sum + a[x][y];
}
}
for(x=0;x<NROW;x++)
for(y=0;y<NCOL;y++)
if (a[x][y]>highest)
{
highest=a[x][y];
}
return highest;
}
我的所有输出都是0。
这是我的全部代码。
#include <stdio.h>
#define NROW 3
#define NCOL 4
void initialize(int a[NROW][NCOL])
{
int x,y;
for(x=0;x<NROW;x++)
{
for(y=0;y<NCOL;y++)
{
a[x][y]=0;
}
}
}
/* Display array in a matrix form*/
void disp_arr(int a[NROW][NCOL])
{
int x,y;
for(x=0;x<NROW;x++)
{
for(y=0;y<NCOL;y++)
{
printf("%i ",a[x][y]);
}
printf("\n");
}
}
/* Input the invidual score for 3 team*/
void input(int a[NROW][NCOL])
{
int x,y;
double team;
for(x=0;x<NROW;x++)
{
printf("\nEnter your team: ");
scanf("%i",&team);
for(y=0;y<NCOL;y++)
{
printf("\nEnter the score: ");
scanf("%lf",&a[x][y]);
}
}
}
/* Calculate the total of score for each team and return the index for the
row with the highest team score */
int teamscore(int a[NROW][NCOL])
{
int x,y,highest,team;
double sum;
for(x=0;x<NROW;x++)
{
for(y=0;y<NCOL;y++)
{
sum = sum + a[x][y];
}
}
for(x=0;x<NROW;x++)
for(y=0;y<NCOL;y++)
if (a[x][y]>highest)
{
highest=a[x][y];
}
return highest;
}
int main()
{
int ar[NROW][NCOL];
int team;
initialize(ar);
disp_arr(ar);
input(ar);
disp_arr(ar);
team=teamscore(ar);
printf("\nThe winniing team is Team %i",&team);
return 0;
}
我会感激一些帮助。
谢谢!
答案 0 :(得分:2)
您的代码对于team
的意图是不明确的。您提示用户输入,然后尝试将team
存储为double
?除非您希望自己的团队编号是,例如123.456
,只需让您的团队成为int
,例如团队1
,团队10
等。
您遇到的下一个问题是为团队编号提供输入,但不允许该条目可用于input
以外的任何其他功能。如果您没有传递另一个参数来捕获team
的用户输入,那么您的团队只是a
的索引,并且没有必要提示输入。要在main
中重新提供用户输入,只需传递另一个参数(或只添加+1到NCOL
并使用col 0
作为团队编号)。以下是捕获团队编号的用户输入的方法(例如团队125, 190, ...
),并在调用者中将其提供回来:
int main (void) {
int hi_index = 0,
teams[NROW] = {0}, /* note array of NROW for teams */
ar[NROW][NCOL] = {{0}};
...
input (ar, teams);
然后您可以通过将input
数组作为参数传递来使teams
捕获该信息,例如
/* Input the individual score for 3 team*/
void input (int a[NROW][NCOL], int teams[NROW])
您必须 验证 所有用户输入。使用scanf
表示验证返回时,实际上会发生转化次数(在格式字符串中指定)。您还必须检查用户是否在windoze上生成了手册EOF
( Ctrl + d 或 Ctrl + z )。如果用户取消输入,您的代码应该优雅地处理该条件。如果用户刚刚提供无效输入并且由于匹配或输入失败导致转换失败,则需要确定是否通知用户并提示用户&#34; 再试一次&#34;或者您是否将其视为取消。
要以这种方式接近用户输入,一种方法就是循环,直到您收到有效输入或用户取消,例如,在input
功能中,您可以执行以下操作:
for (;;) { /* loop until valid input or user canceled */
int rtn;
printf ("\nEnter your team: ");
rtn = scanf ("%d", &teams[x]);
if (rtn == 1)
break;
else if (rtn == EOF) {
fprintf (stderr, "user canceled input.\n");
exit (EXIT_FAILURE);
}
fprintf (stderr, "error: invalid input.\n");
/* (you should empty stdin here) */
empty_stdin();
}
注意以清空stdin
,您只需阅读getchar()
,直至遇到'\n'
或EOF
,例如
/* function to empty stdin */
void empty_stdin()
{
int c = getchar();
while (c != '\n' && c != EOF)
c = getchar();
}
评论中已涵盖您的printf
和scanf
格式说明符不匹配。
将所有这些部分组合在一起,并假设您实际上想要整数作为团队编号而不是像123.456
那样奇怪的团队编号,您可以执行类似以下操作:
#include <stdio.h>
#include <stdlib.h> /* for exit, EXIT_FAILURE */
#define NROW 3
#define NCOL 4
/* Display array in a matrix form*/
void disp_arr (int a[NROW][NCOL], int teams[NROW])
{
int x, y;
putchar ('\n');
for ( x = 0; x < NROW; x++)
{
printf ("team %3d : ", teams[x]);
for (y = 0; y < NCOL; y++)
printf (" %4d", a[x][y]);
putchar ('\n');
}
}
/* function to empty stdin */
void empty_stdin()
{
int c = getchar();
while (c != '\n' && c != EOF)
c = getchar();
}
/* Input the individual score for 3 team*/
void input (int a[NROW][NCOL], int teams[NROW])
{
int x, y;
for (x = 0; x < NROW; x++)
{
for (;;) { /* loop until valid input or user canceled */
int rtn;
printf ("\nEnter your team: ");
rtn = scanf ("%d", &teams[x]);
if (rtn == 1)
break;
else if (rtn == EOF) {
fprintf (stderr, "user canceled input.\n");
exit (EXIT_FAILURE);
}
fprintf (stderr, "error: invalid input.\n");
empty_stdin();
}
for (y = 0; y < NCOL; y++)
{
for (;;) { /* same loop until valid or canceled */
int rtn;
printf ("Enter team[%d] score[%d]: ", teams[x], y + 1);
rtn = scanf ("%d", &a[x][y]);
if (rtn == 1)
break;
else if (rtn == EOF) {
fprintf (stderr, "user canceled input.\n");
exit (EXIT_FAILURE);
}
fprintf (stderr, "error: invalid input.\n");
empty_stdin();
}
}
}
}
/* Calculate the total of score for each team.
* return the index for the row with the highest team score
*/
int teamscore (int a[NROW][NCOL])
{
int x, y,
highest = 0,
hi_index = 0,
sum[NROW] = {0};
for (x = 0; x < NROW; x++) {
for (y = 0; y < NCOL; y++)
sum[x] += a[x][y];
if (sum[x] > highest) {
highest = sum[x];
hi_index = x;
}
}
return hi_index;
}
int main (void) {
int hi_index = 0,
teams[NROW] = {0},
ar[NROW][NCOL] = {{0}};
// initialize (ar); /* ar is not a VLA, initialize at declaration */
disp_arr (ar, teams);
input (ar, teams);
disp_arr (ar, teams);
hi_index = teamscore (ar);
printf ("\nThe winning team is Team %d\n", teams[hi_index]);
return 0;
}
示例使用/输出
$ ./bin/team
team 0 : 0 0 0 0
team 0 : 0 0 0 0
team 0 : 0 0 0 0
Enter your team: 123
Enter team[123] score[1]: 10
Enter team[123] score[2]: 12
Enter team[123] score[3]: 14
Enter team[123] score[4]: 16
Enter your team: 138
Enter team[138] score[1]: 12
Enter team[138] score[2]: 14
Enter team[138] score[3]: 16
Enter team[138] score[4]: 18
Enter your team: 187
Enter team[187] score[1]: 11
Enter team[187] score[2]: 13
Enter team[187] score[3]: 15
Enter team[187] score[4]: 17
team 123 : 10 12 14 16
team 138 : 12 14 16 18
team 187 : 11 13 15 17
The winning team is Team 138
无效&amp;的示例取消输入
$ ./bin/team
team 0 : 0 0 0 0
team 0 : 0 0 0 0
team 0 : 0 0 0 0
Enter your team: The Mighty Ducks
error: invalid input.
Enter your team: user canceled input.
仔细看看,如果我对您的团队类型的假设有任何错误,请告诉我。如果您有其他问题,请告诉我。
答案 1 :(得分:0)
将%d用于整数而不是%lf。 %lf表示双倍 void输入(int [NROW] [NCOL]) { int x,y; 双重团队;
for(x=0;x<NROW;x++)
{
printf("\nEnter your team: ");
scanf("%i",&team);
for(y=0;y<NCOL;y++)
{
printf("\nEnter the score: ");
scanf("%d",&a[x][y]);// use %d for integer instead of %lf. %lf for double
}
}
}
团队分数功能有很多错误。示例代码:
int teamscore(int a[NROW][NCOL])
{
int x,y,highest,team;
double sum;
for(x=0;x<NROW;x++)
{
sum =0;
for(y=0;y<NCOL;y++)
{
sum = sum + a[x][y];
}
a[x][0] = sum;
}
highest = a[0][0];
team = 0;
for(x=0;x<NROW;x++)
if (a[x][0]>highest)
{
highest = a[x][0];
team=x;
}
return team;// return row number
}
在打印时仅在main中使用团队变量而不是&team
。 &amp; team =团队变量的地址。
printf("\nThe winniing team is Team %d",team);