C语言if语句逻辑错误:输入2时输出结果不符合预期
C语言程序逻辑错误排查:输入2时Tarif输出不符合预期
当输入数值2时,程序输出的tarif为2.060,但预期结果应为1.780。问题源于两处错误:变量类型与输入格式不匹配,以及if分支的逻辑条件错误。
问题代码片段
printf("Golongan Rumah Tangga A1\n"); printf("Masukan pemakaian \n"); scanf("%f", &pemakaian); if ( pemakaian <= 10 ) { tarif = 1.780; printf("Tarif : %.3f\n", tarif); } else if ( pemakaian > 11 || pemakaian <= 20 ) { tarif = 2.060; printf("Tarif : %.3f\n", tarif); }
错误原因分析
变量类型与scanf格式符不匹配
你定义的pemakaian是int类型,但使用%f格式符读取输入。float与int的二进制存储格式完全不同,输入的2会被解析成一个无效的大整数,导致pemakaian <=10的条件不成立,进而进入错误分支。else if逻辑条件错误
第二个分支的pemakaian >11 || pemakaian <=20是逻辑错误:||表示“或”,这个条件对几乎所有整数都成立(除了远大于20的数)。如果要表示“11到20之间(含20)”,应该用&&(逻辑与),或者利用第一个分支已经排除<=10的情况,直接简化为pemakaian <=20。
修正后的代码片段
// 修正变量类型为float,匹配scanf的%f;若使用int则将scanf改为%d float pemakaian; printf("Golongan Rumah Tangga A1\n"); printf("Masukan pemakaian \n"); scanf("%f", &pemakaian); if ( pemakaian <= 10 ) { tarif = 1.780; printf("Tarif : %.3f\n", tarif); } else if ( pemakaian <= 20 ) { tarif = 2.060; printf("Tarif : %.3f\n", tarif); } else if ( pemakaian > 20 ) { tarif = 5.880; printf("Tarif : %.3f\n", tarif); }
完整修正代码
#include <stdio.h> int main() { int klaster, golongan, listrik; float pemakaian; // 修正变量类型为float,匹配%f格式符 double berm, tarif; printf("Program air\n"); printf("Pilih klaster\n "); printf("1. Rumah Tangga\n"); printf("2. Usaha\n"); scanf("%d", &klaster); if (klaster == 1) { printf("pilih golongan\n"); printf("1. Subsidi\n"); printf("2. tanpa subsidi\n"); scanf("%d", &golongan); if( golongan == 1) { printf("Masukan daya listik\n"); scanf("%d", &listrik); printf("Masukan lebar berm\n"); scanf("%lf", &berm); // double类型需用%lf格式符读取 if (listrik == 450 && berm <=3.99 ) { printf("Golongan Rumah Tangga A1\n"); printf("Masukan pemakaian \n"); scanf("%f", &pemakaian); if ( pemakaian <=10 && pemakaian > 0 ) { tarif = 1.780; printf("Tarif : %.3f\n", tarif); } else if ( pemakaian <= 20 ) { tarif = 2.060; printf("Tarif : %.3f\n", tarif); } else { tarif = 5.880; printf("Tarif : %.3f\n", tarif); } } else if (listrik == 900 && berm <=3.99 ) { printf("Golongan Rumah Tangga A1\n"); printf("Masukan pemakaian \n"); scanf("%f", &pemakaian); if ( pemakaian <= 10 ) { tarif = 1.780; printf("Tarif : %.3f\n", tarif); } else if ( pemakaian <= 20 ) { tarif = 2.060; printf("Tarif : %.3f\n", tarif); } else if ( pemakaian > 20 ) { tarif = 5.880; printf("Tarif : %.3f\n", tarif); } } }else { printf("Input yang benar woiii"); } }else{ printf("Input yang benar woiii"); } }
内容的提问来源于stack exchange,提问作者Esa
相关产品推荐
相关产品推荐

