电子排布程序输出异常:多余空能级行问题求助
问题:电子排布程序多余空行输出问题
我用C语言写了一个电子排布程序,但现在遇到了未分配电子的能级被多余打印的问题:
- 输入vNum=32时,预期输出:
实际得到:[O]2 6 10 12[O]2 6 10 12 [P] [Q] - 输入vNum=44时,预期输出:
实际得到:[O]2 6 10 14 [P]2 6 4[O]2 6 10 14 [P]2 6 4 [Q]
我的需求是仅当能级有电子时才显示该行,就像输入vNum=0时完全没有输出一样。我知道问题出在外层的for (int i = 3; i > 0; i--)循环,但不知道怎么修改才能避免这些多余的空行。程序原代码如下:
#include <stdio.h> #include <unistd.h> #include <stdlib.h> int main() { while (1) { int vNum; printf("vNum: "); scanf("%d", &vNum); if (vNum > 0) { for (int i = 3; i > 0; i--) { printf("[%c]", 82 - i); int limit = 2; int E = (limit <= vNum ? limit : vNum); for (int j = 0; j < i + 1 && E > 0; j++) { printf("%d ", E); usleep(50000); vNum -= E; E = (limit += 4) <= vNum ? limit : vNum; } printf("\n"); } } printf("\n"); } return 0; }
解决方案
核心问题是原代码的外层循环不管当前能级有没有电子,都会先打印能级标识[%c]和换行,导致空行出现。解决思路是先判断当前能级是否能分配到电子,只有确定有电子时才打印对应内容。
修改后的代码:
#include <stdio.h> #include <unistd.h> #include <stdlib.h> int main() { while (1) { int vNum; printf("vNum: "); scanf("%d", &vNum); if (vNum > 0) { for (int i = 3; i > 0; i--) { int limit = 2; int E = (limit <= vNum ? limit : vNum); // 无电子直接跳过当前能级 if (E <= 0) { continue; } // 有电子才打印能级标识 printf("[%c]", 82 - i); for (int j = 0; j < i + 1 && E > 0; j++) { printf(" %d", E); usleep(50000); vNum -= E; E = (limit += 4) <= vNum ? limit : vNum; } // 打印完电子数再换行 printf("\n"); } } printf("\n"); } return 0; }
修改说明:
- 在外层循环开始时,先计算当前能级的初始电子数
E,如果E<=0,说明该能级没有电子可分配,直接用continue跳过当前循环迭代,不执行后续打印操作。 - 只有当确定有电子时,才打印能级标识
[%c],接着打印对应的电子数,最后换行。 - 移除了多余的空行判断,因为只有有电子的能级才会走到换行步骤,不会出现空行。
这样修改后,未分配电子的能级就不会被打印,完全符合需求。
内容的提问来源于stack exchange,提问作者Exponecial
相关产品推荐
相关产品推荐

