心里测试小项目
注:程序使用easyx函数库进行图形化编程,需下载并安装easyx库
一、前言
介绍
程序适合c语言学习初学者的一个实战项目实践,其中主要运用了easyx函数库进行页面的编译
参考资源
抑郁自评量表(SDS)
焦虑自评量表(SAS)
大学生心理健康调查表(UPI)
easyx帮助文档
编译环境
我使用的是Visual Studio 2015
Windows7和Windows11环境下进行编译
其他环境自行测试
运行效果图
二、头文件
#include<stdio.h>
#include<graphics.h>
#include<conio.h>
#include<stdlib.h>
#include <windows.h>
#include<string.h>
#include<mmsystem.h>
三、主要函数
void getdata(char *FileName);//处理表
void drawMenu();//菜单
void help();//说明
float JiSuan(int File, float fen);//计算分数
四、具体代码
FILE *data;
char answer[1010] = { 0 };
int main()
{
drawMenu();
}
void getdata(char * FlieName)
{
initgraph(800, 600);//建立窗口
setbkcolor(WHITE);
cleardevice();//刷新一次
char flien[100] = { "dataup\\" };
strcat(flien, FlieName);
if ((data = fopen(flien, "r")) == NULL)
{
settextcolor(BLACK);
settextstyle(30, 0, "楷体");//设置文字格式
setbkmode(TRANSPARENT);// 去掉文字背景
outtextxy(30, 30, "程序错误,请重新安装");
Sleep(1000);
exit(0);
}
char text[1010] = {0},*p=text;
int fen[10] = { 0 };//分值
float fens = 0;//分数
int anum = 0;//输出按钮数
char xuan[4][1010] = { 0 };//选项
while ((*(p++) = fgetc(data)) != '\n');//获取一行字符串
*(--p) = '\0';
if (strcmp(text,"head")==0)
while (1)
{
p = text;
while ((*(p++) = fgetc(data)) != '\n');//获取一行字符串
*(--p) = '\0';
if (*text == '!')//得到分值
{
int j = 1;
for (int i = 0; *(text + i); i++)
{
if (*(text + i) == '!')
{
fen[j++] = *(text + i + 1)-'0';
}
}
for (int i = 0; i <= 4; i++)
{
printf("fen[%d]=%d\n", i, fen[i]);
}
}
if (strcmp("???", text) == 0)//输出分数
{
int i = 0,fen1=(int)fens;
float x = 0;
char a[10] = { 0 };
int Flie = *FlieName - '0';
fens = JiSuan(Flie, fens);
printf("fens=%d\nFlie=%d",(int) fens,Flie);
a[1] = (int)fens % 10 + '0';
fens /= 10;
a[0] = (int)fens % 10 + '0';
settextcolor(BLACK);
settextstyle(80, 0, "楷体");//设置文字格式
setbkmode(TRANSPARENT);// 去掉文字背景
outtextxy(230, 30, "测试结束");
outtextxy(200, 150, "您的分数是");
settextcolor(RED);
outtextxy(350, 250, a);
settextstyle(50, 0, "楷体");//设置文字格式
outtextxy(200, 400, answer);
settextcolor(BLACK);
settextstyle(15, 0, "黑体");
outtextxy(355, 472, "点这返回");
MOUSEMSG m;
while (1)
{
m = GetMouseMsg();
if (m.x >= 300 && m.x <= 500 && m.y >= 470 && m.y <= 490) {
setlinecolor(RED);
rectangle(295, 465, 505, 495);
if (m.uMsg == WM_LBUTTONDOWN) {
break;
}
}
else {
setlinecolor(WHITE);
rectangle(295, 465, 505, 495);
}
}
fclose(data);
drawMenu();
}
if (*text != '#'&&*text != '*'&&*text != '!'&&*text !='+'&&*text !='-'&&*text !='?')//正常输出文字
{
int width = 0, height = 0;
width = textwidth(text);
height = textheight(text);
printf("w=%d,h=%d\n", width, height);//************
if (width < 780)//一行能够输出
{
settextcolor(BLACK);
settextstyle(15, 0, "黑体");//设置文字格式
setbkmode(TRANSPARENT);// 去掉文字背景
outtextxy(0, 10, text);
}
else
{
char *x = text;
int hang = 0;
while (*x != '\0')
{
char y[1010] = { 0 };
for (int i = 0; textwidth(y) < 780 && *x != '\0'; i++)
{
y[i] = *(x++);
y[i + 1] = '\0';
}
hang++;
settextcolor(BLACK);
settextstyle(15, 0, "楷体");//设置文字格式
setbkmode(TRANSPARENT);// 去掉文字背景
outtextxy(0, 10+(height*hang), y);
}
}
}
if (*text == '*'||*text>='0'&&*text<='9'||*text=='#')//输出按钮
{
MOUSEMSG m;
char a[1010] = { 0 };
p = a;
setfillcolor(LIGHTBLUE);
settextstyle(15, 0, "楷体");//设置文字格式
setbkmode(TRANSPARENT);// 去掉文字背景
if (*text == '*'|| *text == '#')
{
anum = *(text + 3) - '0';//输出按钮数个数
for (int i = 0; i < anum; i++)//选项
{
int j = 0;
while ((xuan[i][j++] = fgetc(data)) != '\n');//获取一行字符串
xuan[i][j - 1] = '\0';
}
}
if(*text != '#')
while (1) {
m = GetMouseMsg();
//
switch (anum)//输出按钮
{
case 4:
fillrectangle(300, 200, 500, 220);
outtextxy(370, 205, xuan[3]);
if (m.x >= 300 && m.x <= 500 && m.y >= 200 && m.y <= 220) {//
setlinecolor(RED);
rectangle(295, 195, 505, 225);
//111
if (m.uMsg == WM_LBUTTONDOWN) {
fens += fen[4];
goto over;
}
}
case 3:
fillrectangle(300, 240, 500, 260);
outtextxy(370, 245, xuan[2]);
if (m.x >= 300 && m.x <= 500 && m.y >= 240 && m.y <= 260 ){//
setlinecolor(RED);
rectangle(295, 235, 505, 265);
//222
if (m.uMsg == WM_LBUTTONDOWN) {
fens += fen[3];
goto over;
}
}
case 2:
fillrectangle(300, 280, 500, 300);
outtextxy(370, 280, xuan[1]);
if (m.x >= 300 && m.x <= 500 && m.y >= 280 && m.y <= 300 ) {
setlinecolor(RED);
rectangle(295, 275, 505, 305);
//333
if (m.uMsg == WM_LBUTTONDOWN) {
fens += fen[2];
goto over;
}
}
case 1:
fillrectangle(300, 320, 500, 340);
outtextxy(370, 320, xuan[0]);
if (m.x >= 300 && m.x <= 500 && m.y >= 320 && m.y <= 340 ) {
setlinecolor(RED);
rectangle(295, 315, 505, 345);
//444
if (m.uMsg == WM_LBUTTONDOWN) {
fens += fen[1];
goto over;
}
}
default:
setlinecolor(WHITE);
rectangle(295, 235, 505, 265);
rectangle(295, 275, 505, 305);
rectangle(295, 315, 505, 345);
rectangle(295, 195, 505, 225);
}
}
over:cleardevice();//刷新一次
}
}
//Sleep(100000);
}
void drawMenu()
{
MOUSEMSG m;
//菜单
initgraph(800, 600);
setbkcolor(WHITE);
cleardevice();//刷新一次
setfillcolor(LIGHTBLUE);
// 左边1 高1 左边2 高2
fillrectangle(300, 200, 500, 220);
fillrectangle(300, 240, 500, 260);
fillrectangle(300, 280, 500, 300);
fillrectangle(300, 390, 500, 410);
fillrectangle(300, 430, 500, 450);
fillrectangle(300, 470, 500, 490);
settextcolor(BLACK);
settextstyle(100, 0, "楷体");//设置文字格式
setbkmode(TRANSPARENT);// 去掉文字背景
outtextxy(250, 30, "必测试");
settextstyle(15, 0, "楷体");//设置文字格式
setbkmode(TRANSPARENT);// 去掉文字背景
outtextxy(360, 205, "焦虑症测验");
outtextxy(360, 245, "抑郁症测验");
outtextxy(360, 280, "心理健康测试");
outtextxy(380, 395, "说明");
outtextxy(380, 433, "退出");
outtextxy(355, 472, "不开心点这里");
settextcolor(BLACK);
settextstyle(45, 0, "楷体");
while (1) {
//
//
m = GetMouseMsg();
//
if (m.x >= 300 && m.x <= 500 && m.y >= 200 && m.y <= 220) {//
setlinecolor(RED);
rectangle(295, 195, 505, 225);
//111
if (m.uMsg == WM_LBUTTONDOWN) {
getdata("1.txt");
}
}
else if (m.x >= 300 && m.x <= 500 && m.y >= 240 && m.y <= 260) {//
setlinecolor(RED);
rectangle(295, 235, 505, 265);
//222
if (m.uMsg == WM_LBUTTONDOWN) {
getdata("2.txt");
}
}
else if (m.x >= 300 && m.x <= 500 && m.y >= 280 && m.y <= 300) {
setlinecolor(RED);
rectangle(295, 275, 505, 305);
//333
if (m.uMsg == WM_LBUTTONDOWN) {
getdata("3.txt");
}
}
else if (m.x >= 300 && m.x <= 500 && m.y >= 390 && m.y <= 410) {
setlinecolor(RED);
rectangle(295, 385, 505, 415);
//说明
if (m.uMsg == WM_LBUTTONDOWN) {
help();
}
}
else if (m.x >= 300 && m.x <= 500 && m.y >= 430 && m.y <= 450) {
setlinecolor(RED);
rectangle(295, 425, 505, 455);
//退出
if (m.uMsg == WM_LBUTTONDOWN) {
exit(0);
}
}
else if (m.x >= 300 && m.x <= 500 && m.y >= 470 && m.y <= 490) {
setlinecolor(RED);
rectangle(295, 465, 505, 495);
//happy
if (m.uMsg == WM_LBUTTONDOWN) {
happy();
}
}
else {
setlinecolor(WHITE);
rectangle(295, 235, 505, 265);
rectangle(295, 275, 505, 305);
rectangle(295, 315, 505, 345);
rectangle(295, 195, 505, 225);
rectangle(295, 385, 505, 415);
rectangle(295, 425, 505, 455);
rectangle(295, 465, 505, 495);
}
}
getchar();
closegraph();
}
void help()//说明
{
system("datad\\说明.txt");
}
void happy()//鸡汤
{
system("datad\\happy.txt");
}
float JiSuan(int File, float fen)
{
if (File == 1)
{
fen = fen*1.25;
if ((int)fen > 50)
strcpy(answer, "您需要重视了!!!");
else
strcpy(answer, "您很健康哦!!!");
}
else if (File == 2)
{
float fens=fen;
fens = fens / 80;
if(fens<0.5)
strcpy(answer, "您很健康哦!!!");
else if(fens<=0.59)
strcpy(answer, "您有轻微至轻度抑郁!!!");
else if(fens<=0.69)
strcpy(answer, "您有中至重度抑郁!!!");
else if(fens<=1)
strcpy(answer, "您有重度抑郁!!!");
}
else if (File == 3)
{
if(fen>25)
strcpy(answer, "您需要进引起重视了");
else if(fen>=20)
strcpy(answer, "您没有严重心理卫生问题");
else
strcpy(answer, "您没有任何心理卫生问题");
}
else if (File == 4)
{
}
else
{
strcpy(answer, "程序出错请尝试重新安装");
fen = 0;
}
return fen;
}
五、其他文件
1.txt
head
焦虑自评量表(Self-Rating Anxiety Scale SAS)由华裔教授Zung编制(1971).从量表构造的形式到具体评定的 方法,都与抑郁自评量表(SDS)十分相似,是一种分析病人主观症状的相当简便的临床工具.由于焦虑是心理咨询门诊中较 常见的一种情绪障碍,所以近年来SAS是咨询门诊中了解焦虑症状的常用量表. 注意事项:下面有20条文字,请仔细阅读每一条,把意思弄明白,然后根据您最近一星期的实际感觉
1
开始测试
!0!0!0!0
#**4
没有或很少有
有时有
大部分时间有
绝大部分时间有
!1!2!3!4.
1我觉得比平常容易紧张和着急。
2我无缘无故地感到害怕。
3我容易心里烦乱或觉得惊恐。
4我觉得我可能将要发疯。
!4!3!2!1.
5我觉得一切都很好,也不会发生什么不幸。
!1!2!3!4.
6我手脚发抖打颤。
7我因为头痛,颈痛和背痛而苦恼。
8我感觉容易衰弱和疲乏。
!4!3!2!1.
9我觉得心平气和,并且容易安静坐着。
!1!2!3!4.
10我觉得心跳很快。
11我因为一阵阵头晕而苦恼。
12我有晕倒发作或觉得要晕倒似的。
!4!3!2!1.
13我呼气吸气都感到很容易。
!1!2!3!4.
14我手脚麻木和刺痛。
15我因为胃痛和消化不良而苦恼。
16我常常要小便。
!4!3!2!1.
17我的手常常是干燥温暖的。
!1!2!3!4.
18我脸红发热。
!4!3!2!1.
19我容易入睡并且一夜睡得很好。
!1!2!3!4.
20*我做恶梦。
!0!0!0!0
***1
完成测试
???
1
end
2.txt
head
自评抑郁量表(Self-Rating Depression Scale SDS)由华裔教授William W.K.Zung编制(1965)。为自评量 表用于衡量抑郁状态的轻重程度及其在治疗中的变化。评定时间跨度为最近—周。 SDS由20个陈述句和相应问题条目组成,反映抑郁状态四组特异性症状:(1)精神性一情感症状,包含抑郁心境和哭泣2个条目;(2)躯体性障碍,包含情绪的日间差异、睡眠障碍、食欲减退、性欲减退、体重减轻、便秘、心动过速、易疲劳共8个条目;(3)精神运动性障碍,包含思考困难和能力减退2个条目;(4)抑郁的心理障碍,包含思维混乱、无望感、易激惹、犹豫不决、自我贬值、空虚感、反复思考自杀和不满足,共8个条目。
1
开始测试
!0!0!0!0
#**4
没有或很少有
有时有
大部分时间有
绝大部分时间有
!1!2!3!4.
1我感到情绪沮丧,郁闷
!4!3!2!1.
2我感到早晨心情最好
!1!2!3!4.
3我要哭或想哭
4我夜间睡眠不好
!4!3!2!1.
5我吃饭象平时一样多
6我的性功能正常
!1!2!3!4.
7我感到体重减轻
8我为便秘烦恼
9我的心跳比平时快
10我无故感到疲劳
!4!3!2!1.
11我的头脑象往常一样清楚
12我做事情象平时一样不感到困难
!1!2!3!4.
13我坐卧不安,难以保持平静
!4!3!2!1
14我对未来感到有希望
!1!2!3!4.
15我比平时更容易激怒
!4!3!2!1
16我觉得决定什么事很容易
17我感到自己是有用的和不可缺少的人
18我的生活很有意义
!1!2!3!4.
19假若我死了别人会过得更好
20*我仍旧喜爱自己平时喜爱的东西
!0!0!0!0
***1
完成测试
???
2
end
3.txt
head
UPI是University Personality Inventory的简称,是为了早期发现早期治疗有心理问题的学生而编制的大学 生精神卫生、人格健康调查表。该表1966年由日本大学的心理咨询专家与精神科医生集体编制而成。为我国高校应用最早也最为广泛的心理普查量表之一,主要以大学新生为对象,入学时作为心理健康调查而使用。有利于有心理问题的学生的早期发现,并提供及时的帮助和必要的治疗,同时起到心理卫生的宣传作用,有助于学生了解心理问题的表现,增强心理保健的意识。
1
开始测试
!0!0!0!0
#**2
是
否
!1!0.
1食欲不振
2恶心、胃口难受、肚子疼
3容易拉肚子或便秘
4关注心悸和脉搏
!0!0.
5身体健康状况良好
!1!0.
6牢骚和不满多
7父母期望过高
8自己的过去和家庭是不幸的
9过于担心将来的事情
10不想见人
11觉得自己不是自己
12缺乏热情和积极性
13悲观
14思想不集中
15情绪起伏过大
16常常失眠
17头疼
18脖子、肩膀酸痛
19胸疼憋闷
!0!0.
20总是朝气蓬勃的
!1!0.
21气量小
22爱操心
23焦躁不安
24容易动怒
25活着没意思
26对任何事都没有兴趣
27记忆力减退
28缺乏耐力
29缺乏决断能力
30过于依赖别人
31为脸红而苦恼
32口吃,声音发颤
33身体忽冷忽热
34注意排尿和性器官
!0!0.
35心情开朗
!1!0.
36莫名其妙地不安
37一个人独处时感到不安
38缺乏自信心
39办事畏首畏尾
40容易被人误解
41不相信别人
42过于猜疑
43厌恶交往
44感到自卑
45杞人忧天
46身体倦乏
47一着急就出冷汗
48站起来就头晕
49有过失去意识,抽筋
!0!0.
50人缘好受欢迎
!1!0.
51过于拘泥
52为忧郁不决而苦恼
53对脏很在乎
54摆脱不了毫无意义的想法
55觉得自己有怪气味
56别人在自己背后说坏话
57总注意周围的人
58在乎别人视线
59觉得别人轻视自己
60*情绪容易被破坏
!0!0!0!0
***1
完成测试
???
3
end
happy.txt
心情,是一种感情状态,拥有了好心情,也就拥有了自信,
继而拥有了年轻和健康。就拥有了对未来生活的向往,充满
期待,让我们拥有一份好心情吧,因为生活着就是幸运和快乐。
你可以在这里留下想对自己说的话(⊙o⊙)哦
说明.txt
在社会快速发展的现在,人们的心理健康问题变得越来越严 重。很多因为心理疾病已经影响了正常的生活,但却对自身的心 理问题不知情,等到去往医院检查之时已经变得异常严重了,固 此程序的设计初衷是为了让人们在家就能够了解自己的心里状况
能够对自己的心里状态进行更好的调整。程序主要进行一些心理测试 分别为UPI、SDS、SAS
UPI是University Personality Inventory的简称,是为了早期
发现早期治疗有心理问题的学生而编制的大学生精神卫生、人格 健康调查表。该表1966年由日本大学的心理咨询专家与精神科医
生集体编制而成。为我国高校应用最早也最为广泛的心理普查量 表之一,主要以大学新生为对象,入学时作为心理健康调查而使
用。有利于有心理问题的学生的早期发现,并提供及时的帮助和 必要的治疗,同时起到心理卫生的宣传作用,有助于学生了解心
理问题的表现,增强心理保健的意识。自评抑郁量表(Self-Rating Depression Scale SDS)由华裔教 授William
W.K.Zung编制(1965)。为自评量表用于衡量抑郁 状态的轻重程度及其在治疗中的变化。评定时间跨度为最近—周。
SDS由20个陈述句和相应问题条目组成,反映抑郁状态四组特异 性症状:(1)精神性一情感症状,包含抑郁心境和哭泣2个条目;
(2)躯体性障碍,包含情绪的日间差异、睡眠障碍、食欲减退、 性欲减退、体重减轻、便秘、心动过速、易疲劳共8个条目;
(3)精神运动性障碍,包含思考困难和能力减退2个条目; (4)抑郁的心理障碍,包含思维混乱、无望感、易激惹、犹豫不
决、自我贬值、空虚感、反复思考自杀和不满足,共8个条目。焦虑自评量表(Self-Rating Anxiety Scale SAS)由华裔教授Zu ng编制(1971).从量表构造的形式到具体评定的
方法,都与抑郁 自评量表(SDS)十分相似,是一种分析病人主观症状的相当简便的 临床工具.由于焦虑是心理咨询门诊中较 常见的一种情绪障碍,
所以近年来SAS是咨询门诊中了解焦虑症状的常用量表.
作者留言
printf("代码写的不怎么样,如有不懂的地方欢迎留言,看到了都会回复的。
欢迎各位兄弟姐妹们过来学习交流,让我们一起进步");