C 语言初学者必知:如何用 switch 语句制作菜单
初学C语言的你,对于制作菜单是不是觉得挺有难度?其实,这可是个既关键又充满趣味的内容。
成绩分析程序的需求
为了进行某门课程的成绩统计分析,我们进行了平均成绩的计算、最高成绩的查找、不及格人数的统计以及80分以上人数的统计。这一系列功能非常实用,就像在学校里分析各学科成绩那样。在具体的教学环境中,无论是老师还是学生,都能借助这些功能迅速获取成绩分析的结果。这也是学习C语言编程时,学生需要掌握的具体应用之一。这些需求构成了开发该程序的核心依据。对需求的详细准确分析,能够确保后续程序逻辑的正确布局。
函数的定义与编号
要完成这些功能,必须要有四个关键函数。每个函数都有一个专属的编号,比如1号函数就是用来计算平均成绩的。这就像给每位负责不同任务的员工分配一个独特的工号。比如,要定义计算平均成绩的函数,可能需要从“grade.txt”文件中读取成绩数据,先求和再计算平均值。而要定义找出最高成绩的函数,就需要比较所有成绩来找到最大值。这些编号使得后续可以根据用户的输入轻松调用相应的函数。这种方式既方便又高效,是一种典型的模块化编程手段。
语句判断与调用操作
用户输入编号后,系统需准确判断并执行相应的函数。比如,当用户输入数字2,系统便会激活查找最高分的函数。这就像火车站的售票系统,输入车次编号后,会立即显示车次详情和座位信息。在编程领域,这种判断与调用直接关联着程序能否按预定目标完成任务。编写代码时,必须严谨遵循逻辑执行流程,否则一旦这部分出现错误,整个程序的功能可能紊乱,与预期目标产生很大差异。
循环的加入
循环设计使得用户能够反复进行选择。此设计考虑到了用户可能希望重复执行操作的现实需求。在真实用户测试环境中,若用户希望多次查看不同操作的结果分析,循环功能便提供了这样的便利。若缺乏循环,程序在完成一次操作后便会终止,显得不够灵活。循环的存在使得程序更具人性化,能够持续为用户提供服务,直到用户选择停止。
#include "stdio.h"
#include "stdlib.h"
#define NUMOFSTU 38
//print函数用于在显示菜单时,打印星号和空格。
void print(char c, int n)
{
int i;
for(i=1;i<=n;i++)
putchar(c);
}
//ave()函数用于求平均成绩
void ave()
{
int i;
float score,average,sum=0;
FILE*fp;
fp= fopen("grade.txt","r");
for(i=1;i<=NUMOFSTU;i++)
{
fscanf(fp,"%f",&score);
sum+= score;
}
average= sum/NUMOFSTU;
printf("\nTheaverage score is %.2f\n",average);
fclose(fp);
}
//max()函数用于找最高成绩
void max()
{
int i;
float score,max = -1;
FILE*fp;
fp= fopen("grade.txt","r");
for(i=1;i<=NUMOFSTU;i++)
{
fscanf(fp,"%f",&score);
if(score>max)
max= score;
}
printf("\nThemaximum score is %.2f\n",max);
fclose(fp);
}
//numOfFailing()函数用于统计不及格人数
void numOfFailing()
{
int i,count=0;
float score;
FILE*fp;
fp= fopen("grade.txt","r");
for(i=1;i<=NUMOFSTU;i++)
{
fscanf(fp,"%f",&score);
if(score<=60)
count++;
}
printf("\nThenumber of failing grade is %d\n",count);
fclose(fp);
}
//numOf80()函数用于统计80分以上人数
void numOf80()
{
int i,count=0;
float score;
FILE*fp;
fp= fopen("grade.txt","r");
for(i=1;i<=NUMOFSTU;i++)
{
fscanf(fp,"%f",&score);
if(score>=80)
count++;
}
printf("\nThenumber of grades greater than 80 is %d\n",count);
fclose(fp);
}
//显示菜单
void showMenu()
{
putchar('\n');
print(' ',10);
print('*',60);
putchar('\n');
print(' ',20);
printf("1--Calculate the average score\n");
print(' ',20);
printf("2--Find the maximum score\n");
print(' ',20);
printf("3--Count the number of failing grades\n");
print(' ',20);
printf("4--Count the number of grades greater than 80\n");
print(' ',20);
printf("5--Exit\n");
print(' ',10);
print('*',60);
putchar('\n');
}
int main()
{
int choice;
char ifcontinue;
showMenu();
//等待用户选择菜单项
while(1)
{
printf("\nPleaseselect menu item (key in 1-5): ");
scanf("%d",&choice);
//根据用户不同的选择,调用相应的函数
switch(choice)
{
case1: ave(); break;
case2: max(); break;
case3: numOfFailing(); break;
case4: numOf80(); break;
case5: exit(0);break;
default:printf("\nInvalid input!\n");
}
printf("\nIfyou want to continue, press y, otherwise, press any other key!");
getchar();
ifcontinue= getchar();
if(ifcontinue!='y')
break;
}
return 0;
}
成绩数据的存储与读取
成绩均被保存在名为“grade.txt”的文件中,每行记录一个成绩。这个文件是数据的基础,程序正是从这里获取成绩进行后续处理。在成绩的录入阶段,必须保证信息的准确性,每一行数据都对应一个独立的成绩记录。正确读取文件中的数据至关重要,一旦出现读取错误,整个分析结果都将受到影响。这就像烹饪时食材准备不当,做出来的菜肴自然无法达到预期效果。
程序的运行结果
程序运行结果直接呈现了程序的功能。如图1所示,首先是菜单的出现,随后根据用户的输入,程序会给出相应的结果,并询问用户是否继续。这样的设计让用户能够清楚地了解程序的操作步骤和结果。对于C语言的初学者而言,观察这样的完整且清晰的运行结果,不仅有助于他们理解程序的运行逻辑,还能帮助他们检查自己程序中可能出现的错误。
在学习C语言的过程中,你是否也经历过那种既喜欢又烦恼制作菜单的体验?不妨点赞、转发这篇文章,并在评论区分享你的亲身经历!