C语言 实现学生管理系统(手把手教学)

2023-11-05

        学生管理系统怎么实现?首先要对问题能分析出框架来。这样在之后书写功能时就会对所需要的东西有一个清晰的认知。

        那么,管理系统的任务就是:能删除、查找和修改学生信息,能进行排序、能打印信息。

        这些都是最基本的功能,把这些功能框架写在一个c源文件里,当作主函数的运行区。

#include"StudentManager.h"

enum Option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SORT,
	PRINT
};

int main()
{
	int input = 0;
	//创建人员名单
	Student stulist;//人员名单
	//初始化人员名单
	InitStudent(&stulist);
	do 
	{
		menu();
		printf("请选择:\n");
		scanf_s("%d", &input);
		switch(input)
		{
			case ADD:
				AddStudent(&stulist);//修改一定传地址
				break;
			case DEL:
				DelStudent(&stulist);
				break;
			case SEARCH:
				SearchStudent(&stulist);//可以传值,但传地址效率更高
				break;
			case MODIFY:
				ModifyStudent(&stulist);
				break;
			case SORT:
				SortStudent(&stulist);
				break;
			case PRINT:
				PrintStulist(&stulist);
				break;
			case EXIT:
				printf("退出管理系统\n");
			default:
				break;
		}
	} while (input);
	SaveFile(&stulist);
}

========================================================================= 

        而后,是单独的一个文件,实现对所使用函数的声明,以便让业务逻辑更加分明:(同时尽量在这里就把所需要的存储类型定义了,这样写功能函数的时候会更加的清晰)

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//结构体定义
typedef struct StuInfo
{
	//(1)每个学生的个人信息包括:姓名、学号、籍贯、年龄、数学、英语、物理成绩
	char name[15];
	char address[20];
	char ID[15];
	int age;
	int score[3];
	int sum;
	int order;
}StuInfo;
//对结构体进行封装
typedef struct Student
{
	StuInfo data[100];  //存放的人员信息
	int size;  //记录当前的人数
}Student;

int FindByName(Student* pc, char name[]);
void InitStudent(Student* pc);
void AddStudent(Student* pc);
void DelStudent(Student* pc);
void SearchStudent(Student* pc);
void ModifyStudent(Student* pc);
void SortStudent(Student* pc);
void SaveFile(Student* pc);
void PrintStulist(const Student* pc);
void menu();

 =========================================================================

        之后,就是对函数功能的实现了,在实现功能之前,我们已经确定自己写的学生信息存储方式是什么。所以,就是函数功能的实现。

首先最基础的是菜单界面:

//显示菜单界面
void menu()
{
	printf("---------------\n");
	printf("1.增     2.删 \n");
	printf("3.查     4.改 \n");
	printf("5.排     6.打印 \n");
	printf("    0.退出    \n");
	printf("---------------\n");
}

========================================================================= 

    然后写一个函数来初始化空间(不多解释):

//初始化数据,以便使用
void InitStudent(Student* pc)
{
	pc->size = 0;
	memset(pc->data, 0, sizeof(pc->data));//初始化所有数据为0
}

        之后就是一些功能的实现,比如我们先实现一个打印的功能,因为打印功能的代码在其他功能里也能使用和体现(例如查找)

        指针pc想要解引用地址,就需要使用' -> ',其他的则是' . '。所以打印信息的操作就一目了然了,首先指针解引用取单个学生信息,然后结构体再去取出相应的信息数据来。

//打印信息
void PrintStulist(const Student* pc)
{
	int i = 0;
	//打印标题
	printf("%-10s\t%-10s\t%-10s\t%-10s\t%-20s\n", "姓名", "学号", "籍贯", "年龄", "成绩:数学、英语、物理、");
	for (i = 0; i < pc->size; i++)
	{
		printf("%-10s\t%-10s\t%-10s\t%-10d\t%d\t%d\t%d\n",
			pc->data[i].name,
			pc->data[i].ID,
			pc->data[i].address,
			pc->data[i].age,
			pc->data[i].score[0], pc->data[i].score[1], pc->data[i].score[2]);//输入的三科成绩
	}

}

        在这里,需要简单的说明一下这个函数,使用const只读属性是因为我们接受的是学生名单的信息,但为了保证学生名单信息不会被误操作(除打印以外的操作),所以加上了const。那么可能有人会问,既然害怕被修改,为什么不直接定义一个普通变量接受学生信息,而要使用指针?那么请思考一下:指针接受的是地址,普通变量接受的是全部的信息,哪个效率更高呢?当然是传址的效率高。

=========================================================================

        而后是添加的功能,一个新学生来到了班级,得重新录入信息吧,所以添加的功能需要一些什么?当然就是对应的信息去做修改(此处定义的学生名单进行封装时,定义的是100,当然,你也可以选择#define宏定义,以便后期维护):

//增加人员信息
void AddStudent(Student* pc)
{
	if (pc->size == 100)
	{
		printf("名单已满,无法添加\n");
		return;
	}
	//增加信息
	printf("请输入名字:\n");
	scanf_s("%s", pc->data[pc->size].name, 15);
	printf("请输入学号:\n");
	scanf_s("%s", pc->data[pc->size].ID, 15);
	printf("请输入籍贯:\n");
	scanf_s("%s", pc->data[pc->size].address, 20);
	printf("请输入年龄:\n");
	scanf_s("%d", &(pc->data[pc->size].age));
	printf("请输入数学、英语、物理成绩:\n");
	scanf_s("%d %d %d", &(pc->data[pc->size].score[0]), &(pc->data[pc->size].score[1]), &(pc->data[pc->size].score[2]));
	pc->size++;
	printf("信息添加成功\n");
}

        添加的操作跟打印还是很相像的,就不多做解释。

=========================================================================

        那么,看看剩下的几个功能,其中有修改、删除和查找,我们仔细分析一下这三个功能,都需要定向的找到某个学生,所以,我们先写一个查找的功能出来(查找只能顺序查找,一个一个去看哪个符合条件,所以用for或者while):

//定义一个查找的功能,以便删除,查找使用
int FindByName(Student* pc, char name[])
{
	int i = 0;
	for (i = 0; i < pc->size; i++)
	{
		if ((strcmp(pc->data[i].name, name)) == 0)
		{
			return i;
		}
	}
	return -1;
}

        这里查找使用的是姓名查找,你也可以去更改查找的功能实现更高级一点的操作,比如根据成绩找人,根据ID找人(本质都一样)。

=========================================================================

        根据这个查找的功能,我们就可以去实现删除和修改操作了,当一个学生犯下滔天大罪,那就得退学咯,所以接下来实现一下删除:

        这里要注意,因为是对学生的信息进行了更改,所以必须传地址。

//删除人员信息
void DelStudent(Student* pc)
{
	char name[15] = { 0 };
	if (pc->size == 0)
	{
		printf("名单已空,没有信息可以删除\n");
		return;
	}
	//1.查找要删除的人
	printf("请输入要删除的人:\n");
	scanf_s("%s", name, 15);

	int position = FindByName(pc, name);
	/*
	有/没有 --> 2. 删除
	*/
	if (position == -1)
	{
		printf("要删除的人不存在");
		return;
	}
	//删除
	int i = 0;
	for (i = position; i < pc->size - 1; i++)//size-1是因为左后一个元素没必要被覆盖,后面代码删除
	{
		pc->data[i] = pc->data[i + 1];//依次覆盖实现向前移动和删除

	}
	pc->size--;
	printf("删除成功\n");
}

        删除的实现也算是相当简单了,因为实际上就等于是找到这个学生,然后把整个表格向前移动,直接覆盖这个学生就行(没办法,顺序表的缺陷就是删除操作时间复杂度高),同时,注意书写时也要判断学生存不存在。

        那么查找操作呢?我们上面写的关于查找的功能,只是程序找到了这个人的信息,真正需要去查找,总得去查看一下这个人的信息吧。班里学生想知道自己的信息,找老师去查,肯定是需要输出信息的,所以这里也摘下了打印的一部分代码:

//查找指定的人员 --> 借用了删除人员的代码以及打印信息的代码
void SearchStudent(Student* pc)
{
	char name[15] = { 0 };
	printf("请输入要查找的人:\n");
	scanf_s("%s", name, 15);
	int position = FindByName(pc, name);
	if (position == -1)
	{
		printf("要查找的人不存在");
		return;
	}//跟删除的判断一样的代码
	else//去打印找代码,注意更改一些内容
	{
		printf("%-10s\t%-10s\t%-10s\t%-10s\t%-20s\n", "姓名", "学号", "籍贯", "年龄", "成绩:数学、英语、物理、");
		printf("%-10s\t%-10s\t%-10s\t%-10d\t%d\t%d\t%d\n",
			pc->data[position].name,
			pc->data[position].ID,
			pc->data[position].address,
			pc->data[position].age,
			pc->data[position].score[0], pc->data[position].score[1], pc->data[position].score[2]);//从打印那里摘来的代码
	}
}

        所以,基本上只要理解了最前面几个代码,剩下的也就迎刃而解了。那么我们还剩下跟查找有关的修改功能:

//修改指定的人员信息  --> 借用了查找的代码以及添加的代码
void ModifyStudent(Student* pc)//使用查找的代码进行改造
{
	char name[15] = { 0 };
	printf("请输入要修改的人:\n");
	scanf_s("%s", name, 15);
	int position = FindByName(pc, name);
	if (position == -1)
	{
		printf("要修改的人不存在");
		return;
	}//跟删除的判断一样的代码
	else//注意,这里是跟添加一样的代码
	{
		printf("请输入名字:\n");
		scanf_s("%s", pc->data[position].name, 15);
		printf("请输入学号:\n");
		scanf_s("%s", pc->data[position].ID, 15);
		printf("请输入籍贯:\n");
		scanf_s("%s", pc->data[position].address, 20);
		printf("请输入年龄:\n");
		scanf_s("%d", &(pc->data[position].age));
		printf("请输入数学、英语、物理成绩:\n");
		scanf_s("%d %d %d", &(pc->data[position].score[0]), &(pc->data[position].score[1]), &(pc->data[position].score[2]));
		printf("信息修改成功\n");
	}
}

        发现了吗?跟添加信息又有点像。总之,跟查找有关的函数功能基本上全实现了,那么还剩下排序的功能没有实现,由于排序的功能与查找关系就不大了,所以列为下一个大块。

=========================================================================

        排序,我们能用到的排序其实有很多算法,比如选择排序、冒泡排序、插入排序、快速排序等等,这里就使用了一个更容易理解的插入排序算法来实现对学生的排序(算总分来排序):

//对人员进行排序
void SortStudent(Student* pc)
{
	for (int i = 0; i < pc->size; i++)
	{
		pc->data[i].sum = pc->data[i].score[0] + pc->data[i].score[1] + pc->data[i].score[2];
	}
	printf("总分排序结果:\n");//使用插入排序实现此功能
	StuInfo p;
	int i, j;
	for (i = 1; i < pc->size; i++)
		if (pc->data[i].sum > pc->data[i - 1].sum)
		{
			p = pc->data[i];
			for (j = i - 1; j >= 0 && pc->data[j].sum < p.sum; j--)
				pc->data[j + 1] = pc->data[j];
			pc->data[j + 1] = p;
		}
	StuInfo* t;
	i = 0;
	for (t = pc->data; t < pc->data + pc->size; t++)
	{
		pc->data[i].order = i + 1;
		i++;
	}
	//把排序之后的名单打印出来
	printf("%-10s\t%-10s\t%-10s\t%-10s\t%-20s\n", "姓名", "学号", "籍贯", "年龄", "成绩:数学、英语、物理、");
	for (int i = 0; i < pc->size; i++)
	{
		printf("%-10s\t%-10s\t%-10s\t%-10d\t%d\t%d\t%d\n",
			pc->data[i].name,
			pc->data[i].ID,
			pc->data[i].address,
			pc->data[i].age,
			pc->data[i].score[0], pc->data[i].score[1], pc->data[i].score[2]);//输入的三科成绩
	}
}

        那么,这段代码就只稍微解释一下所使用的排序的算法思路。插入排序,就是找到最大的那个值(得循环一遍才能找到),然后放到前面去,循环下来,就得到了一个顺序。具体的算法,等日后笔者再写一篇CSDN讲解一下吧,毕竟排序的内容还是很多的。

        同时,这个函数也使用了打印的代码,毕竟,排完序得让别人看见嘛,所以也打印一下整个学生名单的信息。

        写到这里,所有的功能基本就已经实现了。但是鉴于学生的信息最终可能要保存到文件里,以便日后使用,所以,这里又补了一个简单的文件保存的函数,当然,如果读者想实现读文件来写管理系统,那也是可以的:

//存储文件
void SaveFile(Student* pc)
{
	FILE* fp = NULL;
	fopen_s(&fp, "studentInfo.txt", "wt+");  //b表示以二进制方式打开文件
	if (fp == NULL) //打开文件失败,返回错误信息
	{
		printf("open file for write error\n");
	}
	int i = 0;
	for (i = 0; i < pc->size; i++) {
		fprintf(fp, "%-10s\t%-10s\t%-10s\t%-10d\t 三科成绩:%d\t%d\t%d\n",
			pc->data[i].name,
			pc->data[i].ID,
			pc->data[i].address,
			pc->data[i].age,
			pc->data[i].score[0], pc->data[i].score[1], pc->data[i].score[2]);
	}
	fclose(fp);
	fp = NULL;
}

        终于,我们的学生管理系统就算时搭建完成了,那么,小火罐们快拿着代码去试一试吧!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言 实现学生管理系统(手把手教学) 的相关文章

  • 【计算机毕业设计】北工国际健身俱乐部

    本系统为会员而设计制作北工国际健身俱乐部 旨在实现北工国际健身俱乐部智能化 现代化管理 本北工国际健身俱乐部管理自动化系统的开发和研制的最终目的是将北工国际健身俱乐部的运作模式从手工记录数据转变为网络信息查询管理 从而为现代管理人员的使用提
  • 【计算机毕业设计】SpringBoot+Vue.js协同过滤算法美食推荐小程序 _7tr93

    伴随着我国社会的发展 人民生活质量日益提高 于是对各种需求进行规范而严格是十分有必要的 所以许许多多的微信小程序应运而生 此时单靠人力应对这些事务就显得有些力不从心了 所以本论文将设计一套协同过滤算法美食推荐小程序 帮助美食推荐进行美食分类
  • qt.qpa.plugin: Could not find the Qt platform plugin “windows“ in ““

    系统环境 Win10家庭中文版 Qt 5 12 9 链接了一些64位的第三方库 程序编译完运行后出现 qt qpa plugin Could not find the Qt platform plugin windows in 弹窗如下 网
  • Python自动化测试 | 如何使用Robot Framework进行自动化测试?

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 【计算机毕业设计】OA公文发文管理系统_xtv98

    近年来 人们的生活方式以网络为主题不断进化 OA公文发文管理就是其中的一部分 现在 无论是大型的还是小型的网站 都随处可见 不知不觉中已经成为我们生活中不可或缺的存在 随着社会的发展 除了对系统的需求外 我们还要促进经济发展 提高工作效率
  • 【卡尔曼滤波】具有梯度流的一类系统的扩散映射卡尔曼滤波器研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据 文章
  • 华为OD机试真题-分披萨-2023年OD统一考试(C卷)

    题目描述 吃货 和 馋嘴 两人到披萨店点了一份铁盘 圆形 披萨 并嘱咐店员将披萨按放射状切成大小相同的偶数扇形小块 但是粗心服务员将披萨切成了每块大小都完全不同奇数块 且肉眼能分辨出大小 由于两人都想吃到最多的披萨 他们商量了一个他们认为公
  • 一台java服务器可以跑多少个线程?

    一台java服务器可以跑多少个线程 一台java服务器能跑多少个线程 这个问题来自一次线上报警如下图 超过了我们的配置阈值 打出jstack文件 通过IBM Thread and Monitor Dump Analyzer for Java
  • SpringBoot中整合ElasticSearch快速入门以及踩坑记录

    场景 若依前后端分离版手把手教你本地搭建环境并运行项目 若依前后端分离版手把手教你本地搭建环境并运行项目 本地运行若依前后端分离 CSDN博客 参考上面搭建项目 ElaticSearch Elasticsearch 是java开发的 基于
  • Hutool改变我们的coding方式(二)

    Hutool改变我们的coding方式 Hutool 简介 Hutool如何改变我们的coding方式 文档 安装 Maven
  • 最新整理Java面试八股文,大厂必备神器

    在看这篇文章之前 我想我们需要先搞明白八股文是什么 明清科举考试的一种文体 也称制义 制艺 时文 八比文 八股文章就四书五经取题 内容必须用古人的语气 绝对不允许自由发挥 而句子的长短 字的繁简 声调高低等也都要相对成文 字数也有限制 八股
  • 计算机Java项目|基于SpringBoot个人空间平台的设计与实现

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • JCMsuite应用:光学环形谐振腔模拟

    本案程演示了环形谐振腔的模拟 这种类型的集成光子器件 例如用作升 降滤波器或在传感应用中 当物质或粒子附着在环上时 通过测量其共振频率的位移来检测 对于集成光子电路中的无源光器件 s矩阵通常是研究的热点 它描述了通过端口 波导进入设备的电磁
  • 【go语言】结构体数据填充生成md错误码文件

    这里使用pongo2这个模版引擎库进行md文件渲染 GitHub flosch pongo2 Django syntax like template engine for Go package main import fmt github
  • MongoDB - 整合 SpringBoot 操作全流程

    目录 一 MongoDB 整合 SpringBoot 1 1 引入依赖 1 2 配置文件 1 3 集合操作 1 4 相关注解 1 5 文档操作 1 5 1 查询 1 5 2 更新 1 5 3 删除 一 MongoDB 整合 SpringBo
  • 【心电图基线估计和去噪方法的群稀疏正则化】带有群稀疏正则化的心电图基线估计和去噪(Matlab实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 2024年华为OD机试真题-靠谱的车-Python-OD统一考试(C卷)

    题目描述 程序员小明打了一辆出租车去上班 出于职业敏感 他注意到这辆出租车的计费表有点问题 总是偏大 出租车司机解释说他不喜欢数字4 所以改装了计费表 任何数字位置遇到数字4就直接跳过 其余功能都正常 比如 1 23再多一块钱就变为25 2
  • 初学者如何快速入门Python(内附详细攻略),一文讲清

    目前python可以说是一门非常火爆的编程语言 应用范围也非常的广泛 工资也挺高 未来发展也极好 Python究竟应该怎么学呢 我自己最初也是从零基础开始学习Python的 给大家分享Python的学习思路和方法 一味的买书看书 看视频 是
  • 【C#】基础巩固

    最近写代码的时候各种灵感勃发 有了灵感 就该实现了 可是 实现起来有些不流畅 总是有这样 那样的卡壳 总结下来发现了几个问题 1 C 基础内容不是特别牢靠 理解的不到位 导致自己想出来了一些内容 但是无法使用正确的C 代码实现 导致灵感无法
  • 软件测试/测试开发|给你剖析闭包与装饰器的魔力

    测试管理班是专门面向测试与质量管理人员的一门课程 通过提升从业人员的团队管理 项目管理 绩效管理 沟通管理等方面的能力 使测试管理人员可以更好的带领团队 项目以及公司获得更快的成长 提供 1v1 私教指导 BAT 级别的测试管理大咖量身打造

随机推荐

  • 肖战

    肖战是中国内地男演员 歌手 主持人 毕业于中央戏剧学院表演系 他曾出演过多部影视剧 包括 花千骨 武媚娘传奇 和 长安十二时辰 此外 他还是一位多才多艺的歌手 曾发行过多张个人音乐专辑
  • 苹果开发平台常用网址链接

    苹果开发者中心 https developer apple com cn 苹果开发者中心 企业类型 https developer apple com cn programs enterprise 注册账号 https developer
  • react+antd实现Table拖拽调整列宽

    注意 列需要传入 width 并且配合下面的css样式才能显示拖拽手势 import React useEffect useState from react import Table from antd import Resizable f
  • PE半透明屏是怎么制造的?工艺、材料、应用

    PE半透明屏是一种新型的屏幕材料 具有半透明的特点 它由聚乙烯 PE 材料制成 具有良好的透明度和柔韧性 PE半透明屏广泛应用于建筑 广告 展览等领域 具有很高的市场潜力 PE半透明屏的特点之一是其半透明性 它可以在一定程度上透过光线 使得
  • 相关性分析热力图(Python&Matlab代码实现)

    目录 1 热力图 1 1 简介 1 2 语法 2 算例1 Python代码实现 2 1 算例 2 2 Python代码 2 3 运行结果 3 算例2 Python代码实现 4 算例3 Python代码实现 4 1 算例 4 2 Python
  • 小电容通高频大电容通低频的理解

    本文参考为什么电容通高频阻低频 记录下个人理解并总结 1 电容的作用是通高频阻低频 高频的时候电容总是还没充满电 负半周期便到来 所以电流始终存在 低频的时候信号交流电负半周还没到来 电容已充满电便发生断路 2 理论上电容越大 能通越高的高
  • 简单解释同步、异步、阻塞、非阻塞、中断、轮询、多线程,协程这几个概念(代码未验证,仅参考)

    科普 同步和异步的区别 同步和异步是指程序执行的方式 其中同步指程序按顺序执行 每个任务必须等待前面的任务执行完成后才能执行 而异步则指程序可以在执行一个任务时同时执行另一个任务 不需要等待前一个任务执行完毕 同步 Synchronous
  • supervisor源码分析

    Supervisor分析 1 运行原理概述 Supervisor生成主进程并将主进程变成守护进程 supervisor依次生成配置文件中的工作进程 然后依次监控工作进程的工作状态 并且主进程负责与supervisorctl客户端通信 实现主
  • c语言中求三个整数中的最大值和最小值,编程用指针实现输入三个整数,求其中的最大值...

    公告 为响应国家净网行动 部分内容已经删除 感谢读者理解 话题 编程用指针实现输入三个整数 求其中的最大值回答 include stdio h int getmax int p int n int i max p max p p 0 for
  • C++ 多线程 学习笔记

    线程睡眠很稳定 但无线程睡眠不稳定 线程调用类方法 有参数时调用方法 当参数为引用时 detach分离线程 分离线程与主线程同时进行 join会使主线程挂起 执行join进来的进程 detach必须让主线程在还住运行的情况下调用 换句话说就
  • harbor数据库迁移

    harbor数据库迁移 相同版本间迁移 一 数据导出 旧harbor机 1 进入数据库容器 root localhost docker exec u root it d53efe26b3da bin bash 2 导出registry数据库
  • KafkaConsumer-Kafka从入门到精通(十)

    上篇文章说了 消息压缩可以看分情况进行 判断下服务器cpu空闲还是io空闲较多 如果cpu空闲较多 则考虑消息积压 反之则不考虑 还有消费者组 consumer group 对于同一个group 只会发送一条消息进入一个实例 位移提交在0
  • php中mail,php中mail()函数和SMTP工作原理及实际

    php中mail 函数和SMTP工作原理及实际 发表于2019 05 24 12 36 次阅读 来源网络整理 作者session 摘要 php中mail 函数和SMTP工作原理及实际 php中mail 函数和SMTP工作原理及实际 一个发送
  • C++利用zxing识别二维码

    C 利用zxing识别二维码 下载编译 配置使用 Win10 x64 VS2015 VS2019 下载编译 1 下载zxing包 并解压 下载地址 https github com glassechidna zxing cpp build文
  • linux:TCP(传输控制协议)1、客户端和服务器连接并通信客户端,向服务器发送数据2、实现回传。服务器收到客户端的数据之后,将数据返传给客户端

    注意 服务器中的ip 192 168 31 122 和端口号port 6666 客户端中必须一致 编译 客户端 gcc tcp client c o client 服务器 gcc tcp server c o server 运行 客户端 c
  • GAN的图像修复:多样化补全

    点击上方 机器学习与生成对抗网络 关注 星标 获取有趣 好玩的前沿干货 2019 cvpr Pluralistic Image Completion https arxiv xilesou top pdf 1903 04227 pdf ht
  • 使用IO流对文件进行读取功能

    对于文件的读取可以用字符流也可以用字节流 下面整理了一份利用字节读流对本地文件进行读取 1 实现思路 第一步 选择文件 实例化一个文件File 在File的构造里放上你要读取的文件路径 文件路径的斜杠需要用转义符进行处理 如果文件在项目的根
  • 为什么 Java 中只有值传递?

    开始之前 我们先来搞懂下面这两个概念 形参 实参 值传递 引用传递 形参 实参 方法的定义可能会用到 参数 有参的方法 参数在程序语言中分为 实参 实际参数 用于传递给函数 方法的参数 必须有确定的值 形参 形式参数 用于定义函数 方法 接
  • 管理conda environments

    欢迎关注 生信修炼手册 environments作为conda的核心组件 用于封装相互独立的软件环境 通过在不同的environment中安装packages 来实现不同软件的相互独立 通过在不同的environments之间进行切换 从而
  • C语言 实现学生管理系统(手把手教学)

    学生管理系统怎么实现 首先要对问题能分析出框架来 这样在之后书写功能时就会对所需要的东西有一个清晰的认知 那么 管理系统的任务就是 能删除 查找和修改学生信息 能进行排序 能打印信息 这些都是最基本的功能 把这些功能框架写在一个c源文件里