基于用户输入输出总/平均时长的C代码故障排查及优化建议
问题分析与修改方案
原代码存在多个关键问题,导致无法输出预期结果:
- 输入提示不匹配预期格式:周数、单周时长的提示语和示例不一致,影响交互体验。
- 平均值计算错误:
suma / size是整数除法,会丢失小数部分,无法得到精确的平均时长。 - 字符判断逻辑完全错误:用单个字符指针配合
strcmp做判断(strcmp用于字符串比较,单个字符直接用==即可),且条件顺序颠倒,导致输入选择后无法进入对应输出分支。 - 输出格式不符合要求:原输出的文本内容、数值格式和示例不匹配,比如总时长需要显示一位小数。
- 冗余内存分配:单个字符无需动态分配内存,直接用栈变量即可。
修改步骤
修正输入提示文本:
- 周数输入提示改为
Number of weeks taking CS50: - 单周时长输入的
get_int参数改为HW Hours:,去除多余换行。
- 周数输入提示改为
修复平均值计算:
- 通过强制类型转换将整数除法改为浮点除法:
float average = (float)suma / size;
- 通过强制类型转换将整数除法改为浮点除法:
重构字符选择逻辑:
- 删除不必要的动态内存分配,改用栈变量
char choice。 - 循环验证输入,确保用户输入的是
T/t或A/a(支持大小写)。 - 根据输入直接判断分支,输出对应结果。
- 删除不必要的动态内存分配,改用栈变量
调整输出格式:
- 总时长输出改为
printf("%.1f hours\n", (float)suma);,保证显示一位小数。 - 平均值输出改为
printf("%.1f hours\n", average);,匹配示例格式。
- 总时长输出改为
修改后的完整代码
#include <stdio.h> #include <stdlib.h> #include <cs50.h> int main(void) { int *hours_worked; int size; int suma = 0; printf("Number of weeks taking CS50: "); scanf("%d", &size); hours_worked = malloc(size * sizeof(int)); if (hours_worked == NULL) { printf("Memory Allocation failed!"); return 1; } for (int i = 0; i < size; i++) { printf("Week %i ", i); hours_worked[i] = get_int("HW Hours: "); } // 计算总时长 for (int i = 0; i < size; i++) { suma += hours_worked[i]; } float average = (float)suma / size; // 获取并验证用户选择 char choice; do { choice = get_char("Enter T for total hours, A for average hours per week: "); } while (choice != 'T' && choice != 't' && choice != 'A' && choice != 'a'); // 根据选择输出结果 if (choice == 'T' || choice == 't') { printf("%.1f hours\n", (float)suma); } else { printf("%.1f hours\n", average); } free(hours_worked); return 0; }
内容的提问来源于stack exchange,提问作者Archonaus
相关产品推荐
相关产品推荐

