接上篇博客
>综合系统
问题重述:模拟图书馆管理系统。每名读者只能借一本书,读者可借书或还书。管理员可对图书和读者信息进行录入、修改和删除。图书信息至少应包括:编号、书名、数量,读者信息至少应包括:编号、姓名、所借图书。可根据图书名称或编号进行图书信息查询,可查询某本书现在被哪些读者借走。
算法描述:由于目标是一个综合系统,将其精简成各个子程序,分别实现不同的功能,使用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天下第一(滑稽