精华内容
下载资源
问答
  • 如何制作一本同学录
    千次阅读
    2021-01-09 19:17:32

    数据结构课程设计—同学录管理系统(c语言)



    前言

    计算机相关专业在学习数据结构这门课程时会有课程设计,我被分配到的是同学录管理系统。


    提示:本程序采用的数据结构是线性表,主菜单为:

    --------欢迎使用同学录管理系统V1.0--------
    ☆☆☆☆☆☆主菜单栏☆☆☆☆☆☆☆
    ★1.录入同学信息
    ★2.显示同学信息
    ★3.查找某同学
    ★4.修改某同学信息
    ★5.删除某同学信息
    ★6.同学录排序
    ★7.统计当前同学录总人数
    ★0.退出同学录管理系统


    一、需求分析

    1.问题描述:
    实现同学录管理的几个操作功能(录入、查找、删除、排序、写入文件、从文件中读取、屏幕输出等功能)。同学录中可存储的学生信息包括姓名、年龄、性别、联系电话、QQ号码、邮箱、联系地址等。

    2.问题要求:
    要求编写一程序,选择适当的数据结构,解决上述问题。要求:(1)输入输出界面友好,可视化程度强;(2)程序的可读性较强;(3)程序具有较强的健壮性;(4)程序能够自动把用户操作之后的顺序表中信息写入到tong_xue_lu.txt文件中,并在运行程序时自动从tong_xue_lu.txt文件中读取同学的信息并建立顺序表;

    二、总体设计

    1.设计思路:
    本程序采用顺序表来存储同学信息。先定义一个结构体类型someone,结构体包括六个字符数组变量,一个整形变量,用来存储每个人的姓名、年龄、性别、手机号码、QQ号码、邮箱、联系地址。再定义一个结构体类型classmate,结构体包括一个someone型指针变量(用来存储顺序表的首地址)和一个整型变量length(用来存储顺序表的长度)。然后通过对顺序表的取值、删除、查找、排序、修改、输出等算法来实现对同学录管理系统中的录入同学信息、删除某同学信息、查找某同学、对同学录进行排序、修改某同学的信息等功能。

    三、代码实现

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define MAXSIZE 100
    #define OK 1
    #define ERROR -1
    char a[5]="序号";
    char b[5]="姓名";
    char c[5]="年龄";
    char d[5]="性别";
    char e[10]="手机号码";
    char f[10]="QQ号码";
    char g[6]="邮箱";
    char h[10]="联系地址"; 
    typedef struct mate
    {
    	char name[6];
    	int age;
    	char sex[3];
    	char iphonenumber[20];
    	char QQnumber[20];
    	char mail[20];
    	char location[30];
     } someone;
    typedef struct
    {
    	someone *elem;
    	int length;
    }classmate;
    //初始化线性表
    int init_class(classmate &L)
    {
    	L.elem=new someone[MAXSIZE];
    	if(!L.elem)
    	{
    		return ERROR;
    	}
    	L.length=0;
    	return OK;
    }
    //打印顺序表函数
    void print_class(classmate L) 
    {
    	int choose,i;
    	if(L.length==0) printf("当前同学录为空,请先录入同学信息\n\n");
    	else
    	{
    		while(1)
    		{
    			printf("********************************************\n");
    			puts("●1.输出姓名列");
    			puts("●2.输出所有列信息");
    			puts("●0.返回主菜单");
    			printf("********************************************\n");
    			puts("请输入你的操作指令:");
    			scanf("%d",&choose);
    			while(choose<0||choose>2)
    			{
    				printf("您输入的查找指令有误,请重新输入:");
    				scanf("%d",&choose); 
    			}
    			if(choose==0) break;
    			switch(choose)
    			{
    				case 1:
    					printf("-----------------------------------------------------------------------------------------------\n");
    					printf("%-6s",a);
    					printf("%-8s",b);
    					printf("\n");
    					printf("-----------------------------------------------------------------------------------------------\n");
    					for(i=0;i<L.length;i++)
    					{
    						printf("%-6d",i+1);
    						printf("%-8s",L.elem[i].name);
    						printf("\n");
    					}
    					printf("-----------------------------------------------------------------------------------------------\n");
    					break;
    				
    				case 2:
    					printf("-----------------------------------------------------------------------------------------------\n");
    					printf("%-6s",a);
    					printf("%-8s",b);
    					printf("%-9s",c);
    					printf("%-6s",d); 
    					printf("%-16s",e);
    					printf("%-16s",f);
    					printf("%-21s",g);
    					printf("%-21s",h);
    					printf("\n");
    					printf("-----------------------------------------------------------------------------------------------\n");
    					printf("\n");
    					for(i=0;i<L.length;i++)
    					{
    						printf("%-6d",i+1);
    						printf("%-8s",L.elem[i].name);
    						printf("%-9d",L.elem[i].age);
    						printf("%-6s",L.elem[i].sex);
    						printf("%-16s",L.elem[i].iphonenumber);
    						printf("%-16s",L.elem[i].QQnumber);
    						printf("%-21s",L.elem[i].mail);
    						printf("%-21s",L.elem[i].location);
    						printf("\n\n");
    					}
    					printf("-----------------------------------------------------------------------------------------------\n");
    					printf("***************************************************");
    					printf("\n");
    					break;
    				}
    	
    		}
    
    	}
    }
    //录入同学录内容
    void put_class(classmate &L)
    {
    	void save(classmate L); 
    	int i,l,j;
    	printf("请输入要录入的同学人数(0~%d):",MAXSIZE-L.length);
    	scanf("%d",&l);
    	while(l<1||l>(MAXSIZE-L.length))
    	{
    		printf("输入人数范围有误,请重新输入同学人数(1~%d):",MAXSIZE-L.length);
    		scanf("%d",&l);
    	 }  
    	for(i=L.length,j=0;j<l;j++,i++)
    	{
    		printf("***************************************************\n");
    		printf("请输入第%d个同学的姓名(最大长度6):",i+1);
    		scanf("%s",L.elem[i].name);
    		printf("请输入%s的年龄:",L.elem[i].name);
    		scanf("%d",&L.elem[i].age);
    		printf("请输入%s的性别(最大长度3):",L.elem[i].name);
    		scanf("%s",L.elem[i].sex);
    		printf("请输入%s的手机号(长度11):",L.elem[i].name);
    		scanf("%s",L.elem[i].iphonenumber);
    		while(strlen(L.elem[i].iphonenumber)!=11)
    		{
    			printf("您输入的号码长度不合法,请重新输入");
    			scanf("%s",L.elem[i].iphonenumber);
    		}
    		printf("请输入%s的QQ号码(最大长度20):",L.elem[i].name);
    		scanf("%s",L.elem[i].QQnumber);
    		printf("请输入%s的邮箱(最大长度20):",L.elem[i].name);
    		scanf("%s",L.elem[i].mail);
    		printf("请输入%s的联系地址(最大长度30):",L.elem[i].name);
    		scanf("%s",L.elem[i].location);
    		printf("***************************************************\n");
    		printf("\n");
    	}
    	L.length=L.length+l;
    	save(L);
     }  
     //查找函数菜单 
     void chazhao(classmate L)
     {
     	int i,b,e,choose; 
     	void chazhao_print_title();
     	int chazhao_print(classmate L,int i);
     	char seek[20];
     	if(L.length==0) printf("当前同学录为空,请先录入同学信息\n\n");
     	else
     	{
    		while(1)
    		{
    			int count=0;
    			printf("********************************************\n");
    			puts("●1.按名字查找");
    			puts("●2.按地址查找");
    			puts("●3.按年龄段查找"); 
    			puts("●0.返回主菜单");
    			printf("********************************************\n");
    			puts("请输入你的查找指令:");
    			scanf("%d",&choose);
    			while(choose<0||choose>3)
    			{
    				printf("您输入的查找指令有误,请重新输入:");
    				scanf("%d",&choose); 
    			}
    			if(choose==0) break;
    			switch(choose)
    			{
    				case 1:
    					printf("请输入你要查询人的名字:");scanf("%s",seek);
    					for(i=0;i<L.length;i++)
    	  				{
    	  					if(strcmp(seek,L.elem[i].name)==0)
    	  					{
    	  						printf("查找成功,在第%d个位置\n",i+1);
    	  						chazhao_print_title();
    	  						chazhao_print(L,i);
    	  						count++;
    					  	}
    					}
    					if(count==0) printf("%s不存在!\n",seek);
    					break;
    				case 2:
    					printf("请输入你要查询人的地址:");
    					scanf("%s",seek);
    					chazhao_print_title();
    					for(i=0;i<L.length;i++)
    	  				{
    	  					if(strcmp(seek,L.elem[i].location)==0)
    	  					{
    	  						chazhao_print(L,i);
    	  						count++;
    					  	}
    					}
    					if(count==0) printf("您要查询的人不存在!\n");
    					break;
    				case 3:
    					printf("请输入升序年龄范围,用短横杠隔开(例如1-10)\n");
    	  				scanf("%d-%d",&b,&e);
    	  				printf("年龄在%d-%d之间的人有:\n",b,e);
    	  				chazhao_print_title();
    	  				for(i=0;i<L.length;i++)
    	  				{
    	  					if((b<=L.elem[i].age)&&(L.elem[i].age<=e))
    	  					{
    	  						chazhao_print(L,i);
    	  						count++;
    					  	}
    				  	}
    				  	if(count==0) printf("年龄在%d-%d人不存在!\n",b,e);
    					break;
    			}
    		}
    	}
      }  
     //查找时打印表头
     void chazhao_print_title()
     {
    	printf("-----------------------------------------------------------------------------------------------\n");
    	printf("%-6s",a);
    	printf("%-8s",b);
    	printf("%-9s",c);
    	printf("%-6s",d); 
    	printf("%-16s",e);
    	printf("%-16s",f);
    	printf("%-21s",g);
    	printf("%-21s",h);
    	printf("\n");
    	printf("-----------------------------------------------------------------------------------------------\n");
    	printf("\n");
      } 
      //查找时单独打印函数
      int chazhao_print(classmate L,int i)
      {
    	printf("%-6d",i+1);
    	printf("%-8s",L.elem[i].name);
    	printf("%-9d",L.elem[i].age);
    	printf("%-6s",L.elem[i].sex);
    	printf("%-16s",L.elem[i].iphonenumber);
    	printf("%-16s",L.elem[i].QQnumber);
    	printf("%-21s",L.elem[i].mail);
    	printf("%-21s",L.elem[i].location);
    	printf("\n");
    	printf("-----------------------------------------------------------------------------------------------\n");
    	printf("\n");
       }  
    //删除函数
    void shanchu(classmate &L)
    {
    	void save(classmate L);
    	int i,choose,n,j;
    	char seek_name[6];
    	if(L.length==0) printf("当前同学录为空,请先录入同学信息\n\n");
    	else
    	{
    		while(1)
    		{
    			int count=0;
    			printf("********************************************\n");
    			puts("●1.按序号删除");
    			puts("●2.按名字删除");
    			puts("●0.返回主菜单");
    			printf("********************************************\n");
    			puts("请输入您的删除指令:");
    			scanf("%d",&choose);
    			while(choose<0||choose>3)
    			{
    				printf("您输入的删除指令有误,请重新输入:");
    				scanf("%d",&choose); 
    			}
    			if(L.length==0)
    			{
    				printf("当前同学录为空,请先录入同学信息\n\n");
    				break;
    			}
    			else
    				{
    			
    				while(choose<0||choose>2)
    				{
    					printf("您输入的删除指令有误,请重新输入:");
    					scanf("%d",&choose); 
    			 	} 
    				if(choose==0) break;
    				switch(choose)
    				{
    					case 1:
    						printf("请输入您要删除的同学的序号:");
    						scanf("%d",&n);
    						if(n>L.length)
    						{
    							printf("您要删除的人不存在!\n");
    							break;
    						}
    						printf("序号为%d的同学(%s)已被删除\n",n,L.elem[n-1].name);
    						for(i=n;i<L.length;i++)
    						{
    							L.elem[i-1]=L.elem[i]; 
    						}
    						L.length--;
    						save(L);
    						break;
    					case 2:
    						printf("请输入您要删除的同学的姓名:");
    						scanf("%s",seek_name);
    						for(i=0;i<L.length;i++)
    						{
    							if(strcmp(seek_name,L.elem[i].name)==0)
    							{
    								for(j=i+1;j<L.length;j++)
    								{
    									L.elem[j-1]=L.elem[j];
    								}
    								L.length--;
    								count++;
    							}
    						}
    						if(count==0)
    						{
    							printf("您要删除的人不存在!\n");
    						}
    						else
    						{
    							printf("%s的信息已删除成功\n",seek_name);
    							save(L);
    						}
    						break; 
    				}
    			}
    		}
    	}
     } 
     //排序函数
     void paixu(classmate &L)
    {
    	void save(classmate L);
    	if(L.length==0) printf("当前同学录为空,请先录入同学信息\n\n");
    	else
    	{
    		someone m;
    	 	int i,j,t;
    	 	int choose,choose1; 
    	 	puts("●1.按升序排序");
    		puts("●2.按降序排序");
    		puts("请输入你的排序指令:");
    		scanf("%d",&choose1);
    		while(choose1<1||choose1>2)
    		{
    			printf("您输入的排序指令有误,请重新输入:");
    			scanf("%d",&choose1); 
    		}
    		switch(choose1)
    		{
    			case 1:
    				puts("●1.按名字升序排序");
    				puts("●2.按年龄升序排序");
    				puts("●3.按地址升序排序");
    				puts("●4.按QQ号升序排序");
    				puts("请输入你的操作指令:");
    				scanf("%d",&choose);
    				while(choose<1||choose>4)
    				{
    					printf("您输入的指令有误,请重新输入:");
    					scanf("%d",&choose); 
    				}
    				switch(choose)
    				{
    					case 1:
    						for(i=0;i<L.length;i++)
    			 			{
    			 				for(j=i+1;j<L.length;j++)
    			 				{
    			 					if(strcmp(L.elem[i].name,L.elem[j].name))
    			 					{
    			 						m=L.elem[i];
    			 						L.elem[i]=L.elem[j];
    			 						L.elem[j]=m;
    								}
    						 	}
    						}
    						puts("按姓名升序排序成功。");
    						save(L);
    						break;
    					case 2:
    						for(i=0;i<L.length;i++)
    			 			{
    			 				for(j=i+1;j<L.length;j++)
    			 				{
    			 					if(L.elem[i].age>L.elem[j].age)
    			 					{
    			 						m=L.elem[i];
    			 						L.elem[i]=L.elem[j];
    			 						L.elem[j]=m;
    							 	}
    						 	}
    					 	}
    						puts("按年龄升序排序成功。");
    						save(L);
    						break;
    					case 3:
    						for(i=0;i<L.length;i++)
    			 			{
    			 				for(j=i+1;j<L.length;j++)
    			 				{
    			 					if(strcmp(L.elem[i].location,L.elem[j].location))
    			 					{
    				 					m=L.elem[i];
    				 					L.elem[i]=L.elem[j];
    			 						L.elem[j]=m;
    							 	}
    						 	}
    					 	}
    						puts("按地址升序排序成功。");
    						save(L);
    						break;
    					case 4:
    						for(i=0;i<L.length;i++)
    				 		{
    				 			for(j=i+1;j<L.length;j++)
    				 			{
    				 				if(strcmp(L.elem[i].QQnumber,L.elem[j].QQnumber))
    				 				{
    				 					m=L.elem[i];
    				 					L.elem[i]=L.elem[j];
    				 					L.elem[j]=m;
    								}
    							}
    						}
    						puts("按QQ号升序排序成功。");
    						save(L);
    						break;
    				}
    				break;
    				case 2:
    				puts("●1.按名字降序排序");
    				puts("●2.按年龄降序排序");
    				puts("●3.按地址降序排序");
    				puts("●4.按QQ号降序排序");
    				puts("请输入你的操作指令:");
    				scanf("%d",&choose);
    				while(choose<1||choose>4)
    				{
    					printf("您输入的指令有误,请重新输入:");
    					scanf("%d",&choose); 
    				}
    				switch(choose)
    				{
    					case 1:
    						for(i=0;i<L.length;i++)
    			 			{
    			 				for(j=i+1;j<L.length;j++)
    			 				{
    			 					if(strcmp(L.elem[i].name,L.elem[j].name)==-1)
    			 					{
    			 						m=L.elem[i];
    			 						L.elem[i]=L.elem[j];
    			 						L.elem[j]=m;
    								}
    						 	}
    						}
    						puts("按姓名降序排序成功。");
    						save(L);
    						break;
    					case 2:
    						for(i=0;i<L.length;i++)
    			 			{
    			 				for(j=i+1;j<L.length;j++)
    			 				{
    			 					if(L.elem[i].age<L.elem[j].age)
    			 					{
    			 						m=L.elem[i];
    			 						L.elem[i]=L.elem[j];
    			 						L.elem[j]=m;
    							 	}
    						 	}
    					 	}
    						puts("按年龄降序排序成功。");
    						save(L);
    						break;
    					case 3:
    						for(i=0;i<L.length;i++)
    			 			{
    			 				for(j=i+1;j<L.length;j++)
    			 				{
    			 					if(strcmp(L.elem[i].location,L.elem[j].location)==-1)
    			 					{
    				 					m=L.elem[i];
    				 					L.elem[i]=L.elem[j];
    			 						L.elem[j]=m;
    							 	}
    						 	}
    					 	}
    						puts("按地址降序排序成功。");
    						save(L);
    						break;
    					case 4:
    						for(i=0;i<L.length;i++)
    				 		{
    				 			for(j=i+1;j<L.length;j++)
    				 			{
    				 				if(strcmp(L.elem[i].QQnumber,L.elem[j].QQnumber)==-1)
    				 				{
    				 					m=L.elem[i];
    				 					L.elem[i]=L.elem[j];
    				 					L.elem[j]=m;
    								}
    							}
    						}
    						puts("按QQ号降序排序成功。");
    						save(L);
    						break;
    				}
    				break;
    		}
    	}
    }
     //修改同学信息
     void xiugai(classmate &L)
     {
     	void save(classmate L);
     	if(L.length==0) printf("当前同学录为空,请先录入同学信息\n\n");
     	else
     	{
    	 	int choose,i,t,count=0;
    	 	char seekname[6];//存储要修改人的名字 
    	 	
    	 	printf("你要修改谁的信息,请输入姓名:\t");
    	 	scanf("%s",seekname);
    		for(i=0;i<L.length;i++)
    	  	{
    	  		if(strcmp(seekname,L.elem[i].name)==0)
    	  		{
    	  			t=i;
    	  			count++;
    				break;
    			}
    		}
    		if(count==0) printf("您要删除的人不存在\n");
    		else
    		{
    			while(1)
    			{
    				printf("********************************************\n");
    				puts("●1.修改姓名");
    				puts("●2.修改年龄");
    				puts("●3.修改性别");
    				puts("●4.修改地址");
    				puts("●5.修改QQ号码");
    				puts("●6.修改手机号");
    				puts("●7.修改邮箱");
    				puts("●0.返回主菜单");
    				printf("********************************************\n");
    				puts("请输入你的修改指令:");
    				scanf("%d",&choose);
    				while(choose<0||choose>7)
    				{
    					printf("您输入的修改指令有误,请重新输入:");
    					scanf("%d",&choose); 
    				}
    				if(choose==0) break;
    				switch(choose)
    				{
    					case 1:
    						puts("请输入新的姓名:");
    						scanf("%s",L.elem[t].name);
    						printf("%s的姓名修改成功\n",seekname);
    						save(L);
    						break;
    					case 2:
    						puts("请输入新的年龄:");
    						scanf("%d",&L.elem[t].age);
    						printf("%s的年龄修改成功\n",seekname);
    						save(L);
    						break;
    					case 3:
    						puts("请输入新的性别:");
    						scanf("%s",L.elem[t].sex);
    						printf("%s的性别修改成功\n",seekname);
    						save(L);
    						break;
    					case 4:
    						puts("请输入新的地址:");
    						scanf("%s",L.elem[t].location);
    						printf("%s的地址修改成功\n",seekname);
    						save(L);
    						break;
    					case 5:
    						puts("请输入新的QQ号码:");
    						scanf("%s",L.elem[t].QQnumber);
    						printf("%s的QQ号码修改成功\n",seekname);
    						save(L);
    						break;
    					case 6:
    						puts("请输入新的手机号:");
    						scanf("%s",L.elem[t].iphonenumber);
    						printf("%s的手机号修改成功\n",seekname);
    						save(L);
    						break;
    					case 7:
    						puts("请输入新的邮箱:");
    						scanf("%s",L.elem[t].mail);
    						printf("%s的邮箱修改成功\n",seekname);
    						save(L);
    						break;
    				}
    			}
    		}
    	}
      } 
    //保存到文件函数
    void save(classmate L)
    {
    	FILE *fp;
    	int i;
    	fp=fopen("tong_xue_lu.txt","w");
    	fprintf(fp,"%d\n",L.length);
    	for(i=0;i<L.length;i++)
    	{
    		fprintf(fp,"%s %d %s %s %s %s  %s\n",L.elem[i].name,L.elem[i].age,L.elem[i].sex,L.elem[i].iphonenumber,L.elem[i].QQnumber,L.elem[i].mail,L.elem[i].location);
    		
    	 } 
    	fclose(fp);
    
     } 
     void read(classmate &L)
     {
     	FILE *fp;
    	int i;
    	fp=fopen("tong_xue_lu.txt","r");
    	int count;
    	fscanf(fp,"%d\n",&count);
    	for(i=0;i<count;i++)
    	{
    		fscanf(fp,"%s %d %s %s %s %s %s\n",L.elem[i].name,&L.elem[i].age,L.elem[i].sex,L.elem[i].iphonenumber,L.elem[i].QQnumber,L.elem[i].mail,L.elem[i].location);
    		L.length++;
    	 } 
    	fclose(fp);
     }
     void num(classmate L)
     {
     	printf("-----------------------------------------------------------------------------------------------\n");
     	printf("当前同学录共有%d人\n",L.length);
     	printf("-----------------------------------------------------------------------------------------------\n");
     }
    int main()
    {
    	int choose;
    	classmate L;
    	init_class(L); 
    	read(L);
    	while(1)
    	{
    		printf("--------欢迎使用同学录管理系统V1.0--------\n");
    		printf("--------操作指令是选项前的数字序号--------\n");
    		printf("********************************************\n");
    		printf("☆☆☆☆☆☆主菜单栏☆☆☆☆☆☆☆\n");
    		printf("\n");
    		puts("★1.录入同学信息");
    		puts("★2.显示同学信息");
    		puts("★3.查找某同学");
    		puts("★4.修改某同学信息");
    		puts("★5.删除某同学信息");
    		puts("★6.同学录排序");
    		puts("★7.统计当前同学录总人数");
    		puts("★0.退出同学录管理系统");
    		printf("********************************************\n");
    		printf("\n");
    		printf("-----------------------------------------------------------\n");
    		printf("请选择主菜单指令:");
    		scanf("%d",&choose);
    		while(choose<0||choose>7)
    		{
    			printf("您输入的主菜单指令有误,请重新输入:");
    			scanf("%d",&choose); 
    		}
    		if(choose==0) break;
    		switch(choose)
    		{
    			case 1:put_class(L);save(L);break;
    			case 2:print_class(L);break;
    			case 3:chazhao(L);break;
    			case 4:xiugai(L);break;
    			case 5:shanchu(L);break;
    			case 6:paixu(L);break;
    			case 7:num(L);break;
    		}
    	}
    	printf("请按任意键退出系统");
    	return 0;
    } 
    

    四、代码说明

    1.抽象数据类型定义:

    抽象数据类型包括someone和classmate,someone是一个包含char name[6]; int age; char sex[3]; char iphonenumber[20]; char QQnumber[20]; char mail[20]; char location[30];七个变量的结构体数据类型,classmate是一个包含someone *elem; int length;两个变量的结构体数据类型。
    数据关系:通过访问classmate里面的elem可以间接访问someone里面的数据。
    基本操作:先定义classmate L;然后进行L.elem.name或者L.length;即可访问到抽象数据类型里的所有内容了。

    2.存储结构设计:

    本设计采用了顺序表的存储结构,顺序表的默认表长是100。

    3.算法设计:

    (1)初始化线性表函数【int init_class(classmate &L)】:使用new函数为线性表分配存储空间,用L.elem指向存储空间的首地址,并初始化线性表长度L.length==0;

    (2)打印同学录信息【void print_class(classmate L)】:此函数参数是classmate型抽象数据变量。首先定义两个整形变量choose、i,chooose用来作为内部菜单的选择指令,i用来当做循环变量。然后进行判断表长是否为零(即同学录是否为空),此处用一个if判断语句,如果表长为零,则提示用户“当前同学录为空,请先录入同学信息”,直接跳出此函数;反之则显示内部菜单“●1.输出姓名列、●2.输出所有列信息、●0.返回主菜单”(PS:此处用了while循环,可以使用户对此进行多次操作,当用户选择“●0.返回主菜单”操作时,汇银break而结束循环)。为了程序的健壮性,用while(choose<0||choose>2),来判断用户输入的菜单指令是否在“0,1,2”之间,如果不在,则提示用户重新输入操作指令,直到输入正确。接下来用switch选择语句,参数是用户的操作指令choose,如果choose=1,则只输出姓名列,用for循环遍历一遍顺序表L,输出所有的姓名信息,然后用break终止。如果choose==2,则用for循环遍历L.elem中的所有信息并输出,然后用break终止。

    (3)录入同学录内容【void put_class(classmate &L)】:先定义三个整型变量“i,l,j”,i和j用来当做for循环的循环变量,而l用来存储每次要录入的学生的个数。为了程序的健壮性,用了while(l<1||l>(MAXSIZE-L.length))来判断要录入的学生个数是否大于等于1且是否大于目前剩余的存储空间,如果l<1||l>(MAXSIZE-L.length),则提示用户重新输入学生个数。待l输入正确后,用for循环来以此录入每个学生的姓名、年龄、性别、手机号、QQ号码、邮箱、联系地址等。相应地循环次数是学生个数l。循环完成后,对表长L.length进行加l。

    (4)查找功能【void chazaho(classmate L)】:先定义三个整型变量“i,b,e,count,choose”,i是for循环的循环变量;b和e用来存储使用年龄段查找功能时的年龄段的起始值和末尾值;count赋初值0,用来判断是否查找成功,当count=0时,查找失败;choose用来存储用户的操作指令。在定义一个字符数组变量seek,用来存储查找的关键字,比如按名字查找时的名字、按地址查找时的地址。考虑到程序的健壮性,使用if-else语句先判断线性表(同学录)是否为空,如果为空,则提示用户“当前同学录为空,请先录入同学信息”;如果不为空,则进行后续的查找操作。else内用一个while循环,只有当用户选择“●0.返回主菜单”操作时才会因break而终止。While循环内首先对用户展示内菜单栏“●1.按名字查找、●2.按地址查找、●3.按年龄段查找、●0.返回主菜单”。接下来用swith(choose)语句根据用户选择的查找命令使用不同的方式查找。考虑到程序的健壮性,用while(choose<0||choose>3),来判断用户输入的菜单指令是否在“0,1,2,3”之间,如果不在,则提示用户重新输入操作指令,直到输入正确;接下来用switch(choose)来实现用户命令与查找方式的对应:如果choose==1则进行按名字查找,用for循环遍历顺序表,如果某个人的姓名和关键字相同,则输出这个人的所有信息。同理,当choose==2时,则按地址查找。当choose==3时,则按年龄段查找。如果没有匹配到和关键字相同的同学,此时count==0,提示用户要查找的人不存在。

    (5)删除功能【void shanchu(classmate &L)】:先定义四个整型变量“i,choose,j”,i和j是循环变量,choose用来存储用户的操作指令;再定义一个字符数组变量seek_name用来存储使用按姓名删除功能时的姓名关键字。考虑到程序的健壮性,使用if-else语句先判断线性表(同学录)是否为空,如果为空,则提示用户“当前同学录为空,请先录入同学信息”;如果不为空,则进行后续的删除操作。else内用一个while循环,只有当用户选择“●0.返回主菜单”操作时才会因break而终止。While循环内首先对用户展示内菜单栏“●1. 按序号删除、●2. 按名字删除、●0.返回主菜单”(while内定义了一个整型变量count,用来判断当使用姓名删除时,被删除人是否存在)。考虑到程序的健壮性,用while(choose<0||choose>2),来判断用户输入的菜单指令是否在“0,1,2”之间,如果不在,则提示用户重新输入操作指令,直到输入正确;接下来用switch(choose)来实现用户命令与删除方式的对应:如果choose==1则进行按序号删除,如果choose=2则进行按名字删除。删除的算法思路为:把要删除的元素后面的所有元素都向前挪一个位置。当使用按姓名删除时,先匹配到到待删除人的下标,再进行删除。(且当要删除的人不存在时,系统会提示用户“您要删除的人不存在”,删除成功时则会提示用户删除成功)

    (6)排序功能【void paixu(classmate &L)】:首先判断顺序表是否为空,为空的话会提示用户先录入同学信息(同时直接返回主菜单),不为空则进行下面的的排序操作。此功能同样采用了内菜单的方式来供用户选择不同的排序方式(首先让用户选择升序还是降序,然后再让用户选择按那个关键字排序)。排序的算法为简单选择排序。同时用到了字符串的比较函数strcmp函数。

    (6)修改信息功能【void xiugai(classmate &L)】: 此功能定义了3个整型变量“choose.i.t”两个字符数组变量“seekname[6],change[31]”,choose用来存储用户的操作指令,i是循环变量,t用来存放被修改人的位置下标,seekname存储被修改人的名字。 首先判断顺序表是否为空,为空的话会提示用户先录入同学信息(同时直接返回主菜单),不为空则进行下面的的修改操作。此功能同样采用了内菜单的方式来供用户选择不同的修改方式。首先让用户输入要修改人的名字,根据查找算法来获得此人相应的下标。 然后展示内菜单(考虑到程序的健壮性,用while(choose<0||choose>7),来判断用户输入的菜单指令是否在“0,1,2,3,4,5,6,7”之间,如果不在,则提示用户重新输入操作指令,直到输入正确),让用户选择修改哪一项信息。通过用scanf函数直接修改相应地址的信息。

    (7)保存到文件功能【void save(classmate L)】:先创建一个文件指针fp和一个整型变量i,i是循环变量,fp指向要保存到的文本文档“tong_xue_lu.txt”。文件使用方式选择“w”。先把同学录的人数保存到文本文档的第一行,然后用for循环以此将顺序表L中的所有同学信息写入到文本文档tong_xue_lu.txt中,每位同学的信息单独占一行。此系统采用了实时保存功能,即用户每进行一项操作之后,都会自动保存到文件中。

    (8)从文件中读取功能【void read(classmate &L)】:先创建一个文件指针fp和两个整型变量i和count,i是循环变量,count用来存储从文本文档中读取到的第一个元素,即同学的人数。fp指向要读取的文本文档“tong_xue_lu.txt”。文件使用方式选择“r”。首先读取同学录的总人数存储到count里面,然后用for循环,循环count次将文本文档tong_xue_lu.txt中的所有同学信息读取到顺序表L中去。

    (9)统计同学录人数功能【void num(classmate L)】:此功能实现把顺序表的长度(即同学录中的人数)输出,告知用户当前同学录有多少人。

    更多相关内容
  • 【JavaWeb期末项目】简单的同学录系统

    千次阅读 多人点赞 2020-02-11 23:57:26
    同学录系统,简单的界面增删改查功能,附有完整代码以及源码可以运行和下载。

    源码自行下载:同学录源码

    todo:本文已经包含了所有代码,因此不用积分下载也可以。

    0. 前言

    本文记录了完整的实现代码,若有不足之处,欢迎批评指正!

    1. 开发环境

    Eclipse
    Mysql
    jdk1.8
    Tomcat 7

    2. 涉及技术点

    MVC模式、JavaWeb、JDBC、jsp、css、bootstrap

    3. 实现功能

    1. 学生信息的输入、更新、修改、删除、保存
    2. 学生信息的查询(按名字查询、学号查询、地区查询)

    4. 界面展示

    在这里插入图片描述
    在这里插入图片描述

    5. 项目目录及实现

    在这里插入图片描述

    5.1 数据库连接

    数据库包含两个表,对应字段请查看实体类部分

    DBUtils.java

    package com.utils;
    
    import java.io.FileReader;
    import java.io.Reader;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.util.Properties;
    
    public class DBUtils {
    	private static String driver;
    	private static String url;
    	private static String user;
    	private static String password;
    
    	static Connection conn = null;
    	static {
    		Properties properties = new Properties(); // 创建一个properties对象
    		Reader inReader; // 一个reader属性;
    
    		try {
    			String path = Thread.currentThread().getContextClassLoader().getResource("jdbc.properties").getPath();
    			inReader = new FileReader(path); // 用这个方法获取properties配置文件;
    			properties.load(inReader); // 加载load内部的地址;
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    		// 通过properties.getProperty("driver");方法获取值
    		driver = properties.getProperty("driver");
    		url = properties.getProperty("url");
    		user = properties.getProperty("user");
    		password = properties.getProperty("password");
    	}
    	public static Connection open() {
    		try {
    			Class.forName(driver);
    			System.out.println("连接成功!");
    			return DriverManager.getConnection(url, user, password);
    		} catch (Exception e) {
    			System.out.println("连接数据库失败!");
    		}
    		return null;
    	}
    	public static Connection close() {
    		if (conn != null) {
    			try {
    				conn.close();// 关闭数据库
    				System.out.println("关闭...");
    			} catch (Exception e) {
    				e.printStackTrace();
    				System.out.println("数据库关闭失败...");
    			}
    		}
    		return null;
    	}
    }
    

    jdbc.properties

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/javaweb_final?useUnicode=true&characterEncoding=utf8
    user=root
    password=root
    

    5.2 显示层相关代码

    登录页面login.jsp

    因为写这个系统的时候还没有学过样式,所以这个样式也是在网上搜索到的。有时间一定要把CSS掌握。

    该样式使用来源:一款很漂亮的CSS3登录界面

    自己用js语句加了一个“未登录”及“账号/密码错误”情况的提示框,tip的值分别来源于LoginServlet和LoginFilter(Servlet用于判断账户名和密码,Filter用来防止未登录就查看主页信息)

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>登录界面</title>
    <link rel="stylesheet" href="css/style.css">
    </head>
    <body>
    <%-- <p><font color="red">${tip}</font></p> --%>
    <script> 
    var errori ="${tip}";
    if(errori=='账号或密码错误'){
     alert("账号或密码错误,请重新登录!");
    }else if(errori=='未登录'){
     alert("未登录,请先登录!");   
    }
    </script>
        <div class="wrap">
            <div class="container">
                <h1>Welcome</h1>
                <form action="LoginServlet" method="post">
                    <input type="text" name="username"placeholder="your username"/>
                    <input type="password" name="password"placeholder="your password"/>
                    <input type="submit" value="Login"/>
                </form>
            </div>
            <!-- 动态效果  -->
            <ul>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
            </ul>
        </div>
    </body>
    </html>
    

    同学录主页list.jsp

    一开始只用了一个非常简单的显示表格,看起来非常丑,所以使用了bootstrap。在head里链接相关包即可。然后按照模态框的对着写就可以了,添加编辑删除部分都是采用的模态框,查找部分的话就直接展示在页面上了,可以进行条件选择。

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%
    	String path = request.getContextPath();
    %>    
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta charset="UTF-8">
    
    <script src="<%=path%>/resource/jquery-1.11.1.js"></script>	<!-- 引入jquery -->
    <link rel="stylesheet" href="<%=path%>/resource/bootstrap.css"> <!-- 引入bootstrap.css -->
    <script src="<%=path%>/resource/bootstrap.min.js"></script><!-- 引入bootstrap.min.js -->
    
    <title>同学录管理系统</title>
    </head>
    <body>
    	<c:if test="${list==null }">
    		<jsp:forward page="ShowServlet"></jsp:forward>
    	</c:if>
    		<h2 style="text-align: center;">同学录管理系统</h2>
    	<section class="container">
    		<div class="row">
    			<div class="col-md-3">
    				<button class="btn btn-danger" data-toggle="modal"
    					data-target="#addModal" >添加好友</button>
    			</div>
    		</div>
    		<!-- <p style="text-align: center;"><a href="add.jsp">添加好友 </a></p> -->
    	<div>
    	<div>
    	<center>
    	<form action="FindServlet" method="post">
    			<!-- <label>学号:</label><input type="text" name="id" value="0" οnfοcus="javascript:if(this.value=='0')this.value='';" οnblur="javascript:if(this.value=='')this.value='0';"/>
    			<label>姓名:</label><input type="text" name="name"/>
    			<label>地区:</label><input type="text" name="place"/>	 --><select name="findway">
    			<option value="id">学号</option>
    			<option value="name">姓名</option>
    			<option value="place">地区</option>
    			</select>
    			<input type="text" name="type"/>						
    			<button class="submit" type="submit" name="query" value="true" tabindex="80">查询</button>
    		</form>
    	</center>
    	</div>	
    	<br/>
    	<table class="table table-striped table-bordered table-hover">
    					<tr>
    						<th>序号</th>
    						<th>姓名</th>
    						<th>年龄</th>
    						<th>性别</th>
    						<th>地区</th>
    						<th>电话</th>
    						<th>操作</th>
    					</tr>
    				<c:forEach items="${list}" var="list">
    						<tr>
    							<th>${list.id}</th>
    							<th>${list.name}</th>
    							<th>${list.age}</th>
    							<th>${list.sex}</th>
    							<th>${list.place}</th>
    							<th>${list.tel}</th>
    							<th ><button class="btn btn-primary edBtn"
    							data-toggle="modal" data-target="#edModal" 
    								value="${list.id}" 
    								n="${list.name}" 
    								a="${list.age}"
    								s="${list.sex}"
    								p="${list.place}"
    								t="${list.tel}"
    							>修改</button>
    							<button class="btn btn-danger delBtn" data-toggle="modal"
    							data-target=".delModal" value="${list.id }">删除</button>
    							</th>
    						</tr>
    			</c:forEach>
    		</table>
    	</div>
    	</section>	
    </body>
    
    <!-- 添加信息模块 -->
    <div class="modal fade" id="addModal" tabindex="-1" role="dialog"
    	aria-labelledby="addModal">
    	<div class="modal-dialog" role="document">
    		<div class="modal-content">
    			<div class="modal-header">
    				<button type="button" class="close" data-dismiss="modal"
    					aria-label="Close">
    					<span aria-hidden="true">&times;</span>
    				</button>
    				<h4 class="modal-title" id="exampleModalLabel">添加信息</h4>
    			</div>
    			<form action="AddServlet" method="post">
    				<div class="modal-body">
    					<input id="edId" name="id" value="" hidden>
    					<div class="form-group">
    						<label for="name" class="control-label">姓名:</label> 
    						<input type="text" name="name" class="form-control" value="" >
    					</div>
    					<div class="form-group">
    						<label for="sex" class="control-label">性别:</label> 
    						<input type="text" name="sex" class="form-control" value="" >
    					</div>
    					<div class="form-group">
    						<label for="age" class="control-label">年龄:</label> 
    						<input type="text" name="age" class="form-control" value="" >
    					</div>
    					<div class="form-group">
    						<label for="place" class="control-label">地区:</label> 
    						<input type="text" name="place" class="form-control" value="" >
    					</div>
    					<div class="form-group">
    						<label for="tel" class="control-label">电话:</label> 
    						<input type="text" name="tel" class="form-control" value="" >
    					</div>
    				</div>
    				<div class="modal-footer">
    					<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
    					<button type="submit" class="btn btn-primary">添加</button>
    				</div>
    			</form>
    		</div>
    	</div>
    </div>
    <!-- 删除模块 -->
    <div class="modal fade delModal" tabindex="-1" role="dialog"
    	aria-labelledby="gridSystemModalLabel">
    	<div class="modal-dialog" role="document">
    		<div class="modal-content">
    			<div class="modal-header">
    				<button type="button" class="close" data-dismiss="modal"
    					aria-label="Close">
    					<span aria-hidden="true">&times;</span>
    				</button>
    				<h4 class="modal-title" id="gridSystemModalLabel">提示</h4>
    			</div>
    			<div class="modal-body">
    				<h4>确定要删除吗?</h4>
    			</div>
    			<div class="modal-footer">
    				<form action="DeleteServlet">
    					<input id="delid" name="id" value="" hidden>
    					<button type="submit" class="btn btn-danger">删除</button>
    					<button type="button" class="btn btn-primary" data-dismiss="modal">取消</button>
    				</form>
    			</div>
    		</div>
    	</div>
    </div>
    
    <!-- 编辑模态框 -->
    <div class="modal fade" id="edModal" tabindex="-1" role="dialog"
    	aria-labelledby="edModal">
    	<div class="modal-dialog" role="document">
    		<div class="modal-content">
    			<div class="modal-header">
    				<button type="button" class="close" data-dismiss="modal"
    					aria-label="Close">
    					<span aria-hidden="true">&times;</span>
    				</button>
    				<h4 class="modal-title" id="exampleModalLabel">用户信息</h4>
    			</div>
    			<form action="UpdateServlet" method="post">
    				<div class="modal-body">
    					<input id="id" name="id" value=" " type="hidden">
    					<div class="form-group">
    						<label for="name" class="control-label">姓名:</label> <input
    							type="text" name="name" class="form-control" id="name"
    							value="" >
    					</div>
    					<div class="form-group">
    						<label for="age" class="control-label">年龄:</label> <input
    							type="text" name="age" class="form-control" id="age"
    							value="" >
    					</div>
    					<div class="form-group">
    						<label for="sex" class="control-label">性别:</label> <input
    							type="text" name="sex" class="form-control" id="sex"
    							value="" >
    					</div>
    					<div class="form-group">
    						<label for="place" class="control-label">地区:</label> <input
    							type="text" name="place" class="form-control" id="place"
    							value="" >
    					</div>
    					<div class="form-group">
    						<label for="tel" class="control-label">电话:</label> <input
    							type="text" name="tel" class="form-control" id="tel"
    							value="" >
    					</div>
    
    				</div>
    				<div class="modal-footer">
    					<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
    					<button type="submit" class="btn btn-primary">更新</button>
    				</div>
    			</form>
    		</div>
    	</div>
    </div>
    
    
    <script type="text/javascript">
    	// 删除按钮
    	$(".delBtn").on("click", function() {
    		$("#delid").val($(this).val());	// 获取当前点击按钮的值value值,并赋值给删除模态框的<input name="id"
    	});
    	// 编辑按钮
    	$(".edBtn").on("click", function() {
    		$("#id").val($(this).val());	// 获取当前点击按钮的值value值,并赋值给编辑模态框的<input name="id"
    		$("#name").val($(this).attr("n"));
    		$("#age").val($(this).attr("a"));
    		$("#sex").val($(this).attr("s"));	
    		$("#place").val($(this).attr("p"));
    		$("#tel").val($(this).attr("t"));	
    	});
    </script>
    </html>
    

    查找结果页面find.jsp

    和主页差不多,修改和删除功能的话没有花心思加弹出框了。

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
    <%
    	String path = request.getContextPath();
    %>      
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta charset="UTF-8">
    <!-- 放在head标签内 -->
    <script src="<%=path%>/resource/jquery-1.11.1.js"></script>	<!-- 引入jquery -->
    <link rel="stylesheet" href="<%=path%>/resource/bootstrap.css"> <!-- 引入bootstrap.css -->
    <script src="<%=path%>/resource/bootstrap.min.js"></script><!-- 引入bootstrap.min.js -->
    <title>查找结果</title>
    </head>
    <body>
    <section class="container">
    <div class="row">
    		<center><p><h3>查找结果</h3></p>
    			<p><a  href="ShowServlet">返回</a></p>
    		</center>
    	<center>
    				<table class="table table-striped table-bordered table-hover">
    					<tr>
    						<td>学号</td>
    						<td>姓名</td>
    						<td>年龄</td>
    						<td>性别</td>
    						<td>地区</td>
    						<td>电话</td>
    						<td>操作</td>
    					</tr>
    					<c:forEach items="${find}" var="list">
    					<form method="post" name="myForm${list.id}" action="UpdateServlet?id=${list.id}">
    						<tr>
    							<td>${list.id}</td>
    							<td><input type="text" value="${list.name}" style="border:none" name="name"/></td>
    							<td><input type="text" value="${list.age}" style="border:none" name="age"/></td>
    							<td><input type="text" value="${list.sex}" style="border:none" name="sex"/></td>
    							<td><input type="text" value="${list.place}" style="border:none" name="place"/></td>
    							<td><input type="text" value="${list.tel}" style="border:none" name="tel"/></td>
    							<td><a href="javascript:document.myForm${list.id}.submit();">修改</a>
    							&nbsp;&nbsp;&nbsp;&nbsp;<a href="DeleteServlet?id=${list.id}">删除</td>
    						</tr>
    					</form>
    					</c:forEach>
    				</table>
    	</center>
    	</div>
    </section>
    </body>
    </html>
    

    5.3 数据库访问代码

    UserDao.java

    package com.dao;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    import com.JavaBean.Student;
    import com.JavaBean.User;
    import com.utils.DBUtils;
    
    public class UserDao {
            public User checkLogin(User user) {
            	String sql = "select id,username,password from user where username=? and password=?";
                User u= null;
                try {
                	 Connection conn = DBUtils.open();
                	 PreparedStatement pst = conn.prepareStatement(sql);
                     pst.setString(1, user.getUserName());
                     pst.setString(2, user.getPassword());
                     ResultSet rs = pst.executeQuery();
                     while (rs.next()) { 
                    	
                    	 user.setId(rs.getInt("id"));
                         user.setUserName(rs.getString("username"));
                         user.setPassword(rs.getString("password"));  
                         u=user;
                         System.out.println("uuu"+u);
                     }
                     rs.close();
                     pst.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                return u;
            }
    }
    

    StudentDao.java

    package com.dao;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    import com.JavaBean.Student;
    import com.utils.DBUtils;
    
    public class StudentDao {
    
        /**
         * 所有学生信息
         *
         * @return
         */
        public List<Student> findallStudent() {
            List<Student> list = new ArrayList<>();
            Connection conn = DBUtils.open();
            String sql = "select * from student";
            try {
                PreparedStatement pst = conn.prepareStatement(sql);
                ResultSet rs = pst.executeQuery();
                while (rs.next()) {
                    Student student = new Student();
                    
                    student.setId(rs.getInt("id"));
                    student.setName(rs.getString("name"));
                    student.setAge(rs.getString("age"));
                    student.setSex(rs.getString("sex"));
                    student.setPlace(rs.getString("place"));
                    student.setTel(rs.getString("tel"));
                    
                    list.add(student);
                    System.out.println("--------StudenDao:"+student);
                }
                rs.close();
                pst.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return list;
        }
    
        /**
         * 添加学生
         *
         * @param student
         * @return
         */
        public boolean addStudent(Student student) {
            
        	String sql = "insert into student (name,age,sex,place,tel) values(?,?,?,?,?)";
            Connection conn = DBUtils.open();
            try {
                PreparedStatement pst = conn.prepareStatement(sql);
              
                pst.setString(1, student.getName());
                pst.setString(2, student.getAge());
                pst.setString(3, student.getSex());
                pst.setString(4, student.getPlace());
                pst.setString(5, student.getTel());
                
                int count = pst.executeUpdate();//执行
                pst.close();
                return count > 0 ? true : false;
                
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return false;
        }
    
        /**
         * 更新学生信息
         *
         * @param student
         * @return
         */
        public boolean updateStudent(Student student) {
        	
            String sql = "update student set name=?,age=?,sex=?,place=?,tel=? where id=?";
            Connection conn = DBUtils.open();
            try {
            	
                PreparedStatement pst = conn.prepareStatement(sql);
                
                pst.setString(1, student.getName());
                pst.setString(2, student.getAge());
                pst.setString(3, student.getSex());
                pst.setString(4, student.getPlace());
                pst.setString(5, student.getTel());
                pst.setInt(6,student.getId());
                
                int count = pst.executeUpdate();
                pst.close();
                return count > 0 ? true : false;
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return false;
        }
    
        /**
         * 删除学生信息
         *
         * @param studentId
         * @return
         */
        public int deleteStudent(int id) {
            String sql = "delete from student where id = ?";
            Connection conn = DBUtils.open();
            try {
                PreparedStatement pst = conn.prepareStatement(sql);
                pst.setInt(1, id);
                
                int count = pst.executeUpdate();//执行
                
                pst.close();
                return count > 0 ? 1 : 0;
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return 0;
        }
    
        /**
         * 根据id查询学生
         *
         * @param id
         * @return
         */
        public Student getStudentById(int id) {
        	
        	Connection conn = DBUtils.open();
        	 
            String sql = "select * from student where id= "+id ;
            Student student = new Student();
            
            try {
            	
                PreparedStatement pst = conn.prepareStatement(sql);
                ResultSet rs = pst.executeQuery();
                
                while (rs.next()) {
                    student.setId(rs.getInt("id"));
                    student.setName(rs.getString("name"));
                    student.setAge(rs.getString("age"));
                    student.setSex(rs.getString("sex"));
                    student.setPlace(rs.getString("place"));
                    student.setTel(rs.getString("tel"));
                }
                System.out.println("FindID----------");
                rs.close();
                pst.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return student;
        }
        /**
         * 同Id学生
         *
         * @param id
         * @return
         */
        public List<Student> FindStudentById(int id) {
            List<Student> list = new ArrayList<>();
            Connection conn = DBUtils.open();
            String sql = "select* from student where id=?";
            try {
                PreparedStatement pst = conn.prepareStatement(sql);
                pst.setInt(1, id);
                ResultSet rs = pst.executeQuery();
                while (rs.next()) {
                    Student student = new Student();
                    
                    student.setId(rs.getInt("id"));
                    student.setName(rs.getString("name"));
                    student.setAge(rs.getString("age"));
                    student.setSex(rs.getString("sex"));
                    student.setPlace(rs.getString("place"));
                    student.setTel(rs.getString("tel"));
                    
                    list.add(student);
                    System.out.println("---FindAllSameIDStudent");
                }
                rs.close();
                pst.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            		return list;
            }
    
        /**
         * 根据name查询学生
         *
         * @param name
         * @return
         */
    public Student getStudentByName(String name) {
        	
        	Connection conn = DBUtils.open();
        	 
            String sql = "select * from student where name= "+"name" ;
            Student student = new Student();
            
            try {
            	
                PreparedStatement pst = conn.prepareStatement(sql);
                ResultSet rs = pst.executeQuery();
                
                while (rs.next()) {
                    student.setId(rs.getInt("id"));
                    student.setName(rs.getString("name"));
                    student.setAge(rs.getString("age"));
                    student.setSex(rs.getString("sex"));
                    student.setPlace(rs.getString("place"));
                    student.setTel(rs.getString("tel"));
                }
                System.out.println("FindName----------");
                rs.close();
                pst.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return student;
        }
    
    
    /**
     * 同姓名的所有学生
     *
     * @param name
     * @return
     */
    
    public List<Student> FindStudentByName(String name) {
        List<Student> list = new ArrayList<>();
        Connection conn = DBUtils.open();
        String sql = "select * from student where name like  '%"+name+"%' ";
        
        try {
            PreparedStatement pst = conn.prepareStatement(sql);
            //pst.setString(1, name);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                Student student = new Student();
                
                student.setId(rs.getInt("id"));
                student.setName(rs.getString("name"));
                student.setAge(rs.getString("age"));
                student.setSex(rs.getString("sex"));
                student.setPlace(rs.getString("place"));
                student.setTel(rs.getString("tel"));
                
                list.add(student);
                System.out.println("---FindAllSameNameStudent");
            }
            rs.close();
            pst.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
          return list;
       }
    /**
     * 根据place查询学生
     *
     * @param place
     * @return
     */
    public Student getStudentByPlace(String place) {
    	
    	Connection conn = DBUtils.open();
    	 
        String sql = "select * from student where place= "+"place";
        Student student = new Student();
        
        try {
        	
            PreparedStatement pst = conn.prepareStatement(sql);
            ResultSet rs = pst.executeQuery();
            
            while (rs.next()) {
                student.setId(rs.getInt("id"));
                student.setName(rs.getString("name"));
                student.setAge(rs.getString("age"));
                student.setSex(rs.getString("sex"));
                student.setPlace(rs.getString("place"));
                student.setTel(rs.getString("tel"));
            }
            System.out.println("FindPlace----------");
            rs.close();
            pst.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
       		return student;
    }
    
    /**
     * 同地区的所有学生
     *
     * @param place
     * @return
     */
    
    public List<Student> FindStudentByPlace(String place) {
        List<Student> list = new ArrayList<>();
        Connection conn = DBUtils.open();
        String sql = "select * from student where place like  '%"+place+"%' ";
        try {
            PreparedStatement pst = conn.prepareStatement(sql);
           // pst.setString(1, place);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                Student student = new Student();
                
                student.setId(rs.getInt("id"));
                student.setName(rs.getString("name"));
                student.setAge(rs.getString("age"));
                student.setSex(rs.getString("sex"));
                student.setPlace(rs.getString("place"));
                student.setTel(rs.getString("tel"));
                
                list.add(student);
                System.out.println("---FindAllSamePlaceStudent");
            }
            rs.close();
            pst.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        		return list;
        }
    }
    

    5.4 实体类

    Student.java

    package com.JavaBean;
    
    public class Student {
    
    	private Integer id;
    	private String name;
    	private String age;
    	private String place;
    	private String sex;
    	private String tel;
    	public Student(Integer id, String name, String age,String sex,String place,String tel) {
    		super();
    		this.id = id;
    		this.name = name;
    		this.age = age;
    		this.sex=sex;
    		this.place=place;
    		this.tel=tel;
    	}
    
    	public Student() {
    		super();
    		// TODO Auto-generated constructor stub
    	}
    	public Integer getId() {
    		return id;
    	}
    
    	public void setId(Integer id) {
    		this.id = id;
    	}
    	public String getAge() {
    		return age;
    	}
    
    	public void setAge(String age) {
    		this.age = age;
    	}
    	
    	public String getName() {
    	 return name;
    	}
    	public void setName(String name) {
    		this.name=name;
    	}
    	
    	public String getSex()
    	{
    		return sex;
    	}
    	public void setSex(String sex) {
    		this.sex=sex;
    	}
    	
    	public String getPlace() {
    		return place;
    	}
    	public void setPlace(String place) {
    		this.place=place;
    	}
    	
    	public String getTel() {
    		return tel;
    	}
    	public void setTel(String tel) {
    		this.tel=tel;
    	}	
    }
    

    User.java

    package com.JavaBean;
    
    public class User {
    	private Integer id;
    	private String userName;
    	private String password;
    
    	public User(Integer id, String userName, String password) {
    		super();
    		this.id = id;
    		this.userName = userName;
    		this.password = password;
    	}
    
    	public User() {
    		super();
    		// TODO Auto-generated constructor stub
    	}
    
    	public Integer getId() {
    		return id;
    	}
    
    	public void setId(Integer id) {
    		this.id = id;
    	}
    
    	public String getUserName() {
    		return userName;
    	}
    
    	public void setUserName(String userName) {
    		this.userName = userName;
    	}
    
    	public String getPassword() {
    		return password;
    	}
    
    	public void setPassword(String password) {
    		this.password = password;
    	}
    
    }
    

    5.5 控制类

    LoginServlet.java

    package com.Servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import com.JavaBean.User;
    import com.dao.UserDao;
    import com.utils.DBUtils;;
    
    @WebServlet("/LoginServlet")
    public class LoginServlet extends HttpServlet {
    
       public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        	    request.setCharacterEncoding("utf-8");  
        	    String username=request.getParameter("username");
        	    String password=request.getParameter("password");
        	    
        	    System.out.println(username+""+password);
    	        UserDao ud=new UserDao();
    	        User user=new User();
    	        user.setUserName(username);
    	        user.setPassword(password);
    	        User u=ud.checkLogin(user);
    	        if(u != null) {
    	        	request.getRequestDispatcher("list.jsp").forward(request, response);
    	        	System.out.println("登录成功");
    	        }else {
    	        	System.out.println("登录失败!");
    	        	request.setAttribute("tip", "账号或密码错误");
    	       	request.getRequestDispatcher("login.jsp").forward(request,response);
    	        }	        
     }
    }
    

    ShowSevlet.java

    package com.Servlet;
    import java.io.IOException;
    import java.util.List;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.dao.StudentDao;
    import com.JavaBean.Student;
    
    /**
     * Servlet implementation class ShowServlet
     */
    @WebServlet("/ShowServlet")
    public class ShowServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
        public ShowServlet() {
            super();
        }
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		request.setCharacterEncoding("utf-8");
    		response.setContentType("text/html;charset=utf-8");
    		
    		StudentDao dao = new StudentDao();
    		
    		List<Student> list;
    		list = dao.findallStudent();
    		System.out.println("-----------ShowServlet:"+list);
    		request.setAttribute("list", list);
    		
    		request.getRequestDispatcher("list.jsp").forward(request, response);
    		}
    }
    

    DeleteServlet.java

    package com.Servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.dao.StudentDao;
    
    import java.io.IOException;
    
    @WebServlet("/DeleteServlet")
    @SuppressWarnings("serial")
    public class DeleteServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        	
            int id = Integer.parseInt(request.getParameter("id"));
            StudentDao dao = new StudentDao();
            int  i;
            i=dao.deleteStudent(id);
            if(i>0) {
            request.getRequestDispatcher("ShowServlet").forward(request, response);
            System.out.println("删除成功");
            }else {
            	System.out.println("删除失败");
            }
        }
    }
    

    FindServlet.java

    package com.Servlet;
    
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.JavaBean.Student;
    import com.dao.StudentDao;
    
    @WebServlet("/FindServlet")
    public class FindServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
           
        public FindServlet() {
            super();
            // TODO Auto-generated constructor stub
        }
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		doPost(request, response);
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		request.setCharacterEncoding("utf-8");
    		response.setContentType("text/html;charset=utf-8");
    		
    		String findway=request.getParameter("findway");
    		String type=request.getParameter("type");
    		System.out.println("findway="+findway); 
    		System.out.println("findtype="+type); 
    		StudentDao dao=new StudentDao();
    		List<Student> find =new ArrayList<>();
    		
    		System.out.println("---FindServlet-----");
    		
    		if(findway.equals("id")) {
    			int  id=Integer.parseInt(type);
    			System.out.println("findid="+id); 
    			find = dao.FindStudentById(id);
    			System.out.println("---IDfind-----");
    		}else if(findway.equals("name")) {
    			String name=type;
    			System.out.println("findname="+name); 
    			find = dao.FindStudentByName(name);
    			System.out.println("---NAMEfind-----");
    		}else if(findway.equals("place")) {
    			String place=type;
    			System.out.println("findplace="+place); 
    			find = dao.FindStudentByPlace(place);
    			System.out.println("---Placefind-----");
    		}
    		request.setAttribute("find",find);
    		request.getRequestDispatcher("find.jsp").forward(request, response);
    	}
    }
    

    UpdateServlet.java

    package com.Servlet;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.JavaBean.Student;
    import com.dao.StudentDao;
    
    import java.io.IOException;
    
    @WebServlet("/UpdateServlet")
    @SuppressWarnings("serial")
    public class UpdateServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {	
      
    		/*
    		 * int id = Integer.parseInt(request.getParameter("id")); StudentDao dao = new
    		 * StudentDao(); Student student = dao.getStudentById(id);
    		 * request.setAttribute("student", student);
    		 * request.getRequestDispatcher("update.jsp").forward(request, response);
    		 */
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        	request.setCharacterEncoding("utf-8");
            
            Student student = new Student();
            
            int id = Integer.parseInt(request.getParameter("id"));
            System.out.println("更新前得到的id为:******"+id);
            
            String name = request.getParameter("name");
            String age = request.getParameter("age");
            String sex = request.getParameter("sex");
            String place = request.getParameter("place"); 
            String tel = request.getParameter("tel");
            
            System.out.println("更新后得到的age+sex+place+tel为:**************"+age+sex+place+tel);
            
            student.setId(id);
            student.setName(name);
            student.setAge(age);
            student.setSex(sex);
            student.setPlace(place);
            student.setTel(tel);
           
            
            StudentDao dao = new StudentDao();
            
            dao.updateStudent(student);
            System.out.println("dao.updateStudent运行完毕");
            request.getRequestDispatcher("ShowServlet").forward(request, response);
        }
    }
    

    AddServlet.java

    package com.Servlet;
    
    import java.io.IOException;
    import java.sql.SQLException;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.JavaBean.Student;
    import com.dao.StudentDao;
    
    @WebServlet("/AddServlet")
    @SuppressWarnings("serial")
    public class AddServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest requset, HttpServletResponse response) throws ServletException, IOException {
           
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
         
            String name = request.getParameter("name");
            String age = request.getParameter("age");
            String sex = request.getParameter("sex");
            String place = request.getParameter("place"); 
            String tel = request.getParameter("tel");
           
            Student student = new Student();
     
            student.setName(name);
            student.setAge(age);
            student.setSex(sex);
            student.setPlace(place);
            student.setTel(tel);
           
            StudentDao dao = new StudentDao();
            boolean flag;
            flag=dao.addStudent(student);
    		  if(flag) {request.getRequestDispatcher("ShowServlet").forward(request,response);
    			  System.out.println("添加成功");
    		  }else {
    			  System.out.println("添加失败");
    			  //request.getRequestDispatcher("add.jsp").forward(request,response);
    		  }
            
        }
    }
    

    5.6 过滤器

    LoginFilter.java

    package com.Filter;
    
    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.annotation.WebInitParam;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    
    @WebFilter(urlPatterns=("*.jsp"),initParams= {
    		@WebInitParam(name="loginPage",value="login.jsp"),
    		@WebInitParam(name="loginServlet",value="LoginServlet")
    })
    public class LoginFilter implements Filter {
    
    	private FilterConfig config;
    	
        public LoginFilter() {
            // TODO Auto-generated constructor stub
        }
    
    	public void destroy() {
    		// TODO Auto-generated method stub
    		this.config=null;
    	}
    
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    		// TODO Auto-generated method stub
    		String loginPage=config.getInitParameter("loginPage");
    		String loginServlet=config.getInitParameter("loginServlet");
    		//获取会话对象
    		HttpSession session =((HttpServletRequest)request).getSession();
    		//获取资源路径
    		String requestPath=((HttpServletRequest)request).getServletPath();
    		
    		if(session.getAttribute("username")!= null&&session.getAttribute("password")!= null
    				||requestPath.endsWith(loginPage)
    				||requestPath.endsWith(loginServlet)) {
    			chain.doFilter(request, response);
    		}else {
    			request.setAttribute("tip", "未登录");
    			request.getRequestDispatcher(loginPage).forward(request,response);
    		}
    	}
    
    	public void init(FilterConfig config) throws ServletException {
    		// TODO Auto-generated method stub
    		this.config=config;
    	}
    }
    

    6. 总结与反思

    1. 首先独立完成一个项目收获比较大,与小组作业完全不一样。虽然这是一个非常简单的项目,但是过程也并不一帆风顺。在写的过程中激发了我对页面设计的兴趣,想要进一步学习bootstrap和css相关知识。
    2. 另外,我希望自己能够养成记录的习惯,每一次修改好的东西都要保存起来。当时写这个同学录系统其实也有过好几个版本,可是现在都没法找到了,甚至也没法想起来当时是为什么要修改成现在这样。
    展开全文
  • 五年了,我在 CSDN 的两个百万。

    万次阅读 多人点赞 2021-04-16 00:24:00
    不知不觉,写文 5 年了。 仅以此本文记录一下自己的... 最后载送大家一本帮助我拿到BAT 等一线大厂 offer 的数据结构刷题笔记,是一位 Google 大神写的,对于算法薄弱或者需要提高的同学都十分受用(提起码:m19c): ...

    不知不觉,写文 5 年了。

    仅以此本文记录一下自己的写文经历以及收获。

    故事是从 2016 年 03 月 14 日在 CSDN 发的第一篇简短的文章开始的,那一年我刚上研一。

    这里,一直记录着我的学习路程。

    2017 年 02 月 28 日开始写《Python3网络爬虫入门》系列文章,便一发不可收拾,仅 CSDN 的阅读量就达到了 100W+,这是第一个一百万。

    在那个时候,写爬虫类文章火的,有两个,一个是没有名气的我,一个是较为出名的崔庆才。

    我也姓崔,以至于当时很多人,误以为我就是崔庆才。

    有句话怎么说来着:爬虫玩得好,牢饭吃到饱

    曾经写过关于破解爱奇艺、腾讯 VIP 视频的文章,现在这篇文章已经被下掉了。

    原因是爱奇艺把 CSDN 投诉了。

    律师函警告!

    虽然,写的文章都是以学习知识为目的,但这类技术难免被有心人利用。

    现在很少写关于爬虫类的文章,也是出于这层考虑。

    紧接着,我开始接触人工智能领域的基础知识:机器学习。

    立马又开设了一个专栏,开始写《Python3机器学习实战》系列文章,也是百万级别的阅读量,这是第二个一百万

    与此同时,我成立了个人网站。

    https://cuijiahua.com/

    并将后续写的所有内容,同步更新到了我的这个网站上。

    就像小时候折腾 QQ 空间一样,我精心打扮着我的个人网站。

    从网站的页脚处,可以看到,网站已运营了 1200 多天。

    网站能活这么久,多亏了读者们的赞助。

    我一直记录了从 2017 年 02 月 02 日开始的所有赞赏(包括早期 CSDN 的)。

    https://cuijiahua.com/sponsor.html

    6.66 和 8.88 居多,偶尔能有个百元以上的,历史最高的一笔是 1000 元。

    说是要拿我的机器学习实战系列文章拿去在高校当课程教材使用,答应过后,就来了这笔赞赏。

    后来通过一些读者了解到,我的文章被某培训机构拿去当了教学内容,原封不动。

    不知两者是否存在联系,也曾气愤地去找那个培训机构维权,但势单力薄,最后只能不了了之。至今,那个培训机构还活的好好的。

    将赞赏表格导出,用代码简单统计了一下。

    这些年,赞赏一共 158 笔,共约 3701 元,虽然不多,不足以抵消服务器的全部费用,但偶尔翻看下赞赏留言,那些鼓励、认可的话语,还是很暖心的

    2017 年那会儿就注册了公众号,但是一直没有写过内容。直到去年差不多这个时候,开始决定做公众号,至今也有一年多的时间了。

    公众号的赞赏,没有单独记录,因为微信官方都有助手记录,开赞赏次数的不多,总共 542.41 元。

    公众号写了 100 多篇文章,都放在了这里:

    Jack Cui 原创合集

    我也将所有的文章整理整理好放到了 Github 。

    https://github.com/Jack-Cherish/PythonPark

    后续计划,会将一些系列的内容,整理成 PDF 发出来,方便阅读。

    最后载送大家一本帮助我拿到BAT 等一线大厂 offer 的数据结构刷题笔记,是一位 Google 大神写的,对于算法薄弱或者需要提高的同学都十分受用(提起码:m19c):

    https://pan.baidu.com/s/1txDItPwDrnG8mOloOFbGaQ

    2021 年仍在路上,我们都要偷偷努力,能成为别人的梦想。

    一起加油!

    展开全文
  • python制作小游戏(

    千次阅读 2021-01-29 13:35:09
    下载W3Cschool手机App,0基础随时随地学编程导语这又将是个不定期更新的系列~~~系列主要将使用到python的pygame模块来教大家制作一些小游戏,每期制作一个。最后都会打包成.exe文件分享给大家~~~So,对于只想玩...

    下载W3Cschool手机App,0基础随时随地学编程导语

    这又将是一个不定期更新的系列~~~

    本系列主要将使用到python的pygame模块来教大家制作一些小游戏,每期制作一个。最后都会打包成.exe文件分享给大家~~~

    So,对于只想玩小游戏的小伙伴来说,只需要下载相关文件就好啦~~~

    至于pygame的开发文档,暂时没有归入整理计划,来日方长,英文不好的同学只能先看网上中文的资料将就下了~~~

    相关文件

    密码: q4ib

    本期参考文献

    链接:

    https://www.raywenderlich.com/24252/beginning-game-programming-for-teens-with-python

    作者:

    Julian Meyer

    说明

    python版本:3.5.4

    pygame版本:1.9.3(pip安装即可)

    愉快地开始

    Step1:你好,兔子

    66f331e2a82c215c632a354ae7b4af07.png

    效果:

    bb556280e7953fabe648576d2087d26e.png

    Step2:添加背景

    首先载入所需的图片;其次依次通过x和y进行循环,并且根据循环里x和y的值来画上草的效果;接下来的几行就是在屏幕上画出城堡。

    da9681465ba8576bc63ee0924ff1a287.png

    效果:

    ddb4a74def72b3664e1e2bdb352de656.png

    Step3:让兔子能够移动

    接下来你需要加上一些真正的游戏的元素了,比如让兔子能够随着按键移动。

    0d935c870860b834783c33e32c3e47a6.png

    524f4206a0ccf27ee8468ae33e51c023.png

    效果(可以移动兔子):

    910ca596c124bb1147211bc65c134fd1.png

    Step4:让兔子转向

    好的,现在你的兔子在你按键的时候可以移动了,但是如果你能用鼠标让兔子朝向你选择的方向不是更酷吗?这样它就不会总是朝向一个方向了。

    cdbe3df99fe907812f1fa92630498e95.png

    效果:

    efc6208e2a1728fe6910213783626e65.png

    Step5:射击吧!兔子

    让兔子用箭头射向它们的敌人,这一步会有一点复杂,因为你需要跟踪所有的箭头,更新它们,旋转它们,在它们跑出屏幕的时候删除它们。

    3fbc673974ed2a8686a43a3f5bf68ccf.png

    d159d1b443e2505a463fd635d671d86b.png

    d159d1b443e2505a463fd635d671d86b.png

    效果:

    e0eede1696fe284ea77e974984e31127.png

    Step6:獾,拿上武器!

    好吧,现在有了城堡,并且你有一个英雄可以移动和射出箭头。还差什么呢?当然是攻击城堡的敌人啦~

    在这一步,你将会随机创建出一些獾冲向城堡。在游戏的进程中会有越来越多的獾冒出来。

    fea03bd8fe129bf1aaf6b82dc3350b7b.png

    157d75f57db20a9ae5668af21c37f9f6.png

    9ff2fbc8140a2702c6adb0cc93302ebf.png

    效果:

    fb066db654d6206a7bffc2254ee54d43.png

    Step7:獾与箭头的碰撞

    獾们冲向你的城堡,但是你的箭头对它们完全没有作用!这让兔子怎么防守它的家园呢?

    是时候来让箭头能够杀死獾让兔子能保护自己的城堡并且赢得这场游戏了~~~

    168f6cfc0ee3df81905e2f1fa51916f9.png

    效果:

    3fa8fa2ad405088e3e24e4145dfc2453.png

    Step8:添加健康值和时间的显示

    游戏运行起来相当不错了,有攻击者、防守者。现在,你需要的就是通过一个方法来显示兔子的得分。

    最简单的方法就是添加一个HUD来显示当前城堡的生命值。你也可以加一个计时来记录城堡存活下来的时间。

    36154d0fed63f4d0bf229ee150518c5f.png

    7ac3b3d15497f7ac10b9fb3243a41480.png

    效果:

    5c6eb96654775a87d76f278f032cfa76.png

    Step9:赢或输

    如果你玩的时间够长,即使你的生命值已经变成0了,游戏仍然是继续的!不仅如此,你仍然可以用箭头射向这些獾。这肯定不太对。你需要加上一些赢或者输的情况来让你的游戏值得玩。

    那么我们来加上胜利或者失败的条件。你可以通过终止主循环,进入胜利/失败的循环来实现它。你需要指出玩家是否胜利,并将其显示在屏幕上。

    b2eb022d99dc620efa223d04611bb57d.png

    62eae5f48707e453d715e0a3e57547e8.png

    c3b3860741def83a29aba6645a2668cc.png

    效果:

    8e2bce5b7318ba808b3e33e97b1dc0ff.png

    Step10:免费的音乐和声音效果

    这个游戏现在相当不错了,但是没有声音。有点太安静了。加上一点声音效果,能让你更好地感受这个游戏。

    f0dc4ca1e2c627dbe50df02685bc4db3.png

    e69cf1a4a8cf9bb23fd2d5505a7295cc.png

    b37e87286f752ffd0d002e7a997d4441.png

    效果:

    当然是会各种音效啦~~~图片大概是表达不了了emm。

    OK,大功告成,你完美地制作了一款小游戏!

    在这基础上,你可以根据你自己的创意来扩展游戏!比如,你可以试着重置里面的各种图片,加上不同的枪或者是不同的怪物!

    展开全文
  • 同学录项目分析

    千次阅读 2007-12-02 09:56:00
    同学录系统分析、 系统的结构图 本班通告班级信息 班级信息(班长、副班长、成员、老师) 访问次数排行(成员、访问次数、最后次访问时间) 
  • 大学计算机系最努力的同学都是如何学习的?

    千次阅读 多人点赞 2021-06-23 17:47:54
    大家好,我是小林哥。 经常会有读者跟小林发私信,...说干就干,然后就有了这个「读者牛逼系列」,真心希望这里的每位牛逼读者的经历,能够影响到你,给你带来启发和价值。 今天来跟大家分享的是位我影响很深刻的读
  • 篇文带你从0到1了解建站及完成CMS系统编写

    万次阅读 多人点赞 2020-10-24 00:48:06
    学习目标 了解搭建一般网站的简便方式 了解最原始一般站点搭建 了解内容管理站点搭建 了解权限设计及完成 ...文章为从0到1了解内容管理系统搭建与编写,由于篇文章内容篇幅过长,文章内容经过压缩,该项目中相
  • 综合实验1:线性表的应用 、实验目的 1、利用线性表的基本运算进行线性表的相关操作; 2、掌握文件的应用; 3、加深对链式存储数据结构的理解...设计个班级同学的通讯录,要求如下: 通讯录中每个同学的信...
  • 关于Git这篇就够了

    万次阅读 多人点赞 2021-05-12 12:56:18
    同时篇文章也积累了很多博主在工作开发中包括自己日常开发中都用到的一些git技巧,在本文的最后整理了份关于git的常用命令表。 git命令很多,但是常用的只有十多个。 编写不易,喜欢可以关注点赞三连,谢谢! ...
  • 自己制作一个计时器、倒计时器

    千次阅读 多人点赞 2020-11-30 10:12:00
    时间的观念在现在的时代越来越重要,考试要定时完成,炒菜做饭要计时完成,甚至连煮包...制作计时器对我们越来越重要。 程序的编写环境是VC++6.0,目前此程序实现了计时器和倒计时器的功能。每次只能执行个功能。
  • 幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了个程序员…… 996程序员做的梦: 第场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办...
  • 本文代码实现基本按照《数据结构》课本目录顺序,外加大量的复杂算法实现,篇文章足够。能换你个收藏了吧?
  • sql查询实例2(借书卡、图书、借书记录)

    万次阅读 多人点赞 2019-12-08 14:08:25
    问题描述: 本题用到下面三个关系表: CARD 借书卡。 CNO 卡号,NAME 姓名,CLASS 班级 BOOKS 图书。...备注:限定每人每种书只能借一本;库存册数随借书、还书而改变。 要求实现如下15个处理...
  • 怎么样快速做个数据地图? 大家第时间想到的可能是万能的Excel。 我自己也试着用Excel做了下,发现过程还比较复杂: “先要用绘制地图图形 + VBA,用插入图形"任意多边形"绘制地图; 每个"任意多边形...
  • 推动整体水平的提高(不帮助这部分同学解决问题,学习氛围提高不上来,班级整体学习量、学习的深度都会打折扣,影响每同学大学的成色。) 解决重点关注问题的措施 团队建设及合作学习活动:基本按“组...
  • 小施同学的投资日记 开篇

    千次阅读 2022-02-20 16:59:40
    号将记录小施同学在投资过程中经历过的韭菜坑和对 股.票 和 基.金 市场的一些认知分析。 虽然目前入市未满2年,但小施同学在技术、创业、公司经营等方面具有一定经验,且经历过市场暴涨和爆亏。 过去一年M股几乎...
  • 程序员写简历时的技术词汇拼写规范备忘

    万次阅读 多人点赞 2021-10-11 08:35:15
    因此本文就从几个方面来梳理一下程序员写简历时常用的词汇拼写注意事项,以供必要时查阅,文末也制作了PDF离线手册文档 + 并且将Markdown文件已同步至GitHub开源仓库,有需要的可以自行获取。 当然这里列出的词汇...
  • 计算机考研,这样选学校才是正解

    万次阅读 多人点赞 2019-11-22 07:24:08
    》,时间N多同学咨询自身情况要不要考研,眼看有点Hold不住,索性又出了篇《启舰:计算机专业有必要考研吗?》,结果,又有同学说: “我是渣渣二本,想考985是不是难度太大?” “大城市竞争力是不是很大,我...
  • PHP学生成绩查询及分析系统制作

    千次阅读 2021-03-24 08:52:53
    【摘要】系统是中学一线教师制作的成绩查询及分析的网络程序。程序为B/S模式,程序语言为PHP,数据库为Mysql。可跨平台运行,经多平台测试,可运行于各种linux(CentOS/Debian/Ubuntu)、FreeBSD及Windows(WindowsXP...
  • ????小媛:bit 哥,bit 哥,好像 IVX 还可以做小游戏? ????1_bit:是的呢。 ????小媛:那你教我做小游戏好不?...1_bit:我们选择小程序游戏,选择 2D并且取个名称,我们先制作一个 2D 版本的经典飞机大战
  • 个U盘制作多个系统镜像方法 ——适用于ARM架构UOS和KYLIN银河麒麟系统 、背景: 作为个喜欢收集系统镜像的同学,加起来收集的ARM架构和X86架构系统镜像少则10个,每装次系统都要刻录次U盘,且等待刻录的...
  • 你好呀,我是繁凡!这里是名双非 ACM 弱校的零基础菜鸡算法竞赛选手与博主的竞赛生涯回忆
  • 奉劝各位学弟学妹们,该打造你的技术影响力了!

    万次阅读 多人点赞 2021-04-27 14:21:11
    2019 年的时候,我看过一本书,名叫《影响力》,应该有不少学弟学妹也看过。但说实在的,这本书我就看了几页,就看不下去了,不是这书不好,而是我觉得它不适合我,因为我那时候没什么影响力(谦虚点)。 没有影响力...
  • 超硬核!数据结构学霸笔记,考试面试吹牛就靠它

    万次阅读 多人点赞 2021-03-26 11:11:21
    1、引用和函数调用: 1.1引用:对个数据建立个“引用”,他的作用是为个变量起个别名。这是C++对C语言的个重要补充。 用法很简单: int a = 5; int &b = a; b是a别名,b与a代表的是同个变量,占内存...
  • 【开发记录】Linux常用命令记录(

    千次阅读 多人点赞 2019-09-12 14:16:40
    有时候很难记得清楚,同时方便新来的同学查阅。(将不停的追加和完善) 1)查看CPU情况 cat /proc/cpuinfo |grep "model name" && cat /proc/cpuinfo |grep "physical id" 2)查看内存大小 cat /...
  • 这一年,是异常忙碌的一年,感谢老师和实验室小伙伴们的鼓励,出差途中也见到了一些老同学。然而,这一年突破性的事情件没有,论文篇没中,不足之处太多太多,陪伴家人的时间也很少,还真挺遗憾的,更愧对亲人...
  • 今天来给大家谈谈如何高效地学习编程。 无论什么时候,找到学习的目标,以及学习的套路都非常的重要。找不到的话,就只能事倍功半,付出了很多努力,却迟迟得不到最好的回报。 三四年前,我特别喜欢收藏文章,觉得...
  • 大家好,我是路飞!又是一年毕业季,大学四年还没来得及好好体验校园生活,就匆忙收尾了!这四年时光里,有过目标和追求,也有过遗憾和不舍,从四年前刚...正式作为个在互联网苟且偷生,为了生活和前途而努力的。...
  • 1.未设置代理服务器 jmeter录制的原理:用户的请求通过jmeter脚本录制器然后再发送到所请求的服务器,这样才录制了份请求。 如果没有设置代理服务器,自然就录制不了脚本了
  • 之前在送书的时候做了个小调查,问题是:“你是怎么认识二哥的?” 我以为从知乎上了解的多一些,没想到,CSDN 上的最多,看来二哥还是在 CSDN 上更有影响力一些,这个结果多少让我感到有些意外,因为我最近在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 160,485
精华内容 64,194
关键字:

如何制作一本同学录