C语言程序设计(2)

接上篇博客

>综合系统

问题重述:模拟图书馆管理系统。每名读者只能借一本书,读者可借书或还书。管理员可对图书和读者信息进行录入、修改和删除。图书信息至少应包括:编号、书名、数量,读者信息至少应包括:编号、姓名、所借图书。可根据图书名称或编号进行图书信息查询,可查询某本书现在被哪些读者借走。

算法描述:由于目标是一个综合系统,将其精简成各个子程序,分别实现不同的功能,使用switch在主程序中,有好多功能在case中,每个功能都由子程序来实现。分别进行子程序中功能的实现,最终进行调用,形成一个综合系统。

源代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SIZE 1000 //最多有1000首歌曲 
struct mc
{
	char name[15];
	char singer[15];
	int shan=1;
}music[SIZE];
 int jc(char name[15])//点歌时检查是否存在该歌曲,如果存在则返回1;并且输出歌曲信息 
{ 
	FILE *fp=fopen("music.txt","ab+"); 
	int i,j;
	for(i=0;!feof(fp);i++)
		fread(&music[i],sizeof(struct mc),1,fp); /* 读取并显示数据 */
	for(j=0;j<i;j++)
		if(strcmp(music[j].name ,name)==0)//和del相同  
		{
		 	printf("歌手:%s\n",music[j].singer);
			  return 1;
		}
	return 0;
	fclose(fp);
 } 
void add()//添加歌曲部分 
{
	FILE *fp=(fopen("music.txt","ab+"));
	printf("请输入要添加歌曲的数量:\n");
	int i,j;
	scanf("%d",&i);
	for(j=0;j<i;j++)
	{
		printf("请输入第%d首歌曲信息(格式:歌曲名称 歌手)\n",j+1);
		scanf("%s%s",music[j].name ,music[j].singer);
		fflush(stdin);//刷新标准输入缓冲区,把输入缓冲区里的东西丢弃[非标准] 
		if((fwrite(&music[j],sizeof(struct mc),1,fp))!=1) 
		printf("录入失败\n");//如果录入成功就等于1 
		 else 
		 {
		 	printf("录入成功\n\n\n");
		 }
	 }fclose(fp);
}
void del()/*删除歌曲功能(把歌曲信息从music.txt中删除),这里用到的一个shan,该标志定义在结构体中,shan初始是1;
如果删除歌曲与歌曲信息相同则shan变成0;有了这个标志,可以选择的把歌曲信息重新录入tmp.txt文件中*/
{
	FILE *fp=fopen("music.txt","r");
	FILE *fo=fopen("tmp.txt","w");
	int i,j,k=0;
	char name[50];
	for( i=0;!feof(fp);i++){
		fread(&music[i],sizeof(struct mc),1,fp);}//读出歌曲信息
		k=i;
	printf("请输入要删除的歌曲名称:\n");
	gets(name);
	int a=jc(name);
	if(a==0)
	{
		printf("不存在该歌曲,请添加!\n\n\n"); 
		return;
	}
	for(j=0;j<(k-1);j++){
		if(strcmp(music[j].name,name)==0){
		music[j].shan=0;}
		}//把原来的歌曲信息从music.txt中删除
	for(j=0;j<(k-1);j++){
		if(music[j].shan==1){
		fwrite(&music[j],sizeof(struct mc),1,fo);}}
			fclose(fo);
	        fclose(fp);//选择性重新录入歌曲信息
		remove("music.txt");//删除原文件 
        rename("tmp.txt","music.txt");//将临时文件名改为原文件名
	printf("删除成功\n");
}
void choose1()//只有在music.txt里面存了该歌曲才可以打开该歌词,否则就算歌词存在也没有用 
{
	printf("请输入要点的歌曲名称:\n");
	char name[15],name1[15];
	char geci[50][50];
	int i,j;
	gets(name); 
    int a=jc(name);
	if(a==0)
	{
		printf("不存在该歌曲,请添加!\n\n\n"); 
		return;
	}//检擦是否存在 该歌曲,若存在输出歌曲信息,若不存在printf("该歌曲不存在,请添加\n");结束该分支 
	strcat(name,".txt"); 
	FILE* fp=fopen(name,"r");
	if(fp==NULL) 
	{
		printf("不存在这首歌的歌词,请添加!\n");
		exit(0);
	}//歌词不存在时打不开 
	for(i=0;!feof(fp);i++)//输出歌词 
		{
			fgets(geci[i],50,fp);
			printf("%s\n",geci[i]);
		}
	fclose(fp);
}
void choose2()//同理,copy  del中的读取,判断情况 
{
	char singer[15];
	printf("请输入歌手的名字:"); //这是按歌手来点歌
	gets(singer);
	FILE *fp=fopen("music.txt","ab+");
	if(fp==NULL) 
	{
		printf("con't open this file.");
		exit(0);
	}
	int i,j,k=0;//k用来记是否有该歌手歌曲 
	for(i=0;!feof(fp);i++)
		fread(&music[i],sizeof(struct mc),1,fp);
	for(j=0;j<i;j++)
		if(strcmp(music[j].singer ,singer)==0)
		{
			printf("歌曲:%s\n",music[j].name );
			k++; 
		}
	if(k==0)printf("没有该歌手的歌曲;\n");
	else choose1();//输入歌手,输出歌手所有的歌曲,然后跳到choose1;进行点歌
	fclose(fp); 
}
void scan()//浏览所有曲目 
{
	FILE *fp=fopen("music.txt","ab+");
	int i,j;
	printf("  歌曲名称                     歌手              \n"); 
	for(i=0;!feof(fp);i++)
		fread(&music[i],sizeof(struct mc),1,fp);
	for(i=i-2;i>=0;i--)//至今不知道为啥是i-2 
		printf("%10s                 %10s        \n",music[i].name,music[i].singer );
	fclose(fp);
}
void out()//退出系统 
{
	printf("确定退出系统?(y/n)");
	char a;
	scanf("%c",&a);
	if(a=='y') 
	{
		exit(0);
	}
}
int main()//主函数 
{
	while(1){
	FILE *fp;
	printf("欢迎进入KTV点歌系统\n");
	printf("1:点歌\n");
	printf("2:浏览所有歌曲\n");
	printf("3:添加歌曲\n");
	printf("4:删除歌曲\n");
	printf("5:退出系统\n");
	printf("  请输入数字进行选择\n");
	int i;
	scanf("%d",&i);
	fflush(stdin);
	switch(i)
	{
		case 1:
			printf("1:按歌名查找\n2:按歌手查找\n");
	    	int way;
	    	scanf("%d",&way);
	    	fflush(stdin);
	    	if(way==1) choose1();
			else choose2();
			break;
		case 2:
			scan();
			break; 
		case 3: 
			add();
			break;
		case 4:
			del();
			break;
		case 5:
			out();
			break;
		default :
			printf("输入错误!请重新输入:\n");
			break;}	 
	}
}

测试结果不予展示

其他问题

(1)问题重述:程序自动生成一个位于99内的随机数,要求用户猜这个数。用户输入一个数后,程序有三种应答:too big,too small,you win。

算法描述:系统产生一个非伪随机数,所以用srand函数,用户输入数字,数猜对则退出。

源代码:

#include<stdio.h> 
#include<stdlib.h> 
#include<time.h> 
int main(){
    int a,i; 
    srand((unsigned)time(NULL));//初始化随机数 
    a=rand()%99+1;//随机数的产生调用rand()函数
	printf("游戏开始,已产生一个1~99间的随机数\n");
	int b;
	while(b!=a){
	printf("你的猜测:\n",b);
	scanf("%d",&b);
    if(b>a){
    	printf("too big!\n");
    }
    else if(b<a){
    	printf("too small!\n");
    }
    else if(b=a){
    	printf("you win!\n");
    }
}
    return 0; 
}

(2)问题重述:产生一组随机数,要求每个数字不能重复。例如:1,20,3,17,80,4,35,88符合要求, 3,20,1,17,80,3,35,88不符合要求。

算法描述:计算机产生一组随机数,用户可以控制产生随机数的数量和范围,写一个函数判断产生的随机数是否与之前相同,在主函数中调用这个函数,判断如果相同,则重新产生,直到产生够用户所需要的数目

源代码:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int pd(int a[],int b)//判断前面是否有数字相等的数字 
{
	int i;
	for(i=0;i<b-1;i++)
	{
		if(a[i]==a[b-1])
		return 1;//有,返回值为1 
	}
	return 0; 
}
int main()
{
	int i,f,g,a[1000];
	printf("请你输入产生随机数的上限(不超过1000)\n");
	scanf("%d",&f);//用户输入的范围 
	printf("请输入要输出不同随机数的个数;\n");
	scanf("%d",&g);
	srand(time(NULL));//为下面随机数种下种子 
	for(i=0;i<g;i++)//产生不同的随机数并输出 
	{
		a[i]=rand()%f;
	    if(pd(a,i+1)==1) 
		{
		i=i-1;
		} //判断与之前是否相同 
		printf("%d ",a[i]);
	}
	return 0;
}

写在最后的话

这次对当初c语言程序进行复习,发现自己有很多关于c的细节都已经记不清了,所以大部分参考了当初提交的实验报告。同时感叹python和c++的便利强大。
python天下第一(滑稽

发布了3 篇原创文章 · 获赞 2 · 访问量 31

猜你喜欢

转载自blog.csdn.net/qq_43651063/article/details/104569937