精华内容
下载资源
问答
  • 菜单设计

    千次阅读 多人点赞 2019-07-02 18:54:25
    源代码: #include<stdio.h> #include<math.h> #include<string.h>...//通过该函数头部里的函数,改变控制台的背景和颜色 ...//头文件声明,下文用到了改变控制台的宽度和高度 ...

    源代码:

    #include<stdio.h>
    #include<math.h>
    #include<string.h> 
    #include<stdlib.h>//通过该函数头部里的函数,改变控制台的背景和颜色  
    #include<windows.h>
    //头文件声明,下文用到了改变控制台的宽度和高度 
    #define M 100
    
    struct student
    {
    	char name[25];//姓名  
    	char num[25];//学号  
    	char credit[20];//身份证号  
    	char native[35];//籍贯  
    	char tel[25];//手机号  
    	int special;//专业  
    	int banji;//班级  
    	int math,yy,wl,cyy,pe;//数学、英语、物理、C语言、体育  
    	double ave;//平均分 
    };
    
    void input(struct student stu[M]);
    void output(struct student stu[M]);
    void lookfor(struct student stu[M]); //自定义查询学生信息函数
    void modify(struct student stu[M]); //修改信息 
    void order(struct student stu[M]); //排序 
    void delete_student(struct student stu[M]); //删除信息 
    void xuehao(struct student stu[M]);        
    void xingming(struct student stu[M]);  
    void fileread(struct student stu[M]);  //保存学生信息 
    void filewrite(struct student stu[M]);  
    void yanshi(char *p);
    void kaifaren(struct student stu[M]);
    void xitongjieshao(struct student stu[M]);
    
    int count=0; 
    struct student t;
     
    int main()   
    {  
    	int choice,sum;  
    	struct student stu[M];         
    	system("mode con:cols=400 lines=30000"); //调节控制台的宽度和高度  
    	system("color 0b");  //调节控制台的背景和字体颜色  
    	point1:    
    	sum=0;
    	
    	char qwe[105] = {"\t\t\t\t\t\t\t\t\3\3\3\3\3\3\3\3\3\3\3\3\3欢迎使用学生信息管理系统\3\3\3\3\3\3\3\3\3\3\n"};
    	yanshi(qwe);
    	do
    	{  
    		printf("\t\t\t\t\t\t\t\t-------------------------------------------------\n");  
    		printf("\t\t\t\t\t\t\t\t+               学生信息管理系统            +\n");  
    		printf("\t\t\t\t\t\t\t\t-------------------------------------------------\n");  
    		printf("\t\t\t\t\t\t\t\t\t\t ***************\n");  
    		printf("\t\t\t\t\t\t\t\t\t\t 1、添加学生信息\n");  
    		printf("\t\t\t\t\t\t\t\t\t\t 2、浏览学生信息\n");  
    		printf("\t\t\t\t\t\t\t\t\t\t 3、查询学生信息\n");  
    		printf("\t\t\t\t\t\t\t\t\t\t 4、修改学生信息\n");  
    		printf("\t\t\t\t\t\t\t\t\t\t 5、删除学生信息\n");  
    		printf("\t\t\t\t\t\t\t\t\t\t 6、排列学生信息\n");   
    		printf("\t\t\t\t\t\t\t\t\t\t 7、读取文件学生\n");
    		printf("\t\t\t\t\t\t\t\t\t\t 8、保存到文件\n");
    		printf("\t\t\t\t\t\t\t\t\t\t 9、退出系统\n"); 
    		printf("\t\t\t\t\t\t\t\t\t\t 10、开发人员介绍\n");
    		printf("\t\t\t\t\t\t\t\t\t\t 11、系统介绍\n");
    		printf("\t\t\t\t\t\t\t\t\t\t ***************\n");   
    		printf("请输入你的选择\n");
    		
    		scanf("%d",&choice);
    		fflush(stdin);       //清除输入缓冲区  
    		if (choice>9||choice<=0)
    		{ 
    			sum++;
    			if (sum>=5)  
    			{  
    				printf("输入错误次数过多,程序将重新开始\n"); 
    				system("pause");  //程序暂停  
    				system("cls");   //清屏语句 
    				goto point1;
    			}
    		}
    		switch (choice)       //根据选择,调用不同的函数来完成不同的任务  
    		{  
    			case 1:input(stu);break;         
    			case 2:output(stu);break;  
    			case 3:lookfor(stu);break;  
    			case 4:modify(stu);break;  
    			case 5:delete_student(stu);break;  
    			case 6:order(stu);break;  
    			case 7:fileread(stu);break;  
    			case 8:filewrite(stu);break; 
    			case 9:printf("感谢使用学生信息管理系统,请关掉程序!!!\n");system("pause");break;
    			case 10:kaifaren(stu);break;
    			case 11:xitongjieshao(stu);break;
    			
    			default:printf("无效的选择!!!请重新输入!!!\n");break;
    		} 
    	}while (choice!=9);
    	
    	printf("the program is over!!!\n");
    	return 0;
    }
    
    void input(struct student stu[M])
    {
    	int len,size; 
    	system("cls");  
    	printf("请添加要输入学生的信息\n"); 
    	 
    	do
    	{  
    		printf("请输入由11位数字组成的学生学号\n"); 
    		scanf("%s",&stu[count].num); 
    		len=strlen(stu[count].num);
    	}while(len < 11);
    	  
    	printf("请输入同学的姓名\n");  
    	scanf("%s",stu[count].name); 
    	 
    	do
    	{
    		printf("请输入由18位数字组成的学生身份证号\n");
    		scanf("%s",&stu[count].credit);
    		size=strlen(stu[count].credit);  
    	}while(size!=18);
    	                                               
    	printf("请输入学生的籍贯\n");
    	scanf("%s",&stu[count].native);
    	printf("请输入学生的手机号码\n");
    	scanf("%s",&stu[count].tel);  
    	printf("请输入所需要的专业代号:1、计算机科学 2、通信工程 3、软件工程\n");
    	scanf("%d",&stu[count].special);  
    	printf("请输入对应的学生班级号码:1、软工一班 2、软工二班 3、软工三班\n");  
    	scanf("%d",&stu[count].banji); 
    	do
    	{  
    		printf("请依次输入不大于100的学生各科成绩\n"); 
    		scanf("%d%d%d%d%d",&stu[count].math,&stu[count].yy,&stu[count].wl,&stu[count].cyy,&stu[count].pe);
    	}while(stu[count].math>100||stu[count].yy>100||stu[count].wl>100||stu[count].cyy>100||stu[count].pe>100);
    	  
    	stu[count].ave=(stu[count].math+stu[count].yy+stu[count].wl+stu[count].cyy+stu[count].pe)/5.0;
    	count++;  
    }
    
    void output(struct student stu[M]) 
    {  
    	int j;  
    	system("cls");  
    	if (count==0)  
    	{  
    		printf("当前已存学生信息为0个\n");  
    		return;  
    	}
    	
    	for (j=0;j<count;j++)  
    	{  
    		printf("学号\t\t  姓名\t\t身份证号\t籍贯\t手机号\t\t专业\t\t班级\t数学\t英语\t物理\tC语言\t体育\t平均分\n");  
    		for (j=0;j<count;j++)
    		{
    			printf("%s\t",stu[j].num);  
    			printf("%s\t",stu[j].name);  
    			printf("%s\t",stu[j].credit);  
    			printf("%s\t",stu[j].native);  
    			printf("%s\t",stu[j].tel);
    			
    			if (stu[j].special==1)
    				printf("计算机科学\t");
    			else if (stu[j].special==2)
    				printf("通信工程\t");
    			else  
    				printf("软件工程\t");
    			printf("%d\t",stu[j].banji);
    			printf("%d\t",stu[j].math);
    			printf("%d\t",stu[j].yy);
    			printf("%d\t",stu[j].wl);
    			printf("%d\t",stu[j].cyy);
    			printf("%d\t",stu[j].pe);
    			printf("%.1lf\t\n",stu[j].ave); 
    		}  
    	}  
    }
    void lookfor(struct student stu[M])       //自定义查询学生信息函数  
    {  
    	int j,flag=0;  
    	char xh[25];  
    	system("cls");  
    	if (count==0)  
    	{  
    		printf("当前已存学生信息为0个,无法查询!!!\n");  
    		return;
    	}
    	else
    	{
    		printf("请输入你想要查看的同学学号\n");
    		scanf("%s",&xh);
    		fflush(stdin);
    		for (j=0;j<count;j++)  
    		{  
    			if (strcmp(stu[j].num,xh)==0)  //通过字符函数对已存入的学生信息进行比较,找出要查看的学生  
    			{  
    				printf("学号\t\t姓名\t\t\t\t身份证号\t\t\t\t\t籍贯\t手机号\t\t\te\t\t专业\t\t班级\t数学\t英语\t物理\tC语言\t体育\t平均分\n");
    				printf("%s\t",stu[j].num);  
    				printf("%s\t",stu[j].name);  
    				printf("%s\t",stu[j].credit);  
    				printf("%s\t",stu[j].native);  
    				printf("%s\t",stu[j].tel);  
    				if (stu[j].special==1)  
    					printf("计算机科学\t");  
    				else if (stu[j].special==2)  
    					printf("通信工程\t");      
    				else  
    					printf("软件工程\t");
    				printf("%d\t",stu[j].banji);
    				printf("%d\t",stu[j].math);
    				printf("%d\t",stu[j].yy); 
    				printf("%d\t",stu[j].wl);  
    				printf("%d\t",stu[j].cyy);  
    				printf("%d\t",stu[j].pe);  
    				printf("%.1lf\t",stu[j].ave);  
    			}  
    		}  
    		if (j==count)  
    			printf("很抱歉,没有你所需要的学生信息\n");  
    	}  
    }  
    void modify(struct student stu[M])
    {  
    	int j,flag=0,course;
    	char xh[25];
    	system("cls");
    	if (count==0)
    	{
    		printf("当前已存学生信息为0个,无法修改!!!\n");
    		return;
    	}
    	else  
    	{  
    		printf("请输入你想要修改的同学学号\n");
    		scanf("%s",&xh);  
    		fflush(stdin);  
    		for (j=0;j<count;j++)  
    			if (strcmp(stu[j].num,xh)==0)
    			{  
    				printf("你确定要修改学生的信息吗???如果不确定的话,请关掉本程序!!!\n");  
    				printf("选择课程: 1、数学 2、英语 3、物理 4、C语言 5、体育\n");
    				scanf("%d",&course);  
    				printf("请输入你想要修改后的学生成绩\n");
    				switch(course)  
    				{  
    					case 1:scanf("%d",&stu[j].math);break;  
    					case 2:scanf("%d",&stu[j].yy);break;
    					case 3:scanf("%d",&stu[j].wl);break;  
    					case 4:scanf("%d",&stu[j].cyy);break;  
    					case 5:scanf("%d",&stu[j].pe);break;  
    					default:printf("无效的选择!!!请重新输入!!!\n");break;  
    				} 
    			}
    	}  
    }  
    void delete_student(struct student stu[M])
    {  
    	int choice;  
    	system("cls");  
    	if (count==0)  
    	{  
    		printf("当前已存学生信息为0个,无法删除!!!\n");  
    		return;  
    	}  
    	else  
    	{  
    		printf("请选择你所要删除的方式:1、学号 2、姓名(如果你的姓名是中文,那么无法删除,请选择学号删除) 3、取消\n");
    		scanf("%d",&choice);  
    		switch(choice)
    		{  
    			case 3:return;break;  
    			case 2:xingming(stu);break;
    			case 1:xuehao(stu);break;  
    			default:printf("无效的选择!!!请重新输入!!!\n");break;  
    		}  
    	}  
    }  
    void order(struct student stu[M])
    {  
    	int j,k,choice,index;  
    	system("cls");  
    	printf("请输入你想要进行排序的方式(所有排序的方式均是降序)!!!\n");  
    	printf("1、数学 2、英语 3、物理 4、C语言 5、体育 6、平均分\n");  
    	scanf("%d",&choice);
    	
    	switch (choice)  
    	{
    		case 1:for (j=0;j<count;j++)  
    		{
    			index=j;   
    			for (k=j+1;k<count;k++)  
    				if (stu[k].math>stu[index].math)  
    				{
    					t=stu[k];stu[k]=stu[index];stu[index]=t;
    				}  
    		};break; 
    		 
    		case 2:for (j=0;j<count;j++)
    		{
    			index=j;   
    			for (k=j+1;k<count;k++)
    				if (stu[k].yy>stu[index].yy)
    				{
    					stu[k]=stu[index];
    				}
    		 };break;
    		 
    		case 3:for (j=0;j<count;j++)  
    		{
    			index=j;   
    			for (k=j+1;k<count;k++)  
    				if (stu[k].wl>stu[index].wl)  
    				{
    					t=stu[k];stu[k]=stu[index];stu[index]=t;
    				}  
    		};break;
    		
    		case 4:for (j=0;j<count;j++)  
    		{
    			index=j;   
    			for (k=j+1;k<count;k++)  
    				if (stu[k].cyy>stu[index].cyy)  
    				{
    					t=stu[k];stu[k]=stu[index];stu[index]=t;
    				}  
    		};break;
    		
    		case 5:for (j=0;j<count;j++)  
    		{
    			index=j;   
    			for (k=j+1;k<count;k++)  
    				if (stu[k].pe>stu[index].pe)  
    				{
    					t=stu[k];stu[k]=stu[index];stu[index]=t;
    				}  
    		};break;
    		 
    		case 6:for (j=0;j<count;j++)
    		{
    			index=j;   
    			for (k=j+1;k<count;k++)  
    			if (stu[k].ave>stu[index].ave)  
    			{
    				t=stu[k];stu[k]=stu[index];stu[index]=t;
    			}
    		};break;
    		  
    		default:printf("无效的选择!!!请重新输入!!!\n");break;  
    	}  
    }  
    void xuehao(struct student stu[M])      //自定义通过学号方式删除学生信息函数  
    {  
    	int j,index=0,k=count;  
    	char xh[25];  
    	system("cls");  
    	printf("请输入你想要删除的同学学号\n");
    	scanf("%s",xh);
    	
    	fflush(stdin);  
    	for (j=0;j<count;j++)  
    	{
    		if (strcmp(stu[j].num,xh)==0)  
    		{     
    			for (j=index;j<count;j++)  
    				stu[j]=stu[j+1];  
    			count--;  
    			if (count<k)  
    				printf("你已经删除成功\n");  
    		}  
    		index++;
    	}
    	  
    	if (j==count)  
    		printf("抱歉!!!没有你所需要删除的学生信息!*_*!\n");  
    }
    void xingming(struct student stu[M])       //自定义通过姓名方式删除学生信息函数  
    {  
    	int flag=0,j,k=count;  
    	char xm[25];  
    	system("cls");  
    	printf("请输入你想要删除的同学姓名\n");  
    	scanf("%s",xm);
    	 
    	fflush(stdin);  
    	for(j=0;j<count;j++)  
    	{  
    		if (strcmp(stu[j].num,xm)==0)  
    		{  
    		
    			for (j=flag-1;j<count;j++)               
    				stu[j]=stu[j+1];  
    			count--;  
    			if (count<k)  
    				printf("你已经删除成功\n");  
    		}     
    		flag++;
    	}
    	 
    	if (j==count)  
    		printf("抱歉!!!没有你所需要删除的学生信息!*_*!\n");  
    }  
    void yanshi(char *p)
    {  
    	while (1)  
    	{  
    		if (*p!=0)  
    			printf("%c",*p++);  
    		else  
    			break;  
    		Sleep(100);
    	}  
    }
    void filewrite(struct student stu[M])
    {  
    	int j=0;  
    	char c;  
    	FILE *fp;  
    	printf("请选择是否要存入已输入的学生信息:'y'还是'n'		\n");  
    	scanf("%c",&c);
    	  
    	fflush(stdin);  
    	while(c!='y'&&c!='n')
    	{  
    		if (c!='y'&&c!='n')  
    			printf("输入错误,请重新输入\n");  
    		printf("以下操作将会覆盖已存储的数据,确定请输入'y'或'n'		\n"); 
    		scanf("%c",&c); 
    		fflush(stdin);  
    	}
    	  
    	if (c=='y')  
    	{  
    		if((fp=fopen("d:\\stu.dat","wb"))==NULL)  
    		{  
    		    printf("文件打开错误,程序无法进行\n");  
    		    exit(0);  
    		}  
    		for(j=0;j<count;j++)  
    		{
    			fwrite(&stu[j],sizeof(struct student),1,fp);  
    		}  
    		fclose(fp);  
    		if(count==0)  
    		    printf("没有文件,无法保存\n");  
    		else  
    			printf("数据存储完毕\n");  
    		system("pause");  
    	}  
    	else  
    	    return;  
    }  
    void fileread(struct student stu[M])
    {  
    	int j=0;  
    	char c;  
    	FILE *fp;  
    	system("cls");  
    	printf("请选择是否要存入已输入的学生信息:'y'还是'n'		\n");  
    	scanf("%c",&c);
    	
    	fflush(stdin);  
    	while(c!='y'&&c!='n')
    	{  
    		if (c!='y'&&c!='n')  
    		printf("输入错误,请重新输入\n");  
    		printf("以下操作将会覆盖已存储的数据,确定请输入'y'或'n'		\n");  
    		scanf("%c",&c);  
    		fflush(stdin);  
    	} 
    	if (c=='y')  
    	{  
    		if((fp=fopen("d:\\stu.dat","rb"))==NULL)  
    		{  
    		    printf("文件打开错误,程序无法进行\n");  
    		    exit(0);  
    		}  
    		fread(&stu[j],sizeof(struct student),1,fp);   
    		count=0;  
    		count++;  
    		j++;  
    		while(fread(&stu[j],sizeof(struct student),1,fp))  
    		{  
    		    j++;  
    		    count++;  
    		}  
    		fclose(fp);  
    		printf("数据读取完毕!!!\n");  
    		system("pause");  
    	}  
    	else  
    		return;  
    } 
    void kaifaren(struct student stu[M])
    {
    	printf("201705010309 张子敏\n");
    	printf("201705010303 李玉红\n");
    	printf("201705010311 訾海燕\n");
    	return; 
    }
    void xitongjieshao(struct student stu[M])
    {
    	printf("系统介绍:\n");
    	printf("本菜单设计主要是学生信息的浏览情况。\n");
    	printf("分别用十几个函数实现了:添加学生信息、浏览学生信息、查询学生信息、修改学生信息、删除学生信息、\n");
    	printf("排列学生信息、读取文件学生、保存到文件、退出系统九个功能。另外还有开发人介绍和系统介绍两部分。\n");
    	printf("在运行此系统是,可根据界面提示完成自己的目的。\n");
    	printf("最后退出即可。\n");
    	return;
    }

     

    展开全文
  • JavaWeb框架设计之菜单设计

    千次阅读 2016-11-24 19:31:42
    JavaWeb框架设计之菜单设计

         近来工作,要求自己搭建框架。从中遇到了这样一个诉求---动态菜单。

         这个诉求在Java Web框架设计中属于最普遍的需求。那么我们来探讨下。

         一般的Java Web框架的菜单层级都是为二级,那么在数据库设计时,就需要定义其父子关系。

        如:

       数据库设计此时已经成为了层级关系,但是如何让我们的Java代码输出呈现出层级关系呢?

       此时就需要实体类。实体类中包含自己的集合

       

    public class TreeObject implements Serializable{
    	
    	private static final long serialVersionUID = 1L;
    	
    	private Integer id;  
        private Integer pid;
        private String parentName;
        private String type;  
        private String svalue;  
        private String name;  
        private String remark; 
        private String icon;
        private String englishName;
        private Integer sort; 
        private List<TreeObject> children = new ArrayList<TreeObject>();
    	public Integer getId() {
    		return id;
    	}
    	public void setId(Integer id) {
    		this.id = id;
    	}
    	public Integer getPid() {
    		return pid;
    	}
    	public void setPid(Integer pid) {
    		this.pid = pid;
    	}
    	public String getType() {
    		return type;
    	}
    	public void setType(String type) {
    		this.type = type;
    	}
    	public String getSvalue() {
    		return svalue;
    	}
    	public void setSvalue(String svalue) {
    		this.svalue = svalue;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getRemark() {
    		return remark;
    	}
    	public void setRemark(String remark) {
    		this.remark = remark;
    	}
    	public String getIcon() {
    		return icon;
    	}
    	public void setIcon(String icon) {
    		this.icon = icon;
    	}
    	public String getEnglishName() {
    		return englishName;
    	}
    	public void setEnglishName(String englishName) {
    		this.englishName = englishName;
    	}
    	public Integer getSort() {
    		return sort;
    	}
    	public void setSort(Integer sort) {
    		this.sort = sort;
    	}
    	public List<TreeObject> getChildren() {
    		return children;
    	}
    	public void setChildren(List<TreeObject> children) {
    		this.children = children;
    	}
    	public String getParentName() {
    		return parentName;
    	}
    	public void setParentName(String parentName) {
    		this.parentName = parentName;
    	}
        那么就可以实现集合中包含集合。为了实现了这一点,我们需要借助算法---递归

         这里不在叙述。。。。递归

    -----------------------------------

       这里提示一点:目前发现在使用Bootstrap前端框架在异步调用菜单发现第二级样式没有加载出来。所以采用同步。这里请求大神支持


    展开全文
  • Wordpress 的菜单设计非常简单。在操作面板上 Apperarance-&gt;Menus 这样就进入了菜单的设计面板。看看这个面板,有一个 create a new menu, 这就是新建一个菜单。我们式样里开始有一个菜单,也可以不建。...

    有了网页和博客网页,我们还需把他们组织起来,形成一个网站,这就是菜单的设计。

    Wordpress 的菜单设计非常简单。在操作面板上 Apperarance->Menus

    这样就进入了菜单的设计面板。看看这个面板,有一个 create a new menu, 这就是新建一个菜单。我们式样里开始有一个菜单,也可以不建。但记得修改菜单后一定要保存菜单Save Menu。

    左边有Pages, Posts等,点一下那个小刀三角,比如pages 旁边的, 所有的页面都出现了。选择并点击Add to Menu 就把页面添加到菜单里了。

    看看右边菜单的结构,上面是菜单的名字,这里是Menu_1, 下面是添加在菜单各页面的名字。这个页面名字的顺序可以用鼠标上下拖动,控制菜单的位置。

    级联菜单:看看软件服务菜单下面,有几个菜单项右移了一点,像文章段落跳格了一样。就是用鼠标拖着往右一点,这就是级联菜单的分菜单。可以多级级联,但一般级联一级就好了。

    下面我们打开博客目录的情况 。在这里可以把博客目录放入菜单。在这里我们可以打开网页(Pages),博客(Posts),博客目录(Categories),专有链接(Custom Links)。每次打开一个,就关上原来的。

    我们再看看菜单底部有些什么。这里勾上了 Primary Menu,主菜单,就是说我们设计的就是网站的主菜单。 还有自动添加新页面到此菜单选项,做一个页面就添加到菜单上。当然多个页面太挤了,就需要有级联菜单。

    这样菜单的内容就设计好了。你可能还需设置菜单的界面,放一个logo 在菜单上面。请看本专栏相关菜单设置等博文。

    展开全文
  • 基于链表的多级菜单设计

    千次阅读 2020-04-19 17:19:17
    基于链表的多级菜单设计前言主体 前言 最近在做一个简单的界面,需要用到多级菜单,一开始使用的是传统的索引法,在修改时比较乱,在网上有用链表写的,虽然一致都在用c语言,却很少使用链表,于是今天早上便打算用...

    基于链表的多级菜单设计

    前言

    最近在做一个简单的界面,需要用到多级菜单,一开始使用的是传统的索引法,在修改时比较乱,在网上有用链表写的,虽然一致都在用c语言,却很少使用链表,于是今天早上便打算用链表制作一个多级菜单,经过一天的努力,终于完成了一个简单的框架,现在只可以添加菜单,而且没有级数限制。 目前只是在gcc下运行成功,还没有在单片机上运行。

    主体

    传统的双向链表可以寻找上下级的关系,而在多级菜单中还包括同级关系,因此链表的解构应该是树形,包括,父级,子级,同级上和同级下
    这里定义一个结构体

    typedef struct _menu
    {
        struct _menu * last;//父极菜单指针
        struct _menu * same_last;//同级菜单下一项指针
        struct _menu * same_next;//同级菜单上一项指针
        char * menu_name;//当前功能名称
        int id;//当前功能号
        void (*funsion)();//功能
        struct _menu*next;//子级菜单
      
    }menu_t;
    

    这里,我们还需要几个变量
    1.我们需要知道链表当前位置
    2.通过按键上下可以在同级之间切换,左右分别表示退出和返回,但是如果我们进入一个界面不想通过上下左右切换链表,所以我们还需要一个全局变量,当这个变量为1时是正常操作,当变量为非1时,我们将获取的按键值交给一个全局变量,故我们需要两个变量

    struct {
    menu_t *now;//当前链表位置
    int ctrl;
    char input;
    }sys_info;
    

    接下来便是创建表头

    menu_t*add_funsion(menu_t *head,void * fun,char * str){    //添加一个功能 head为该界面的第一项,自动在该界面后添加一项功能
    	menu_t *p = NULL,*pr = head;  
    	p = (menu_t *)malloc(sizeof(menu_t)) ; 
    	if(p == NULL){		
    		printf("NO enough momery to allocate!\n");
    		exit(0);
    	}
    	if(head == NULL){		
    		head = p;	//head为空,创建头节点	
            printf("创建头节点\n");						
    	}else{				//如果不是创建头节点	
            int i=1;					                       
    		while(pr->same_next!= NULL){		//找到同级菜单最后的表
            {
                i++;
                pr = pr->same_next;
            }
    			
    		}
    		pr->same_next = p;	//在同级菜单尾部创建一个功能
            p->same_last=pr;
            p->last=head->last;
            p->id=i;
    	}
         p->funsion=fun;
    	 p->menu_name=str;
    	p->same_next = NULL;//下一个同级功能为空
        p->next=NULL;			//下一个子集功能为空
    	return head;		
    }
    

    上面的函数中如果head是一个空指针,则创建头节点,如果不是空指针,则在其同级最后添加一个结构
    然后是在一个目录功能下新建一个目录

    menu_t * set_page(menu_t * head,int num)//输入为页的表头
    {
        for(int i=0;i<num;i++)
        {
            if(head->same_next!=NULL)
            head=head->same_next;
            else
            {
                printf("超出当前功能号\n");
            }
            
        }
         if(head->next!=NULL)
        head=head->next;
        else
        {
    
            printf("创建子菜单\n");
        menu_t *p = NULL;   
    	p = (menu_t *)malloc(sizeof(menu_t)) ; 
    	if(p == NULL){		
    		printf("NO enough momery to allocate!\n");
    		exit(0);
    	}
    								                       
    		head->next=p;
            p->last=head;
            p->id=0;//当前功能号为0
            p->same_last=NULL;
            p->same_next=NULL;
            return p;
        }
        
        return head;
    }
    

    第一个head指针为当前目录真正,第二个num代表要在当前目录那一项创建子级,并将创建子级的指针返回,但是,需要注意的是返回的指针已经开辟了内存,并没有使用,因此需要对此指针内容进行赋值

    void set_fun(menu_t *menu,void * fun,char * str)//设置函数和功能
    {
            menu->funsion=fun;
            menu->menu_name=str;
    }
    

    至此主要函数就已经写完了
    然后就是进入目录时的刷新

    void fun1()
    {
       printf("%s","\033[1H\033[2J");//linux下的清屏函数,window下请用system("cls");
        printf("使用键盘选择以下功能\n");
        if(sys_info.now->last!=NULL)//如果父极不为空
        {
            menu_t * start=sys_info.now->last->next;//start指向同级第一个
            while(start!=NULL)//将所有功能打在屏幕上,如果功能和选中功能一样,变色
            {
                
                if(start->menu_name==sys_info.now->menu_name)//
                {
                    printf("********%s*********\n",start->menu_name);
                }
                else
                {
                    printf("    ****%s****\n",start->menu_name);
                }
                start=start->same_next;
    
            }
        }
        else
        {
            printf("父极为空");
        }
    
    
    }
    

    由于是在linux下写完,清屏函数在window下需要system
    下面是完整代码

    #include <stdio.h>
    #include <stdlib.h>
    typedef struct _menu
    {
        struct _menu * last;//父极菜单指针
        struct _menu * same_last;//同级菜单下一项指针
        struct _menu * same_next;//同级菜单上一项指针
        char * menu_name;//当前功能名称
        int id;//当前功能号
        void (*funsion)();//功能
        struct _menu*next;//子级菜单
      
    }menu_t;
    
    struct {
    menu_t *now;//当前链表位置
    int ctrl;
    char input;
    }sys_info;
    
    menu_t * set_page(menu_t * head,int num)//输入为页的表头
    {
        for(int i=0;i<num;i++)
        {
            if(head->same_next!=NULL)
            head=head->same_next;
            else
            {
                printf("超出当前功能号\n");
            }
            
        }
         if(head->next!=NULL)
        head=head->next;
        else
        {
    
            printf("创建子菜单\n");
        menu_t *p = NULL;   
    	p = (menu_t *)malloc(sizeof(menu_t)) ; 
    	if(p == NULL){		
    		printf("NO enough momery to allocate!\n");
    		exit(0);
    	}
    								                       
    		head->next=p;
            p->last=head;
            p->id=0;//当前功能号为0
            p->same_last=NULL;
            p->same_next=NULL;
            return p;
        }
        
        return head;
    }
    
    menu_t*add_funsion(menu_t *head,void * fun,char * str){    //添加一个功能 head为该界面的第一项,自动在该界面后添加一项功能
    	menu_t *p = NULL,*pr = head;   
        
    	p = (menu_t *)malloc(sizeof(menu_t)) ; 
    	if(p == NULL){		
    		printf("NO enough momery to allocate!\n");
    		exit(0);
    	}
    	if(head == NULL){		
    		head = p;	//head为空,创建头节点	
            printf("创建头节点\n");						
    	}else{				//如果不是创建头节点	
            int i=1;					                       
    		while(pr->same_next!= NULL){		//找到同级菜单最后的表
            {
                i++;
                pr = pr->same_next;
            }
    			
    		}
    		pr->same_next = p;	//在同级菜单尾部创建一个功能
            p->same_last=pr;
            p->last=head->last;
           
           
            p->id=i;
    	}
         p->funsion=fun;
    	 p->menu_name=str;
    	p->same_next = NULL;//下一个同级功能为空
        p->next=NULL;			//下一个子集功能为空
    	return head;		
    }
     menu_t * add_child(menu_t *head)//添加子级
    {
        	menu_t *p = NULL;   
    	p = (menu_t *)malloc(sizeof(menu_t)) ; 
    	if(p == NULL){		
    		printf("NO enough momery to allocate!\n");
    		exit(0);
    	}
    	if(head == NULL){		
    		printf("输入head错误,添加子级失败\n");							
    	}else{										                       
    		head->next=p;
            p->last=head;
            p->same_last=NULL;
            p->same_next=NULL;
    	}
        return p;
    }
    void fun1()
    {
       printf("%s","\033[1H\033[2J");//linux下的清屏函数,window下请用system("cls");
        printf("使用键盘选择以下功能\n");
        if(sys_info.now->last!=NULL)//如果父极不为空
        {
            menu_t * start=sys_info.now->last->next;//start指向同级第一个
            while(start!=NULL)//将所有功能打在屏幕上,如果功能和选中功能一样,变色
            {
                
                if(start->menu_name==sys_info.now->menu_name)//
                {
                    printf("********%s*********\n",start->menu_name);
                }
                else
                {
                    printf("    ****%s****\n",start->menu_name);
                }
                start=start->same_next;
    
            }
        }
        else
        {
            printf("父极为空");
        }
    
    
    }
    void kong()//空函数
    {
        printf("%s","\033[1H\033[2J");//linux下的清屏函数,window下请用system("cls");
        printf("***多级菜单显示****");
    }
    void set_fun(menu_t *menu,void * fun,char * str)//设置函数和功能
    {
            menu->funsion=fun;
            menu->menu_name=str;
    }
    void switch_input()//判断输入
    {
      
    
        scanf("%c", & sys_info.input);//把a仍给系统,交给对应函数处理
        if (sys_info.ctrl)//按键控制链表
        {
            switch (sys_info.input)
        {
         case 'w'://if(sys_info.now->same_last!=NULL)
         sys_info.now=sys_info.now->same_last;
         
            break;
             case 's'://if(sys_info.now->same_next!=NULL)
             sys_info.now=sys_info.now->same_next;
          
            break;
             case 'a':// 左相当于返回
             if(sys_info.now->last!=NULL)
             sys_info.now=sys_info.now->last;
         
            break;
             case 'd'://右相当于确认
         if(sys_info.now->next!=NULL)
             sys_info.now=sys_info.now->next;
            break;
        
        default:
            break;
        }
            sys_info.now->funsion();
        }
    }
    void main()
    {
        sys_info.ctrl=1;
    
        menu_t *head=NULL;
        head=add_funsion(head,kong,"添加头节点");//添加头节点
    
         menu_t *first=set_page(head,0);//主页面
        set_fun(first,fun1,"第一页选项一");
       add_funsion(first,fun1,"第一页选项二");
        add_funsion(first,fun1,"第一页选项三");
    
    
        menu_t *second=set_page(first,0);//第一个功能的页面 二级菜单
        set_fun(second,fun1,"选项一的选项一");
        add_funsion(second,fun1,"选项一的选项二");
        add_funsion(second,fun1,"选项一的选项三");
        sys_info.now=first;
    
        menu_t *three=set_page(first,1);//第一个功能的页面 二级菜单
        set_fun(three,fun1,"选项二的选项一");
        add_funsion(three,fun1,"选项二的选项二");
        add_funsion(three,fun1,"选项二的选项三");
    
        menu_t *four=set_page(second,0);//第一个功能的页面的第一个页面  三级菜单
        set_fun(four,fun1,"选项一的选项一的选项一");
        add_funsion(four,fun1,"选项一的选项一选项二");
        add_funsion(four,fun1,"选项一的选项一选项三");
        fun1();
        sys_info.now=first;
        while(1)
        {
            switch_input();
        }
    
    }
    
    
    展开全文
  • 10分钟快速搭建React权限菜单设计 我又来了, react还剩下redux就结束了。就可以开展java、spring boot的学习流程了!!! 本次的功能实现基于上次的【工具篇】10分钟学会Ant Design of React用法,再次的基础上添加...
  • Android菜单设计指南

    千次阅读 2010-08-04 13:57:00
    Android菜单设计指南
  • 菜单设计 CMenu

    千次阅读 2016-11-28 16:05:45
    6.1 菜 单 设计 菜单是可视化编程的重要组成部分,是一种方便地给命令分组并访问这些命令的方法。菜单通常用来显示程序的各项功能,以方便用户选择执行,通过对菜单命令进行编程可以调用程序中相应的功能。 ...
  • 优秀侧滑菜单设计案例

    千次阅读 2013-07-20 11:37:44
    侧滑菜单已经成为app一个...侧滑菜单因Path 2.0和Facebook为开发者熟知,本文搜集了一些时髦的,精致的侧滑菜单设计案例。   优雅的纯色背景,逼真的翻页动画效果。   微妙的阴影和渐变增加了视觉立体感。
  • 权限菜单设计

    千次阅读 2017-02-24 16:17:05
    关于权限菜单设计 http://blog.csdn.net/bearyb1982/article/details/2448301 权限设计(初稿)   1. 前言:   权限管理往往是一个极其复杂的问题,但也可简单表述为这样的逻辑表达式:判断...
  • 基于STM32F407的简易菜单设计+LCD+按键

    千次阅读 多人点赞 2020-07-23 16:14:04
    基于STM32F407的简易多级菜单设计+LCD+按键 实现原理 主要使用 双向链表 结构实现的菜单: //定义菜单中功能项的类型 #define TYPE_SUBMENU 101 //具有子菜单的菜单项 #define TYPE_PARAM 102 //参数项(用于执行...
  • C语言课程设计报告-菜单设计

    万次阅读 多人点赞 2019-07-02 18:55:03
    源代码:https://blog.csdn.net/queen00000/article/details/94468911 xxx大学 C语言课程设计报告 ...
  • Matlab gui用户图形设计界面学习笔记(一)——单个界面的菜单设计 弹出式菜单(pop-up menu)和下拉列表框(listbox) 实现功能:pop menu最初为 “请选择省份”,他的选项包括“黑龙江”和“湖北”。 当选择...
  • C#漂亮菜单设计

    千次阅读 2018-03-23 16:49:30
    在工程化的应用中, 为了取得良好的风格或者具有自身特色的界面,一个重要的方面就是要重绘控件, 菜单作为比较重要的资源,经常在软件中使用,设计漂亮的菜单有助于建立良好的商业化软件。 C#的提供了MenuStrip菜单...
  • 手机分辨率比桌面平台小很多,所以设计手机网站或是移动应用的时候,导航菜单都需要考虑周全,尽量保持简约和易用性高,这里我们整理了5种实用的移动手机App导航菜单设计方案,你可以尝试这些菜单设计模式用在你的新...
  • vue菜单设计

    2018-11-23 17:29:55
  • flex---->菜单设计

    千次阅读 2012-08-29 14:37:23
    菜单设计 菜单主要的作用就是功能模块的导航,通过菜单,用户可以快速的切换到需要的功能。Flex中的菜单大体有三种:上下文菜单、菜单条以及弹出式菜单 一、上下文菜单的设计 上下文菜单是菜单的基础形式,如...
  • 可视化编程工具中一般都附带菜单设计器,使用它就可以方便、快捷的编辑、设计菜单。本文的主要内容就是介绍使用此菜单设计器设计菜单的具体方法,以及个性化菜单的实现方法。 下面就首先来详细介绍在VB.NET中设计...
  • 现在市面上产品的菜单栏种类繁多,到底什么样的才是优秀的导航菜单设计呢?好的菜单设计不仅能提升整个产品的用户体验,而且还能让用户耳目一新。这篇文章将聚焦导航菜单,分享我们对于导航菜单的认识和体验。 ...
  • 第六讲 菜单设计

    2011-03-04 23:30:00
    菜单设计 零、引子: 消息的分类: 标准消息:除WM_COMMAND外,所有以WM_开头的消息,从CWnd派生的类都可以接收这类消息。 命令消息:来自菜单项、工具栏按钮的消息,这类消息都以WM_COMMAND呈现,在MFC中...
  • PyQT5一起学做图书管理系统(13)主界面及菜单设计 环境 系统:windows10系统 编辑器:Sublime3 编程语言:python3+pyqt5 设计逻辑 在之前的所有代码中,其实都能看到signal相关的操作,这是PyQt自带的信号与...
  • <br /> 很久没写文章了,前几天有几个朋友问了我很多关于业务系统(ERP,DRP,CRM等)设计里很多概念性...  本系列文章目录:  1、业务系统设计之一:系统菜单设计   2、业务系统设计之二:系
  • 手机UI:精致有用的侧滑菜单设计

    千次阅读 2014-02-19 12:06:55
    为了节约屏幕空间,侧滑...国内现在也有很多应用都使用侧滑式菜单,如多米、花瓣、豆瓣小组、正点日历等等,本文搜集了一些国外又酷又精致的侧滑菜单设计案例与大家分享,希望对你的设计有所帮助。 优雅的
  • C++习题(系统菜单设计

    千次阅读 2021-02-13 11:22:15
    题目 根据“实践项目1、2“Q题的内容进入实质性设计内容如下: 1、现有学生信息包含三部分:学号(10位数字...4、显示信息时按照两种显示方式(两种方式可以设计菜单):一种是输入学生的关键字,显示特定学生,找
  • 导航菜单设计是网站设计关键。这里是一个伟大的,脱颖而出,启发灵感的导航菜单设计! Cab Edge Egoitz Osa Listal Proxaska Giogrio Molinaro Happy Tapper Stickybeak Media Charlie ...
  • app的底部菜单设计

    2018-08-15 18:15:00
    1、一般都是四个菜单或者五个菜单,这个是绝对主流,我估计占比达99%。当然也有三个菜单图标的,也有零个菜单图标的 2、如果该app软件功能复杂,那么尽量选择5个图标布局。比如苹果app store,支付宝,淘宝,京东,...
  • 最新网站导航菜单设计案例欣赏

    千次阅读 2010-03-23 16:46:00
    众多国外英文网站导航菜单设计案例欣赏。3-D 导航3-D 风格的导航菜单可以表现的更突出,能在整个页面的设计中凸显导航功能,并且向用户传达直观的可操作性。DelibarBlue Door BabyMystery TinpsdtowpHarry Bissett
  • 这些菜单选项肯定需要在数据库中进行维护,当数据表很多时,菜单选项可能都会达到上百个,该如何设计呢?下面将讲解设计方法。(设计方法不唯一,本人总结的也不代表最好的,仅供参考)。数据表设计总共包含4个表,...
  • 从下拉菜单设计细节看Amazon对用户体验的把握 摘要:作为世界上最大的B2C电子商务公司,Amazon用户体验设计上一直有其独到之处,最知名的莫过于“一键下单”专利,连苹果都没忍住,花钱购买了该专利的使用权。除...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,928
精华内容 10,371
关键字:

菜单设计