C语言课程设计不会做?其实各种信息管理系统都一样!

C语言课程设计示例:歌曲信息管理系统

前言:大家在学习C语言时,最终都会面临这个“大项目”:课程设计,而知识的整合与庞大的代码量总会让许多初学者手足无措。还记得我当时的课程设计,真的是挑灯夜战好几天,最终才算是整合成功。希望这个示例可以给还没有头绪的同学一点启发。我会在代码的注释中帮助大家理解。

注:代码运行之前要在 E 盘新建一个 zxx 的文件夹,在文件夹中新建两个文本文件 zxx 和 zxxluru
zxx 为存储全部歌曲信息的文件,可以先为空
zxxluru 内为被录入的信息,即可以将 zxxluru 里的信息都存储到 zxx 中
在这里插入图片描述
zxxluru 文件内格式为:歌曲名 演唱者 作词者 作曲者 发行时间 中间用空格隔开
在这里插入图片描述
下面是完整代码:

#include<stdio.h>    //头文件就不多说了
#include<stdlib.h>
#include<string.h>

#define N 10000      //最大可以存储的歌曲数量

struct song			 //定义一个歌曲信息的结构体
{
  char name[20];     //歌曲名
  char singer[20];   //演唱者
  char authors[20];  //作词者
  char compose[20];  //作曲者
  char time[20];     //发行日期
}so[N];

//声明函数
void menu();         //菜单函数
void display();      //查看函数
void create();       //录入函数
void search();       //查找函数
void modify();       //修改函数
void delete();       //删除函数
void input1(int i);  //键盘录入
void input2();       //文件录入
void save(int n);    //储存函数
int back();          //返回函数

//主函数
int main()
{
    system("color 9f"); //主菜单的颜色美化
    menu();             //进入菜单函数
    return 0;
}

//菜单函数
void menu()
{
    system("cls");      //每次进入菜单都清屏
    printf("|_**__**__**__**__**__**__**__**__**__**_|\n");
    printf("**                                      **\n"); //这里装饰框在编译器中会对齐
    printf("||          406舞厅歌曲管理系统         ||\n");
    printf("**           1、 显示歌曲信息           **\n");
    printf("||           2、 录入歌曲信息           ||\n");
    printf("**           3、 查找某首歌曲           **\n");
    printf("||           4、 修改歌曲信息           ||\n");
    printf("**           5、 删除某首歌曲           **\n");
    printf("||           0、 退出系统               ||\n");
    printf("**                                 -ZXX **\n");
    printf("|_**__**__**__**__**__**__**__**__**__**_|\n");
    printf("请选择相应的功能:\n");
    int n;
    scanf("%d", &n);
    switch(n)           //根据功能选择跳转到相应函数
    {
        case 0:exit(0);
        case 1:display();break;
        case 2:create();break;
        case 3:search();break;
        case 4:modify();break;
        case 5:delete();break;
        default:        //输入上面以外的数字会响铃并再次显示菜单
            printf("\a");
            menu();
            break;
    }
}

//信息显示函数
void display()
{
    FILE *fp = fopen("E:\\zxx\\zxx.txt","r"); //打开存储信息的文件
    int i, a, n, j, k;
    if(fp == NULL)      //判断文件是否存在
    {
        printf("\n无法打开此文件!\n\a");
        exit(0);
    }
    system("cls");
    printf("\n\n请选择排序方式:\n");
    printf("1、按歌名排序\n");
    printf("2、按演唱者排序\n");
    scanf("%d", &a);
    for(i = 0; !feof(fp); i++) //将文件中的内容按格式存储到程序中的结构体中
    {
        fscanf(fp,"%s %s %s %s %s",so[i].name, so[i].singer, so[i].authors, so[i].compose, so[i].time);
        if(feof(fp)) break;
    }
    fclose(fp);     //关闭文件
    n = i - 1;      //歌曲数量的记录
    struct song tmp;
    switch(a)       //根据用户选择对歌曲进行排序显示
    {
        case 1:
            for(j = 0; j < n; j++)
                for(k = 0; k < n; k++)
                    if(strcmp(so[k].name, so[k+1].name) > 0) //根据歌曲名字排序
                    {
                        tmp = so[k];
                        so[k] = so[k+1];
                        so[k+1] = tmp;
                    }
            printf("\n\n歌名    歌手    作词    作曲    发行日期\n");
            printf("****************************************\n");
            for(i = 0; i <= n; i++)
                printf("%s  %s  %s  %s  %s\n", so[i].name, so[i].singer, so[i].authors, so[i].compose, so[i].time);
        break;
        
        case 2:
            for(j = 0; j < n; j++)
                for(k = 0; k < n; k++)
                    if(strcmp(so[k].singer, so[k+1].singer) > 0) //根据歌手名字排序
                    {
                        tmp = so[k];
                        so[k] = so[k+1];
                        so[k+1] = tmp;
                    }
            printf("\n\n歌名    歌手    作词    作曲    发行日期\n");
            printf("****************************************\n");
            for(i = 0; i <= n; i++)
                printf("%s  %s  %s  %s  %s\n", so[i].name, so[i].singer, so[i].authors, so[i].compose, so[i].time);
        break;
        
        default:
            printf("\n输入错误!\a");
        break;
    }
    back(); //返回函数
}

//录入函数
void create()
{
    system("cls");
    int n, a, i;
    printf("\n    请选择录入方式:  \n");
    printf("**********************\n");
    printf(" 1、 键盘录入歌曲信息 \n");
    printf(" 2、 文件录入歌曲信息 \n");
    scanf("%d", &a);
    switch(a)  //根据选择跳转到不同的录入函数
    {
        case 1:
            printf("\n你想录入几首歌?\n");
            scanf("%d", &n);
            printf("\n开始录入歌曲信息!\n");
            for(i = 0; i < n; i++)
            {
                printf("\n请输入第%d首歌曲信息:\n\n",i+1);
                input1(i); //键盘录入函数
            }
            if(i != 0)
            {
                save(n); //保存函数
                printf("\n存储成功!\a\n");
            }
        break;
        
        case 2:
            input2();  //文件录入函数
            printf("\n存储成功!\a\n");
        break;
        
        default:
            printf("\n输入错误!\a");
            back();
        break;
    }
    back();
}

//查找函数
void search()
{
    system("cls");
    FILE *fp;
    int n = 100, k, ch, i, j = 0;
    char c[20];
    if((fp = fopen("E:\\zxx\\zxx.txt","r")) == NULL)
    {
        printf("\n\n无法打开此文件!\n\n\a");
        back();
    }
    for(i = 0; !feof(fp); i++)
    {
        fscanf(fp,"%s%s%s%s%s", so[i].name, so[i].singer, so[i].authors, so[i].compose, so[i].time);
        if(feof(fp)) break;
    }
    fclose(fp);
    n = i; //记录歌曲数量
    printf("\n请选择查询的方式:\n");
    printf("*****************\n");
    printf("1、按歌名查询\n");
    printf("2、按演唱者查询\n");
    scanf("%d", &ch);
    switch(ch)
    {
        case 1:
            printf("\n请输入歌名:\n");
            scanf("%s", c);
            for(i = 0; i < n; i++)   //strcmp函数匹配字符串查找歌曲
                if(strcmp(c, so[i].name) == 0)
                	break;
        break;
        
        case 2:
            printf("\n请输入演唱者:\n");
            scanf("%s", c);
            for(i = 0; i < n; i++)
                if(strcmp(c, so[i].singer) == 0)
                	break;
        break;
        
        default:
            j = 1;
            printf("\n输入错误!\n\a");
            back();
        break;
    }
    k = i;
    if(k == n && j == 0)
    {
        printf("\n\n没有这首歌曲的信息!\n\a");
        back();
    }
    else
    {
        printf("\n\n歌名    歌手    作词    作曲    发行日期\n");
        printf("****************************************\n");
        printf("%s  %s  %s  %s  %s\n",so[k].name, so[k].singer, so[k].authors, so[k].compose, so[k].time);
        back();
    }
}

//修改函数
void modify()
{
    char name[20];
    char singer[20];
    char authors[20];
    char compose[20];
    char time[20];
    FILE *fp = fopen("E:\\zxx\\zxx.txt","r");
    int n, i, c, j = 0;
    system("cls");  //修改信息时首先展示全部的歌曲信息
    printf("\n\n所有歌曲记录如下:\n");
    printf("\n\n歌名    歌手    作词    作曲    发行日期\n");
    printf("****************************************\n");
    for(i = 0; !feof(fp); i++)
    {
        fscanf(fp,"%s %s %s %s %s", so[i].name, so[i].singer, so[i].authors, so[i].compose, so[i].time);
        if(feof(fp)) break;
        printf("%s  %s  %s  %s  %s\n", so[i].name, so[i].singer, so[i].authors, so[i].compose, so[i].time);
    }
    n = i;
    fclose(fp);
    printf("\n请输入要修改信息的歌名:\n");
    scanf("%s", name);
    system("cls");
    for(i = 0; i < n; i++)
        if(strcmp(so[i].name, name) == 0)
        {
            j = 1;
            printf("\n原始信息为:\n");
            printf("\n歌名    歌手    作词    作曲    发行日期\n");
            printf("****************************************\n");
            printf("%s  %s  %s  %s  %s\n", so[i].name, so[i].singer, so[i].authors, so[i].compose, so[i].time);
            printf("\n需要进行修改的选项:\n\n1.歌曲名 2.演唱者 3.作词 4.作曲 5.发行日期\n");
            printf("\n请输入你需要修改的那一项的序号:\n");
            scanf("%d", &c);
            if(c > 5 || c < 1)
            {
               printf("\n选择错误,请重新选择!\n\a");
               back();
            }
            break;
        }
    fp = fopen("E:\\zxx\\zxx.txt","w");
    if(j == 0)
    {
         printf("\n对不起,没有此歌!\n\a");
         for(i = 0; i < n; i++)   //没有这首歌时,全部信息直接写入文件
        {
            fprintf(fp, "%s %s %s %s %s", so[i].name, so[i].singer, so[i].authors, so[i].compose, so[i].time);
            fprintf(fp, "\n");
        }
    }
    else //当有此歌时修改相应的数据
    {
        j = i;
        for(i = 0; i < n; i++)
            if(i != j) //未修改的数据写入文件
                fprintf(fp,"%s %s %s %s %s \n", so[i].name, so[i].singer, so[i].authors, so[i].compose, so[i].time);
            else       //新修改的数据写入文件
                switch(c)
                {
                    case 1:
                        printf("\n歌曲名改为:\n");
                        scanf("%s", name);
                        fprintf(fp,"%s %s %s %s %s \n", name, so[i].singer, so[i].authors, so[i].compose, so[i].time);
                    break;
                    
                    case 2:
                        printf("演唱者改为:");
                        scanf("%s", singer);
                        fprintf(fp,"%s %s %s %s %s \n", name, so[i].singer, so[i].authors, so[i].compose, so[i].time);
                    break;
                    
                    case 3:
                        printf("作词改为:");
                        scanf("%s",authors);
                        fprintf(fp,"%s %s %s %s %s \n", name, so[i].singer, so[i].authors, so[i].compose, so[i].time);
                    break;
                    
                    case 4:
                        printf("作曲改为:");
                        scanf("%s",compose);
                        fprintf(fp,"%s %s %s %s %s \n", name, so[i].singer, so[i].authors, so[i].compose, so[i].time);
                    break;
                    
                    case 5:
                        printf("发行时间改为:");
                        scanf("%s",time);
                        fprintf(fp,"%s %s %s %s %s \n", name, so[i].singer, so[i].authors, so[i].compose, so[i].time);
                    break;
                    
                    default:
                    break;
                }
    printf("\n修改成功!\n\a");
    }
    fclose(fp);
    back();
}

//删除函数
void delete()
{
    char s[20];
    int i, n, j, k = 0;
    FILE *fp = fopen("E:\\zxx\\zxx.txt","r");
    if(fp == NULL)
    {
        printf("\n无法打开此文件!\n\a");
        exit(0);
    }
    system("cls");
    printf("\n\n所有歌曲记录如下:\n\n");
    printf("\n\n歌曲名 演唱者 作词 作曲 发行日期\n");
    printf("****************************************\n");
    for(i = 0; !feof(fp); i++)
    {
        fscanf(fp, "%s %s %s %s %s", so[i].name, so[i].singer, so[i].authors, so[i].compose, so[i].time);
        if(feof(fp)) break;
        printf("%s %s %s %s %s\n", so[i].name, so[i].singer, so[i].authors, so[i].compose, so[i].time);
    }
    fclose(fp);
    n = i;
    printf("\n请输入你要删除的歌名:\n");
    scanf("%s", s);
    for(i = 0; i < n; i++)
        if(strcmp(s, so[i].name) == 0)   //通过strcmp函数匹配到歌曲
        {
            k = 1;						 //k=1表示查找到了这首歌																
            break;
        }
    if(k == 0)       //k=0即表示没有这首歌
        printf("\n输入错误!\n\a");
    else
    {
        j = i;
        fp = fopen("E:\\zxx\\zxx.txt","w");
        for(i = 0; i < n; i++)
        if(i != j)          //将除了这首歌之外的数据存储到文件中
        {
            fprintf(fp, "%s %s %s %s %s", so[i].name, so[i].singer, so[i].authors, so[i].compose, so[i].time);
            fprintf(fp, "\n");
        }
        printf("\n删除成功!\n\a");
    }
    fclose(fp);
    back();
}

//键盘输入函数
void input1(int i)
{
    printf("请输入音乐的歌名、演唱者、作词、作曲、发行时间:\n");
    scanf("%s %s %s %s %s", so[i].name, so[i].singer, so[i].authors, so[i].compose, so[i].time);
}

//文件输入函数
void input2()
{
    FILE *fq = fopen("E:\\zxx\\zxxluru.txt","r");//此文件里为即将录入的信息
    FILE *fp = fopen("E:\\zxx\\zxx.txt","a"); //此文件为存储数据的文件
    int i;
    if(fq == NULL)
    {
        printf("\n无法打开此文件!\n\a");
        exit(0);
    }
    for(i = 0; !feof(fq); i++)
    {
        fscanf(fq, "%s %s %s %s %s", so[i].name, so[i].singer, so[i].authors, so[i].compose, so[i].time);
        fprintf(fp, "%s %s %s %s %s", so[i].name, so[i].singer, so[i].authors, so[i].compose, so[i].time);
        fprintf(fp, "\n");
        if(feof(fp)) break;
    }
    fclose(fp);
    fclose(fq);
}

//保存函数
void save(int n)
{
    FILE *fp = fopen("E:\\zxx\\zxx.txt","a");
    int i;
    for(i = 0; i < n; i++)
    {
        fprintf(fp, "%s %s %s %s %s", so[i].name, so[i].singer, so[i].authors, so[i].compose, so[i].time);
        fprintf(fp, "\n");
    }
    fclose(fp);
}

//返回函数
int back()
{
    int n;
    printf("\n\n是否返回主菜单?\n");
    printf("***************\n");
    printf("1、返回主菜单\n");
    printf("2、退出程序\n");
    scanf("%d", &n);
    switch(n)
    {
        case 1: menu(); break;
        case 2: return 0; break;
        default:
            printf("\n\a");
            system("cls");
            back();
            break;
    }
    return 0;
}

如果有不懂的地方大家可以在下方留言
觉得哪里有不妥或者可以改善的也欢迎大家一起来讨论
请大家多多点赞和关注~ 最后希望大家的课程设计都可以顺利完成!

发布了203 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43479432/article/details/104953297
今日推荐