如何用Prolog实现AI课程学生指定成绩区间的统计程序?
Prolog成绩统计程序实现方案
需求说明
读取AI课程学生的成绩,直至输入stop时停止,统计以下两个区间的学生人数:
- 93-100分
- 83分及以上且低于92分
现有代码的不足
你提供的grade/1子句仅能判断单个成绩所属区间并输出固定文本,无法实现循环读取输入和累计统计人数的核心功能,需要补充相关逻辑。
完整实现代码
% 主程序入口:初始化计数器并开始读取成绩 start_grade_count :- write('请输入学生成绩(输入stop结束):'), nl, count_grades(0, 0). % 初始时两个区间的人数均为0 % 处理输入为stop的情况:输出最终统计结果 count_grades(Count93_100, Count83_91) :- read(Input), Input = stop, nl, write('93-100分的学生人数:'), write(Count93_100), nl, write('83分及以上且低于92分的学生人数:'), write(Count83_91), nl. % 处理输入为有效成绩的情况:判断区间并更新计数器 count_grades(Count93_100, Count83_91) :- read(Input), number(Input), Input >= 0, Input =< 100, % 确保成绩是合法的0-100分 update_counts(Input, Count93_100, Count83_91, NewCount93, NewCount83), count_grades(NewCount93, NewCount83). % 处理无效输入(非数字且非stop)的情况:提示错误并继续读取 count_grades(Count93_100, Count83_91) :- read(Input), Input \= stop, \+ number(Input), write('输入无效,请输入数字成绩或stop:'), nl, count_grades(Count93_100, Count83_91). % 根据成绩更新对应区间的计数器 update_counts(Marks, C93, C83, C93+1, C83) :- Marks >= 93, Marks =< 100, !. % 匹配93-100区间,截断避免回溯 update_counts(Marks, C93, C83, C93, C83+1) :- Marks >= 83, Marks < 92, !. % 匹配83≤分数<92区间,截断避免回溯 update_counts(_, C93, C83, C93, C83). % 成绩不属于两个区间,计数器不变
代码说明
start_grade_count/0:程序入口,初始化两个区间的计数器为0,提示用户输入后进入循环。count_grades/2:核心循环子句,分三种情况处理输入:- 输入
stop:输出最终统计结果,结束程序。 - 输入合法数字(0-100):调用
update_counts/5更新对应区间的计数器,继续循环读取下一个成绩。 - 输入无效内容:提示错误后继续循环。
- 输入
update_counts/5:根据成绩判断所属区间,更新计数器;若成绩不在目标区间,计数器保持不变。
使用方法
在Prolog解释器中加载代码后,调用start_grade_count.即可启动程序,按提示输入成绩,输入stop后查看统计结果。
内容的提问来源于stack exchange,提问作者Rola Zeyad
相关产品推荐
相关产品推荐

