【C语言进阶】进来抄作业,完善你的通讯录(软工期末大作业可用)

news2025/7/5 2:08:56

目录

🥰前言🥰:

一、输入合法性检测🤠:

        ①.对“ 联系方式 ”的合法性检测:

        ②.对“年龄”进行合法性检测:

二、字典排序🤑:

三、反馈优化🤯:

四、优化版通讯录全部源码🤩:

        ①.Contact.h:

        ②.Contact.c:

        ③.test.c:

🥳总结🥳:


🛰️博客主页:✈️銮同学的干货分享基地

🛰️欢迎关注:👍点赞🙌收藏✍️留言

🛰️系列专栏:💐【进阶】C语言学习

🛰️代码仓库:🎉VS2022_C语言仓库

        家人们更新不易,你们的👍点赞👍和👉关注👈真的对我真重要,各位路过的友友麻烦多多点赞关注,欢迎你们的私信提问,感谢你们的转发!

        关注我,关注我,关注我,你们将会看到更多的优质内容!!


🏡🏡 本文重点 🏡🏡:

🚅  优化完善静态通讯录(源码在结尾) 🚏🚏

🥰前言🥰:

        在上篇文章中我们已经使用我们所学过的结构体相关知识,写出了一个基础版本的通讯录工具,但是我们也知道这个基础版本的通讯录工具仍然存在着许多的缺陷

        我们注意到,在我们的基础版通讯录中,我们对输入的值没有合法性检测,这将会导致,无论用户输入什么样的值都将会被我们的通讯录存储,并且由于输入与反馈的数据类型及格式差异,很有可能会导致输出错误。并且我们可以回想一下,我们手机里的通讯录在保存好联系人信息后,在我们进行查看时,会按照类似字典内的排序方式(即字典排序)将所有联系人进行排序后反馈给用户,而在我们基础版的通讯录中,保存的联系人信息还没有经过排序。最后还有对输出反馈的优化,相信各位小伙伴们在使用通讯录的时侯,屏幕上的打印反馈信息也应该都不是凌乱的吧。

        而关于上面所说的这些问题,我们今天就将逐一进行处理

一、输入合法性检测🤠:

        关于合法性检测,我们的要求是对需要进行输入合法性检测的信息进行合法性检测。例如输入联系方式时若用户输入非数字字符,则提示用户输入非法;以及在用户输入年龄时应当对年龄范围进行限制,超出限制范围则应提示用户输入非法

        ①.对“ 联系方式 ”的合法性检测:

        对联系方式的合法性检测我们认为应当分为两步,首先我们应当对输入的联系方式内容进行检测,这里所采用的方式是,对数组内字符串进行遍历,在前11个位置(联系方式为 11 位)每个位置上的字符均为数字字符 0~9 时,则继续向后遍历,全部遍历完成且没有错误后则判断为合法,否则为不合法,提醒用户输入非法并要求用户重新进行输入

scanf("%s", p->data[p->sz].tele);
char check1[MAX_TELE] = { 0 };
strcpy(check1, p->data[p->sz].tele);
int i = 0;
int cmp = 0;
//比较变量cmp用于标记各位置上的判断结果
for (i = 0; i < 11; i++)
{
	if ('0' <= check1[i] && check1[i] <= '9')
	{
		cmp = 0;
	}
	else
	{
		cmp = 1;
		break;
	}
}
if (cmp)
{
	printf("您输入的联系方式有误,请重新输入!\n");
}

        接下来我们还要进行联系方式长度检测,我们当前所使用的联系方式通常为 11 位,于是我们就将位数暂且定为11位,并且我们前面的合法位判断中已经确定了每一位上均为合法,于是在这里我们只需要对位数加以判断即可,我们选择的判断方法是若第十二位为初始化时的 0(即第十二位没有输入值),则合法,否则不合法

if (check1[11] == 0)
//下标从零开始,第十二位下标为11
{
	;
//若合法则不进行操作,不合法则提示不合法并重新输入
}
else
{
	cmp = 1;
}

        最后我们再对整个循环条件进行判断即可。我们使用了 do ... while 循环,保证了合法性判断至少进行一次,并在判断循环一开始便让判断条件 input 变为 0(假),若在判断结束时仍没有不合法现象,则判断为假跳出循环,合法性判断结束;若在过程中判断存在不合法输入,则将其值重新赋为 1,提示不合法后继续进入下一循环

int input = 1;
do
{
	input = 0;
	//直接让input为0,若出现不合法则改其值为1继续循环
	//不符合不合法则跳出循环

	printf("请输入联系人联系方式:>");
	scanf("%s", p->data[p->sz].tele);
	char check1[MAX_TELE] = { 0 };
	strcpy(check1, p->data[p->sz].tele);
	int i = 0;
	int cmp = 0;
	//比较变量cmp用于标记各位置上的判断结果
	for (i = 0; i < 11; i++)
	{
		if ('0' <= check1[i] && check1[i] <= '9')
		{
			cmp = 0;
		}
		else
		{
			cmp = 1;
			break;
		}
	}
	if (check1[11] == 0)
	//下标从零开始,第十二位下标为11
	{
		;
		//若合法则不进行操作,不合法则提示不合法并重新输入
	}
	else
	{
		cmp = 1;
	}
	if (cmp)
	{
		input = 1;
		//不合法继续循环
		printf("您输入的联系方式有误,请重新输入!\n");
	}
} while (input);

        同时我们对“修改联系人信息”功能中的相关输入也需要采用这样的方式进行合法性判断

case 4:
    do
    {
	    input_cmp = 0;
    	//直接让input_cmp为0,若出现不合法则改其值为1继续循环
	    //不符合不合法则跳出循环

    	printf("请输入联系人联系方式:>");
	    scanf("%s", p->data[x - 1].tele);
	    char check1[MAX_TELE] = { 0 };
    	strcpy(check1, p->data[x - 1].tele);
    	int i = 0;
    	int cmp = 0;
	    //比较变量cmp用于标记各位置上的判断结果
    	for (i = 0; i < 11; i++)
	    {
		    if ('0' <= check1[i] && check1[i] <= '9')
		    {
			    cmp = 0;
	    	}
	        else
		    {
			    cmp = 1;
			    break;
	    	}
	    }
	    if (check1[11] == 0)
		    //下标从零开始,第十二位下标为11
	    {
		    ;
		    //若合法则不进行操作,不合法则提示不合法并重新输入
	    }
	    else
	    {
		    cmp = 1;
	    }
	    if (cmp)
	    {
		    input_cmp = 1;
		    //不合法继续循环
		    printf("您输入的联系方式有误,请重新输入!\n");
	    }
	    else
	    {
		    printf("修改成功!\n");
        }
    } while (input_cmp);
    PrintContact(p, x - 1);
    input = 0;
    break;

        ②.对“年龄”进行合法性检测:

        对年龄的合法性检测最为简单,我们只需要判断用户输入的年龄位于区间 0~100 之间即可,合法则跳出,否则继续循环

int input = 1;
do
{
	printf("请输入联系人年龄:>");
	scanf("%d", &(p->data[p->sz].age));
	if (0 <= p->data[p->sz].age && p->data[p->sz].age <= 100)
	{
		input = 0;
	}
	else
	{
		printf("您输入的年龄信息有误,请重新输入!\n");
	}
} while (input);

        同样的,将“修改联系人信息”功能中的输入以同样的方式进行合法性检测

case 3:
	do
	{
		printf("请输入联系人年龄:>");
		scanf("%d", &(p->data[x - 1].age));
		if (0 <= p->data[x - 1].age && p->data[x - 1].age <= 100)
		{
			input_cmp = 0;
			printf("修改成功!\n");
		}
		else
		{
			printf("您输入的年龄信息有误,请重新输入!\n");
		}
	} while (input_cmp);
	PrintContact(p, x - 1);
	input = 0;
	break;

二、字典排序🤑:

        字典排序相对简单,简单来说,就是按照像字典里那样,根据姓名的排序,将通讯录中联系人信息进行排序

        而我们要想进行实现,其实也很简单,我们只需要像冒泡排序那样进行遍历将每一个联系人的姓名均与下一个联系人进行比较,如果后一个联系人的姓名更靠前,则将二者的信息进行交换,否则继续向后一个进行比较

//字典排序:
void sort(contact* p)
{
	int i = 0;
	PeoInfo temp;
	for (i = 0; i < p->sz; i++)
	{
		if (strcmp(p->data[i].name, p->data[i + 1].name) > 0)
		{
			temp = p->data[i + 1];
			p->data[i + 1] = p->data[i];
			p->data[i] = temp;
		}
	}
}

        在这里,我们只需要再定义一个中间结构体,并通过中间结构体直接交换两个联系人的信息即可,而不用逐一交换两个联系人的各项信息。

三、反馈优化🤯:

        而关于反馈优化则很简单了。在优化前,我们的通讯录小工具运行起来是这个样子的:

        优化前的程序运行结果肉眼可见的繁杂、凌乱,一团乱麻地堆在一起。于是我们就需要对小工具的打印反馈过程进行优化。

        我们使用的方法仍然是,使用 Sleep 命令与 system 命令,共同协作完成优化工作。

        而关于 Sleep 与 system 命令,我们前面在对三子棋游戏与扫雷游戏(点击跳转)进行优化时,就已经为大家讲解过了,这里就不再做过多的赘述,各位小伙伴们可以通过点击游戏名跳转至我们之前关于这两个命令的讲解部分进行学习。

四、优化版通讯录全部源码🤩:

        废话不多说,直接给大家上源码

        ①.Contact.h:

#pragma once

//定义宏常量:
#define MAX 1000
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30

//引用头文件:
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<Windows.h>

//选项枚举:
enum Option
{
	Exit,//值为0
	Add,//值为1
	Del,//值为2
	Search,//值为3
	Modify,//值为4
	Print//值为5
};

//联系人信息:
typedef struct PeoInfo
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}PeoInfo;

//通讯录调用封装:
typedef struct contact
{
	PeoInfo data[MAX];
	int sz;
}contact;

//函数声明:
void InitContact(contact* p);
void sort(contact* p);
void PrintContact(const contact* p, int x);
void PrintAllContact(const contact* p);
void AddContact(contact* p);
void DelContact(contact* p);
void SearchContact(const contact* p);
void ModifyContact(const contact* p);

        ②.Contact.c:

#define _CRT_SECURE_NO_WARNINGS 1

#include"Contact.h"

//初始化通讯录:
void InitContact(contact* p)
{
	assert(p);
	p->sz = 0;
	memset(p->data, 0, sizeof(p->data));
	//使用memeset函数将p->data所指向的空间中的数据初始化为0
	//操作的空间大小为sizeof函数所计算出的p->data所指向空间的大小,即整个无联系人数据的结构体数组data所占的空间的大小
}

//字典排序:
void sort(contact* p)
{
	int i = 0;
	PeoInfo temp;
	for (i = 0; i < p->sz; i++)
	{
		if (strcmp(p->data[i].name, p->data[i + 1].name) > 0)
		{
			temp = p->data[i + 1];
			p->data[i + 1] = p->data[i];
			p->data[i] = temp;
		}
	}
}

//打印联系人信息:
void PrintContact(const contact* p, int x)
{
	assert(p);
	printf(" 联系人 :%04d\n", x + 1);
	printf(" 姓  名 :%s\n", p->data[x].name);
	printf(" 性  别 :%s\n", p->data[x].sex);
	printf(" 年  龄 :%d\n", p->data[x].age);
	printf("联系方式:%s\n", p->data[x].tele);
	printf("当前住址:%s\n", p->data[x].addr);
}

//打印全部联系人信息:
void PrintAllContact(const contact* p)
{
	assert(p);
	printf("联系人 姓名                性别  年龄   联系方式      住址\n");
	int i = 0;
	for (i = 0; i < p->sz; i++)
	{
		printf(" %04d  %-20s %-5s %-4d %-12s %-30s\n", i + 1, p->data[i].name, p->data[i].sex, p->data[i].age, p->data[i].tele, p->data[i].addr);
	}
}

//添加联系人:
void AddContact(contact* p)
{
	assert(p);
	if (p->sz == MAX)
	{
		system("cls");
		printf("通讯录空间不足,无法添加新成员!\n");
		Sleep(1500);
		system("cls");
	}
	else
	{
		printf("请输入联系人姓名:>");
		scanf("%s", p->data[p->sz].name);

		printf("请输入联系人性别:>");
		scanf("%s", p->data[p->sz].sex);
		
		//对年龄进行合法性检测:
		int input = 1;
		do
		{
			printf("请输入联系人年龄:>");
			scanf("%d", &(p->data[p->sz].age));
			if (0 <= p->data[p->sz].age && p->data[p->sz].age <= 100)
			{
				input = 0;
			}
			else
			{
				Sleep(1000);
				system("cls");
				printf("您输入的年龄信息有误,请重新输入!\n");
				Sleep(1500);
				system("cls");
				printf("请输入联系人姓名:>%s\n", p->data[p->sz].name);
				printf("请输入联系人性别:>%s\n", p->data[p->sz].sex);
			}
		} while (input);

		//对联系方式进行合法性检测:
		input = 1;
		do
		{
			input = 0;
			//直接让input为0,若出现不合法则改其值为1继续循环
			//不符合不合法则跳出循环

			printf("请输入联系人联系方式:>");
			scanf("%s", p->data[p->sz].tele);
			char check1[MAX_TELE] = { 0 };
			strcpy(check1, p->data[p->sz].tele);
			int i = 0;
			int cmp = 0;
			//比较变量cmp用于标记各位置上的判断结果
			for (i = 0; i < 11; i++)
			{
				if ('0' <= check1[i] && check1[i] <= '9')
				{
					cmp = 0;
				}
				else
				{
					cmp = 1;
					break;
				}
			}
			if (check1[11] == 0)
			//下标从零开始,第十二位下标为11
			{
				;
				//若合法则不进行操作,不合法则提示不合法并重新输入
			}
			else
			{
				cmp = 1;
			}
			if (cmp)
			{
				input = 1;
				//不合法继续循环
				Sleep(1000);
				system("cls");
				printf("您输入的联系方式有误,请重新输入!\n");
				Sleep(1500);
				system("cls");
				printf("请输入联系人姓名:>%s\n", p->data[p->sz].name);
				printf("请输入联系人性别:>%s\n", p->data[p->sz].sex);
				printf("请输入联系人年龄:>%d\n", p->data[p->sz].age);
			}
		} while (input);
		
		printf("请输入联系人住址:>");
		scanf("%s", p->data[p->sz].addr);
		Sleep(1000);
		system("cls");
		printf("****************************\n");
		printf("****************************\n");
		printf("**** 联系人信息添加成功!***\n");
		printf("****************************\n");
		printf("****************************\n");
		PrintContact(p, p->sz);
		sort(p);
		p->sz++;
	}
}

//删除联系人:
void DelContact(contact* p)
{
	assert(p);
	int num = 0;
	if (p->sz == 0)
	{
		printf("对不起,当前通讯录中没有联系人信息!\n");
		Sleep(1500);
	}
	else
	{
		PrintAllContact(p);
		printf("请输入您想删除的联系人编号:>");
		scanf("%d", &num);
		int x = num - 1;
		if (0 <= x && x <= p->sz)
		{
			int j = 0;
			for (j = x; j < p->sz; j++)
			{
				p->data[j] = p->data[j + 1];
				p->sz--;
			}
			Sleep(1000);
			system("cls");
			printf("**************************\n");
			printf("**************************\n");
			printf("**** 联系人信息已删除!***\n");
			printf("**************************\n");
			printf("**************************\n");
			PrintAllContact(p);
			Sleep(3000);
		}
	}
}

//查询联系人:
void SearchContact(const contact* p)
{
	assert(p);
	char name[MAX_NAME] = { 0 };
	printf("请输入您想要查询的联系人姓名:>");
	scanf("%s", &name);
	Sleep(1000);
	system("cls");
	int i = 0;
	int ret = 1;
	for (i = 0; i < p->data; i++)
	{
		if (0 == strcmp(name, p->data[i].name))
		{
			printf("************************\n");
			printf("************************\n");
			printf("**** 成功找到联系人!***\n");
			printf("************************\n");
			printf("************************\n");
			PrintContact(p, i);
			Sleep(3000);
			ret = 0;
			break;
		}
	}
	if (ret)
	{
		printf("************************\n");
		printf("************************\n");
		printf("**** 未找到该联系人!***\n");
		printf("************************\n");
		printf("************************\n");
		Sleep(1500);
	}
}

//修改联系人信息:
void ModifyContact(contact* p)
{
	assert(p);
	int x = 0;
	int input = 0;
	int input_cmp = 1;
	if (p->sz == 0)
	{
		printf("对不起,当前通讯录中没有联系人信息!\n");
		Sleep(1500);
		system("cls");
	}
	else
	{
		PrintAllContact(p);
		printf("请输入您想要修改的联系人编号:>");
		scanf("%d", &x);
		Sleep(1000);
		system("cls");
		do
		{
			printf("***************************\n");
			printf("***************************\n");
			PrintContact(p, x - 1);
			printf("***************************\n");
			printf("当前支持修改的信息:\n");
			printf("1.Name\n");
			printf("2.Sex\n");
			printf("3.Age\n");
			printf("4.Tele\n");
			printf("5.Addr\n");
			printf("请选择您想要修改的信息:>");
			scanf("%d", &input);
			Sleep(1000);
			system("cls");
			switch (input)
			{
			case 1:
				printf("***************************\n");
				printf("***************************\n");
				PrintContact(p, x - 1);
				printf("***************************\n");
				printf("请更新联系人姓名:");
				scanf("%s", p->data[x - 1].name);
				Sleep(1000);
				system("cls");
				printf("**************************\n");
				printf("**************************\n");
				printf("**** 联系人姓名已修改!***\n");
				printf("**************************\n");
				printf("**************************\n");
				PrintContact(p, x - 1);
				Sleep(3000);
				system("cls");
				input = 0;
				break;
			case 2:
				printf("***************************\n");
				printf("***************************\n");
				PrintContact(p, x - 1);
				printf("***************************\n");
				printf("请更新联系人性别:");
				scanf("%s", p->data[x - 1].sex);
				Sleep(1000);
				system("cls");
				printf("**************************\n");
				printf("**************************\n");
				printf("**** 联系人性别已修改!***\n");
				printf("**************************\n");
				printf("**************************\n");
				PrintContact(p, x - 1);
				Sleep(3000);
				system("cls");
				input = 0;
				break;
			case 3:
				do
				{
					printf("***************************\n");
					printf("***************************\n");
					PrintContact(p, x - 1);
					printf("***************************\n");
					printf("请更新联系人年龄:>");
					scanf("%d", &(p->data[x - 1].age));
					Sleep(1000);
					system("cls");
					if (0 <= p->data[x - 1].age && p->data[x - 1].age <= 100)
					{
						input_cmp = 0;
						printf("**************************\n");
						printf("**************************\n");
						printf("**** 联系人年龄已修改!***\n");
						printf("**************************\n");
						printf("**************************\n");
					}
					else
					{
						printf("您输入的年龄信息有误,请重新输入!\n");
						Sleep(1500);
						system("cls");
					}
				} while (input_cmp);
				PrintContact(p, x - 1);
				Sleep(3000);
				system("cls");
				input = 0;
				break;
			case 4:
				do
				{
					input_cmp = 0;
					//直接让input_cmp为0,若出现不合法则改其值为1继续循环
					//不符合不合法则跳出循环

					printf("***************************\n");
					printf("***************************\n");
					PrintContact(p, x - 1);
					printf("***************************\n");
					printf("请更新联系人联系方式:>");
					scanf("%s", p->data[x - 1].tele);
					Sleep(1000);
					system("cls");
					char check1[MAX_TELE] = { 0 };
					strcpy(check1, p->data[x - 1].tele);
					int i = 0;
					int cmp = 0;
					//比较变量cmp用于标记各位置上的判断结果
					for (i = 0; i < 11; i++)
					{
						if ('0' <= check1[i] && check1[i] <= '9')
						{
							cmp = 0;
						}
						else
						{
							cmp = 1;
							break;
						}
					}
					if (check1[11] == 0)
						//下标从零开始,第十二位下标为11
					{
						;
						//若合法则不进行操作,不合法则提示不合法并重新输入
					}
					else
					{
						cmp = 1;
					}
					if (cmp)
					{
						input_cmp = 1;
						//不合法继续循环
						printf("您输入的联系方式有误,请重新输入!\n");
						Sleep(1500);
						system("cls");
					}
					else
					{
						printf("******************************\n");
						printf("******************************\n");
						printf("**** 联系人联系方式已修改!***\n");
						printf("******************************\n");
						printf("******************************\n");
					}
				} while (input_cmp);
				PrintContact(p, x - 1);
				Sleep(3000);
				system("cls");
				input = 0;
				break;
			case 5:
				printf("***************************\n");
				printf("***************************\n");
				PrintContact(p, x - 1);
				printf("***************************\n");
				printf("请更新联系人住址:");
				scanf("%s", p->data[x - 1].addr);
				Sleep(1000);
				system("cls");
				printf("**************************\n");
				printf("**************************\n");
				printf("**** 联系人住址已修改!***\n");
				printf("**************************\n");
				printf("**************************\n");
				PrintContact(p, x - 1);
				Sleep(3000);
				system("cls");
				input = 0;
				break;
			default:
				printf("您的选择有误,请重新选择!\n");
				Sleep(1500);
				system("cls");
				break;
			}
		}while (input);
	}
}

        ③.test.c:

#define _CRT_SECURE_NO_WARNINGS 1

#include"Contact.h"

void menu()
{
	printf("**********************************\n");
	printf("**********************************\n");
	printf("******** 欢迎使用本通讯录 ********\n");
	printf("**********************************\n");
	printf("***** 本通讯录现提供以下功能 *****\n");
	printf("************ 1.Add ***************\n");
	printf("************ 2.Del ***************\n");
	printf("************ 3.Search ************\n");
	printf("************ 4.Modify ************\n");
	printf("************ 5.Print *************\n");
	printf("************ 0.Exit **************\n");
	printf("**********************************\n");
	printf("**********************************\n");
}

void Contact()
{
	int input = 0;
	contact con;
	InitContact(&con);
	do
	{
		menu();
		printf("请您进行选择:> ");
		scanf("%d", &input);
		switch (input)
		{
		case Add:
			Sleep(1000);
			system("cls");
			AddContact(&con);
			Sleep(3000);
			system("cls");
			break;
		case Del:
			Sleep(1000);
			system("cls");
			DelContact(&con);
			system("cls");
			break;
		case Search:
			Sleep(1000);
			system("cls");
			SearchContact(&con);
			system("cls");
			break;
		case Modify:
			Sleep(1000);
			system("cls");
			ModifyContact(&con);
			Sleep(1000);
			system("cls");
			break;
		case Print:
			Sleep(1000);
			system("cls");
			PrintAllContact(&con);
			Sleep(1000);
			system("cls");
			break;
		case Exit:
			Sleep(1000);
			system("cls");
			printf("正在退出!\n");
			Sleep(1000);
			system("cls");
			break;
		default:
			Sleep(1000);
			system("cls");
			printf("您的选择有误,请重新选择!\n");
			Sleep(1500);
			system("cls");
			break;
		}
	} while (input);
}

int main()
{
	Contact();

	return 0;
}

🥳总结🥳:

        至此,我们关于通讯录的优化就全部完成了。不过我们看到我们目前写出来的通讯录仍旧功能简单,各位小伙伴们下去以后可以自行研究,再给它添加上我们需要的各种功能

        🔥🔥坚强并不只是在大是大非中不屈服,而也是在挫折前不改变自己🔥🔥

        更新不易,辛苦各位小伙伴们动动小手,👍三连走一走💕💕 ~ ~ ~  你们真的对我很重要!最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/109306.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 圣诞树代码

一、前言 1.本章将会讲解Python编程 实现圣诞树效果&#xff01; 2.圣诞节介绍 基督教纪念耶稣诞生的重要节日。亦称耶稣圣诞节、主降生节&#xff0c;天主教亦称耶稣圣诞瞻礼。耶稣诞生的日期&#xff0c;《圣经》并无记载。公元336年罗马教会开始在12月25日过此节。12月25日…

现在转行计算机如49年入国军?

阿里&#xff0c;腾讯等互联网大厂最近不太安宁&#xff0c;裁员消息频出&#xff0c;无风不起浪&#xff0c;裁员年年有&#xff0c;今年特别多。于是不少打算入行或者已经入行计算机的同学开始担忧&#xff0c;如今入行计算机&#xff0c;怎么有点49年入国军的赶脚&#xff1…

Android面试题及答案整理(2023最新版)持续更新中......

倒霉的时候总会想起福祸相依&#xff0c;但你会发现倒霉起来没完没了&#xff0c;就是看不到传说中的“福” 年初被裁了&#xff0c;我会安慰自己&#xff0c;此处不留爷自有留爷处&#xff0c;然后踏入找工作的行列&#xff1b;没有面试邀请&#xff0c;我会告诉自己&#xf…

倒在转“码”路上的文科生,文科生也能转行做IT吗?

近期&#xff0c;一篇《倒在转“码”路上的文科生》火了。 这也让关于“文科转码”的话题引起了一番热度&#xff0c;由于大环境不佳&#xff0c;使得毕业生就业成为了一个难度&#xff0c;其中文科生相较而言&#xff0c;选择更少&#xff0c;因此&#xff0c;让不少学子有了…

Java项目:springboot酒店宾馆管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 功能介绍 springboot酒店宾馆管理系统。该系统为后管系统&#xff0c;无前台。主要分三种角色&#xff1a;管理者/工作人员/前台人员。 主要功能有&…

网络安全方向好吗?

我就在这个行业&#xff0c;今年刚毕业&#xff0c;民办二本&#xff0c;目前武汉&#xff0c;薪资就没必要说了&#xff0c;高就对了。 这个行业优势就是工资高&#xff0c;缺点就需要一直学&#xff0c;卷得要死&#xff0c;不是跟别人卷&#xff0c;而是自己卷&#xff0c;…

数据库实验3 完整性语言实验

实验3 完整性语言实验 实验3.1实体完整性实验 1.实验目的 掌握实体完整性的定义和维护方法。 2.实验内容和要求 定义实体完整性,删除实体完整性。能够写出两种方式定义实体完整性的SQL 语句:创建表时定义实体完整性﹑创建表后定义实体完整性。设计SQL语句验证完整性约束是…

LeetCode 96. 不同的二叉搜索树

LeetCode 96. 不同的二叉搜索树 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5示例 2&#xff1a; 输入&#x…

我,30多岁的土木工程人,终于转行了

行外人可能没法想象&#xff0c;十年前最火爆、高校录取分数最高的土木工程专业&#xff0c;现在在贴吧知乎等社交网站上&#xff0c;竟然成了一个“劝退率”最高的专业。 土木出身的工程人&#xff0c;一边吐槽“土木毁我青春”&#xff0c;一边苦口婆心的劝退还在上学的学弟学…

一本通 1276:【例9.20】编辑距离

看完题目后&#xff0c;整个人都懵了&#xff0c;这题咋整&#xff1f; 哎呀&#xff0c;知道知道&#xff0c;用动态规划做 不要慌&#xff0c;我们慢慢分析.... 目录 做题前须知 状态转移 如果 a[i] b[j] 如果 a[i] ! b[j] 做删除操作 做插入操作 做替换操作 初始…

跑步热来袭!缤跃关注运动健康生活,跨界推出差异化酒店产品!

近期&#xff0c;人民数据研究院发布《2022全民跑步运动健康报告》&#xff0c;报告中显示参与跑步人群的年龄跨度随着社会对跑步运动不断攀升的热情而增加。现代生活节奏加快、竞争压力大使得部分中青年通过运动寻求解压&#xff0c;2022年18-40岁的跑者开始成为中坚力量&…

非零基础自学Golang 第15章 Go命令行工具 15.1 编译相关指令 15.1.3 install 15.1.4 交叉编译

非零基础自学Golang 文章目录非零基础自学Golang第15章 Go命令行工具15.1 编译相关指令15.1.3 install15.1.4 交叉编译第15章 Go命令行工具 15.1 编译相关指令 15.1.3 install go install命令的作用是编译后安装&#xff0c;该命令依赖于GOPATH&#xff0c;因此不能在独立的…

网上到处转行编程成功的,现实中真的容易吗?

首先&#xff0c;我先回答&#xff0c;转行编程真的这么简单么&#xff1f;答案是极其简单&#xff0c;但是也非常艰难。 这是一句正确的废话&#xff01; 其实&#xff0c;网上到处都是转行成功的案例。而我们现在也是在互联网上咨询&#xff0c;所以得到的答案会是什么答案…

转行IT,你需要了解的真实项目研发流程是怎样的?

本文以我在阿里写bug的项目流程为例子&#xff0c;介绍软件项目的研发一般流程&#xff0c;也可以作为企业开发流程的参考&#xff0c;让想转行IT的同学提前心里有个数。 一、职位分工 一般的大厂或者互联网软件公司&#xff0c;都会有如下职位。 1、产品经理 负责产品的设计&a…

json-server的学习笔记

文章目录json-server简介1、入门环境依赖安装2、基本使用2.1 启动jsonserver2.2 **json-server相关配置参数**2.3 jsonserver中的请求方法的作用3、筛选过滤4、分页5、排序6、切片(分页)7、特殊符号8、全文搜索9、关系10、数据库11、主页12、附加功能12.1 静态文件服务器12.2 替…

青少年等级考试【Python通关干货知识点】(一级)

青少年等级考试【Python通关干货知识点】&#xff08;一级&#xff09; 1. 编程模式 1&#xff09;交互式编程 在交互式环境的提示符>>>下&#xff0c;直接输入代码&#xff0c;按回车&#xff0c;就可以立刻得到代码执行结果。 交互式编程缺憾是没有保存下来&#x…

转行大数据,编程学Java还是Python?

Python和Java&#xff0c;是大数据行业最常见的两种编程语言&#xff0c;对于想转行大数据的人来说&#xff0c;学习哪个语言是比较好的选择呢&#xff1f; Python和大数据&#xff1a; Python本身的特点是高效率的开发和简单的维护&#xff0c;大数据运维领域也在普遍采用Pyth…

GridLayout案例

GridLayout-网格布局案例 1.网格布局-GridLayout 1.简介 无限细的线绘制的分割区域成行成列&#xff0c;和棋盘的样子差不多2.注意点 自己设置行数和列数自己控件在几行几列自己定义跨越的行数和列数自己设置子布局的排列的样式3.常见属性 4.网格布局属性 android:columnCount&…

【软件测试】测试人的懊恼,你要揭开的秘密复现bug......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 我们测试人常常会懊…

分布式微服务框架SpringCloud Alibaba学习(1)

springCloud 发展历史以及SpringCloud Alibaba概述 一.Why SpringCloud Alibaba? 1.微服务cloud新闻&#xff1a; 2020-12-22日Spring 官方博客宣布&#xff0c;Spring Cloud 2020.0.0正式发布。2020.0.0是第一个使用新的版本号命名方案的Spring Cloud 发行版本。在此之前S…