初学者c语言心里测试小项目

心里测试小项目

注:程序使用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("代码写的不怎么样,如有不懂的地方欢迎留言,看到了都会回复的。
欢迎各位兄弟姐妹们过来学习交流,让我们一起进步");
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

球团

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值