SCL-90检测系统 课程设计

多年前做的课程设计,今天在电脑里发现,分享出来供需要参考的同学查看。文件是C语言编写,注意源代码后缀名是.c,不要用visual studio编译。

   

/*
Curriculum Design Programme    SCL-90
要点
1.二级权限           2.用户基本信息        3.答题成绩       
4.做题输入方法 '1~5' 5.整体界面            6.函数模块化
7.文件储存与读取     
基本结构体
1.测试用户信息表
2.测试成绩信息
基本函数

清屏函数 system("cls");
清空输入缓存 fflush(stdin);
*/
#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "malloc.h"
#include "time.h"
typedef struct UserScore
{
	int QES[90];
	int SumScore;
	int Female_Num;
	int Male_Num;
	double Somatization;//躯体化1,4,12,27,40,42,48,49,52,53,56,58
	double Obsessive_Compulsive;//3,9,10,28,38,45,46,51,55,65
	double Interpersonal_Sensitivity;//6,21,34,36,37,41,61,69,73
	double Depression;//5,14,15,20,22,26,29,30,3l,32,54,7l,79
	double Anxiety;//2,17,23,33,39,57,72,78,80,86
	double Hostility;//11,24,63,67,74,8l
	double Photic_Anxiety;//13,25,47,50,70,75,82
	double Paranoididefition;//8,18,43,68,76,83
	double Psychotieism;//7,16,35,62,77,84,85,87,88,90
	double Others;//19,44,59,60,64,66,89
	double Male_Average;//(总分-阴性项目数)/阳性项目数
	char Severity_YN;
}UserScore;
typedef struct TestUser
{
	char name[40];
	char sex;
	int age;
	UserScore *score;
	struct TestUser *next;
}TestUser;

char *Question[90]={
"头痛",
"神经过敏,心中不踏实",
"头脑中有不必要的想法或字句盘旋",
"头晕或晕倒",
"对异性的兴趣减退",
"对旁人责备求全",
"感到别人能控制您的思想",
"责怪别人制造麻烦",
"忘性大",
"担心自己的衣饰整齐及仪态的端正",
"容易烦恼和激动",
"胸痛",
"害怕空旷的场所或街道",
"感到自己的精力下降,活动减慢",
"想结束自己的生命",
"听到旁人听不到的声音",
"发抖",
"感到大多数人都不可信任",
"胃口不好",
"容易哭泣",
"同异性相处时感到害羞不自在",
"感到受骗,中了圈套或有人想抓住您",
"无缘无故地突然感到害怕",
"自己不能控制地大发脾气",
"怕单独出门",
"经常责怪自己",
"腰痛",
"感到难以完成任务",
"感到孤独",
"感到苦闷",
"过分担忧",
"对事物不感兴趣",
"感到害怕",
"您的感情容易受到伤害",
"旁人能知道您的私下想法",
"感到别人不理解您、不同情您",
"感到人们对您不友好,不喜欢您",
"做事必须做得很慢以保证做得正确",
"心跳得很厉害",
"恶心或胃部不舒服",
"感到比不上他人",
"肌肉酸痛",
"感到有人在监视您、谈论您",
"难以入睡",
"做事必须反复检查",
"难以做出决定",
"怕乘电车、公共汽车、地铁或火车",
"呼吸有困难",
"一阵阵发冷或发热",
"因为感到害怕而避开某些东西、场合或活动",
"脑子变空了",
"身体发麻或刺痛",
"喉咙有梗塞感",
"感到前途没有希望",
"不能集中注意力",
"感到身体的某一部分软弱无力",
"感到紧张或容易紧张",
"感到手或脚发重",
"想到死亡的事",
"吃得太多",
"当别人看着您或谈论您时感到不自在",
"有一些不属于您自己的想法",
"有想打人或伤害他人的冲动",
"醒得太早",
"必须反复洗手、点数",
"睡得不稳不深",
"有想摔坏或破坏东西的想法",
"有一些别人没有的想法",
"感到对别人神经过敏",
"在商店或电影院等人多的地方感到不自在",
"感到任何事情都很困难",
"一阵阵恐惧或惊恐",
"感到公共场合吃东西很不舒服",
"经常与人争论",
"单独一人时神经很紧张",
"别人对您的成绩没有做出恰当的评价",
"即使和别人在一起也感到孤单",
"感到坐立不安心神不定",
"感到自己没有什么价值",
"感到熟悉的东西变成陌生或不像是真的",
"大叫或摔东西",
"害怕会在公共场合晕倒",
"感到别人想占您的便宜",
"为一些有关性的想法而很苦恼",
"您认为应该因为自己的过错而受到惩罚",
"感到要很快把事情做完",
"感到自己的身体有严重问题",
"从未感到和其他人很亲近",
"感到自己有罪",
"感到自己的脑子有毛病"
};
//Questions
int InterfacialOutput();//界面输出函数
int MainIndex(char e,TestUser *ListHead);//主索引函数
int TestUserCreate();//测试用户创建函数 
int QuestionAnswer(UserScore *sco);//回答问题函数
char TestUserLogin();//新用户注册或已测试用户登录界面
int AUserLogin();
int TestedUserLogin();//已测试用户搜索函数
int NumTestResultOutput(TestUser *,int);//查找出的指定用户成绩输出
int TestUserListOutput(TestUser *);//管理员用户列表
int FirstFileRead(TestUser *);//文件读
int FinishFileWrite(TestUser *);//文件写
int TestResultOutput(TestUser *);//用户成绩输出
int QESOutPut(TestUser *);//单独题目成绩输出
int GResultOutput(TestUser *);
int AResultOutput(TestUser *);
int DataDelete(TestUser*,int);//指定用户数据删除

int InterfacialOutput(TestUser *ListHead)
{
	fflush(stdin);
	system("cls");
	printf("------------------------------------------\n");
	printf("欢迎使用SCL-90心理测试系统\n\n\n");
	printf("测试用户登录请键入 ‘1’\n");
	printf("--管理员登录请键入 ‘2’\n");
	printf("----退出系统请键入 ‘e’\n\n");
	printf("------------------------------------------\n");
	printf("本程序由太原理工大学计算机科学与技术专业15级龙永臻设计与编写\n");
	printf("------------------------------------------\n");
	char Index;
	int re;
	Index=getch();//Index存储,并向主索引调用Index
	re=MainIndex(Index,ListHead);
	while(!re)//当re为0的时候,代表Index输入不正确,
	{
		Index=getch();	
		re=MainIndex(Index,ListHead);	
	}
	if(re==1)return 0;//当re为1的时候,代表一次使用完毕,返回主界面。
	if(re==2)return 1;//当re为2的时候,代表程序使用完毕退出系统。
}

int MainIndex(char e,TestUser *ListHead)
{
	char logselect;//用于在测试用户登录界面存储选择
	int select;//用于存储各项操作的选择
	switch(e)
	{
		case '1':
		{
			logselect=TestUserLogin();//进入测试用户注册登录界面
			switch(logselect)//测试用户登录界面各个分支选择
			{
				case 's'://已测试用户搜索自己成绩
				{
					select=TestedUserLogin(ListHead);//搜索成功返回序号,失败或取消返回0
					if(select)NumTestResultOutput(ListHead,select);
					else return 1;
				}
				case 'o':return 1;//返回上一层
				case 'n'://新用户登录并开始测试
				{
					TestUserCreate(ListHead);
					QuestionAnswer(ListHead->next->score);
					while(!GResultOutput(ListHead->next))
						//在用户选择返回主菜单前持续输出
						GResultOutput(ListHead->next);
					return 1;
				}
			}
			break;
		}
		case '2'://管理员选项
		{
			if(AUserLogin())
				select=TestUserListOutput(ListHead);//成绩列表输出并返回操作变量
			//如果select为零,则代表返回上一层,否则输出相应数据
			else return 1;
			if(select)
				while(select&&(!NumTestResultOutput(ListHead,select)))
					select=TestUserListOutput(ListHead);
			return 1;
			break;
		}
		case 'e':return 2;break;//退出程序选择,返回2
		default ://输入错误情况
			printf("键入错误,请重新键入\n");
			return 0;
	}
	return 1;
}
int QuestionAnswer(UserScore *sco)
{
	system("cls");
	sco->SumScore=0;
	sco->Female_Num=0;
	sco->Male_Num=0;
	sco->Severity_YN=0;
	int i;
	for (i = 0; i < 90; ++i)
	{
		fflush(stdin);
		system("cls");
		printf("问题%d:%s\n",i+1,Question[i]);
		printf("请根据自身情况输入数字:1-没有 2-很轻 3-中等 4-偏重 5-严重\n");
		int grade;
		while(fflush(stdin), scanf("%d", &grade) != 1)
		    printf("输入有误,请按格式输入数字 1~5!\n");
		while(!(grade>=1&&grade<=5))
		{
			printf("输入有误,请按格式输入数字 1~5\n");
			while(fflush(stdin), scanf("%d", &grade) != 1)
		   		printf("输入有误,请按格式输入数字 1~5!\n");
		}
		sco->QES[i]=grade;
		sco->SumScore+=grade;
		if(grade==1)//阴性项目
			sco->Female_Num++;
		else if(grade==2)//阳性项目
			sco->Male_Num++;
		else //严重项目,将存储是否严重的变量赋值y代表yes
		{
			sco->Male_Num++;
			sco->Severity_YN='y';
		}
	}
	sco->Somatization=(double)(	sco->QES[1-1]+sco->QES[4-1]+sco->QES[12-1]+
						sco->QES[27-1]+sco->QES[40-1]+sco->QES[42-1]+
						sco->QES[48-1]+sco->QES[49-1]+sco->QES[52-1]+
						sco->QES[53-1]+sco->QES[56-1]+sco->QES[58-1])/12;
	sco->Obsessive_Compulsive=(double)(	sco->QES[3-1]+sco->QES[9-1]+sco->QES[10-1]+
								sco->QES[28-1]+sco->QES[38-1]+sco->QES[45-1]+
								sco->QES[46-1]+sco->QES[51-1]+sco->QES[55-1]+sco->QES[65-1])/10;
	sco->Interpersonal_Sensitivity=(double)(sco->QES[6-1]+sco->QES[21-1]+sco->QES[34-1]+
									sco->QES[36-1]+sco->QES[37-1]+sco->QES[41-1]+
									sco->QES[61-1]+sco->QES[69-1]+sco->QES[73-1])/9;
	sco->Depression=(double)(	sco->QES[5-1]+sco->QES[14-1]+sco->QES[15-1]+
						sco->QES[20-1]+sco->QES[22-1]+sco->QES[26-1]+
						sco->QES[29-1]+sco->QES[30-1]+sco->QES[3l-1]+
						sco->QES[32-1]+sco->QES[54-1]+sco->QES[7l-1]+sco->QES[79-1])/13;
	sco->Anxiety=(double)(	sco->QES[2-1]+sco->QES[17-1]+sco->QES[23-1]+
					sco->QES[33-1]+sco->QES[39-1]+sco->QES[57-1]+
					sco->QES[72-1]+sco->QES[78-1]+sco->QES[80-1]+sco->QES[86-1])/10;

	sco->Hostility=(double)(	sco->QES[11-1]+sco->QES[24-1]+sco->QES[63-1]+
						sco->QES[67-1]+sco->QES[74-1]+sco->QES[8l-1])/6;
	sco->Photic_Anxiety=(double)(	sco->QES[13-1]+sco->QES[25-1]+sco->QES[47-1]+
							sco->QES[50-1]+sco->QES[70-1]+sco->QES[75-1]+sco->QES[82-1])/7;
	sco->Paranoididefition=(double)(sco->QES[8-1]+sco->QES[18-1]+sco->QES[43-1]+
							sco->QES[68-1]+sco->QES[76-1]+sco->QES[83-1])/6;
	sco->Psychotieism=(double)(	sco->QES[7-1]+sco->QES[16-1]+sco->QES[35-1]+
						sco->QES[62-1]+sco->QES[77-1]+sco->QES[84-1]+
						sco->QES[85-1]+sco->QES[87-1]+sco->QES[88-1]+sco->QES[90-1])/10;
	sco->Others=(double)(	sco->QES[19-1]+sco->QES[44-1]+sco->QES[59-1]+
					sco->QES[60-1]+sco->QES[64-1]+sco->QES[66-1]+sco->QES[89-1])/7;
	sco->Male_Average=(double)(sco->SumScore-sco->Female_Num)/sco->Male_Num;//阳性平均
	if(sco->Severity_YN=='n')//是否属于严重情况进行判定
	{
		if(sco->SumScore>160)sco->Severity_YN='y';
		else if(sco->Male_Num>43)sco->Severity_YN='y';
	}
}

int TestResultOutput(TestUser *tester)
{
	fflush(stdin);
	system("cls");
	printf("------------------------------------------------\n");	
	printf("个人信息\n");
	printf("姓名:%s\n",tester->name);
	printf("性别:%c\n",tester->sex);
	printf("年龄:%d\n\n",tester->age);
	printf("--------成绩------------------------------------\n");
	printf("----总分数:%-8d\n",tester->score->SumScore);
	printf("阴性项目数:%-8d\n",tester->score->Female_Num);
	printf("阳性项目数:%-8d\n",tester->score->Male_Num);
	printf("阳性平均数:%1.2f\n",tester->score->Male_Average);
	if(tester->score->Severity_YN=='y')//判定是否严重
		printf("某一项较为严重或者有较多项呈现阳性,应做进一步阳性筛查\n\n\n");
	printf("--------以下是各项因子分数----------------------\n");
	printf("躯体化(Somatization):                   %5.2f\n",tester->score->Somatization);
	printf("强迫症状(Obsessive  Compulsive:         %5.2f\n",tester->score->Obsessive_Compulsive);
	printf("人际关系敏感(interpersonal sensitivity):%5.2f\n",tester->score->Interpersonal_Sensitivity);
	printf("抑郁(depression):                       %5.2f\n",tester->score->Depression);
	printf("焦虑(anxiety):                          %5.2f\n",tester->score->Anxiety);
	printf("敌对(hostility):                        %5.2f\n",tester->score->Hostility);
	printf("恐怖(Photic anxiety):                   %5.2f\n",tester->score->Photic_Anxiety);
	printf("偏执(Paranoididefition):                %5.2f\n",tester->score->Paranoididefition);
	printf("精神病性(psychotieism):                 %5.2f\n",tester->score->Psychotieism);
	printf("附加项目(additionalitems):              %5.2f\n",tester->score->Others);
	printf("----------------------------------------\n");
	return 1;
}
int GResultOutput(TestUser *tester)//测试用户成绩输出后的引导界面
{
	if(TestResultOutput(tester))
	{
		printf("按 ‘e’返回主菜单,按‘s’查看单独题目成绩\n");
		char out=getch();
		while(out!='e'&&out!='s')
			out=getch();
		if(out=='s')
		{
			QESOutPut(tester);
			return 0;
		}
		return 1;
	}
}
int QESOutPut(TestUser *tester)//单独题目成绩输出
{
	system("cls");
	int i;
	for ( i = 0; i < 90; ++i)
	{
		printf("问题%d:%s\n",i+1,Question[i]);
		printf("分数:%d\n",tester->score->QES[i]);
	}
	printf("按‘e’返回上一层\n");
	char out=getch();
	while(out!='e')
		out=getch();
	return 1;
}

char TestUserLogin()//测试用户登录界面,索引
{
	printf("-------------用户登录--------\n");
	printf("新用户注册并开始测试请键入 ‘1’\n");
	printf("--已测试用户成绩查看请键入 ‘2’\n");
	printf("----------返回上一层请键入 ‘e’\n");
	char select;
	select=getch();
	while(!(select=='1'||select=='2'||select=='e'))
	{
		printf("选择有误,请重新选择\n");
		select=getch();
	}
	if(select=='1')
		select='n';
	else if (select=='2')
		select='s';
	else if(select=='e')
		select='o';
	return select;
}

int TestUserCreate(TestUser * ListHead)
{
	TestUser *new=(TestUser *)malloc(sizeof(TestUser));
	new->score=(UserScore *)malloc(sizeof(UserScore));
	printf("-------请输入个人信息-------\n\n\n");
	printf("姓名:");
	gets(new->name);
	printf("性别,男性请键入 ‘m’ 女性请键入‘f’\n");
	new->sex=getch();
	while(!(new->sex=='f'||new->sex=='m'))
	{
		printf("输入有误,重新选择\n");
		new->sex=getch();
	}
	printf("%c\n",new->sex);
	printf("年龄:");
	while(fflush(stdin), scanf("%d", &new->age)!= 1)
		printf("输入有误,请以数字输入真实年龄!\n");
	while(new->age>100||new->age<1)
	{
		printf("输入有误,请以数字输入真实年龄\n");
		while(fflush(stdin), scanf("%d", &new->age) != 1)
			printf("输入有误,请以数字输入真实年龄!\n");
	}
	new->next=ListHead->next;
	ListHead->next=new;
	printf("记录完成,按任意键开始实验\n");
	getch();
	return 1;
}//测试用户创建函数
int TestedUserLogin(TestUser *ListHead)//已测试用户搜索函数
{
	system("cls");
	printf("-------------------------------------\n");
	if(ListHead->next)
	{		
		char name[50];
		int num=0,i=1;
		printf("请输入您的姓名:");
		gets(name);
		fflush(stdin);
		TestUser *p=ListHead->next;
		for(;p;p=p->next,i++)
			if(!strcmp(name,p->name))num=i;//搜索并返回序号
		if(!num)
		{
			printf("无此用户数据,请检查输入,按任意键返回上一层\n");
			getch();
		}
		return num;//返回序号
	}
	else 
	{
		printf("数据为空!按任意键返回主菜单\n");
		getch();
		return 0;//搜索失败返回零
	}
}
int AUserLogin()
{
	system("cls");
	printf("-----------------------------\n");
	printf("请输入管理员密码:\n");
	int code;
	scanf("%d",&code);
	if (code!=94698)
	{
		printf("密码输入错误!按任意键返回主界面\n");
		getch();
		return 0;
	}
	else return 1;
}
int TestUserListOutput(TestUser *ListHead)//列表输出用户信息
{
	system("cls");
	TestUser *p;
	int i=1,select;
	if(ListHead->next)
	{
		for(p=ListHead->next,i=1;p;p=p->next,i++)
		{
			printf("%d.%s  年龄:%d",i,p->name,p->age);
			(p->sex=='m')?printf("性别:男\n"):printf("性别:女\n");
		}
		i--;
		printf("--------------------------------------------\n");
		printf("请输入要查看成绩的用户序号 1~%d\n,返回上一层请输入‘0’\n",i);
		for (;;)  //保证输入有效的判定
		{
			fflush(stdin);
			if((scanf("%d",&select)!=1)||(!(select>=0&&select<=i)))
			{
				printf("输入有误,请按格式输入数字序号 1~%d\n",i);
				continue;
			}
			else break;
		fflush(stdin);
		return select;
		}
	}
	else
	{
		printf("数据库中无数据!按任意键返回主菜单\n");
		getch();
		return 0;
	}
}
int NumTestResultOutput(TestUser *ListHead,int num)
{
	TestUser *p=ListHead;
	int i,select;
	for(i=0;i!=num;i++)p=p->next;
	select=AResultOutput(p);//管理员输出函数并返回操作变量
	while(!select)select=AResultOutput(p);//为零则代表退出
	if(select==2)
	{
		DataDelete(ListHead,num);//为2则执行删除操作
		return 0;
	}
	return 1;
}
int AResultOutput(TestUser *tester)
{
	if(TestResultOutput(tester))
	{
		printf("按 ‘e’返回主菜单,按‘s’查看单独题目成绩,按‘d’删除该条数据\n");
		char select=getch();
		while(select!='e'&&select!='s'&&select!='d')
			select=getch();
		if(select=='s')
		{
			QESOutPut(tester);
			return 0;
		}
		if(select=='d')return 2;
		return 1;
	}
}
int DataDelete(TestUser* ListHead,int num)
{
	TestUser *p=ListHead,*q;
	int i;
	for(i=0;i!=num-1;i++)p=p->next;
	q=p->next;
	p->next=q->next;
	free(q->score);
	free(q);
	printf("删除成功,按任意键返回上一次\n");
	getch();
	return 1;
}

int FirstFileRead(TestUser *ListHead)
{
	printf("-----------------------------------\n");
	printf("正在读取文件\n\n");
	FILE *data=fopen("data","rb");
	if(data==NULL)
	{
		data=fopen("data","wb");
		if(!fclose(data))
			printf("检测到无数据记录文件,创建新文件成功\n");
	}
	else
	{
		printf("检测到数据记录文件!\n");
		int result=0;
		do
		{
			TestUser *p=(TestUser *)malloc(sizeof(TestUser));
			result=fread(p,sizeof(TestUser),1,data);
			if(result==1)
			{
				p->score=(UserScore *)malloc(sizeof(UserScore));
				if(fread(p->score,sizeof(UserScore),1,data)!=1)
				{
					printf("读取出错!\n");
					getch();
					exit(0);
				}
				p->next=ListHead->next;
				ListHead->next=p;
			}
			else free(p);
		}while(result==1);
		if(ListHead->next)printf("读取数据成功\n");
		else printf("数据文件内没有用户数据\n");
	}
	printf("-----------------------------------\n");
	printf("按任意键进入程序\n");
	getch();
	return 1;
}
int FinishFileWrite(TestUser *ListHead)
{
	FILE *data=fopen("data","wb");
	if(ListHead->next)
	{
		TestUser *p=ListHead->next;
		for(;p;p=p->next)
		{
			if(fwrite(p,sizeof(TestUser),1,data)!=1)
				{printf("保存过程中出错!\n");break;}
			if(fwrite(p->score,sizeof(UserScore),1,data)!=1)
				{printf("保存过程中出错!\n");break;}
		}
	printf("-----------------------------------\n");
	printf("保存数据成功,按任意键结束程序\n");
	}
	else printf("无数据可储存,按任意键结束\n");
	fclose(data);
	getch();
	return 1;
}
int main()
{
	TestUser *ListHead=(TestUser *)malloc(sizeof(TestUser));
	ListHead->next=NULL;
	FirstFileRead(ListHead);
	while(!(InterfacialOutput(ListHead)))
		InterfacialOutput(ListHead);
	FinishFileWrite(ListHead);
	return 0;
}

 

你可能感兴趣的:(在校作品)