职工信息管理系统
程序员文章站
2022-05-06 20:36:00
...
/***********************************************************
* 版权所有(C)2017. zangyunpeng
*
* 文件名称:职工信息管理系统
* 文件标识:无
* 内容摘要:该代码用于函数声明及结构体构建
* 其它说明:无
* 当前版本: V1.0
* 作 者:臧云鹏
* 完成日期: 2017 12 22
*
*修改记录1:
*修改日期: 2017 12 22
*版本号 V1.0
*修改人: zangyunpeng
*
**********************************************************/
课程设计要求:
6
块
。
职
工
信
息
管
理
系
统
职
工
信
息
包
括
职
工
号
、
姓
名
、
性
别
、
年
龄
、
学
历
、
工
资
、
住
址
、
电
话
等
(
职
工
号
不
重
复
)
。
设
计
一
个
职
工
信
息
管
理
系
统
,
使
之
能
提
供
以
下
功
能
:
(
1
)
系
统
以
菜
单
方
式
工
作
(
2
)
职
工
信
息
录
入
功
能
(
职
工
信
息
用
文
件
保
存
)
-
-
输
入
(
3
)
职
工
信
息
浏
览
功
能
-
-
输
出
,
包
括
在
退
出
系
统
时
,
将
数
据
保
存
到
文
件
(
4
)
查
询
和
排
序
功
能
:
按
工
资
查
询
按
学
历
查
询
等
6
块
。
职
工
信
息
管
理
系
统
职
工
信
息
包
括
职
工
号
、
姓
名
、
性
别
、
年
龄
、
学
历
、
工
资
、
住
址
、
电
话
等
(
职
工
号
不
重
复
)
。
设
计
一
个
职
工
信
息
管
理
系
统
,
使
之
能
提
供
以
下
功
能
:
(
1
)
系
统
以
菜
单
方
式
工
作
(
2
)
职
工
信
息
录
入
功
能
(
职
工
信
息
用
文
件
保
存
)
-
-
输
入
(
3
)
职
工
信
息
浏
览
功
能
-
-
输
出
,
包
括
在
退
出
系
统
时
,
将
数
据
保
存
到
文
件
(
4
)
查
询
和
排
序
功
能
:
按
工
资
查
询
按
学
历
查
询
等
6
块
。
职
工
信
息
管
理
系
统
职
工
信
息
包
括
职
工
号
、
姓
名
、
性
别
、
年
龄
、
学
历
、
工
资
、
住
址
、
电
话
等
(
职
工
号
不
重
复
)
。
设
计
一
个
职
工
信
息
管
理
系
统
,
使
之
能
提
供
以
下
功
能
:
(
1
)
系
统
以
菜
单
方
式
工
作
(
2
)
职
工
信
息
录
入
功
能
(
职
工
信
息
用
文
件
保
存
)
-
-
输
入
(
3
)
职
工
信
息
浏
览
功
能
-
-
输
出
,
包
括
在
退
出
系
统
时
,
将
数
据
保
存
到
文
件
(
4
)
查
询
和
排
序
功
能
:
按
工
资
查
询
按
学
历
查
询
等
职工信息管理系统职工信息包括职工号、姓名、性别、年龄、学历、工资、住址、电话等(职工号不重复)。设计一个职工信息管理系统,使之能提供以下功能:(1)系统以菜单方式工作(2)职工信息录入功能(职工信息用文件保存)--输入(3)职工信息浏览功能--输出,包括在退出系统时,将数据保存到文件(4)查询和排序功能:按工资查询按学历查询等
6
块
。
职
工
信
息
管
理
系
统
职
工
信
息
包
括
职
工
号
、
姓
名
、
性
别
、
年
龄
、
学
历
、
工
资
、
住
址
、
电
话
等
(
职
工
号
不
重
复
)
。
设
计
一
个
职
工
信
息
管
理
系
统
,
使
之
能
提
供
以
下
功
能
:
(
1
)
系
统
以
菜
单
方
式
工
作
(
2
)
职
工
信
息
录
入
功
能
(
职
工
信
息
用
文
件
保
存
)
-
-
输
入
(
3
)
职
工
信
息
浏
览
功
能
-
-
输
出
,
包
括
在
退
出
系
统
时
,
将
数
据
保
存
到
文
件
(
4
)
查
询
和
排
序
功
能
:
按
工
资
查
询
按
学
历
查
询
等
实现源代码如下:
1.source.cpp
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"head.h"
/***************************************************************************************
*功能描述:菜单函数
*输入参数:无
*输出参数:无
*返回值:1
***************************************************************************************/
void menu()
{
system("color 6E");
printf("\t◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n");
printf("\t◆ 欢迎使用职工信息管理系统 ◆\n");
printf("\t◆ ◆\n");
printf("\t◆ 【菜单】 ◆\n");
printf("\t◆ 1.录入职工信息 ◆\n");
printf("\t◆ 2.查询职工信息 ◆\n");
printf("\t◆ 3.职工信息排序 ◆\n");
printf("\t◆ 4.插入职工信息 ◆\n");
printf("\t◆ 5.浏览职工信息 ◆\n");
printf("\t◆ 6.修改职工信息 ◆\n");
printf("\t◆ 7.删除职工信息 ◆\n");
printf("\t◆ 8.保存职工信息 ◆\n");
printf("\t◆ 【9】退出系统 ◆\n");
printf("\t◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n");
}
/***************************************************************************************
*功能描述:初始化单链表
*输入参数:无
*输出参数:无
*返回值:1
***************************************************************************************/
int Initlist(Linklist *L) //初始化单链表
{
*L=(Linklist )malloc(sizeof(LNode));
if((*L)==NULL)
return (0);
(*L)->next=NULL;
return OK;
}
/***************************************************************************************
*功能描述:头插法生成单链表
*输入参数:职工各项信息工号、姓名、性别、年龄、学历、工资、住址
*输出参数:无
*返回值:1或0
***************************************************************************************/
int CreatList(Linklist L)//头插法生成单链表
{
LNode *p,*r,*s;
char id[30];
int k=0;
r=L;
s=L->next;//链表没有节点时,s=null;/链表有节点时,指向第一个职工节点
while(r->next!=NULL)//如果存在后继结点时,r指针后移一个
{
r=r->next;
}
while(L)
{
printf("\t职工号:");
scanf("%s",id);
s=L->next;//每次从第一个节点开始找,看id是否重复
while(s)
{
if(strcmp(s->data.id,id)==0)
{
printf("\t提示:职工号为'%s'的职工已经存在!\n",id);
k=1;
return OK;
}
s=s->next;
}
p=(Linklist)malloc(sizeof(LNode));
memset(p,0,sizeof(LNode));//清空内存
strcpy(p->data.id,id);
printf("\t姓名:");
scanf("%s",p->data.name);
printf("\t性别:");
scanf("%s",p->data.sex);
printf("\t年龄:");
scanf("%d",&p->data.age);
printf("\t学历:");
scanf("%s",p->data.edu);
printf("\t工资:");
scanf("%lf",&p->data.salary);
printf("\t电话:");
scanf("%s",p->data.phone);
printf("\t地址:");
scanf("%s",p->data.address);
break;
}
p->next=NULL;//表明这是链表的尾部结点
r->next=p;//将新建的结点加入链表尾部中
r=p;
return OK;
}
/***************************************************************************************
*功能描述:显示职工信息
*输入参数:p指针
*输出参数:职工各项信息
*返回值:无
***************************************************************************************/
void Display(Linklist L)//显示职工信息
{
LNode *p;
p=L->next;
if(p==NULL)
{
printf("\t现在没有职工信息,请先输入职工信息\n\n");
return;
}
printf("\t职工号\t姓名\t\t性别\t年龄\t学历\t工资\t电话\t地址\n\n");
while(p)
{
printf("\t%s\t",p->data.id);
printf("%s\t\t",p->data.name);
printf("%s\t",p->data.sex);
printf("%d\t",p->data.age);
printf("%s\t",p->data.edu);
printf("%0.2lf\t",p->data.salary);
printf("%s\t",p->data.phone);
printf("%s\t",p->data.address);
printf("\n");
p=p->next;
}
}
/***************************************************************************************
*功能描述:职工信息查询
*输入参数:a k
*输出参数:查找到的职工信息
*返回值:1
***************************************************************************************/
void Search(Linklist L)//职工信息查询
{
int a,k=0;
char name[10];
char id[20];
char phone[30];
printf("\t请输入查询方式(1按职工号查询,2按姓名查找):");
scanf("%d",&a);
if(a==1)
{
k=1;
printf("\t请输入查询职工号:");
scanf("%s",&id);
SearchID(L,id);//ID查询
}
if(a==2)
{
k=1;
printf("\t请输入查询职工姓名:");
scanf("%s",&name);
SearchName(L,name);//姓名查询
}
if(k==0)
{
printf("\t请输入正确的序号!\n");
}
}
/***************************************************************************************
*功能描述:职工号查询
*输入参数:职工工号 p指针 L
*输出参数:该职工各项信息
*返回值:1
***************************************************************************************/
int SearchID(Linklist L,char id[20])//职工号查询
{
LNode *p; p=L;
int k=0;
while(p)
{
if(strcmp(p->data.id,id)==0)
{
printf("\t职工号 %s\n",p->data.id);
printf("\t姓名 %s\n",p->data.name);
printf("\t性别 %s\n",p->data.sex);
printf("\t年龄 %d\n",p->data.age);
printf("\t学历 %s\n",p->data.edu);
printf("\t工资 %0.2lf\n",p->data.salary);
printf("\t电话 %s\n",p->data.phone);
printf("\t地址 %s\n",p->data.address);
k=1;
}
p=p->next;
}
if(k==0)
{
printf("\t对不起,没有您想要查找的人!\n");
}
return OK;
}
/***************************************************************************************
*功能描述:姓名查询
*输入参数:职工姓名 p指针
*输出参数:该职工各项信息
*返回值:1
***************************************************************************************/
int SearchName(Linklist L,char name[10])//姓名查询
{
LNode *p; p=L;
int k=0;
while(p)
{
if(strcmp(p->data.name,name)==0)
{
printf("\t职工号 %s\n",p->data.id);
printf("\t姓名 %s\n",p->data.name);
printf("\t性别 %s\n",p->data.sex);
printf("\t年龄 %d\n",p->data.age);
printf("\t学历 %s\n",p->data.edu);
printf("\t工资 %0.2lf\n",p->data.salary);
printf("\t电话 %s\n",p->data.phone);
printf("\t地址 %s\n",p->data.address);
k=1;
}
p=p->next;
}
if(k==0)
{
printf("\t对不起,没有您想要查找的人!\n");
}
return OK;
}
/***************************************************************************************
*功能描述:职工信息排序
*输入参数:b k
*输出参数:ID排序 ;姓名排序; 工资排序后的职工信息
*返回值:无
***************************************************************************************/
void Sort(Linklist L)//职工信息排序
{
int b,k=0;
printf("\t请输入排序方式(1按职工号排序,2按姓名排序,3按工资排序):");
scanf("%d",&b);
if(b==1)
{
k=1;
printf("\t按职工号排序为:\n");
SortID(L);//职工号排序
Display(L);
}
if(b==2)
{
k=1;
printf("\t按姓名排序为:\n");
SortName(L);//姓名排序
Display(L);//显示职工信息
}
if(b==3)
{
k=1;
printf("\t按工资排序为:\n");
SortSalary(L);//工资排序
Display(L);//显示职工信息
}
if(k==0)
{
printf("\t请输入正确的序号!\n");
}
}
/***************************************************************************************
*功能描述:职工号排序
*输入参数:p指针 q指针
*输出参数:按照职工号排序后各职工各项信息
*返回值:无
***************************************************************************************/
void SortID(Linklist L)//职工号排序
{
Linklist p,q;
struct employee temp;
for(p=L->next;p!=NULL;p=p->next)
{
for(q=p->next;q!=NULL;q=q->next)
{
if((strcmp(p->data.id,q->data.id)>0))
{
temp=q->data;
q->data=p->data;
p->data=temp;
}
}
}
}
/***************************************************************************************
*功能描述:姓名排序
*输入参数:p,q指针
*输出参数:按照姓名排序后各职工各项信息
*返回值:无
*其他说明:
***************************************************************************************/
void SortName(Linklist L)//姓名排序
{
Linklist p,q;
struct employee temp;
for(p=L->next;p!=NULL;p=p->next)
{
for(q=p->next;q!=NULL;q=q->next)
{
if((strcmp(p->data.name,q->data.name)>0))
{
temp=q->data;
q->data=p->data;
p->data=temp;
}
}
}
}
/***************************************************************************************
*功能描述:职工工资排序
*输入参数:p,q指针
*输出参数:按照职工工资排序后各职工各项信息
*返回值:无
***************************************************************************************/
void SortSalary(Linklist L)//职工工资排序
{
Linklist p,q;
struct employee temp;
for(p=L->next;p!=NULL;p=p->next)
{
for(q=p->next;q!=NULL;q=q->next)
{
if(p->data.salary>q->data.salary)
{
temp=q->data;
q->data=p->data;
p->data=temp;
}
}
}
}
/***************************************************************************************
*功能描述:插入信息
*输入参数:pre s 指针
*输出参数:职工信息
*返回值:1
*其他说明:
***************************************************************************************/
int Ins(Linklist L, char id[20])//插入信息
{
LNode *pre,*s;
int k=0;
pre=L;
while(pre->next!=NULL)
{
pre=pre->next;
if((strcmp( pre->data.id,id))==0)
{
k=1;
printf("\t对不起,要查找职工号已存在!\n");
}
}
if(k==0)
{
s=(LNode*)malloc(sizeof(LNode));
printf("\t请输入要插入员工信息\n");
printf("\t职工号:");
scanf("%s",&s->data.id);
printf("\t姓名:");
scanf("%s",&s->data.name);
printf("\t性别:");
scanf("%s",&s->data.sex);
printf("\t年龄:");
scanf("%d",&s->data.age);
printf("\t学历:");
scanf("%s",&s->data.edu);
printf("\t工资:");
scanf("%0.2lf",&s->data.salary);
printf("\t电话:");
scanf("%s",&s->data.phone);
printf("\t地址:");
scanf("%s",&s->data.address);
s->next=pre->next;
pre->next=s;
printf("\t插入员工信息成功!\n");
}
return OK;
}
/***************************************************************************************
*功能描述:更改信息
*输入参数: c k p指针
*输出参数:修改后的职工信息
*返回值:1
*其他说明:
***************************************************************************************/
int Alter(Linklist L,char id[20])//更改信息
{
int c;
int k=0;
LNode *p;
p=L;
while(p)
{
if(strcmp(p->data.id,id)==0)
{
k=1;
printf("\t原来的职工信息:\n");
printf("\t职工号 %s\n",p->data.id);
printf("\t姓名 %s\n",p->data.name);
printf("\t性别 %s\n",p->data.sex);
printf("\t年龄 %d\n",p->data.age);
printf("\t学历 %s\n",p->data.edu);
printf("\t工资 %0.2lf\n",p->data.salary);
printf("\t电话 %s\n",p->data.phone);
printf("\t地址 %s\n",p->data.address);
printf("\t请输入要修改的选项(1职工号,2姓名,3性别,4年龄\n");
printf(" \t 5学历,6工资,7电话,8地址):");
scanf("%d",&c);
switch(c)
{
case 1:
{
printf("\t请输入修改员工编号:",p->data.id);
scanf("%s",p->data.id);
printf("\t修改员工信息成功!\n");
break;
}
case 2:
{
printf("\t请输入员工修改姓名:",p->data.name);
scanf("%s",p->data.name);
printf("\t修改员工信息成功!\n");
break;
}
case 3:
{
printf("\t请输入员工修改性别:",p->data.sex);
scanf("%s",p->data.sex);
printf("\t修改员工信息成功!\n");
break;
}
case 4:
{
printf("\t请输入员工修改年龄:",p->data.age);
scanf("%d",&p->data.age);
printf("\t修改员工信息成功!\n");
break;
}
case 5:
{
printf("\t请输入员工修改学历:",p->data.edu);
scanf("%s",p->data.edu);
printf("\t修改员工信息成功!\n");
break;
}
case 6:
{
printf("\t请输入员工修改工资:",p->data.salary);
scanf("%lf",&p->data.salary);
printf("\t修改员工信息成功!\n");
break;
}
case 7:
{
printf("\t请输入员工修改电话:",p->data.phone);
scanf("%s",p->data.phone);
printf("\t修改员工信息成功!\n");
break;
}
case 8:
{
printf("\t请输入员工修改地址:",p->data.address);
scanf("%s",p->data.address);
printf("\t修改员工信息成功!\n");
break;
}
default:
printf("\t请输入正确序号!\n");
break;
}
}
p=p->next;
}
if(k==0)
{
printf("\t该职工号不存在!\n");
}
return OK;
}
/***************************************************************************************
*功能描述:按职工号删除
*输入参数:p r 指针
*输出参数:无
*返回值:1
*其他说明:
***************************************************************************************/
int Del(Linklist L,char id[20])//按ID删除
{
LNode *p; LNode *r;
p=L->next; r=L; while(!(strcmp(p->data.id,id)==0)&&p)
{
r=p;
p=p->next;
}
if(!p)
printf("\n删除位置不合理\n");
else
{
r->next=p->next;
free(p);
printf("删除成功!\n");
}
return 1;
}
/***************************************************************************************
*功能描述:将操作完成后的信息存储到文件
*输入参数:无
*输出参数:无
*返回值:无
***************************************************************************************/
void Save(Linklist L)
{
FILE *fpb2; //文件指针
LNode *p2;
fpb2=fopen("worker.txt","wb"); //把职工信息写入到文件中
for(p2=L->next; p2!=NULL; p2=p2->next)
fwrite(p2,sizeof(LNode),1,fpb2);
fclose(fpb2);
}
/***************************************************************************************
*功能描述:把文件中的职工信息读出来
*输入参数:无
*输出参数:无
*返回值:无
***************************************************************************************/
void Read(Linklist L)
{
FILE *fpb1; //文件指针
LNode *p1,*s1;
fpb1=fopen("worker.txt","rb"); //读方式打开职工文件
if(fpb1!=NULL)
{
p1=(Linklist)malloc(sizeof(LNode));
if(!p1)
exit(1);
p1->next=NULL;
while(fread(p1,sizeof(LNode),1,fpb1)==1)
{
if(L->next==NULL)
{
L->next=p1;
s1=p1;
}
else
{
s1->next=p1;
s1=p1;
}
p1=(Linklist)malloc(sizeof(LNode));
if(!p1)
exit(1);
p1->next=NULL;
}
}
}
2.main.cpp
#include<stdio.h>
#include<stdlib.h>
#include<string.H>
#include"D://head.h"
#define OK 1
#define ERROR 0
/***************************************************************************************
*功能描述:测试函数
*输入参数:你的选择
*输出参数:无
*返回值:0
*其他说明:完成各个函数测试,消息字段之间用分号(;)隔离
***************************************************************************************/
int main()//主函数
{
Linklist L;
int x=1;
int y;
char m;
char id[20];
Initlist(&L);//初始化单链表
Read(L);
while(x)
{
menu();
printf("\t请选择操作序号并按回车:");
scanf("%d",&y);
switch(y)
{
case 1:
{
system ("cls");//清空主界面
printf("\t*********************欢迎进入录入模块********************\n");
CreatList(L);//头插法生成单链表
do
{
printf("\t是否继续输入?(y/n):");
getchar();
scanf("%c",&m);
if(m=='y')
{
CreatList(L);//显示职工信息
}
}
while(m!='n');
printf("\t*******************欢迎下次进入录入模块******************\n");
break;
}
case 2:
{
system ("cls");//清空主界面
printf("\t*********************欢迎进入查询模块********************\n");
Search(L);//职工信息查询
do
{
printf("\t是否继续查询?(y/n):");
getchar();
scanf("%c",&m);
if(m=='y')
{
Search(L);//职工信息查询
}
}
while(m!='n');
printf("\t*******************欢迎下次进入查找模块******************\n");
break;
}
case 3:
{
system ("cls");//清空主界面
printf("\t*******************欢迎进入排序模块**********************\n");
Sort(L);
do
{
printf("\t是否继续查询?(y/n):");
getchar();
scanf("%c",&m);
if(m=='y')
{
Sort(L);
}
}
while(m!='n');
printf("\t*******************欢迎下次进入排序模块******************\n");
break;
}
case 4:
system ("cls");//清空主界面
printf("\t*********************欢迎进入插入模块********************\n");
printf("\t请输入要插入查找的职工号:");
getchar();
scanf("%s",&id);
Ins(L,id);//插入信息
do
{
printf("\t是否继续插入?(y/n):");
getchar();
scanf("%c",&m);
if(m=='y')
{
printf("\t请输入要插入查找的职工号:");
getchar();
scanf("%s",&id);
Ins(L,id);//插入信息
}
}
while(m!='n');
printf("\t*******************欢迎下次进入插入模块******************\n");
break;
case 5:
system ("cls");//清空主界面
printf("\t*********************欢迎进入显示模块********************\n");
printf("\t所有职工信息如下所示\n");
Display(L);//显示职工信息
printf("\t*******************欢迎下次进入显示模块******************\n");
break;
case 6:
system ("cls");//清空主界面
printf("\t*********************欢迎进入修改模块********************\n");
printf("\t请输入要修改员工职工号:");
getchar();
scanf("%s",&id);
Alter(L,id);//更改信息
do
{
printf("\t是否继续修改?(y/n):");
getchar();
scanf("%c",&m);
if(m=='y')
{
printf("\t请输入要修改员工职工号:");
getchar();
scanf("%s",&id);
Alter(L,id);//更改信息
}
}
while(m!='n');
printf("\t******************欢迎下次进入修改模块*******************\n");
break;
case 7:
system ("cls");//清空主界面
printf("\t*********************欢迎进入删除模块********************\n");
printf("\t请输入删除员工职工号:");
getchar();
scanf("%s",&id);
Del(L,id);//按职工号删除
do
{
printf("\t是否继续删除?(y/n):");
getchar();
scanf("%c",&m);
if(m=='y')
{
printf("\t请输入要删除员工职工号:");
getchar();
scanf("%s",&id);
Del(L,id);//按职工号删除
}
}
while(m!='n');
printf("\t******************欢迎下次进入删除模块*******************\n");
break;
case 8:
system("cls");
printf("\t*********************欢迎进入保存模块********************\n");
Save(L);//保存数据
printf("\t职工信息保存成功!\n");
printf("\t******************欢迎下次进入保存模块*******************\n");
break;
case 9:
system ("cls");//清空主界面
x=0;
printf("\t****************感谢您使用本系统,再见!*****************\n");
exit(0);
default:
printf("\t请输入正确序号!\n");
break;
}
}
return 0;
}
3。head
#define OK 1
#define ERROR 0
struct employee
{
char id[20];//职工号
char name[20];//姓名
char sex[20];//性别
int age;//年龄
char edu[20];//学历
double salary;//工资
char phone[30];//电话
char address[30];//地址
};
//存储结构
typedef struct LNode
{
struct employee data;
struct LNode* next;
}LNode, *Linklist;
void menu();//菜单函数
int Initlist(Linklist *L);//初始化单链表
int CreatList(Linklist L);//头插法生成单链表
void Display(Linklist L);//显示职工信息
void Search(Linklist L);//职工信息查询
int SearchID(Linklist L,char id[20]);//职工号查询
int SearchName(Linklist L,char name[10]);//姓名查询
void Sort(Linklist L);//职工信息排序
void SortID(Linklist L);//职工号排序
void SortName(Linklist L);//姓名排序
void SortSalary(Linklist L);//工资排序
int Ins(Linklist L, char id[20]);//插入信息
int Alter(Linklist L,char id[20]);//更改信息
int Del(Linklist L,char id[20]);//按职工号删除
void Save(Linklist L);//保存到文件
void Read(Linklist L);//读取信息
运行结果截图:
上一篇: 三天学会Spring?第二天!!!!
下一篇: Spring框架之AOP
推荐阅读
-
Android自定义View 使用PathMeasure简单模仿系统ProgressBar(四)
-
windows系统mysql5.7.18安装图文教程
-
Mac系统中的Mail邮件怎么关联163/Outlook邮箱?
-
有美食餐饮管理系统后台连接打印机的设置方法
-
Mac有哪些常用的快捷键?Mac系统快捷键进阶教程
-
微软Win7/Win8.1/Win10系统工具包Sysinternals(15.7)下载
-
笔记本开机进不去系统 错误代码0xc000000f的解决办法
-
玩Mac电脑必学:去除系统截图名的日期后缀
-
Win7系统如何开启/关闭无线路由器SSID广播?
-
XP系统设备管理器视频控制器VGA有黄色问号如何解决?