实验内容:
图书信息处理程序。程序能存储和处理 10 本图书的信息,图书信息包括图
书号(数字编号)和图书名(字符串)。
写几个函数:
1、输入 10 本图书信息(10 本书的图书号和图书名)
2、按图书名排序(应用字符串比较,由小到大),图书号的顺序也随之调整:
3、要求输入一个图书名,用折半查找法找出该本书的图书号:
说明:
从主函数输入要查找的图书名,输出该图书的图书号。
book input 函数是完成10本图书的数据的录入。
book sort函数的作用是选择法排序,按图书名排序(应用字符串比较,由小到大)。
book search 函数的作用是用折半查找的方法找出指定图书名的图书号。
编了半天了,出现诸多问题,求捞捞
开写
# include<stdio.h>
# include<String.h>
# include<stdlib.h>
typedef struct book
{
int id;
char name[32];
}book;
//输入10本书的信息
void book_input(book Book[10]){
int i=0;
for(i=0;i<10;i++){
printf("请输出第%d本书的信息:\n",i+1);
scanf("%d %s",&Book[i].id,Book[i].name);
}
}
// 图书名称从小到大排序
void sorr( book Book[10],int n)
{
int i, j;
int s, t;
char b[30];
for(i=0; i<n; i++) {
for(j=0; j<n-1-i; j++) {
if(strcmp(Book[j].name,Book[j+1].name)>0) {
t = Book[j].id;
Book[j].id = Book[j+1].id;
Book[j+1].id = t;
strcpy(b, Book[j].name);
strcpy(Book[j].name, Book[j+1].name);
strcpy(Book[j+1].name, b);
}
}
}
printf("图书信息从小到大排序如下\n");
printf("ID\tName\n");
for(i=0; i<n; i++) {
printf("%d\t%s\n", Book[i].id,Book[i].name);
}
}
//折半法查找
int binary_search(book Book[10],char a[32],int n)
{
int low = 0; //定义low为0号元素
int high = n - 1; //定义high为下标最大的元素
int mid; //数组中间元素的下标
while (low <= high) //只要低号位元素小于或等于高号位元素,说明还没查找到元素,循环继续
{
mid = (low + high) / 2; //中间元素下标定义
if (strcmp(Book[mid].name,a)<0) //当所查找的元素比中间值大,说明要查找的元素在右半区,
{
low = mid + 1; //key在右半区,改变low的值
}
else if (strcmp(Book[mid].name,a)>0) //当所查找的元素比中间值小,说明要查找的元素在左半区,
{
high = mid - 1; //key在左半区,改变high的值
}
else //如果前面两个条件都不满足,说明已经找到key 满足条件 key==mid 返回mid
{
return mid;
}
}
return -1; //当跳出循环还没有返回值,说明没找到想要的元素,返回-1
}
int main(){
book Book[10];
char a[32];
int i,index,result=1;
book_input(Book);
printf("\n");
printf("----------图书管理系统----------\n");
printf("-------1:从小到大按图书名排序----\n");
printf("-------2:按书名查找信息----------\n");
printf("-------0:退出系统----------\n");
for(;;){
printf("请输入你的选择:");
scanf("%d",&i);
switch (i)
{
case 1:
sorr(Book,10);
printf("\n");
break;
case 2:
printf("请输入查找的图书名称:\n");
scanf("%s",a);
index=binary_search(Book,a,10);
if(index==-1){printf("没有该图书信息。\n");}
else{
printf("编号为:%d,名称为:%s\n",Book[index].id,Book[index].name);
}
break;
case 0:
result=0;
break;
default:
printf("指令错误\n");
break;
}
if(result==0){break;}
else{continue;}
}
return 0;
}
我运行没问题,有问题可以说,有用请采纳
typedef struct book
{
int id;
char name[32];
}book;
book a[32]; //不会返回结构体数组,就定义的全局变量
void booksort(book *a)
{
for (int i=0;i<10;i++)
{
for (int j=0;j<9-i;j++) {
if(strcmp(a[j].name,a[j+1].name)>0)
{
book *p,*q,str;
p=&a[j];
q=&a[j+1];
str=*p;
p=q;
q=&str;
a[j]=*p;
a[j+1]=*q;
}
}
}
for (int i=0;i<10;i++) {
printf("\n");
printf("%d %s\n",a[i].id,a[i].name);
}
}
void booksearch(book *a,char s[])
{
int low=0,high=10,mid;
while (high>=low)
{
mid=(high+low)/2;
if(strcmp(s,a[mid].name)<0)
{
high=mid-1;
}
else if (strcmp(s,a[mid].name)>0) {
low=mid+1;
}
if(strcmp(s,a[mid].name)==0)
{
printf("%d %s\n",a[mid].id,a[mid].name);
break;
}
}
}
void bookinput()
{
for (int i=0;i<10;i++) {
scanf("%d%s",&a[i].id,a[i].name);
}
}
int main()
{
bookinput();
booksort(a);
char s[32];
scanf("%s",s);
booksearch(a,s);
}
出问题的地方断点调试