翻起大一时写过的作业代码——一个学生信息管理系统,当时不会使用QT,不会MFC等库,只会c++,但是又想做一个有界面的,能够实现鼠标操作的程序。于是绞尽脑汁查资料,自己造轮子,最终写出来了下面的这个现在连我自己也看不懂的代码。。。
代码虽然有些长(单文件),但不需要怎么配置,直接在windows下用dev就能运行。
截图:
#include<time.h>
#include<iomanip>
#include <conio.h>
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<fstream>
#include<iostream>
using namespace std;
#define PERR(bSuccess, api){if(!(bSuccess)) printf("%s:Error %d from %s on line %d\n", __FILE__, GetLastError(), api, __LINE__);}
struct student
{
char num[15];
char name[10];
char phone[20];
char adress[20];
student *next;
};
static int i=1;
void MyCls(HANDLE) ;
/*
//读文件记录函数
student *readfile(student *p)
{
int k=1;
student *head=p;
ifstream read("input.txt"); // 读文件流
//ofstream write("c://record.dat"); // 写文件流
// 判断是否打开成功
if(!read)
{
printf("文件打开失败\n");return head;
}
while(!read.eof())
{
if(k++==1)head=p=new student;
else{p->next=new student;p=p->next;}
read>>p->num>>p->name>>p->phone>>p->adress;
}
p=NULL;
read.close();
return head;
}
void writerecord(student *pointer)
{
student *p=pointer;
ofstream write("output.txt");
if(!write){cout<<"文件打开失败\n";
}
while(p!=NULL)
{
write<<p->num<<" "<<p->name<<" "<<p->phone<<" "<<p->adress<<endl;
p=p->next;
}
write.close();
}
*/
//清屏函数
void clrscr(void)
{
HANDLE hStdOut=GetStdHandle(STD_OUTPUT_HANDLE);
MyCls(hStdOut);
return;
}
void MyCls(HANDLE hConsole)
{
COORD coordScreen={0,0};//设置清屏后光标返回的屏幕左上角坐标
BOOL bSuccess;
DWORD cCharsWritten;
CONSOLE_SCREEN_BUFFER_INFO csbi;//保存缓冲区信息
DWORD dwConSize;//当前缓冲区可容纳的字符数
bSuccess=GetConsoleScreenBufferInfo(hConsole,&csbi);//获得缓冲区信息
PERR(bSuccess,"GetConsoleScreenBufferInfo");
dwConSize=csbi.dwSize.X * csbi.dwSize.Y;//缓冲区容纳字符数目
//用空格填充缓冲区
bSuccess=FillConsoleOutputCharacter(hConsole,(TCHAR)' ',dwConSize,coordScreen,&cCharsWritten);
PERR(bSuccess,"FillConsoleOutputCharacter");
bSuccess=GetConsoleScreenBufferInfo(hConsole,&csbi);//获得缓冲区信息
PERR(bSuccess,"ConsoleScreenBufferInfo");
//填充缓冲区属性
bSuccess=FillConsoleOutputAttribute(hConsole,csbi.wAttributes,dwConSize,coordScreen,&cCharsWritten);
PERR(bSuccess,"FillConsoleOutputAttribute");
//光标返回屏幕左上角坐标
bSuccess=SetConsoleCursorPosition(hConsole,coordScreen);
PERR(bSuccess,"SetConsoleCursorPosition");
return;
}
//直接退出函数
void exit()
{
clrscr();
printf("\n\n\n\n\n\n\n\n\n\n 谢谢您的使用 祝您生活愉快\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");getchar();
}
HANDLE hInput; /* 获取标准输入设备句柄 */
INPUT_RECORD inRec;/* 返回数据记录 */
DWORD numRead; /* 返回已读取的记录数 */
int Y,X;/* X和Y的坐标 */
student * search(student *pointer)
{char num[15];char name[10];
student *p=pointer;
cout<<"┏━━━━━━━━━━━━━━┓ ┏━━━━━━━━━━━━━━━━┓ \n"
<<"┃ 按学号查找 ┃ ┃ 按姓名查找 ┃ \n"//3-21
<<"┗━━━━━━━━━━━━━━┛ ┗━━━━━━━━━━━━━━━━┛ \n";
ReadConsoleInput(hInput, &inRec, 1, &numRead); /* 读取1个输入事件 */
while(1)
{
COORD pos = {0,0};
ReadConsoleInput(hInput, &inRec, 1, &numRead);
pos = inRec.Event.MouseEvent.dwMousePosition;
Y=(int)pos.Y;
X=(int)pos.X;
if (inRec.EventType == MOUSE_EVENT && inRec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) /* 鼠标左键单击 */
{
if((Y==0||Y==1||Y==2)&&X>3&&X<19)
{
cout<<"请输入学号:"<<endl;
cin>>num;
while(p!=NULL)
{
if(strcmp(p->num,num)==0)
{
cout<<setw(14)<<p->num<<setw(8)<<p->name<<setw(14)<<p->phone<<setw(15)<<p->adress<<endl;goto L1;
}
else p=p->next;
}
cout<<"该学生不存在"<<endl;
goto L1;
}
if((Y==0||Y==1||Y==2)&&X>28&&X<38)
{
cout<<"请输入姓名:"<<endl;
cin>>name;
while(p!=NULL)
{
if(strcmp(name,p->name)==0)
{
cout<<setw(14)<<p->num<<setw(8)<<p->name<<setw(14)<<p->phone<<setw(15)<<p->adress<<endl;goto L1;
}
else p=p->next;
}
cout<<"该学生不存在"<<endl;goto L1;
}
}
}
L1:HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos={90,80};
SMALL_RECT rc={0,0, 90, 80};
SetConsoleTitle("小型学生通讯录管理系统");
SetConsoleScreenBufferSize(hOut, pos);
SetConsoleWindowInfo(hOut, true,&rc);string stra(int);
//"1234567890123456789012345678901234567890123456789
cout<<"┏━━━━━━━━━━━━━━┓ ┏━━━━━━━━━━━━━━┓ \n"
<<"┃ 返回主菜单 ┃ ┃ 直接退出 ┃ \n"//3-21
<<"┗━━━━━━━━━━━━━━┛ ┗━━━━━━━━━━━━━━┛ \n";
Read