在C

时间:2017-02-17 16:54:58

标签: c double structure

我正在编写一个允许用户按ID,年龄和工资添加员工的代码,但是,对于薪水,我不确定使用什么值来扫描和打印78950.86之类的数字。我为SALARY使用了double,因为有更多的值要保留,我已经尝试使用printf和scanf来处理这个变量,但是我得到了分段错误或随机数。这是我的代码:

#include <stdio.h>

#define SIZE 2
// Define Number of Employees "SIZE" to be 2

 struct Employee{
    int ID;
    int AGE;
    double SALARY;
};
//Declare Struct Employee


 /* main program */
int main(void) {

    int option = 0;
    int i;
    struct Employee emp[SIZE];

    printf("---=== EMPLOYEE DATA ===---\n\n");

    // Declare a struct Employee array "emp" with SIZE elements
    // and initialize all elements to zero

    do {
            // Print the option list
            printf("1. Display Employee Information\n");
            printf("2. Add Employee\n");
            printf("0. Exit\n\n");
            printf("Please select from the above options: ");

            // Capture input to option variable
            scanf("%d",&option);
            printf("\n");

            switch (option) {
                    case 0: // Exit the program

                            break;
                    case 1: // Display Employee Data
                            // @IN-LAB

                          printf("EMP ID EMP AGE EMP SALARY\n");
                          printf("====== ======= ==========\n");

                          //Use "%6d%9d%11.21f" formatting in a
                          //printf statement to display
                          //employee id, age and salary of
                          //all employees using a loop construct

               for(i=0; i<SIZE; i++) {
                                  printf("%d    %d     %11.2lf", emp[i].ID, emp[i].AGE, emp[i].SALARY);
                          }

                          //The loop construct will be run for SIZE times
                          //and will only display Employee data
                          //where the EmployeeID is > 0

                          break;
                  case 2: //Adding Employee
                                    // @IN-LAB

                          printf("Adding Employee\n");
                          printf("===============\n");

                          for(i=0;i<SIZE;i++) {

                          printf("\nEnter employee ID: ");
                          scanf ("%d", &emp[i].ID);

                          printf("\nEnter employee Age: ");
                          scanf ("%d", &emp[i].AGE);

                          printf("\nEnter employee Salary: ");
                          scanf ("%11lf", &emp[i].SALARY);
                                  }


                          //Check for limits on the array and add employee
                          //data accordingly

                          break;

                  default:

                          printf("ERROR: Incorrect Option: Try Again\n\n");

            }

    } while (option!= 0);

    return 0;

}

2 个答案:

答案 0 :(得分:1)

在处理%ld.%02d时,您的格式字符串正在使用doubledouble表示将其视为由句点分隔的2个整数(应生成警告)。修复字符串以正确指示一个{{1}},或者如果(如@MalcomMcLean所示)您想要分别保留美元和美分,则为每个字符串/变量使用不同的字段/变量。

答案 1 :(得分:0)

&#34;我不确定使用什么值来扫描和打印78950.86这样的数字。&#34;

一般来说,在编码领域(或准确的C数据类型),工资并不是真正的大数字#34;对于您引用的示例,即使是单个精度浮点数据类型也足够了。 (以单精度搜索&#34;最大有限正值&#34;在pagehttps://en.m.wikipedia.org/wiki/Single-precision_floating-point_format)

因此,您使用的双数据类型对于上述目的来说已经足够了。正如斯科特正确指出的那样,分段错误是由于你的格式字符串建议2个数据参数,当只有1个双数据类型变量时。

我的意见不是将工资数据存储为单独的美元和美分。从雇主的角度来看,这些美分将加起来美元,最终将与美元数据合并,使您的求和算法变得复杂。

总之,您可以将double数据类型用于薪水变量。打印工资时,您可以使用&#34;%。2f&#34;在格式字符串中。当使用scanf以正常的固定点表示法获得薪水时,你可以使用&#34;%lf&#34;格式为字符串。