精华内容
下载资源
问答
  • 循环系统ppt

    2012-11-05 09:28:10
    人体血液循环及血管包括动脉静脉的组织学基础ppt
  • 目前,该公司采用开放式系统的基本朗肯循环。锅炉原水源从附近的河流泵入后备池进行进一步的内部和外部处理。 锅炉产生的过热蒸汽用于运行汽轮机,用于发电和工厂的热过程。 然后,将涡轮机排出的蒸汽冷凝,然后排...
  • 利用南京市2004-2009年居民死亡资料和同期气象资料,分析了2004-2009年南京市呼吸系统和循环系统疾病死亡人数的年内变化规律,在计算3种人体舒适度基础上研究了上述两大系统疾病死亡人数与气象因子(包括气象要素及人体...
  •  系统工作原理 由于太阳能热水器的工作环境限制,将下位机(PIC16F877)置于集热现场,主要实现温度采集功能,温差循环控制功能,即控制循环泵、上水阀、辅助电加热器、伴热带的启停,并与上位机(PIC16F877)进行...
  • 根据区域创新网络内各个行为主体关系等,提出了包含自主创新机制、互动创新机制、资源流动与优化配置机制在内的区域创新网络关键运行机制体系,并引入"系统思考",设计了三个关键运行机制的系统循环图,指出了激发其良性...
  • 行业资料-电子功用-控温循环装置及包含该装置的凝胶电泳系统
  • 行业-电子政务-包括风电和燃气联合循环机组的热电联产系统及方法.zip
  • 根据区域创新网络内各个行为主体关系等,提出了包含自主创新机制、互动创新机制、资源流动与优化配置机制在内的区域创新网络关键运行机制体系,并引入“系统思考”,设计了三个关键运行机制的系统循环图,指出了激发其...
  • 行业-电子政务-包括风电和燃气联合循环机组的冷电联产系统及方法.zip
  • 启明星MRBS与启明星Book最大的区别是:启明星MRBS支持循环例会功能(包括循环,周循环,月循环和年循环),来满足你更多的要求。 启明星循环会议预定系统MRBS v31.0更新日志启明星会议室预定系统MRBS截图,新版本...
  • 电信设备-可循环使用的页面介质和包含平整装置的信息记录处理系统.zip
  • shell数组循环 测试shell数组,循环的例子: arr=(a b c) echo 所有的内容如下:${arr[@]} echo 数组的长度:${#arr[*]} ... 您可能感兴趣的文章:Shell获取字符串长度的多种方法总结用Shell判断字符串包含
  • 循环码的Matlab仿真代码 学生卫星项目 - 印度理工学院,孟买 基于星跟踪器的姿态确定系统 (STADS) 该存储库包含 STADS 开环仿真的代码。 笔记 始终从根文件夹运行 - .\ 在 MATLAB 的命令窗口中输入pwd 。 ans = "......
  • 包括:录入、查询、排序等功能。 要求: 用数据文件保存学生基本信息(学号 姓名 课程1 课程2 课程3…) ,利用菜单可以循环实现各个功能。 进一步要求*: (1) 能够实现增加、删除、修改功能; (2) 能够实现统计功能等...

    欢迎关注我的公众号【软件大爆炸】
    用C语言实现一个学生成绩管理系统
    题目: 学生成绩管理系统
    功能: 实现学生信息管理。包括:录入、查询、排序等功能。
    要求: 用数据文件保存学生基本信息(学号 姓名 课程1 课程2 课程3…) ,利用菜单可以循环实现各个功能。
    进一步要求*: (1) 能够实现增加、删除、修改功能;
    (2) 能够实现统计功能等。
    思路简介: 要采用模块化思想,对不同的功能编写不同的函数进行实现
    不足之处: 没有查重处理,需要进一步完善
    比如此结构体中,定义有学号,在函数查找、修改等功能中也是通过学号来查找。
    没有查重则对结果影响比较大。举例来说,原本数据存有学号为 20190156 的学生
    。当你选择增加数据且再次输入一个学号为 20190518 的学生数据时,程序并不会
    报错,只是默默的存在在数据文件中。所以这就带来了很大的隐患。当你继续选择
    查找功能时,假如你输入的学号是 20190518 ,这时候计算机就不知道怎么处理了
    。在实际生活中情况可能更复杂,带来更大的隐患。所以应该增加查重环节并对数
    据进一步处理。

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>   //提供 exit() 函数支持  
    #define SIZE 100000
    //#include"conio.h"
    
    //声明函数原型
    void finput();    //存入数据
    void flist();     //输出数据
    void fsearch();   //查找数据
    void fadden();    //增加数据
    void fchange();   //修改数据
    void ftaxis();    //数据排序
    void stat();      //统计数据
    
    //定义结构体 
    struct student 
    {
    	int num;        //存放
    	char name[10];  //定义名字数组变量
    	int C;          //C 语言成绩
    	int Maths;      //数学课成绩
    	int En;         //英语课成绩
    	float ave;      //三门课平均成绩
    } stu[SIZE];        //在定义结构体时同时声明结构体变量
    
    int main() 
    {
    	int n;
    	for(;;)          //使程序能够循环,在循环内部判断何时结束 
    	{
    		printf("\n\n");        //与上次的输出结果保持间隔,便于美观 
    		printf("	_________________________________\n");//菜单输出 
    		printf("	|           MENU                |\n");
    		printf("	|       1.Input data            |\n");               
    		printf("	|       2.Output data           |\n");
    		printf("	|       3.Search data           |\n");
    		printf("	|       4.Add data              |\n");
    		printf("	|       5.Revise data           |\n");
    		printf("	|       6.Sort data             |\n");
    		printf("	|       7.Statistics            |\n");
    		printf("	|       8.  quit                |\n");
    		printf("	|_______________________________|\n");
    		printf("  Please choose your function:(1-8):");          //功能选择 
    		scanf("%d",&n);
    		printf("\n");
    		if(n>0&&n<=8) {
    			switch(n) {
    				case 1:
    					finput();
    					break;
    				case 2:
    					flist();
    					break;
    				case 3:
    					fsearch();
    					break;
    				case 4:
    					fadden();
    					break;
    				case 5:
    					fchange();
    					break;
    				case 6:
    					ftaxis();
    					break;
    				case 7:
    					stat();
    				case 8:		 
    		printf("\n    ~~~~~~~~~~~~~~~~~~~~~~~~~~\n");     //退出提示
    		printf("             Goodbye!         \n");
    		printf("    ~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
    					exit(0);//将程序退出 
    			}
    		} else //没有按规范选择功能,要进行错误提示     //错误提示
    		{
    		printf("\n    ~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
    		printf("           error input!       \n");
    		printf("    ~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
    //			break; //应该将这一句话去掉才能使在输错的情况下也进行菜单循环 
    		}
    	}
    	return 0;
    }
    /*
    主函数部分结束 
    */ 
    
    
    /*
    下面是模块化设计
    每个功能对应一个函数 
    */ 
    
    //part 1 : 进行信息录入 
    void finput() 
    {
    	FILE *fp;            //声明指针变量 
    	int i,p;
    	fp=fopen("grades","wb");          //首次打开文件, 若没有文件将会自动创建新文件 
    	for(i=0; i<SIZE; i+1) 
    	{
    		printf("1 to continue and 0 to end input: ");        //询问是否继续输入 
    		scanf("%d",&i);
    		if(i==0) 
    		{
    			fclose(fp);
    			return;
    		} 
    		else {
    			printf("Please inut your school number, C grade, Math grade, English grade:\n");
    			scanf("%d%s%d%d%d",&stu[i].num,stu[i].name,&stu[i].C,&stu[i].Maths,&stu[i].En);
    			stu[i].ave=(stu[i].C+stu[i].Maths+stu[i].En)/3.0;
    			fwrite(&stu[i],sizeof(struct student),1,fp);
    		}
    	}
    	fclose(fp);         //记得关闭文件,这是一个好习惯! 
    }
    
    
    //part 2: 将结果输出 
    void flist() 
    {
    	FILE *fp;
    	int i;
    	fp=fopen("grades","rb");
    	printf("____________________________________________________________________________________________________\n"); 
    	printf("|                                                  Report                                           |\n");
    	printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");
    	printf("|        ID      |    name   |    C grade    |    Math grade   |   English grade   |    Average     |\n");
    	printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");
    	for(i=0; fread(&stu[i],sizeof(struct student),1,fp)==1; i++) 
    		printf("|%11d%15s%13d%17d%18d%19.2f\n",stu[i].num,stu[i].name,stu[i].C,stu[i].Maths,stu[i].En,stu[i].ave);
    		/*
    		此处采用字宽输入比加空格更好, 因为若是使用空格输入,当学号或者名字前后输入的长度不一致时,格式会乱掉,导致无法对其格式 
    		*/ 
    	printf("|___________________________________________________________________________________________________|\n\n");
    	fclose(fp);
    }
    
    //part 3:查找数据 
    void fsearch() 
    {
    	FILE *fp;
    	int i,num,flag=0;//flag 用来判断是否需要进行错误提示 
    	fp=fopen("grades","rb");
    	rewind(fp);
    	printf("Which one are you searching? Input the School number: ");
    	scanf("%d",&num);
    	
    	for(i=0; i<=SIZE; i++)
    	{
    		if(stu[i].num==num) 
    		{
    			printf("____________________________________________________________________________________________________\n");//与上文采用相同的输出格式,会显得统一整洁 
    			printf(" Here are the rusults                                                                               \n");
    			printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");
    			printf("|        ID      |    name   |    C grade    |    Math grade   |   English grade   |    Average     \n");
    			printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");
    			printf("|%11d%15s%13d%17d%18d%19.2f\n",stu[i].num,stu[i].name,stu[i].C,stu[i].Maths,stu[i].En,stu[i].ave);
    			printf("|__________________________________________________________________________________________________|\n\n");
    			flag+=1;
    		}
    	}
    	if(flag==0)
    	{
    		printf("\n    ~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
    		printf("           error input!       \n");
    		printf("    ~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
    	}
    //	printf("___________________________________________________________________________________________________________\n\n");
    	fclose(fp);
    }
    
    //part 4:增加数据 
    void fadden() 
    {
    	int i,s;
    	FILE *fp;
    	fp=fopen("grades","ab+");
    	rewind(fp);
    	printf("___________________________________________________________________________ ________________________\n");
    	printf("|                                                  Report                                          |\n");
    	printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");
    	printf("|        ID      |    name   |    C grade    |    Math grade   |   English grade   |    Average     \n");
    	printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");
    	for(i=0; fread(&stu[i],sizeof(struct student),1,fp)==1; i++) 
    		printf("|%11d%15s%13d%17d%18d%19.2f\n",stu[i].num,stu[i].name,stu[i].C,stu[i].Maths,stu[i].En,stu[i].ave);
    	printf("____________________________________________________________________________________________________\n");
    	s=i;	         //记录学号位置,从此处开始增加新的数据 
    	for(i=s; i<SIZE; i++) {
    		printf("1 to continue and 0 to end input: ");
    		scanf("%d",&i);
    		if(i==0) 
    		{
    			fclose(fp);
    			return;
    		} else 
    		{
    			printf("Please inut your school number, C grade, Math grade, English grade:\n");
    			scanf("%d%s%d%d%d",&stu[i].num,stu[i].name,&stu[i].C,&stu[i].Maths,&stu[i].En);
    			stu[i].ave=(stu[i].C+stu[i].Maths+stu[i].En)/3.0;
    			fwrite(&stu[i],sizeof(struct student),1,fp);
    		}
    	}
    	fclose(fp);
    }
    
    //part 5:修改数据 
    void fchange() 
    {
    	FILE *fp;
    	int i,num,n;
    	int flag=0;
    	printf("Which one are you searching? Input the School number: ");
    	scanf("%d",&num);
    	printf("\n");
    	for(i=0; i<=SIZE; i++)
    		if(stu[i].num==num) 
    		{
    			printf("____________________________________________________________________________________________________\n");
    			printf("|                                                  Report                                           |\n");
    			printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");
    			printf("|        ID      |    name   |    C grade    |    Math grade   |   English grade   |    Average     |\n");
    			printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");
    			printf("|%11d%15s%13d%17d%18d%19.2f\n",stu[i].num,stu[i].name,stu[i].C,stu[i].Maths,stu[i].En,stu[i].ave);
    			printf("|___________________________________________________________________________________________________|\n\n");
    			n=i;
    			flag=1;
    			break;
    		}
    	if(flag==0) {
    		printf("\n    ~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
    		printf("           error input!       \n");
    		printf("    ~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
    		return;
    	}
    	printf("\n\n");
    	fp=fopen("grades","rb+");
    	fseek(fp,n*sizeof(struct student),0);
    	printf("Please inut your school number, C grade, Math grade, English grade:\n");
    	scanf("%d%s%d%d%d",&stu[i].num,stu[i].name,&stu[i].C,&stu[i].Maths,&stu[i].En);
    	stu[i].ave=(stu[i].C+stu[i].Maths+stu[i].En)/3.0;
    	fwrite(&stu[i],sizeof(struct student),1,fp);
    	fclose(fp);
    	fp=fopen("grades","rb");
    	printf("_______________________________________________________________________________ _____________________\n");
    	printf("|                                                  Report                                           |\n");
    	printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");
    	printf("|        ID      |    name   |    C grade    |    Math grade   |   English grade   |    Average     |\n");
    	printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");
    	for(i=0; fread(&stu[i],sizeof(struct student),1,fp)==1; i++) 
    	{
    		printf("|%11d%15s%13d%17d%18d%19.2f\n",stu[i].num,stu[i].name,stu[i].C,stu[i].Maths,stu[i].En,stu[i].ave);
    	}
    	printf("|___________________________________________________________________________________________________|\n");
    	fclose(fp);
    }
    
    //part 6:按平均成绩进行排序 
    void ftaxis() 
    {
    	int i,j,n;
    	FILE *fp;
    	struct student t;
    	fp=fopen("grades","rb");
    	printf("____________________________________________________________________________________________________ \n");
    	printf("|                                                  Report                                           |\n");
    	printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");
    	printf("|        ID      |    name   |    C grade    |    Math grade   |   English grade   |    Average     |\n");
    	printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");
    	for(i=0; fread(&stu[i],sizeof(struct student),1,fp)==1; i++)
    		printf("|%11d%15s%13d%17d%18d%19.2f\n",stu[i].num,stu[i].name,stu[i].C,stu[i].Maths,stu[i].En,stu[i].ave);
    	printf("|___________________________________________________________________________________________________|\n\n");
    	fclose(fp);
    	n=i;
    	for(i=0; i<n; i++)
    		for(j=i+1; j<n; j++)
    			if(stu[i].ave<stu[j].ave) {
    				t=stu[i];
    				stu[i]=stu[j];
    				stu[j]=t;
    			}
    	fp=fopen("grades","wb");
    	printf("\n\n\n");
    	printf("_____________________________________________________________________________________________________\n");
    	printf("|                                                  Report                                           |\n");
    	printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");
    	printf("|        ID      |    name   |    C grade    |    Math grade   |   English grade   |    Average     |\n");
    	printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");
    	for(i=0; i<n; i++) {
    		fwrite(&stu[i],sizeof(struct student),1,fp);
    		printf("|%11d%15s%13d%17d%18d%19.2f\n",stu[i].num,stu[i].name,stu[i].C,stu[i].Maths,stu[i].En,stu[i].ave);
    	}
    	printf("|___________________________________________________________________________________________________|\n");
    	fclose(fp);
    }
    
    //part 6: 统计指定分数之上的人数
    void stat()
    {
    	FILE *fp;
    	int i,num,flag=0,count=0;//flag 用来判断是否需要进行错误提示, count用来统计个数
    	float score_; 
    	fp=fopen("grades","rb");
    	rewind(fp);
    	printf("Do you want to know the percentage of the total score?\nEnter your number: ");
    	scanf("%f",&score_);
    	
    	for(i=0; i<=SIZE; i++)
    	{
    		if(score_ < stu[i].ave ) 
    		{
    			count++;
    			flag=1;
    		}
    	}
    	if(flag == 1)
    		printf("%d in total above your number\n",count);
    	if(flag==0)
    	{
    		printf("\n    ~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
    		printf("           error input!       \n");
    		printf("    ~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
    	}
    //	printf("___________________________________________________________________________________________________________\n\n");
    	fclose(fp);
    }
    

    欢迎大家交流指正~

    展开全文
  • 1)对数字通信系统主要原理和技术进行研究,包括二进制频移键控(2FSK)及解调技术、高斯噪声信道原理、以及信道编码中循环码的基本原理等。 2)建立完整的基于2FSK和循环码的数字通信系统仿真模型,包括2FSK调制...
  • 大学生单片机课程设计:内容包含硬件电路设计和软件电路设计。
  • 煤泥水可称为选煤厂的“血液”,循环煤泥水系统则是选煤厂的“血液循环系统”。为深入了解选煤厂的循环煤泥水系统,提出了选煤水化学的概念,并通过介绍循环煤泥水系统的物质组成、无机盐类矿物的溶解、煤中无机硫的...
  • OFDM系统中基于循环前缀和导频同步算法,雷萍,黄景生,本论文展示了OFDM系统中的导频同步的应用,该同步算法运用了循环前缀的冗余技术,导频同步可以用于跟踪模式.通过将导冗余息包含在导��
  • 《Django实现》通过一个完整的博客系统,让你能真正使用Django开发项目,课程内容包括:模型设计、模板设计、幻灯片展现、博客列表、博客详细、标签云、友情链接、分页、评论、搜索、自定义标签、登录、注册、发送...
  • 单井循环地下换热系统研究进展,倪龙,,单井循环地下换热系统的热源井现阶段包括循环单井、抽灌同井和填砾抽灌同井。本文综述了单井循环地下换热系统的工程应用情况和现
  • 【入门基础+轻实战演示】【讲授方式轻松幽默、有趣不枯燥、案例与实操结合,与相关课程差异化】常用模块的介绍,详细剖析包括time模块,os模块等常用模块,正则表达式基础语法,常用函数,以及通过正则表达式完成...
  • C语言图书管理系统设计报告

    万次阅读 多人点赞 2017-06-20 17:37:54
    源代码:https://blog.csdn.net/k_young1997/article/details/73480766 XXXX大学 C语言课程设计报告 ...题 目 图书管理系统设计 专业班级 XXXX级计算机科学与技术本科X班 组 别 计科第...

     

    源代码:https://blog.csdn.net/k_young1997/article/details/73480766

     

     

     

    XXXX大学

     

    C语言课程设计报告

     

     

     

     

     

    题    目            图书管理系统设计         

    专业班级     XXXX级计算机科学与技术本科X班

    组    别            计科第29组               

    学生姓名          XXX、XXX、XXX           

    (系)           信息工程系               

    指导教师(职称)       XXX(教授)          

    完成时间            xxxx年x月xx日          

     

    XXX大学

    课程设计任务书

     

    题目                图书管理系统设计                  

    班级              xxxx级计算机科学与技术本科x班     

    学号         xxxxxxxxxxxx         姓名      xxx      

    学号         xxxxxxxxxxxx         姓名      xxx      

    学号         xxxxxxxxxxxx         姓名      xxx      

    一、主要内容:

    本课程设计结合本学期所学C语言知识,数组、函数、结构体、指针、链表、文件读取操作等等,准备设计开发一个简单的图书管理系统。设计开发这个系统需要用到链表、文件读取操作、结构体、函数、指针、等C语言知识。本课程设计将会实现对图书信息的账号登录、注册账号、密码修改、密码查找、查找、输出、排序、备份、恢复、图书借阅和归还功能。本着简单、易用的设计原则,本课程设计在尽量优化界面在保证输入输出美观的同时又不失友好的交互界面。

    本次设计主要学习内容包括:

    (一)进一步学习并熟练掌握C语言语法和编程思想。

    (二)学习C语言提供的库函数,熟悉CodeBlocks的开发工具。

    (三)学习C语言函数、链表、结构体、文件读取、指针等知识。

    (四)学习软件的设计与开发过程中所需要思想和细节。

    二、基本要求:

    (一)质量要求

    (1)图书管理系统的基本功能模块的设计应包括:账号登录和修改、图书信息的浏览和保存、图书的借阅和归还。

    (2)对图书管理系统设计并进行调试、修复、完善、测试。测试图书信息的输入输出是否正确、测试文件的读取与存储是否正常、测试账号切换后是否各项功能是否正常运行、测试评估界面是否合理,友好。

    (3)定期主动向指导教师汇报任务进度,认真填写相关报告文档。

    (4)按时完成各阶段工作,不突击,不抄袭。

    (二)进度要求

    (2)明确课程设计任务,搜集资料:xxxx年x月xx日—x月xx日。

    (3)完成程序的设计与实现,撰写课程设计论文初稿:xxxx年x月xx日—x月xx日。

    (4)与指导教师沟通,完成课程设计论文定稿:xxxx年x月xx日—xxxx年x月xx日。

    (5)进入课程设计论文审阅阶段,准备答辩:xxxx年x月xx日—x月xx日。

     

    三、主要参考资料:

    [1] 甘勇,李晔,卢冰.中国铁道出版.《C语言程序设计(第二版) 》 

    [2] 河南工业大学同学的图书管理系统的功能的借鉴。

    [3] 啊哈磊.人民邮电出版社.《啊哈!算法》

    [4] 程杰,清华大学出版社.《大话数据结构》

     

     

     完 成 期 限:     xxxx年x月xx日 

    指导教师签名:                 

     

    年   月   日

     

     

    目   录

    1概述.1

    1.1 设计思想. 1

    1.2 设计原则. 1

    1.3 课程设计报告内容及分工情况. 1

    1.3.1 课程设计报告内容. 1

    1.3.2 课程设计分工情况. 2

    2总体设计.3

    2.1 功能模块图. 3

    2.2 主函数 main()3

    2.3 程序流程图. 4

    3详细设计.5

    3.1函数.5

    3.2函数流程图.7

    4运行结果与调试.13

    4.1 运行结果. 13

    4.2 软件调试. 15

    结束语.17

    参考资料.18

    附录.19

     

    1概述

     

    1.1设计思想

    (1)该系统的设计分成几个相对独立的模块,这些模块都进行集中式管理。

    (2)分层的模块化程序设计思想,整个系统采用模块化结构设计作为应用程序,有较强的可操作性和扩展性。

    (3)合理的数据设计,在应用系统设计中,相对独立的模块间以数据相互连接,使各模块间的耦合性较低,方便系统运行,提高系统安全性 。     

    1.2设计原则

    为了使本系统功能齐全完备,操作简便,最大限度的提高用户的使用的体验,从而满足用户的实际需要,在设计开发过程中遵循了如下原则:

    (1)合法性原则:规范录入各种图书信息和各种数据,对用户的账号信息进行规范保存。

    (2)实用性原则:根据用户对图书信息浏览和借阅的基本需求设计各种功能,并能够处理一些特殊情况的要求,此外,尽可能预留空间,以便扩充功能。

    (3)易操作原则:要求设计的系统功能齐全,界面友好,操作方便,必要的地方进行提示。

    (4)源程序可读性原则:为了便于其他设计,维护人员读懂代码或以后的代码修改,软件升级维护,即可能做好代码注释工作。

     

    1.3 课程设计报告内容及分工情况

    1.3.1课程设计报告内容

    (1)系统功能模块结构图和程序流程图

    (2)数据结构设计及用法说明

    (3)程序结构(画功能模块图或流程图)

    (4)各模块的功能

    (5).实验结果(包括输入数据和输出结果)

    (6)设计体会

    (7)参考文献

     

    1.3.2 课程设计分工情况

    本组共有3人,具体分工情况如下:

    (1)学号:xxxxxxxxxxx,姓名:xxx,具体负责xxxxxx。

    (2)学号:xxxxxxxxxxx,姓名:xxx,具体负责xxxxxx。

    (3)学号:xxxxxxxxxxx,姓名:xxx,具体负责xxxxxx。

     

     

    2总体设计

    2.1功能模块图

           本图书管理系统分为三个功能模块,分别是账号管理功能、图书信息管理功能、图书借还管理功能。账号管理功能可以进行账号登录、注册账号、找回密码、修改密码:图书信息管理功能可以对图书信息进行查找、排序、修改、恢复、和备份功能:图书借还管理功能可以查询用户的借书记录、借书、还书功能。功能模块图如图2-1所示。

     

     

    图2-1图书管理系统模块图

    2.2主函数 main()                                        

    函数的功能:用于联系各个功能函数模块,以及退出程序时的退出画面提示。

    函数的入口:整个程序是从主函数开始的。

    函数的出口:当从main()的ove函数开始中进入,即显示出欢迎使用界面;跳出while循环,然后退出main()函数,即:退出整个程序。

    函数调用关系:该函数不被其它函数调用。

     

    2.3程序流程图

           本图书管理系统在启动后会先进入登录界面进行登录或各种账号操作,然后进入图书信息管理、图书借还管理等实用性功能的操作。程序流程图如图2-2所示。


    图2-2图书管理系统流程图

    3       详细设计

    3.1      函数

    (1)功能函数ling()

    函数的功能:登录账号

    函数的入口:从main()中进入。

    函数调用关系:被主函数调用。

    函数的出口:当账号登录成功返回1然后结束该函数,或输入密码错误超过三次结束结束整个程序。

    (2)功能函数FindByNum()

    函数的功能:按书号对图书进行查找并输出。

    函数的入口:程序从Find()的switch()开关结构中进入,即sclele的值为1时,开始进入该函数,进入函数后,在存储图书信息的stu结构数组中进行查找,找到后进行输出,若没找到则输出“未找到该数”。

    函数调用关系:被Find()函数调用。由switch()开关结构中进入,并在文中无返回值的空值void函数。

    函数的出口:当输出结果信息用printf()标准输出到屏幕上,然后结束该函数,而执行Find()函数中“break;”跳出switch()开关函数,继续执行while循环结构。

    (3)功能函数SortByScore()

    函数的功能:对所有图书信息按书名的首字母进行排序,并保存到文件“缓存区”中。

    函数的入口:从Sort()的switch()开关结构中进入,即sexh的值为1的时侯,进入该函数,开始对图书信息按书名的首字母进行排序,然后将排序结果保存到文件“缓存区”中。

    函数调用关系:被Sort()函数调用。由switch()开关结构中进入,并在文中无返回值的空值void函数。

    函数的出口:把“排序完成”用printf()标准输出到屏幕上,然后结束该函数,而执行Sort()函数中“break;”跳出switch()开关函数,继续执行while循环结构。

    (4)功能函数output()

    函数的功能:输出所有图书信息

    函数的入口:从Find()的switch()开关结构中进入,即sclele的值为4时,进入该函数。并调用PrintRecord()函数对每一条图书信息进行输出。

    函数调用关系:被Find()函数调用。由switch()开关结构中进入,并在文中无返回值的空值void函数。

    函数的出口:将所有图书信息都输入到屏幕上后,执行Find()函数中“break;”跳出switch()开关函数,继续执行while循环结构。

    (5)功能函数Huifu ()

    函数的功能:将所有图书的信息恢复至备份时的状态

    函数的入口:从Menu()的switch()开关结构中进入,即select的值为4时,进入该函数。用freopen("图书信息库.txt","r",stdin)将里边的所有图书信息都存入内存,然后再调用save()将所有图书信息都存入到“缓存区”中。

    函数调用关系:被Menu()函数调用。由switch()开关结构中进入,并在文中无返回值的空值void函数。

    函数的出口:将所有图书信息都存入到“缓存区”中后,执行Menu()函数中“break;”跳出switch()开关函数,继续执行while循环结构。

    (6)功能函数BorrowBook()

    函数的功能:借阅图书

    函数的入口:从Borrow()的switch()开关结构中进入,即shl的值为2时,进入该函数。之后对用户的信誉值进行判断,若低于60将无法借书。然后调用FindByName()函数对所借图书进行搜索,若存在则输入借书时间,否则借书失败。

    函数调用关系:被Borrow()函数调用。由switch()开关结构中进入,并在文中无返回值的空值void函数。

    函数的出口: 将借书结果输入到屏幕上后,执行Borrow ()函数中“break;”跳出switch()开关函数,继续执行while循环结构。

    (7)功能函数SendBook ()

    函数的功能:归还图书     

    函数的入口:从Borrow ()的switch()开关结构中进入,即shl的值为3时,进入该函数。之后先判断该用户是否有借书记录,并调用FindByName()函数找到还的图书并对其数量进行修改,最后判断是否按期归还图书和图书有无破损。

    函数调用关系:被Borrow ()函数调用。由switch()开关结构中进入,并在文中无返回值的空值void函数。

    函数的出口: 还书完成后后,执行Borrow()函数中“break;”跳出switch()开关函数,继续执行while循环结构。

    3.2      函数流程图

    (1)账号登录流程如图3-1所示。


    图3-1 账号登录流程图

    (2)按书号查找图书流程如图3-2所示。


     图3-2按书号查找流程图

    (3)按书名首字母排序流程图如图3-3所示 。


    图3-3按书名首字母排序流程图

    (4)输出所有图书信息流程如图3-4所示。


    图3-4输出所有图书信息流程图

    (5)恢复备份功能流程如图3-5所示。


    图3-5恢复备份流程图

    (6)借阅图书流程如图3-6所示。

     

           图3-6借阅图书流程图

    (7)归还图书流程如图3-7所示。


            图3-7归还图书流程图

     

     

     4、运行结果与调试

    4.1运行结果

    (1)在程序开始是进入登录界面进行登录界面或选择切换账号时输出登录界面。该界面可以进行登录操作、注册新账号、找回账号密码、修改密码和退出系统。

    账号登录界面如图4-1所示。

        
         

    图4-1 账号登陆界面

    (2)该界面为主界面,在登录完成后或者从下一级界面返回后输出该界面。该主界面可以选择图书信息管理功能、图书借还功能、查看系统功能介绍、开发人员信息和退出系统的操作。主界面如图4-2所示。

      
       

    图4-2 主界面

    (3)该界面为图书管理功能的主界面,可以选择执行查找、排序、修改、恢复图书信息、备份图书信息的操作、返回上一级菜单的功能。图书信息管理功能界面如图4-3所示。

     
         

    图4-3图书信息管理功能界面

    (4)该界面可以实现图书信息查找功能,可以按书号查找、按书名查找、按作者查找、查看全部图书信息、返回上一级菜单的功能。查找功能界面如图4-4所示。

                

          图4-4 查找功能界面

    (5)该界面可以进行排序的操作。可以进行按书名首字母排序、按图书单价升序排序、按图书单价降序排序,还可以返回上一级菜单。排序功能是在内存中进行,所以不进行输出。排序功能界面如图4-5所示。

                 

        图4-5排序功能界面

    (6)该界面可以实现添加图书、删除图书、删除全部图书信息、返回上一级菜单的功能。修改功能界面如图4-6所示。

              

    图4-6修改功能界面

    (7)该界面可以实现对用户借书记录查询、图书借阅、图书归还、返回上一级菜单的功能。图书借还管理功能界面如图4-7所示。

                

    图4-7图书借还管理功能界面

    4软件调试

    (1)每个选择界面之后,前一屏幕的内容依旧存在,影响界面的美观;经过老会长的帮助及上网搜索,发现利用“system(“cls”);”可以消去前一屏幕的内容;然而接下来又出现新的问题:每次在执行完讲数据保存到文件的函数后都会输出紊乱。经过多次调试和修改后,发现把是因为freopen(”CON”,stdout)运行不稳定导致,在更换了保存数据的方法后结决了此问题。

    (2)在增加了切换账号功能后,在创建新账号后保存到文件的用户借还书记录总是出错但内存中没错,经过调试发现是因为在新增账号时用于存储新账号借还书记录的指针名与一个变量名相同造成每次都判断错误。最后更换了变量名,并使该指针每次使用前都指向NULL。

    (3)在借书时不能判断是因为图书数量不足导致不能借阅还是因为没用该图书导致的不能借阅,最后给每种情况标记变量都设置了一不同的值来区分两种不同的情况。

    (4)最开始在每次关闭程序后在下次使用前需要手动恢复文件中的数据,不能连续的使用数据,最后加了一个文件来保存各类数据的数量以使数据能够连续自主的调用,不需要再人工修改。

     

     

    结束语

     

    本系统包含51个函数,实现了图书管理系统所需的基本功能。系统功能大致分为三个模块,分别是登录模块、图书信息管理模块和图书借还模块。启动程序后首先执行的是登录功能。在此功能中可以实现账号登录、注册账号、找回账号密码、修改账号密码功能。登录时,若输入密码错误次数达到三次系统将自动关闭。在注册账号时若注册的账号已存在则不能再进行注册。修改密码时增加了验证码功能。在图书信息管理模块中可以进行图书的查找、排序、添加、删除、备份图书信息、恢复图书信息和切换账号功能。在图书借还功能模块可以进行图书的借阅、归还、借书记录查询功能。本系统在信息存储时采用了两种方式。在存储图书信息和账号信息时用的是结构数组,在存储用户借书记录时用的是链表。通过此次图书管理系统的设计熟练了结构数组、链表、文件的操作,同时对编写小型的系统有了一定的了解,对于细节方面考虑的比以前有很大提升。

     

    xxx:在该设计中主要完成了所有代码的实现,并最终调试实现了该图书管理系统的全部功能并完成了大部分的设计报告。在设计的过程中熟练了对文件的各种操作,链表和结构数组的使用,清屏函数和暂停函数的使用,对做一个项目的过程有了一个大概的认识,知道了大致的规划。在设计过程中发现一些文件的操作和清屏函数会有冲突,通过改变对文件的操作解决了此问题;

    xxx:除了xxx设计的这个图书管理系统,我自己也尝试着设计了一个图书管理系统的功能,因此也发现了很多问题,比如说:在用add()函数添加新增图书信息时,我就忘了字符型数据本身会吃掉回车的这一特点,忘了在%c前面加上空格,导致程序在循环的过程中一直无法正常显示结果。但是,通过仔细耐心的检查与对错误的分析,又在课本的相关章节进行了查阅,最终发现了这一问题。同时,我更加熟悉了结构体的使用,对函数的调用方式更加清楚。还有就是初步了解了函数指针的概念,能够使用基础的函数指针。同时,这也是我第一次尝试画各种各样的流程图,虽然画的不好,但这确实是我的第一次尝试,也觉得充满了乐趣。

    xxx:在本系统的设计中我参加设计了少量函数语句以及制作流程图等任务,在这次的设计前我原本对函数和结构体等了解并不太清楚,通过这次的设计我清楚了这些语句的运用,并且我学会了文件的操作,在文件的修改等地方出现了问题,后来通过查阅资料和讨论解决了这个问题。

    参考资料

     

    [1] 《C语言程序设计(第二版)》,甘勇等编著,中国铁道出版社,2015年9月

     

    [2] 《C语言程序设计》,苏小红等主编,高等教育出版社,2011年

    [3] 《C和指针》,徐波译,人民邮电出版社,2008年

    [4] 《C Primer Plus第6版 中文版》,姜佑 译,人民邮电出版社,2016年

    [5] 《大话数据结构》,程杰,清华大学出版社,2011年6月

    [6] 《啊哈!算法》,啊哈磊,人民邮电出版社

     

     

    附录

     

    源代码

     

     

     

    展开全文
  • 该存储库包含有关MATLAB和Simulink以及机器人操作系统(ROS)入门的资源。 ROS工具箱提供了此功能。 要了解更多信息,请参阅我们的视频和以下视频。 templateFiles文件夹 包含文件提供了用于创建自己的MATLAB和...
  • 小柒前面总结了几篇关于浏览器的事件循环,这篇文章主要总结Node的事件循环。 Node中的Event Loop 什么是Node.js Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度...

    前面的话

    小柒前面总结了几篇关于浏览器的事件循环,这篇文章主要总结Node的事件循环。

    Node中的Event Loop

    什么是Node.js

    Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。

    而I/O处理方面使用了自己设计的libuv,libuv是一个基于事件驱动的跨平台抽象层,封装了不同操作系统一些底层特性,对外提供统一的API,事件循环机制也是它里面的实现。

    Node.js运行机制

    • V8引擎解析JavaScript脚本
    • 解析之后的代码调用Node API
    • libuv库负责Node API的执行。它将不同的任务分配给不同的线程,形成一个
      Event Loop,以异步的方式将任务的执行结果返回给V8引擎
    • V8引擎再将结果返回给用户

    libuv中的6个阶段

    libuv引擎中的事件循环分为6个阶段,它们会按顺序反复执行。每当进入某个阶段,都会从对应的回调队列中取出函数执行。当队列为空或者执行的回调函数数量到达系统设定的阈值,就会进入下一阶段。

    在这里插入图片描述

    从图中可以看出Node中事件循环的顺序:

    外部输入数据–>轮询阶段(poll)–>检查阶段(check)–>关闭事件回调阶段(close callback)–>定时器检测阶段(timer)–>I/O事件回调阶段(I/O callbacks)–>闲置阶段(idle, prepare)–>轮询阶段(按照该顺序反复运行)…

    • timers阶段: 执行timer(setTimeout 、setInterval)的回调

    • I/O callbacks阶段: 处理一些上一轮循环中少数未执行的I/O回调

    • idle,prepare阶段: 仅Node内部使用

    • poll阶段: 获取新的I/O事件,适当的条件下node将阻塞在这里。(发生阻塞的情况为:poll队列为空,且没有代码设定为setImmediate())

    • check阶段: 执行setImmediate()的回调。(如果poll阶段空闲,并且有被setImmediate()设定的回调,那么事件循环直接跳到check执行,而不是阻塞在poll阶段等待回调被加入)

      [注意]: setImmediate()在这个阶段具有最高优先级,只要poll队列为空,代码被setImmediate(),无论是否有timers达到下限时间,setImmediate()的代码都先执行。 (下面有例子会解释)

    • close callbacks阶段:执行socket的close事件回调

    [注意]: 以上阶段不包括process.nextTick()。日常开发中的绝大部分异步任务都是在timers、poll、check这3个阶段处理的

    Micro-Task 与 Macro-Task

    Node端事件循环中的异步队列也是这两种:macro(宏任务)队列和 micro(微任务)队列。

    • 常见的 macro-task 比如:setTimeout、setInterval、 setImmediate、script(整体代码)、 I/O 操作等。

    • 常见的 micro-task 比如: process.nextTick、new Promise().then(回调)、mutationObserver等。

    [关于setTimeout 和 setImmediate]

    两者非常相似,区别在于调用时机不同:

    • setImmediate 在check阶段
    • setTimeout在timers阶段
    setTimeout(function timeout () {
      console.log('timeout');
    },0);
    setImmediate(function immediate () {
      console.log('immediate');
    });
     
    

    这段代码中setTimeout可能执行在前,也可能执行在后(在node中是“随缘的”)。原因:

    • 首先进入timers阶段,如果我们的机械性能一般,那么进入timers阶段,一毫秒已经过去了,相当于(setTimeout(fn, 0) === setTimeout(fn, 1) ,那么setTimeout的回调会首先执行。
    • 如果没有到一毫秒,那么times阶段的时候,下限时间没到,setTimeout回调不执行,事件循环到了poll阶段,这个时候队列为空,此时代码有setImmediate(),于是先执行了setImmediate()的回调函数,之后再下一个事件循环再执行setTimeout的回调函数。

    而我们在执行代码的时候,进入timers的时间延迟其实是随机的,并不是确定的,所以会出现两个函数执行顺序随机的情况。

    再来看一段代码:

    var fs = require('fs')
    
    fs.readFile(__filename, () => {
        setTimeout(() => {
            console.log('timeout');
        }, 0);
        setImmediate(() => {
            console.log('immediate');
        });
    });
    

    我们会发现,setImmediate永远先于setTimeout执行。

    原因如下:

    • fs.readFile的回调是在poll阶段执行的,当其回调执行完毕之后,poll队列为空,而setTimeout进入了timers的队列,此时又有代码被setImmediate(),于是事件循环先进入check阶段 执行回调,之后再下一个事件循环再在timers阶段中执行回调。

    下面的代码也是同样的道理:

    setTimeout(() => {
        setImmediate(() => {
            console.log('setImmediate');
        });
        setTimeout(() => {
            console.log('setTimeout');
        }, 0);
    }, 0);
    

    在timers阶段执行外部的setTimeout之后,内层setTimeout与setImmediate入队,时间循环继续往下走,到poll阶段发现队列为空,此时代码有setImmediate(),所以直接进入check阶段执行setimmediate()的回调。之后再第二次时间循环的timers中再执行相应的回调。

    总结

    • 如果两者都在主模块中调用,那么执行先后取决于进程性能,也就是随机。
    • 如果两者都不在主模块调用(被一个异步操作包裹),那么setImmediate的回调永远先执行。

    关于[process.nextTick() ]

    这是一个微任务,node的事件循环不包括process.nextTick() 。 它有自己的队列,当事件循环的每一个阶段完成之后,如果存在nextTick队列,就会清空队列中的所有回调函数,并且优先于其他microtask执行

    例1:

    setTimeout(() => {
     console.log('timer1')
     Promise.resolve().then(function() {
       console.log('promise1')
     })
    }, 0)
    process.nextTick(() => {
     console.log('nextTick')
     process.nextTick(() => {
       console.log('nextTick')
       process.nextTick(() => {
         console.log('nextTick')
         process.nextTick(() => {
           console.log('nextTick')
         })
       })
     })
    })
    
     // nextTick=>nextTick=>nextTick=>nextTick=>timer1=>promise1
    

    例2:

    setTimeout(() => {
        console.log('timeout0');
        process.nextTick(() => {
            console.log('nextTick1');
            process.nextTick(() => {
                console.log('nextTick2');
            });
        });
        process.nextTick(() => {
            console.log('nextTick3');
        });
        console.log('sync');
        setTimeout(() => {
            console.log('timeout2');
        }, 0);
    }, 0);
    
    // timeout0 -> sync->nextTick1->nextTick3->nextTick2->timeout2
    

    解释:
    timers阶段执行外层setTimeout的回调,遇到同步代码先执行,也就有timeout0、sync的输出。遇到process.nextTick后入微任务队列,依次nextTick1、nextTick3、nextTick2入队后出队输出。之后,在下一个事件循环的timers阶段,执行setTimeout回调输出timeout2。

    例3:

    setImmediate(function(){
      console.log("setImmediate");
      setImmediate(function(){
        console.log("嵌套setImmediate");
      });
      process.nextTick(function(){
        console.log("nextTick");
      })
    });
    
    // setImmediate
    // nextTick
    // 嵌套setImmediate
    

    解释: 事件循环进入check阶段执行回调函数setImmediate,执行同步任务,输出setImmediate,然后check阶段完成。有process.nextTick队列,则输出nextTick。嵌套的setImmediate在下一次事件循环的check阶段执行。

    Node与浏览器的 Event Loop 差异

    • 浏览器环境下,microtask的任务队列是每个macrotask执行完成之后执行。
    • 而在node.js中,microtask会在事件循环的各个阶段之间执行,也就是说,每一个阶段执行完毕,就会去执行microtask队列中的任务。
      在这里插入图片描述
      举例说明:
    setTimeout(()=>{
        console.log('timer1')
        Promise.resolve().then(function() {
            console.log('promise1')
        })
    }, 0)
    setTimeout(()=>{
        console.log('timer2')
        Promise.resolve().then(function() {
            console.log('promise2')
        })
    }, 0)
    
    

    对于浏览器:

    执行第一个宏任务时,输出同步代码timer1之后,发现微任务then(),执行微任务输出promise1;接着执行第二个宏任务,输出同步任务timer2,发现微任务,执行微任务,输出promise2。
    即:timer1 ->promise1->timer2->promise2

    浏览器端的处理过程如下:

    在这里插入图片描述

    对于Node情况分两种:

    • 如果是node11版本,与浏览器执行结果一样

    • 如果是node10及以下:要看第一个定时器执行完,第二个定时器是否在完成队列中。

      • 如果是第二个定时器还未在完成队列中,最后的结果为 timer1=>promise1=>timer2=>promise2
      • 如果是第二个定时器已经在完成队列中,则最后的结果为timer1=>timer2=>promise1=>promise2(下文过程解释基于这种情况下).

    1.全局脚本(main())执行,将2个timer依次放入timer队列,main()执行完毕,调用栈空闲,任务队列开始执行;

    2.首先进入timers阶段,执行timer1的回调函数,打印timer1,并将promise1.then回调放入microtask队列,同样的步骤执行timer2,打印timer2;

    3.至此,timer阶段执行结束,event loop进入下一个阶段之前,执行microtask队列的所有任务,依次打印promise1、promise2

    node端执行过程:

    在这里插入图片描述

    总结

    浏览器和Node 环境下,microtask 任务队列的执行时机不同

    • Node端,microtask 在事件循环的各个阶段之间执行
    • 浏览器端,microtask 在事件循环的 macrotask 执行完之后执行

    参考链接:

    • https://juejin.im/post/5c337ae06fb9a049bc4cd218
    • https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
    展开全文
  • 启明星MRBS与启明星Book最大的区别是:启明星MRBS支持循环例会功能(包括循环,周循环,月循环和年循环),来满足你更多的要求。  启明星会议室预定系统MRBS截图 相关阅读 同类推荐:站长常用源码
  • Python GUI库PyQt5视频教程,内容包括pyqt5的安装、环境搭建、配置,桌面系统的开发等。该系列课程一共20套,每一套视频课程会深入讲解Python的一类知识点。Python是当今炙手可热的编程语言,可用于多个领域,人工...
  •  如上文所讲,加了几个node的间谍,有兴趣的兄弟可以自己搜搜node的事件循环系统,真是回味无穷,这里就不详细介绍了。   事件循环的顺序,决定了JavaScript代码的执行顺序。它从script(整体代码)开始第一次...

            这个是面试题中经常问的,再回答这个问题之前,我们需要知道以下几个知识点:

                              1.执行上下文context

                              2.函数调用栈

                              3.队列数据结构

                            4.promise,process.nexttick,setImmediate(其中promise大家都知道,后两个是node循环中必不可少的部分,node的高并发,异步I/O也是基于node事件循环)

            不懂的兄弟们可以看看这个: github的mqyqingfeng/Blog,冴羽写得

           我们都知道javascript是单线程,只有唯一的事件循环。而javascript再执行过程中,除了函数调用栈来调节函数的执行顺序外,还有个任务队列task queue,任务队列可以是多个,其中又包括宏任务队列和微任务队列;

           宏任务队列有:script(整体代码),setTimeout,setInterval,setImmediately,I/O,UI render

           微任务队列有:promise,process.nexttick,Object.observe(已经不用了),Mutation.observe

            MutationObserver的前身是MutationEvents(熟知的addEventListener就是一部分,已经不怎么用了),Mutation存在兼容问题,自行搜索,留下点实例用法
    
    // Firefox和Chrome早期版本中带有前缀
    var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver
    // 选择目标节点
    var target = document.querySelector('#some-id'); 
    // 创建观察者对象
    var observer = new MutationObserver(function(mutations) {  
      mutations.forEach(function(mutation) { 
        console.log(mutation.type); 
      }); 
    }); 
    // 配置观察选项:
    var config = { attributes: true, childList: true, characterData: true } 
    // 传入目标节点和观察选项
    observer.observe(target, config); 
    // 随后,你还可以停止观察
    observer.disconnect();

           如上文所讲,加了几个node的间谍,有兴趣的兄弟可以自己搜搜node的事件循环系统,真是回味无穷,这里就不详细介绍了。       

           事件循环的顺序,决定了JavaScript代码的执行顺序。它从script(整体代码)开始第一次循环。之后全局上下文进入函数调用栈。直到调用栈清空(只剩全局),然后执行所有的微任务。当所有可执行的微任务执行完毕之后。循环再次从macro-task开始,找到其中一个任务队列执行完毕,然后再执行所有的宏任务,这样一直循环下去。其中每一个任务的执行,无论是微任务还是宏任务,都是借助函数调用栈来完成。

     

        

     

    展开全文
  •   考虑用正反馈循环创造变化,同时包括负反馈循环,防止出现失控行为导致系统故障。 考虑用负反馈循环稳定系统,但要注意负反馈过多会导致系统停滞。 反馈循环的四个阶段 取证阶段。行为必须能被测量、接收和存储...
  • 一、什么是事件循环 JS的代码执行是基于一种事件循环的机制,之所以称作事件循环,MDN给出的解释为因为它经常被用于类似如下的方式来实现 while (queue.waitForMessage()) { queue.processNextMessage(); } ...
  • 本规范认真总结我国多年工业循环冷却水系统设计和运行经验,包括总则、术语、循环冷却水系统系统平衡、冷却设施、泵站、管道布

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 741,947
精华内容 296,778
关键字:

循环系统包括什么