C语言初学者如何制作一个完整的C语言程序——歌曲排行榜

整个程序采用的是一个链式存储结构,文件选用了文本文件

这是程序的一个结构体结构及全局变量的定义

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Song_Ranking
{
	int ID;  //歌曲编号
	char Sname[20]; //歌曲名称 
	char singer[20];  //歌手名字
	long ticket;	//票数 
	struct Song_Ranking *next;
};

int option;		//选项
struct Song_Ranking *head,*tail,*move;	//head是头指针,tail是尾指针,move是代替head移动的指针 
int n=0;	//记录歌曲的数量 

各项功能函数的声明

void function();	//各项功能函数 
void choose();	//是否查看管理系统 
void menu();	//菜单
void information();		//所有歌曲信息 
void help();	//使用帮助 
void input();   //输入歌曲信息 
void write();	//歌曲信息写入文件 
void look();	//浏览歌曲信息
void vote();	//对歌曲进行投票 
void rank();	//top10排行榜 
void quit();	//退出 

下面是主函数,比较简短,整个程序是利用各个函数之前互相嵌套调用

int main()
{
	head=(struct Song_Ranking *)malloc(sizeof(struct Song_Ranking));
	if(!head)
	{
		printf("错误,结束!\n");
		exit(0);
	}
	head->next=NULL;
	menu();
	return 0;
}

choose函数:是否查看管理系统整个页面

void choose()
{
	printf("\n是否查看系统功能菜单:\n");
	printf("\n1、是,0、否\n");
	printf("\n输入:"); 
	int t;	//用来是否查看管理系统 
	scanf("%d",&t); 
	if(t==1) menu();
 } 

function函数是功能函数

void function()
{
	printf("请输入你要做的选项:");
	scanf("%d",&option);
	switch(option)
	{
		case 1:menu();break; 
		case 2:information();break; 
		case 3:help();break;
		case 4:input();break;
		case 5:look();break;
		case 6:vote();break;
		case 7:rank();break; 
		case 8:quit();
		default:printf("\n已退出系统!!!\n");
	}
 } 

menu函数是让使用者能够去选择要做的功能

void menu()
{
	printf("\n\n");
	printf("*----------------------------------------------------\n");	
	printf("*               歌曲排行榜管理系统                  *\n");
	printf("*****************************************************\n");
	printf("********************系统功能菜单*********************\n");
	printf("----------------------     --------------------------\n");
	printf("*****************************************************\n");
	printf("**    1、菜单           *     2、所有参赛歌曲信息  **\n");
	printf("*****************************************************\n");
	printf("**    3、使用说明       *     4、输入歌曲信息      **\n");
	printf("*****************************************************\n");
	printf("**    5、浏览歌曲信息   *     6、对歌曲进行投票    **\n");
	printf("*****************************************************\n");
	printf("**    7、TOP10排行榜    *     8、退出              **\n"); 
	printf("*****************************************************\n"); 	
	printf("----------------------     --------------------------\n");
	printf("\n\n");
	system("pause");
	function();
 }

information是歌曲信息函数,可以根据自己的喜好自行添加,ps:本程序没有加入一键读入的功能,需要读者自行完成

void information()
{
	printf("所有歌曲信息如下:\n");
	printf("\n歌曲编号      歌曲名称        歌手          票数\n");
	printf("\n  101         《童年》       罗大佑           0  \n");
	printf("\n  102        《起风了》    买辣椒也用券       0  \n");
	printf("\n  103         《水手》       郑智化           0  \n");
	printf("\n  104       《纸短情长》     烟把儿           0  \n");
	printf("\n  105        《生僻字》      陈珂宇           0  \n"); 
	printf("\n  106       《海阔天空》     黄家驹           0  \n");
	printf("\n  107     《当爱已成往事》   李宗盛           0  \n");
	printf("\n  108      《贝加尔湖畔》     李健            0  \n");
	printf("\n  109      《父亲的散文诗》   许飞            0  \n");
	printf("\n  110         《成都》        赵雷            0  \n");
	printf("\n  111         《吻别》       张学友           0  \n");
	printf("\n  112     《失恋阵线联盟》    草蜢            0  \n");
	printf("\n"); 
	system("pause");
	choose();
	function();
 } 

help函数是一个辅助函数,能够帮助使用者更快的去操作程序

void help()
{
	printf("\n这是一个歌曲排行榜的菜单化信息管理程序,为了您能更快的去了解使用它,请您仔细阅读以下注意事项:\n");
	printf("\n\t\t注意事项:\n");
	printf("\n\t1、当您第一次使用该系统时,建议您先输出歌曲的信息并存储!\n");
	printf("\n\t2、如果想要使用TOP10这个功能,必须先进行歌曲投票后方可使用。\n");
	printf("\n\t3、在您使用完某一功能时,建议你保存到文件中!\n");
	printf("\n\t4、使用遇到任何问题请与我们联系\n");
	printf("\n\t5、最后感谢您的使用!\n"); 
	printf("\n");
	
	system("pause");
	choose();
	function();
}

input函数:是数据插入函数,采用的是尾插法

void input()
{
	tail=head;		
	move=head;
	struct Song_Ranking *p;		//p是新创建的区域,存放输入的数据,然后与head连接起来 
	p=(struct Song_Ranking*)malloc(sizeof(struct Song_Ranking));
	if(!p)
	{
		printf("错误,结束!\n");
		exit(0);
	}	//判断是否成功开辟 
	printf("\n当所有的数据输入都为0时,结束输入!\n");
	printf("请输入歌曲的信息:\n");
	printf("歌曲编号:");
	scanf("%d",&p->ID);
	printf("歌曲名称:");
	scanf("%s",p->Sname);
	printf("歌手:");
	scanf("%s",p->singer);
	printf("票数(所有的人的票数在输入时都为零):");
	scanf("%ld",&p->ticket);
	while(p->ID!=0)		//输入的歌曲编号为零时结束输入 
	{
		n++;
		p->next=tail->next;
		tail->next=p;
		tail=p;
		p=(struct Song_Ranking*)malloc(sizeof(struct Song_Ranking));
		if(!p)
		{
			printf("错误,结束!\n");
			exit(0);
		}	
		printf("请输入歌曲的信息:\n");
		printf("歌曲编号:");
		scanf("%d",&p->ID);
		printf("歌曲名称:");
		scanf("%s",p->Sname);
		printf("歌手:");
		scanf("%s",p->singer);
		printf("票数(所有的人的票数在输入时都为零):");
		scanf("%ld",&p->ticket);
	 } 
	 int check;	//检查信息是否输入有误
	 printf("\n请选择是否检查输入的歌曲信息(输入1是,0为否):"); 
	 scanf("%d",&check);
	 if(check)
	 {
	 	while(move->next!=NULL)
		 {
		 	printf("  %d   \t%s   \t%s   \t%ld\n",move->next->ID,move->next->Sname,move->next->singer,move->next->ticket);
			if(move->next->next==NULL) printf("\n歌曲信息输出完毕\n");
			move=move->next;
		  } 
	  } 
	write();
	system("pause");
	choose();
	function();
 } 

write是将数据写入文件

void write()
 {
 	FILE *fp;
 	struct Song_Ranking *p; 
 	p=head;
 	if((fp=fopen("Song-Ranking.dat","w"))==NULL)
	{
		printf("\n无法打开此文件\n");
		exit(0);
	 }
	while(p->next!=NULL)
	{
		p=p->next;
		fprintf(fp,"%d %s %s %ld\n",p->ID,p->Sname,p->singer,p->ticket);
	}
	fclose(fp);
  } 

look函数是查看数据信息

void look()
 {
 	move=head;
 	while(move->next==NULL)
	{
		printf("\n没有歌曲的信息,请添加后再来浏览!\n");break;
	}
 	while(move->next!=NULL)
	{
		printf("%d\t %s\t %s\t %ld\n",move->next->ID,move->next->Sname,move->next->singer,move->next->ticket);
		if(move->next->next==NULL) printf("\n歌曲信息输出完毕\n");
		move=move->next;
	}
 	printf("\n");
 	system("pause");
 	choose();
	function();
 }

vote函数执行的功能是给歌曲投票,有多种投票方式

void vote()
 {
 	move=head;
	while(move->next==NULL)
	{
		printf("\n无任何歌曲的信息,请在更新后重新使用此功能!\n");break;
	 } 
	int ball; //ball是每次投票的歌曲编号 
	printf("\n当输入-1时结束投票\n"); 
 	printf("请输入要投的歌曲的编号:");
 	scanf("%d",&ball);		//当输入的编号为-1时,投票结束 
 	while(ball!=-1)
 	{
 		while(move->next!=NULL)
 		{
 			if(ball==move->next->ID) 
 			{
 				move->next->ticket=move->next->ticket+1;
 				break;
			 }
 			move=move->next;
		 }
		 move=head;		//进行完一次投票后,move回到head指针的位置,进行下一次投票,知道编号为-1结束 
		 while(move->next==NULL)
		 {
		 	printf("\n无任何歌曲的信息,无法进行投票。\n");break;
		 	} 
		printf("请输入要投的歌曲的编号:");
 	    scanf("%d",&ball);		//当输入的编号为-1时,投票结束
	}
	write();
	system("pause");
	choose();
	function();
 }

rank函数是给歌曲信息进行一个排名,只会输出前10名。由于改变指针太过复杂,初学者难以理解,便采用了简单的冒泡算法进行一个排序

void rank()
 {
 	move=head;
 	tail=head->next;
 	while(move->next==NULL)
	 {
	 	printf("\n无任何歌曲信息,请在更新歌曲信息后再做此处理。\n");break;
	 }
	 int i,j,k;
	 int temp_ID;		//歌手编号交换中间变量 
	 char temp_Sname[20];		//歌曲名称交换中间变量 
	 char temp_singer[20];		//歌手姓名交换中间变量 
	 long temp_ticket;		//票数交换中间变量 
	 
	 
	 //用冒泡交换各个区域内的所有值 
	   for(i=0;i<n;i++)
	 	{
	 		for(j=1;j<n-i;j++)
	 		{
	 			if(move->next->ticket < move->next->next->ticket)
	 			{
	 				temp_ID=move->next->ID;
					move->next->ID=move->next->next->ID;
					move->next->next->ID=temp_ID;
					
					strcpy(temp_Sname,move->next->Sname);
					strcpy(move->next->Sname,move->next->next->Sname);
					strcpy(move->next->next->Sname,temp_Sname);
					
					strcpy(temp_singer,move->next->singer);
					strcpy(move->next->singer,move->next->next->singer);
					strcpy(move->next->next->singer,temp_singer);
					
					temp_ticket=move->next->ticket;
					move->next->ticket=move->next->next->ticket;
					move->next->next->ticket=temp_ticket;
				 }
				 move=move->next;
			 }
			 move=head;
		 }
	  move=head;
	  printf("\nTOP10排行榜信息如下:\n");
	  for(k=0;k<10;k++)
	  {
	  	 printf("%d %s %s %ld\n",move->next->ID,move->next->Sname,move->next->singer,move->next->ticket);
	  	 move=move->next;
	  } 
	  printf("\nTOP10排行榜信息输入完毕!\n");
	write();
	system("pause");
	choose();
	function();
  } 

最后一个是quit函数,功能是退出整个程序,没有放任何代码

 void quit()
  {
  	
   } 

ps:这个程序对于C语言初学者来说,是比较易懂的,只需要搞懂指针、结构体和链表的相关知识就足够了!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值