c++学生信息管理系统(window控制台实现鼠标点击操作)

2023-11-09

翻起大一时写过的作业代码——一个学生信息管理系统,当时不会使用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";
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==7||Y==9||Y==8)&&X>3&&X<24){
            	clrscr();return pointer;
			}
if((Y==7||Y==8||Y==9)&&X>28&&X<39){clrscr();exit();}
        }
    }
}
student *sort(student *p)
{
	student *pointer=p;student *upsort(student*);student *downsort(student *);
	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<24)
			{
            	p=upsort(pointer);
    cout<<"              ┏━━━━━━━━━━━━━━┓                                  \n"
		<<"              ┃ 升序排列成功 ┃                                  \n"//3-21
		<<"              ┗━━━━━━━━━━━━━━┛                                  \n";
		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";
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==7||Y==6||Y==8)&&X>3&&X<24){
            	clrscr();return p;
			}
if((Y==7||Y==8||Y==6)&&X>28&&X<39){clrscr();exit();}
        }
    }
			}
if((Y==0||Y==1||Y==2)&&X>28&&X<39)
		{
			p=downsort(pointer);
    cout<<"              ┏━━━━━━━━━━━━━━┓                                  \n"
		<<"              ┃ 降序排列成功 ┃                                  \n"//3-21
		<<"              ┗━━━━━━━━━━━━━━┛                                  \n";
		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";
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==7||Y==6||Y==8)&&X>3&&X<24)
			{
            	clrscr();return p;
			}
if((Y==7||Y==8||Y==6)&&X>28&&X<39){clrscr();exit();}
        }
    }
		}
        }
    }

}

int compare(char p1[],char p2[])
{int i=0;
	while(i<strlen(p1)&&i<strlen(p2))
	{
		if(p1[i]==p2[i]){i++;}
		else return p1[i]-p2[i];
	}
	return 0;
}



student *upsort(student*p)
{
	char t;student *head=p;
	student *pointer=p;
	int len=0;
	while(pointer!=NULL){
		pointer=pointer->next;
		len++;
	}
	for(int k=0;k<len;k++)
	{
		p=head;
		for(int j=0;j<len-k-1;j++)
		{
		if(compare(p->num,p->next->num)>0)
		{
			for(int i=0;i<15;i++){t=p->num[i];p->num[i]=p->next->num[i];p->next->num[i]=t;	}
			for(int i=0;i<10;i++){t=p->name[i];p->name[i]=p->next->name[i];p->next->name[i]=t;	}
			for(int i=0;i<20;i++){t=p->phone[i];p->phone[i]=p->next->phone[i];p->next->phone[i]=t;	}
			for(int i=0;i<20;i++){t=p->adress[i];p->adress[i]=p->next->adress[i];p->next->adress[i]=t;	}
		}
			p=p->next;
		}

	}
	return head;
}

student *downsort(student *p)
{
	char t;student *head=p;
	student *pointer=p;
	int len=0;
	while(pointer!=NULL){
		pointer=pointer->next;
		len++;
	}
	for(int k=0;k<len;k++)
	{
		p=head;
		for(int j=0;j<len-k-1;j++)
		{
		if(compare(p->num,p->next->num)<0)
		{
			for(int i=0;i<15;i++){t=p->num[i];p->num[i]=p->next->num[i];p->next->num[i]=t;	}
			for(int i=0;i<10;i++){t=p->name[i];p->name[i]=p->next->name[i];p->next->name[i]=t;	}
			for(int i=0;i<20;i++){t=p->phone[i];p->phone[i]=p->next->phone[i];p->next->phone[i]=t;	}
			for(int i=0;i<20;i++){t=p->adress[i];p->adress[i]=p->next->adress[i];p->next->adress[i]=t;	}
		}
			p=p->next;
		}

	}
	return head;
}

//主菜单函数
int menu()
{
hInput = GetStdHandle(STD_INPUT_HANDLE); /*  输入设备句柄 */
       /*printf("********************************************************\n");
        printf("*             student information system               *\n");
        printf("*insert information         ");//(2,1)-(2,20)
        printf("      print the information*\n");//(2,29)-(2,51)
        printf("*delete a specific student        ");//(3,1)-(3,26)
        printf("exit                 *\n");//(3,35)-(3,40)
        printf("*add new student          ");//(4,1)-(4,16)
        printf("        modify information   *\n");//(4,26)-(4,46)
        printf("********************************************************\n");*/



        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);
	cout<<endl
		<<"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n"
		<<"┃                                                                            ┃\n"
		<<"┃                           小型学生通讯录管理系统                           ┃\n"
		<<"┃                                                                            ┃\n"
		<<"┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n"
		//"12345678901234567890123456789012345678901234567890
		<<"                             ┏━━━━━━主菜单━━━━━━┓\n"
		<<"                             ┃                  ┃\n"//30-50
		<<"                             ┣━━━━━━━━━━━━━━━━━━┫\n"
		<<"                             ┃    创建通讯录    ┃\n"//9
		<<"                             ┣━━━━━━━━━━━━━━━━━━┫\n"
		<<"                             ┃    显示通讯录    ┃\n"//11
		<<"                             ┣━━━━━━━━━━━━━━━━━━┫\n"
		<<"                             ┃    查询通讯录    ┃\n"
		<<"                             ┣━━━━━━━━━━━━━━━━━━┫\n"
		<<"                             ┃    添加通讯录    ┃\n"
		<<"                             ┣━━━━━━━━━━━━━━━━━━┫\n"
		<<"                             ┃    修改通讯录    ┃\n"
		<<"                             ┣━━━━━━━━━━━━━━━━━━┫\n"
		<<"                             ┃    删除通讯录    ┃\n"
		<<"                             ┣━━━━━━━━━━━━━━━━━━┫\n"
		<<"                             ┃    通讯录排序    ┃\n"
		<<"                             ┣━━━━━━━━━━━━━━━━━━┫\n"
		<<"                             ┃    退出通讯录    ┃\n"
		<<"                             ┗━━━━━━━━━━━━━━━━━━┛\n";
 time_t tt = time(NULL);//这句返回的只是一个时间cuo
 tm* t= localtime(&tt);
 printf("%d-%02d-%02d\n",
  t->tm_year + 1900,
  t->tm_mon + 1,
  t->tm_mday);

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==9&&X>30&&X<50){clrscr();return 1;}
            if(Y==11&&X>30&&X<50){clrscr();return 2;}
            if(Y==13&&X>30&&X<50){clrscr();return 3;}
            if(Y==15&&X>30&&X<50){clrscr();return 4;}
            if(Y==17&&X>30&&X<50){clrscr();return 5;}
            if(Y==19&&X>30&&X<50){clrscr();return 6;}
            if(Y==21&&X>30&&X<50){clrscr();return 7;}
            if(Y==23&&X>30&&X<50){clrscr();return 8;}
        }
    }

}

//隐藏光标
void HideCursor()//隐藏控制台的光标
{
    CONSOLE_CURSOR_INFO cursor_info = {1, 0};
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}



//main函数
int main()
{
void writerecord(student*);
void mydisplay(student *);
void clrscr();
    int menu();
      //HideCursor(); //隐藏控制台的光标
    struct student *head=NULL;
    student *insert(struct student *);
    void print(struct student *);
    student *del(struct student *,char [15]);
student *add(student*);
student *modify(student *);
//head=readfile(head);

    int rt=1;
    while(rt)
           {
                  rt=menu();
                switch(rt)
                {
                    case 1:{head=insert(head);break;}
                    case 2:mydisplay(head);break;
                    case 3:head=search(head);break;
                    case 4:{head=add(head);break;}
                    case 5:{head=modify(head);break;}
                    case 6:{printf("请输入要删除的学生姓名:\n");char n[15];cin>>n;head=del(head,n);break;}
                    case 7:head=sort(head);break;
                	case 8:{exit();return 0;}
                    default :{printf("error, try again");/*sleep(1);*/break;}
                }
            }


    return 0;
}




//创建函数
student *insert(struct student *head)
{int i;
HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos={90,80};
    SMALL_RECT rc={0,0, 90, 80};
	student *p=head;
	SetConsoleTitle("小型学生通讯录管理系统");
	SetConsoleScreenBufferSize(hOut, pos);
	SetConsoleWindowInfo(hOut, true,&rc);string stra(int);
	clrscr();
	//"123456789012345678
    cout<<"┏━━━━━━━━━━━━━━┓                                                              \n"
		<<"┃  返回主菜单  ┃                                                              \n"//3-21
		<<"┗━━━━━━━━━━━━━━┛                                                              \n";

    int n;struct student *p1,*p2;
    head=p1=p2=new student;
    printf("请输入人数:");
    scanf("%d",&n);

        printf("请输入学号,姓名,手机号码和学院名称\n");
    for(i=0;i<n;i++)
    {
    	p2=p1;
        if(i!=0)p1=new student;
		scanf("%s%s%s%s",(p1->num),p1->name,p1->phone,p1->adress);
        p2->next=p1;
    }
    p1->next=NULL;
    Sleep(1000);
    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==2||Y==1)&&X>3&&X<19){
            	clrscr();return head;
			}
        }
    }
    return (head);
}


//显示函数
void mydisplay(student *head)
{
	int len(int);
	HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos={90,80};
    SMALL_RECT rc={0,0, 90, 80};
	student *p=head;
	int n=0;
	SetConsoleTitle("小型学生通讯录管理系统");
	SetConsoleScreenBufferSize(hOut, pos);
	SetConsoleWindowInfo(hOut, true,&rc);string stra(int);
	clrscr();
	cout<<endl
	//"123456789012345678
		<<"┏━━━━━━━━━━━━━━┓                                                              \n"
		<<"┃  返回主菜单  ┃                                                              \n"//3-21
		<<"┗━━━━━━━━━━━━━━┛                                                              \n"
		<<"┏━━━━━━━━━━━━━━━━━━━━━━━━━通讯录列表━━━━━━━━━━━━━━━━━━━━━━━━━┓\n"
		<<"┃                                                            ┃\n"
		<<"┣━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┫\n"
		<<"┃     学号     ┃     姓名     ┃    联系电话    ┃    学院     ┃\n";
	if(p==NULL)
	cout<<"┣━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━┫\n"
		<<"┃没有任何记录.                                               ┃\n"
		<<"┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n";
	else
	{
    cout<<"┣━━━━━━━━━━━━━━┫━━━━━━━━━━━━━━┫━━━━━━━━━━━━━━━━┫━━━━━━━━━━━━━┫\n";
		while(p!=NULL)
		{
			n=n+1;
			if(n!=1)
	cout<<"┣━━━━━━━━━━━━━━┫━━━━━━━━━━━━━━┫━━━━━━━━━━━━━━━━┫━━━━━━━━━━━━━┫\n";
	cout<<"┃"<<setw(14)<<p->num<<"│"<<setw(14)<<p->name<<"│"<<setw(16)<<p->phone<<"│"<<setw(13)<<p->adress<<"┃\n";
			p=p->next;
		}
	cout<<"┣━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━┫\n"
		<<" 总共有"<<n<<"条记录";cout<<string(4-len(n),' ')<<endl;
		cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\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==2||Y==1)&&X>3&&X<19){
            	clrscr();return;
			}
        }
    }
clrscr();
}
int len(int n)
{
	int i=0;
	while(n>0)
	{
		n=n/10;
		i++;
	}
	return i;
}


//添加函数
student *add(student *p)
{
		//writerecord(p);
    student *head=p;
    while(p->next!=NULL)p=p->next;
    p->next=new student;
    printf("请输入学号,姓名,手机号码和学院名称\n");
    scanf("%s%s%s%s",(p->next->num),p->next->name,p->next->phone,p->next->adress);
    p=p->next;
    p->next=NULL;

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);
	cout<<"             ┏━━━━━━━━━━━━━━┓                                   \n"
		<<"             ┃   添加成功   ┃                                   \n"//3-21
		<<"             ┗━━━━━━━━━━━━━━┛                                   \n";
	//"1234567890123456789012345678901234567890123456789
	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==6||Y==5||Y==7)&&X>3&&X<19){
            	clrscr();return head;
			}
if((Y==5||Y==6||Y==7)&&X>28&&X<35){clrscr();exit();}
        }
    }
    return head;
}




//修改函数
student *modify(student *p)
{
    student *pointer=p;
    char name[10];
    printf("输入要修改的学生姓名\n");
    scanf("%s",name);
    while(p!=NULL&&strcmp(p->name,name)!=0)p=p->next;
    if(strcmp(p->name,name)==0){printf("已找到该学生的信息\n");printf(" %s   %s   %s     %s\n",p->num,p->name,p->phone,p->adress);
    printf("请输入修正的学生信息");
    printf("请输入学号,姓名,手机号码和学院名称\n");scanf("%s%s%s%s",(p->num),p->name,p->phone,p->adress);
    cout<<"             ┏━━━━━━━━━━━━━━┓                                   \n"
		<<"             ┃   修改成功   ┃                                   \n"//3-21
		<<"             ┗━━━━━━━━━━━━━━┛                                   \n";
    }
    else {printf("该学生不存在\n");Sleep(1000);}
    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos={90,80};
    SMALL_RECT rc={0,0, 90, 80};
		SetConsoleTitle("小型学生通讯录管理系统");
	SetConsoleScreenBufferSize(hOut, pos);
	//"1234567890123456789012345678901234567890123456789
	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==8||Y==10||Y==9)&&X>3&&X<19){
            	clrscr();return pointer;
			}
if((Y==8||Y==9||Y==10)&&X>28&&X<35){clrscr();exit();}
        }
    }
        return (pointer);
}





//删除函数
student *del(student *head,char n[15])
{
			student *p1=head;student *p2=head;
        if(p1!=NULL){
                if(strcmp(p1->name,n)==0){printf("删除成功\n");p2=p1->next;delete p1;head=p2;goto L2;}
		p1=p1->next;
            while(p1!=NULL)
            {
                p2->next=p1;
                if(strcmp(p1->name,n)==0){printf("删除成功\n");p2->next=p1->next;delete p1;goto L2;}
                p2=p1;
                p1=p1->next;
            }
            printf("找不到对应的学生\n");
        }

L2: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";
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==4||Y==5||Y==3)&&X>3&&X<19){
            	clrscr();return head;
			}
if((Y==4||Y==5||Y==3)&&X>28&&X<35){clrscr();exit();}
        }
    }
        return (head);
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++学生信息管理系统(window控制台实现鼠标点击操作) 的相关文章

  • 输出字符串的子串

    我们经常碰到这样一个问题 怎样快速输出一个字符串的子串 这种问题通常有两种形式 1 输出连续子串 例如 假设字符串的长度为n 其非空子串的数目为你n n 1 2个 例如字符串 abc 的连续子串有 a b c ab bc abc 利用代码实
  • ini配置文件读写操作入门

    ini配置文件读写操作入门 ini文件 Initialization file 这种类型的文件中通常存放的是一个程序的初始化信息 ini文件由若干个节 Section 组成 每个Section由若干键 Key 组成 每个Key可以赋相应的值
  • C++函数

    C 函数 函数是一组一起执行一个任务的语句 与C程序类似 每个 C 程序都至少有一个函数 即主函数 main 通过函数 还可以把一个复杂任务分解成为若干个易于解决的小任务 充分体现结构化程序设计由粗到精 逐步细化的设计思想 即将任务合理划分
  • 【C语言取反运算符】~2是多少?~-5是多少?

    标题的答案 2 3 3 2 原理是什么 我们先来看这个程序及输出的结果 容易总结出这样一个结论 i i 1 为什么呢 一言以蔽之 运算符是对i的补码 含符号位 进行取反 2的原码是0000 0010 正数补码是其本身0000 0010 取反
  • C++中的<string>头文件 和 <cstring>头文件简介

    C 中的
  • getline函数的用法

    一 getline函数的用法 getline只要一遇到换行符就结束读取操作并返回结果 哪怕一开始输入的是换行符也是如此 C 中有两个getline函数 一个是在string头文件中 定义的是一个全局的函数 函数声明是 istream get
  • #define宏定义详解

    define宏定义 1 常规用法 无参宏 define PI 3 1415926 define EN 1e5 定义指数1 10e5 cout lt
  • Mac构建Protobuf

    Protobuf源码下载 https github com JumpWu xls2protobuf tree master protobuf V3 0 1 切换到protobuf V3 0 根目录 运行 autogen sh前 我们需要先安
  • C单元测试框架——CMockery (3)中文手册

    Cmockery 单元测试框架 翻译的匆忙 没有校验 纰漏之处感谢请指正 转载请注明来自 see see 版权归原文 所有 Cmockery 是一个轻量级的库 作者用它来做C单元测试 目录 动机 概述 执行测试 异常处理 出错处理 断言 断
  • 二维数组定义

    二维数组定义 1 方法一 int a new int m for int i 0 i
  • C++程序如何编译运行

    下面是C 入门的hello world程序源码 include
  • 【LeetCode刷题】-岛屿数量

    Task 思路 1 首先判断给定的二维数组是不是空的 2 对二维数组遍历一下 对每个元素进行判断 a 如果这个值等于1 那么就把计数器 1 并且对该元素四周进行深度搜索 3 返回 代码 class Solution public int n
  • 苏小红版 c语言程序设计(第三版)系列实验题:学生成绩管理系统V2.0

    github https github com Jackie0Feng SAMS 系统需求描述 某班有最多不超过30人 具体人数由键盘输入 参加某门课的考试 用一维数组和函数指针作为函数参数编程实现如下学生成绩管理 1 录入每个学生的学号和
  • 苏小红版 c语言程序设计(第三版)系列实验题:学生成绩管理系统V6.0

    github https github com Jackie0Feng SAMS 系统需求描述 某班有最多不超过30人 具体人数由键盘输入 参加期末考试 考试科目最多不超过6门 具体门数由键盘输入 学生成绩管理系统是一个非常实用的程序 如果
  • android___android_log_print打印函数__源代码

    android端JNI的打印信息 include
  • Windows中使用GCC介绍

    Windows中使用GCC介绍 GCC介绍 GCC是由许多组件组成的 GCC原名为GNU C语言编译器 GNU C Compiler 只能处理C语言 但其很快扩展 变得可处理C 后来又扩展为能够支持更多编程语言 如Fortran Pasca
  • C++修饰构造函数的explicit关键字

    C explicit关键字的作用主要是用来修饰类的构造函数 表明该构造函数是显式的 禁止单参数构造函数的隐式转换 如果C 类的构造函数有一个参数 那么在编译的时候就会有一个缺省的转换操作 将该构造函数对应数据类型的数据转换为该类对象 如下面
  • C/C++中的数据结构对齐,#pragma pack() 和 __attribute__

    C C 中的数据结构对齐 总览 数据结构对齐是指在计算机内存中排列和访问数据的方式 它包含三个独立但相关的问题 数据对齐 data alignment 数据结构填充 data structure padding 和打包 packing 当数
  • windows下使用CMake构建工程:cmake-gui+Visual Studio

    文件结构 在工程目录下构建目录src thirdparty build src 存放自己写的源代码文件 thirdparty 存放使用的第三方库 build 存放编译时生成的文件 因为很多很杂乱 所以单独目录存放 保持项目文件夹整洁 在bu
  • C++程序的基本组成简介

    C 程序的基本组成简介 C 程序的基本组成 这个C 程序例子 由一个程序单位 程序文件 注 组成 这是一个简单例子未使用类 注 其中包括 1 头文件 可以认为头文件是你在调用函数时的一个桥梁 格式为 include 引用文件名 c 的程序是

随机推荐

  • C语言:(含大量图解)你真的了解结构体吗?

    文章目录 结构体 结构体的定义 结构体大小计算 结构体的对齐规则 关于对齐规则的解释 为什么C语言要这样进行大小设定 平台移植原因 追求高性能 修改默认对齐数 结构体传参问题 结构体 结构体的定义 结构体是一些值的集合 这些值被称为成员变量
  • 【RPC】RPC的序列化方式

    序列化 网络传输的数据必须是二进制数据 但调用方请求的出入参数都是对象 对象是不能直接在网络中传输的 所以我们需要提前把它转成可传输的二进制 并且要求转换算法是可逆的 这个过程我们一般叫做 序列化 这时 服务提供方就可以正确地从二进制数据中
  • 小程序——wxml组件和wxss适配

    一 和以往代码区别 wxml html zhuiy css view div text文字 加入这个可以长按选中 否则不能复制 image img button button form form input input label labe
  • Leetcode1333.餐厅过滤器——使用stream流

    文章目录 引入 本题题解 后记 int Integer List的互相转化 引入 在上周周赛中 有这么一道题 1333 餐厅过滤器 给你一个餐馆信息数组 restaurants 其中 restaurants i idi ratingi ve
  • Java远程调试原理与运用

    Java远程调试的原理是两个VM之间通过debug协议进行通信 然后以达到远程调试的目的 两者之间可以通过socket进行通信 首先被debug程序的虚拟机在启动时要开启debug模式 启动debug监听程序 jdwp是Java Debug
  • c语言——链表——多项式相加

    例题详解 一个多项式可以表示为二元组序列 a1 e1 a2 e2 an en 其中ai表示第i项的系数 非零值 ei表示第i项的指数 编写函数建立多项式链表实现一个多项式的输入 按指数从高到低有序 返回链表的头指针 3 编写函数实现两个多项
  • 【Kaggle】关于Kaggle永久保存Output & 如何关闭页面后在Kaggle后台运行程序的问题

    其实在创建一个notebook的时候上面的说明的代码已经讲到了 需要创建一个new version才能永久保存Output结果 否则就是临时保存 关掉页面就会删除 This Python 3 environment comes with m
  • 2023mothercup妈妈杯数学建模挑战赛思路

    先占坑 本人于2019年开始接触数学建模 参加了大大小小几十场数学建模比赛 本次mothercup也会持续陪跑 为大家提供免费的文字思路和视频思路 后续还有代码和参考文章等 2023年Mathorcup数学建模竞赛A题 比赛开始后第一时间更
  • swift:使用cocoapods引入Alamofire

    1 打开终端 Terminal 安装cocoapods 回车运行 抛出如下的异常 上网查了一下 这是墙外的网站 我们墙内的访问不了 这时候我们就要更换cocoapods的来源 如果gem的版本太旧 就执行如下命令更新一下gem 以下是更新成
  • vue router-view使用详解

    这里写目录标题 一 介绍 二 使用方法 1 实现效果 2 代码 一 介绍 router view组件作为vue最核心的路由管理组件 在项目中作为路由管理经常被使用到 vue项目最核心的App vue文件中即是通过router view进行路
  • 设置Tomcat默认访问路径

    步骤 1 打开server xml 在的上一行添加内容格式如下
  • 电脑关机一段时间后不能网络唤醒WOL

    一直以来 想实现远程开机的功能 后来经过NAT 花生壳DDNS的设置 可以通过一台常年开机的主机 来控制其他机器的开关机 但新的问题来了 就是电脑关机一段时间后不能网络唤醒WOL 按照网上教程 关闭了网卡的环保选项 在主板里也设置了WOL相
  • UE4_C++访问蓝图里的变量

    有没有碰到这样的问题 之前的同事用 连连看 实现了项目的逻辑 后续你要维护推展项目的开发 但头疼的是 你是个coder not 连连看 玩家 这时候how to do it UE4 C 访问蓝图里的变量 c 获得BP的方式 在访问蓝图变量之
  • GTest基础学习-04-第3个单元测试-测试夹具test fixture

    这篇来学习一下Gtest中更高级一些的特性test fixture 测试夹具的基本上使用 什么的场景需要使用到测试夹具呢 测试夹具是哪个宏 这篇来学习这个主题 1 什么叫test fixture 什么是测试夹具 这个概念在任何xUnit系列
  • 工厂车间设备智能化管理系统软件

    工厂车间设备智能化管理系统软件 在面对疫情这样的严峻挑战下 制造业企业和工厂开始走向精细化和智能化的管理模式 如今有不少的工厂采用智能化的管理模式 统筹人事 客户 采购 订单 车间 物料 仓储 工艺等板块 而这样的一款智能工厂管理系统 应该
  • C++:这门语言优势在哪?命名空间以及缺省参数?

    文章目录 C 的优势 解决命名空间的问题 缺省参数 C 的优势 C 和C语言比起来有许多优势 这里我们先举一个例子 后续进行补充 解决命名空间的问题 首先看这样的代码 include
  • docker ubuntu 使用apt安装vim--报错Unable to locate package vim

    docker ubuntu 安装vim 报错Unable to locate package vim 前言 想修改从vulhub拉取运行的docker容器里的配置文件 使用vim时报错bash vim command not found 发
  • nest:[TypeOrmModule] Unable to connect to the database. Retrying

    有可能是刚开机的时候 mysql服务还没有开启导致的
  • 百度 AI Studio——《高层API助你快速上手深度学习》课程学习1

    百度 AI Studio 高层API助你快速上手深度学习 课程学习1 该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 相关链接 飞桨 飞桨开源框架 PaddlePaddle 是一个易用 高效 灵活 可扩展的深度学习
  • c++学生信息管理系统(window控制台实现鼠标点击操作)

    翻起大一时写过的作业代码 一个学生信息管理系统 当时不会使用QT 不会MFC等库 只会c 但是又想做一个有界面的 能够实现鼠标操作的程序 于是绞尽脑汁查资料 自己造轮子 最终写出来了下面的这个现在连我自己也看不懂的代码 代码虽然有些长 单文