C 语言初学者必知:如何用 switch 语句制作菜单

时间:2024-11-21 06:10:44

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语言的过程中,你是否也经历过那种既喜欢又烦恼制作菜单的体验?不妨点赞、转发这篇文章,并在评论区分享你的亲身经历!