c - 输出有时会失败
问题描述
我正在尝试使用 C 程序查找月总工资。我的输出有时会失败。将代码和输出放在下面:
#include <stdio.h>
#include <conio.h>
void main() {
int id;
float hours;
float mgsalary;
clrscr();
printf(
" Press ID : \n Press 1 if Staff: \n Press 2 if Supervisor: \n Press 3 if Manager: \n Press 4 if President: \n");
scanf("%d", &id);
printf(" Enter hours per week \n");
scanf("%f", &hours);
if (id == 1) {
printf(" Position ID: 1 \n");
mgsalary = (hours * 62.5) * 4.28;
printf(" Positon/Rank: Staff \n");
printf(" Rate per hour: 62.5 php \n");
printf(" Monthly Gross Salary : %f php \n ", mgsalary);
} else if (id == 2) {
mgsalary = (hours * 125) * 4.28;
printf(" Position ID: 2 \n");
printf(" Position/Rank: Supervisor \n");
printf(" Rate per hour: 125 php \n");
printf(" Monthly Gross Salary : %f php \n", mgsalary);
} else if (id == 3) {
mgsalary = (hours * 187.5) * 4.28;
printf(" Position ID: 3 \n");
printf(" Position/Rank: Manager \n");
printf(" Rate per hour: 187.5 php \n");
printf(" Monthly Gross Salary : %f php \n", mgsalary);
} else if (id == 4) {
mgsalary = (hours * 375) * 4.28;
printf(" Position ID: 4 \n");
printf(" Position/Rank: President \n");
printf(" Rate per hour: 375 php \n");
printf(" Monthly Gross Salary: %f php \n", mgsalary);
} else
printf(" Invalid Input");
getch();
}
// 运行程序(输出)
Press 1 if Staff:
Press 2 if Supervisor:
Press 3 if Manager:
Press 4 if President:
// 我按 1 选择了员工
Enter numbers of hours work:
// 我输入了 33 作为工作小时数
Position ID: 1
Positon/Rank: Staff
Rate per hour: 62.5 php
Monthly Gross Salary : 8872.5000 php (sometimes it came out 10000000.000 php or null)
解决方案
以下建议的代码:
- 消除了来自非便携式电话
conio.h
- 正确检查
scanf()
错误 - 格式化代码以提高可读性
- 使用一个
switch()
语句而不是一系列if()
语句 - 正确声明具有有意义名称的“神奇”数字
- 利用
enum
语句为用户选择输入提供有意义的名称 - 正确地将所有文字值声明为
float
而不是默认值double
- 干净地编译
main()
对函数使用有效的签名- 编辑命名等根据评论更正
现在,建议的代码:
#include <stdio.h> // perror(), getchar(), fprintf(), printf(), scanf()
//#include <conio.h>
#include <stdlib.h> // exit(), EXIT_FAILURE
#define WEEKS_PER_MONTH 4.28f
#define STAFF_WEEKLY_RATE 62.5f
#define SUPERVISOR_WEEKLY_RATE 125.0f
#define MANAGER_WEEKLY_RATE 187.5f
#define PRESIDENT_WEEKLY_RATE 375.0f
enum
{
dummy,
STAFF,
SUPERVISOR,
MANAGER,
PRESIDENT
};
int main( void )
{
int id;
float hours;
float mgsalary;
int ch;
/* clrscr(); Suggest using the ANSI excape sequences */
printf( "%s\n",
" Press ID : \n"
" Press 1 if Staff: \n"
" Press 2 if Supervisor: \n"
" Press 3 if Manager: \n"
" Press 4 if President: \n");
id = getchar();
printf(" Enter hours per week \n");
if( scanf("%f", &hours) != 1 )
{
fprintf( stderr, "scanf for hours failed\n" );
exit( EXIT_FAILURE );
}
switch( id )
{
case STAFF:
printf(" Position ID: 1 \n");
mgsalary = (hours * STAFF_WEEKLY_RATE) * WEEKS_PER_MONTH;
printf(" Positon/Rank: Staff \n");
printf(" Rate per hour: 62.5 php \n");
printf(" Monthly Gross Salary : %f php \n ", mgsalary);
break;
case SUPERVISOR:
mgsalary = (hours * SUPERVISOR_WEEKLY_RATE) * WEEKS_PER_MONTH;
printf(" Position ID: 2 \n");
printf(" Position/Rank: Supervisor \n");
printf(" Rate per hour: 125 php \n");
printf(" Monthly Gross Salary : %f php \n", mgsalary);
break;
case MANAGER:
mgsalary = (hours * MANAGER_WEEKLY_RATE) * WEEKS_PER_MONTH;
printf(" Position ID: 3 \n");
printf(" Position/Rank: Manager \n");
printf(" Rate per hour: 187.5 php \n");
printf(" Monthly Gross Salary : %f php \n", mgsalary);
break;
case PRESIDENT:
mgsalary = (hours * PRESIDENT_WEEKLY_RATE) * WEEKS_PER_MONTH;
printf(" Position ID: 4 \n");
printf(" Position/Rank: President \n");
printf(" Rate per hour: 375 php \n");
printf(" Monthly Gross Salary: %f php \n", mgsalary);
break;
default:
printf(" Invalid Menu Selection\n");
break;
} /* end switch */
while( (ch = getchar()) != EOF && ch != '\n' );
getchar();
}
推荐阅读
- git - Magit 不考虑 ~/.gitignore
- docker-compose - 让 docker-compose up 只运行某些容器
- python - 使用 `print()` 写入以二进制模式打开的文件
- python - 读取文件并转换值“'list' 对象没有属性 'find' on”
- assembly - 关于简单浮点加载指令的困惑
- react-native - -bash: react-native: 在 MAC 上找不到命令
- c# - 什么是 WPF 的 DataFormats 类中 Xaml 数据格式字段的 UWP 等效项
- amazon-web-services - 在 EMR 上使用笔记本时如何在 PySpark 中包含包?
- swift - 如何在 SpriteKit 中更改变量之前创建延迟
- laravel - Symfony\Component\HttpFoundation\ParameterBag 类的对象无法转换为字符串 -laravel 5.8