使用用户输入进出Struct的数组

时间:2016-06-24 14:58:26

标签: c arrays loops struct

所以我正在开发一个程序,我是一个网络管理员,编程很糟糕,需要一些结构,数组和指针的帮助。我正在尝试使用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;
    }

Apologies, I forgot to add the pic

如果可能的话,我希望它能像这样远看。

info for emp id 12345:
  100
  90
  80

info for emp id 67890:
  80
  90
  60

1 个答案:

答案 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 usegoto (点击查看原因:))

因为它使您的代码理解起来非常复杂,单击它可以了解更多原因。

您可以通过这种方式实现而不使用 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介于0100之间,则会将其接受并存储在marks s[i]
    • val数组中
    • else - 如果101-1,则会插入marks以标记s[i] for数组的结尾,并突破内部{ {1}}循环和i值递增
    • else - 如果val102,那么类似

        插入
      1. -1以标记marks s[i]数组的末尾。
      2. 另外将0到目前为止的标记分配给1,这有助于退出外部for循环
    • else (适用于所有其他情况),不接受该号码,并递减j值以重新获得该值
  • 最后您打印员工的分数就像打印值2D数组一样,并使用我们为每个marks s[i]数组的末尾分配-1的事实}。