所以我正在开发一个程序,我是一个网络管理员,编程很糟糕,需要一些结构,数组和指针的帮助。我正在尝试使用struct编写程序,我知道我需要数组,但我不确定如何将它们与struct结合起来。所有信息都需要是用户输入,并且需要按命令中断以跳转到结束或循环回到某个点以输入更多信息。我需要用户输入员工ID#,然后输入多个评论分数,如100,90,80,然后打破该序列,然后返回并输入另一名员工#并继续,或跳到最后并打印输入所有信息。
员工ID号和分数条目在输入时似乎工作正常,但是当我打印出来时它看起来不正确,所以我显然在如何存储和打印数据方面做错了。代码和结果如下。
#include <stdio.h>
struct help{
int empID;
int marks[100];
};
int main(){
struct help s[100];
int i, input, empNUM;
NEWENTRY: printf("Enter employee ID#: ");
scanf("%d", &empNUM);
for(i=0;i<10;++i){
s[i].empID = empNUM;
printf("\nFor employee ID# %d\n",s[i].empID);
while (i <= 100) {
printf("Enter score:");
if (scanf("%d", &input) == 1) {
if (input >= 0 && input <= 100) {
s[i].marks[100] = input;
i++;
}
else if (input == 101) {
printf("\n\nExiting entry.\n");
i = i - 1;
goto NEWENTRY;
}
else if (input == 102) {
printf("\n\nExiting entry.\n");
i = i - 1;
goto EXIT;
}
}
}
}
EXIT:
for(i=0;i<10;++i) {
printf("\nInformation for employee ID number %d:\n",s[i].empID);
printf("Marks: %.1f",s[i].marks);
}
return 0;
}
如果可能的话,我希望它能像这样远看。
info for emp id 12345:
100
90
80
info for emp id 67890:
80
90
60
答案 0 :(得分:2)
您的代码中存在许多问题:
问题1:
在您的代码中
您对外部
i
循环和内部for
循环使用相同的参数while
:
for(i=0;i<10;++i) //you are using i here
{
s[i].empID = empNUM;
printf("\nFor employee ID# %d\n",s[i].empID);
while (i <= 100) //and even here
{
printf("Enter score:");
问题2:
除此之外每次goto
NEWENTRY:
然后再次进入for
循环,i
值再次设置为0
,
因此,无论您输入多少条目,您只会填充struct array的第一个元素
s
,即s[0]
< / p>
问题3:
在这里打印数组时使用错误的参数:
printf("Marks: %.1f",s[i].marks);
此处
s[i].marks
属于int*
类型,您正在使用它来打印double
数据
解决方案:
我能给出的简单解决方案是:
never use
goto
(点击查看原因:))
因为它使您的代码理解起来非常复杂,单击它可以了解更多原因。
您可以通过这种方式实现而不使用 goto
的目标:
#include <stdio.h>
struct help
{
int empID;
int marks[100];
};
int main()
{
struct help s[100];
int i, j; //useful for indices of array
int val; //useful for taking in user input
int flag=0; //useful for exiting the program
for(i=0;i<10;)
{
printf("Enter employee ID#: ");
scanf("%d",&s[i].empID);
printf("\nFor employee ID# %d\n",s[i].empID);
for(j=0;j<100;j++)
{
printf("Enter score : ");
scanf("%d",&val); //taking in score input
if(val>=0 && val<=100)
{
s[i].marks[j]=val;
}
else if(val==101)
{
s[i].marks[j]=-1; //to mark the end of entries I used -1
break;
}
else if(val==102)
{
s[i].marks[j]=-1;
flag=1; //to know whether user wants to exit
break;
}
else
{
printf("\ninvalid entry\n");
j--;
}
}
printf("\n\n----------\n\n");
i++;
if(flag==1) //to exit
break;
}
int num=i;
for(i=0; i<num ; i++)
{
printf("\nInformation for employee ID number %d:\n",s[i].empID);
for(j=0; s[i].marks[j]!=-1; j++)
printf("Marks: %d\n",s[i].marks[j]);
}
printf("\nenter any key to exit!\n");
scanf("%d",&i);
return 0;
}
这个逻辑很容易理解:
for
循环就像用于填充2D数组的任何其他嵌套for
循环一样在内部for
循环中,val
接受用户的输入并通过其他if梯形图
val
介于0
和100
之间,则会将其接受并存储在marks
s[i]
val
数组中
101
为-1
,则会插入marks
以标记s[i]
for
数组的结尾,并突破内部{ {1}}循环和i
值递增 else - 如果val
是102
,那么类似
-1
以标记marks
s[i]
数组的末尾。 0
到目前为止的标记分配给1
,这有助于退出外部for
循环j
值以重新获得该值最后您打印员工的分数就像打印值2D数组一样,并使用我们为每个marks
s[i]
数组的末尾分配-1
的事实}。