标题:c语言实训 写了一个 带windows界面的 图书管理程序。但程序后边有问题,求指 ...
只看楼主
中午的星星
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2016-6-29
结帖率:33.33%
已结贴  问题点数:20 回复次数:7 
c语言实训 写了一个 带windows界面的 图书管理程序。但程序后边有问题,求指教 谢谢!
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct book_msg{
 char ISBN[10],book_name[22],publish[22],writer[22] ,year[4],mouth[2],day[2],price[6];//分别为书号,书名,出版社,作者,出版时间,价格
 struct book_msg *next;
}BOOK;//定义链表节点的结构体类型取别名BOOK
HWND hWnd;
BOOK head;//定义头指针
BOOK *p,*tail;
BOOK b[10];
FILE *fp;//文件指针
FILE* file();//读写文件
void clean();//清屏
int no();
BOOK* findISBN();//查找ISBN对应的图书
char filename[22];
int n=0,i,j;
char ISBN[10];
char temp1[200],temp[200];
LRESULT WINAPI WinProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);//函数声明
RECT rect;
RECT rect1;
HDC hDC;
PAINTSTRUCT paint;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
    char *cName = "myWindow";//定义个字符指针表示窗口类的名字
    WNDCLASS wc;//定义变量
    MSG Msg;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//设置窗口背景为白色
    wc.hCursor = NULL;//窗口的光标不设置
    wc.hIcon = NULL;//窗口图标设置
    wc.hInstance = hInstance;//当前程序的句柄,hInstance是由主函数传递
    wc.lpfnWndProc = WinProc;//窗口处理过程的窗口函数。
    wc.lpszClassName =(LPSTR)cName;//窗口类的名字。
    wc.lpszMenuName = NULL;//目录名,不设置
    wc.style = CS_HREDRAW | CS_VREDRAW; //窗口类的风格
    RegisterClass(&wc);//在系统中注册窗口
    hWnd = CreateWindow(cName, TEXT("图书馆管理系统"),WS_OVERLAPPEDWINDOW, 300, 100, 800, 550, NULL, NULL, hInstance, NULL) ;
 ShowWindow(hWnd,nShowCmd);//显示窗口
 UpdateWindow(hWnd);//更新窗口
 while(GetMessage(&Msg,NULL,0,0))
    {
        TranslateMessage(&Msg);//翻译消息
        DispatchMessage(&Msg);//分派消息
    }
    return Msg.message;//程序结束后返回消息
}
LRESULT WINAPI WinProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
{//处理消息过程
 static HWND hwndbutton;
 static HWND hwndbutton1;
 static HWND inputHwnd ;
    switch(Msg)//对消息进行判断
    {
 case WM_PAINT:
  hDC=BeginPaint(hWnd,&paint);//获取设备上下文
  rect.left=40;//"文件路径"文本框坐标的定义
  rect.top=10;
  rect.right=120;
  rect.bottom=70;
  
  rect1.left=30;//"书籍信息"文本框定义
  rect1.top=50;
  rect1.right=700;
  rect1.bottom=90;
  
  //在窗口中输出文本
  DrawText(hDC,"文件路径: ",-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
  DrawText(hDC,"ISBN:                  书名:                   作者:                   出版社:              出版日期:            价格:",-1,&rect1,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
  EndPaint(hWnd,&paint);
  return 0;
 case WM_CREATE:
  //创建按钮和文本框
  inputHwnd = CreateWindow( TEXT("edit"), NULL,WS_CHILD | WS_VISIBLE  | WS_BORDER |ES_LEFT | ES_MULTILINE ,120, 30, 300, 20,
   hWnd, (HMENU)88, ((LPCREATESTRUCT) lParam) -> hInstance,NULL ) ;//文件路径框
  hwndbutton=CreateWindow(TEXT("BUTTON"),TEXT("导入"),WS_CHILD|WS_VISIBLE,400,450,100,20,
   hWnd,(HMENU)1,((LPCREATESTRUCT) lParam) -> hInstance,NULL);
  hwndbutton=CreateWindow(TEXT("BUTTON"),TEXT("保存"),WS_CHILD|WS_VISIBLE,520,450,100,20,
   hWnd,(HMENU)2,((LPCREATESTRUCT) lParam) -> hInstance,NULL);
  hwndbutton=CreateWindow(TEXT("BUTTON"),TEXT("1.新建图书信息"),WS_CHILD|WS_VISIBLE,50,400,120,20,
   hWnd,(HMENU)0,((LPCREATESTRUCT) lParam) -> hInstance,NULL);
  hwndbutton=CreateWindow(TEXT("BUTTON"),TEXT("2.ISBN查询图书"),WS_CHILD|WS_VISIBLE,190,400,120,20,
   hWnd,(HMENU)3,((LPCREATESTRUCT) lParam) -> hInstance,NULL);
  hwndbutton=CreateWindow(TEXT("BUTTON"),TEXT("3.作者作品查询"),WS_CHILD|WS_VISIBLE,330,400,120,20,
   hWnd,(HMENU)4,((LPCREATESTRUCT) lParam) -> hInstance,NULL);
  hwndbutton=CreateWindow(TEXT("BUTTON"),TEXT("4.ISBN修改图书"),WS_CHILD|WS_VISIBLE,470,400,120,20,
   hWnd,(HMENU)5,((LPCREATESTRUCT) lParam) -> hInstance,NULL);
  hwndbutton=CreateWindow(TEXT("BUTTON"),TEXT("5.删除图书"),WS_CHILD|WS_VISIBLE,610,400,120,20,
   hWnd,(HMENU)6,((LPCREATESTRUCT) lParam) -> hInstance,NULL);
  hwndbutton=CreateWindow(TEXT("BUTTON"),TEXT("退出"),WS_CHILD|WS_VISIBLE,640,450,100,20,
   hWnd,(HMENU)7,((LPCREATESTRUCT) lParam) -> hInstance,NULL);
  inputHwnd = CreateWindow( TEXT("edit"), NULL,WS_CHILD | WS_VISIBLE  | WS_BORDER |ES_LEFT | ES_MULTILINE , 45, 85, 100, 30, hWnd, (HMENU)9
   , ((LPCREATESTRUCT) lParam) -> hInstance,NULL );//ISBN框
  inputHwnd = CreateWindow( TEXT("edit"), NULL,WS_CHILD | WS_VISIBLE  | WS_BORDER |ES_LEFT | ES_MULTILINE , 165, 85, 100, 30, hWnd, (HMENU)11,
   ((LPCREATESTRUCT) lParam) -> hInstance,NULL ) ;//书名框
  inputHwnd = CreateWindow( TEXT("edit"), NULL,WS_CHILD | WS_VISIBLE  | WS_BORDER |ES_LEFT | ES_MULTILINE , 285, 85, 100, 30, hWnd, (HMENU)12,
   ((LPCREATESTRUCT) lParam) -> hInstance,NULL ) ;//作者框
  inputHwnd = CreateWindow( TEXT("edit"), NULL,WS_CHILD | WS_VISIBLE  | WS_BORDER |ES_LEFT | ES_MULTILINE , 405, 85, 100, 30, hWnd, (HMENU)13,
   ((LPCREATESTRUCT) lParam) -> hInstance,NULL ) ;//出版社框
  inputHwnd = CreateWindow( TEXT("edit"), "年",WS_CHILD | WS_VISIBLE  | WS_BORDER |ES_LEFT | ES_MULTILINE , 525, 85, 40, 30, hWnd, (HMENU)14,
   ((LPCREATESTRUCT) lParam) -> hInstance,NULL ) ;//出版日期年框
  inputHwnd = CreateWindow( TEXT("edit"), "月",WS_CHILD | WS_VISIBLE  | WS_BORDER |ES_LEFT | ES_MULTILINE , 570, 85, 24, 30, hWnd, (HMENU)20,
   ((LPCREATESTRUCT) lParam) -> hInstance,NULL ) ;//出版日期月框
  inputHwnd = CreateWindow( TEXT("edit"), "日",WS_CHILD | WS_VISIBLE  | WS_BORDER |ES_LEFT | ES_MULTILINE , 595, 85, 24, 30, hWnd, (HMENU)21,
   ((LPCREATESTRUCT) lParam) -> hInstance,NULL ) ;//出版日期日框
  inputHwnd = CreateWindow( TEXT("edit"), NULL,WS_CHILD | WS_VISIBLE  | WS_BORDER |ES_LEFT | ES_MULTILINE , 645, 85, 100, 30, hWnd, (HMENU)15,
   ((LPCREATESTRUCT) lParam) -> hInstance,NULL ) ;//价格框
  
  inputHwnd = CreateWindow( TEXT("edit"), NULL,WS_CHILD | WS_VISIBLE  | WS_BORDER |ES_LEFT | ES_MULTILINE , 45, 130, 700, 200,
   hWnd, (HMENU)10, ((LPCREATESTRUCT) lParam) -> hInstance,NULL ) ;//查询结果信息框
  
  inputHwnd = CreateWindow( TEXT("edit"), NULL,WS_CHILD | WS_VISIBLE  |ES_CENTER | ES_MULTILINE , 100, 350,600, 30,
   hWnd, (HMENU)77, ((LPCREATESTRUCT) lParam) -> hInstance,NULL ) ;//提示框
  return 0 ;
 case WM_COMMAND:
  {
   switch(LOWORD(wParam)){
   case 0://初始化链表
    head.next=NULL;
    tail=&head;
    SetDlgItemText(hWnd,77,"请在对应的信息框中输入信息,再点击“导入”");
    break;
   case 1://将图书信息导入到链表中
    p=(BOOK *)malloc(sizeof(BOOK));
    GetDlgItemText(hWnd,9,p->ISBN,sizeof(p->ISBN)/sizeof(char));
    GetDlgItemText(hWnd,11,p->book_name,sizeof(p->book_name)/sizeof(char));
    GetDlgItemText(hWnd,12,p->writer,sizeof(p->writer)/sizeof(char));
    GetDlgItemText(hWnd,13,p->publish,sizeof(p->publish)/sizeof(char));
    GetDlgItemText(hWnd,14,p->year,sizeof(p->year)/sizeof(char));
    GetDlgItemText(hWnd,20,p->mouth,sizeof(p->mouth)/sizeof(char));
    GetDlgItemText(hWnd,21,p->day,sizeof(p->day)/sizeof(char));
    GetDlgItemText(hWnd,15,p->price,sizeof(p->price)/sizeof(char));
    tail->next =p;
    p->next =NULL;
    tail=p;
    SetDlgItemText(hWnd,77,"导入成功");
    clean();
    break;
   case 2://将链表数据保存到文件中
    p=head.next;
    GetDlgItemText(hWnd,88,filename,sizeof(filename)/sizeof(char));
    file();
    while(p!=NULL){
     fprintf(fp,"%s %s %s %s %s %s\n",p->ISBN,p->book_name,p->writer,p->publish,p->year,p->mouth,p->day,p->price);
     p=p->next;
    }
    fclose(fp);
    MessageBox(NULL,TEXT("已成功保存到文件"),TEXT("提示"),MB_OK);
    clean();
    break;
   case 3: //搜索ISBN,从文件中查找并显示图书数据
    file();
    findISBN();
    sprintf(temp,"ISBN: %s  书名:《%s》  作者:%s  出版社:%s 出版日期: %s年%s月%s日 价格:%s元 ",
     p->ISBN,p->book_name,p->writer,p->publish,p->year,p->mouth,p->day,p->price);
    SetDlgItemText(hWnd,10,temp);
    fclose(fp);
    break;
   case 4://从文件中搜索作者所有图书
    char writer[12];
    GetDlgItemText(hWnd,12,writer,sizeof(writer)/sizeof(char));
    file();
    ZeroMemory(temp,sizeof(temp));
    p=head.next;
    while(p!=NULL){
     if(strcmp(p->writer,writer)==0)
     {
      sprintf(temp1,"ISBN:%s  书名:《%s》  作者:%s  出版社:%s 出版日期: %s年%s月%s日  价格:%s元 \r\n",
       p->ISBN,p->book_name,p->writer,p->publish,p->year,p->mouth,p->day,p->price);
      strcat(temp,temp1);
     }
     p=p->next;
    }
    SetDlgItemText(hWnd,10,temp);
    fclose(fp);
    clean();
    break;
   case 5://修改所找的图书信息
    file();
    findISBN();
    GetDlgItemText(hWnd,9,p->ISBN,sizeof(p->ISBN)/sizeof(char));
    GetDlgItemText(hWnd,11,p->book_name,sizeof(p->book_name)/sizeof(char));
    GetDlgItemText(hWnd,13,p->publish,sizeof(p->publish)/sizeof(char));
    GetDlgItemText(hWnd,12,p->writer,sizeof(writer)/sizeof(char));
   
    GetDlgItemText(hWnd,14,p->year,sizeof(p->year)/sizeof(char));
    GetDlgItemText(hWnd,20,p->mouth,sizeof(p->mouth)/sizeof(char));
    GetDlgItemText(hWnd,21,p->day,sizeof(p->day)/sizeof(char));
    GetDlgItemText(hWnd,15,p->price,sizeof(p->price)/sizeof(char));
   
    MessageBox(NULL,TEXT("修改成功"),TEXT("提示"),MB_OK);
    clean();
    break;
   case 6://删除所找的图书
    BOOK *pre;
    n=1;
    pre=&head;
    GetDlgItemText(hWnd,9,ISBN,sizeof(ISBN)/sizeof(char));
    GetDlgItemText(hWnd,88,filename,sizeof(filename)/sizeof(char));
    file();
    while(!feof(fp)){
     p=(BOOK *)malloc(sizeof(BOOK));
     i=fscanf(fp,"%s %s %s %s %s %s\n",p->ISBN,p->book_name,p->writer,p->publish,p->year,p->mouth,p->day,p->price);
     if(i<6)break;
    }
    p=head.next;
    while(p!=NULL){
     if(strcmp(p->ISBN,ISBN)==0)//显示查询的书籍的信息
      break;
     p=p->next;
     n++;
    }
    pre=&head;
    for(i=1;i<=n-1;i++){
     pre=pre->next;
    }
    p=pre->next ;
    fflush(stdin);
    pre->next=p->next;
    free(p);
    fclose(fp);
    clean();
    MessageBox(NULL,TEXT("删除成功"),TEXT("提示"),MB_OK);
    break;
   case 7:
    exit(0);
   }
   return 0;
   }
   case WM_DESTROY://如果是点击关闭窗口时的消息
    PostQuitMessage(0);//退出消息队列
    return 0;//返回0,结束函数
    }
    //如果是其余的消息,调用默认消息处理函数,将消息该函数处理并将返回值返回
    return DefWindowProc(hWnd,Msg,wParam,lParam);
}
void clean(){//刷新窗口
 SetDlgItemText(hWnd,9,"");
 SetDlgItemText(hWnd,11,"");
 SetDlgItemText(hWnd,12,"");
 SetDlgItemText(hWnd,13,"");
 SetDlgItemText(hWnd,14,"年");
 SetDlgItemText(hWnd,15,"");
 SetDlgItemText(hWnd,20,"");
 SetDlgItemText(hWnd,21,"月");
 SetDlgItemText(hWnd,77,"日");
}
BOOK* findISBN(){//定位要查询的ISBN,并返回p的地址]
 int i;int n=0;
  GetDlgItemText(hWnd,9,ISBN,sizeof(ISBN)/sizeof(char));
  GetDlgItemText(hWnd,88,filename,sizeof(filename)/sizeof(char));
  while(!feof(fp)){
   p=(BOOK *)malloc(sizeof(BOOK));
   i=fscanf(fp,"%s%s%s%s%s%s",p->ISBN,p->book_name,p->writer,p->publish,p->year,p->mouth,p->day,p->price);
   if(i<6)break;
  }
  p=head.next;
  while(p!=NULL){
   if(strcmp(p->ISBN,ISBN)==0)
    break;
   else
   p=p->next;
  }
  if(p==NULL){
   MessageBox(NULL,TEXT("不存在此图书!请重新输入"),TEXT("错误"),MB_OK);
   return 0;
  }
  return p;
}
FILE* file(){// 读写文件
 GetDlgItemText(hWnd,88,filename,sizeof(filename)/sizeof(char));
 if((fp=fopen(filename,"r+"))==NULL){
  MessageBox(NULL,TEXT("文件打开失败"),TEXT("错误"),MB_OK);
  return 0;
 }
 else
  return fp;//返回文件的地址
}

搜索更多相关主题的帖子: windows 管理程序 include 出版社 结构体 
2016-07-06 11:18
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
得分:10 
啥问题?我直接复制过来编译后提示有错误,不过我把 case 4://从文件中搜索作者所有图书 char writer[12];这里的char writer[12];还有case 6://删除所找的图书   BOOK *pre; 这里的BOOK *pre;放到函数开头定义就编译通过了;具体功能没有调试,不过感觉界面不太友好,中间那个大方块是做什么用的?


[此贴子已经被作者于2016-7-6 13:39编辑过]

收到的鲜花
2016-07-06 13:28
中午的星星
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2016-6-29
得分:0 
谢谢你帮我改错。
中间的框是用来显示查找结果的,可以用不上。程序只能存入图书信息,isbn查询图书程序就崩溃了,以后的步骤就实现不了了。
能否帮我看一下后面的程序功能为什么实现不了呢?
2016-07-06 16:53
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:10 
case 0://初始化链表
    head.next=NULL;
    tail=&head;
这两句初始化代码最好放到定义head后就自动完全,不要由用户操作来完成。

2016-07-06 19:37
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 3楼 中午的星星
中间查找结果的框,通常的操作可以这样:mhWnd是这个框(edit)的句柄。

//设置可以输入最大字符数,nMaxSize = 0 时无限制。
void _SetMaxSize(UINT nMaxSize)
{
    SendMessage(mhWnd, EM_SETLIMITTEXT, (WPARAM)nMaxSize, (LPARAM)0);
}

//清除编辑框内容
void _Clear()
{
    SetWindowText(mhWnd, NULL);
}

//在尾部添加一行
void _AddLine(const char* szText)
{
    SendMessage(mhWnd, EM_SETSEL, (WPARAM)-1, (LPARAM)0);           //选择到尾
    SendMessage(mhWnd, EM_REPLACESEL, 0, (LPARAM)szText);           //添加一行
    SendMessage(mhWnd, EM_SETSEL, (WPARAM)-1, (LPARAM)0);
    SendMessage(mhWnd, EM_REPLACESEL, 0, (LPARAM)(TEXT("\r\n")));   //添加回车换行符
}

//返回某行(dwRow)的文本
char* _GetLine(const DWORD dwRow)
{
    // 使用 EM_GETLINE 时要注意:
    // 1、在存放数据缓冲区(szBuff)的首字节写入最大的字符数值(MaxStrLen)
    // 2、执行 SendMessage 读取数据,返回取得读出的字符串长(nLen)
    // 3、在读出的字符串尾部添加结束符'\0'

    //EM_FMTLINES wParam= TRUE或FALSE ;Param=0 决定是否在取回的文本宇串中包含软回车字符

    *((LPWORD)szBuff) = MaxStrLen;
    int nLen = SendMessage(mhWnd, EM_GETLINE, (WPARAM)dwRow, (LPARAM)szBuff);
    szBuff[nLen] = '\0';    //在字符串尾添加结束符
    return szBuff;
}

//返回编辑框文本总行数
DWORD _GetLineCount()
{
    return SendMessage(mhWnd, EM_GETLINECOUNT, 0, 0);
}
收到的鲜花
2016-07-06 20:01
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
中间查找结果框类型设置:
WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | WS_BORDER | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_LEFT;
2016-07-06 20:14
中午的星星
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2016-6-29
得分:0 
懂了,不甚感谢!
2016-07-06 22:11
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
得分:0 
回复 3楼 中午的星星
不客气,不过不好意思,链表的相关知识我还不是很懂,可能需要其他朋友多多帮你了
2016-07-06 23:00



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-466685-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.353914 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved