Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C语言开发简单的学生成绩管理系统(附源码)

C语言开发简单的学生成绩管理系统(附源码)

作者头像
全栈程序员站长
发布于 2022-08-28 03:46:30
发布于 2022-08-28 03:46:30
1.3K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

学生成绩管理系统

开发语言:C语言
开发工具:Visual Studio 2019
开发时间:2019.4.14
开发者:summer

@一、系统使用展示

@二、系统功能

@三、菜单

@四、录入学生信息

@五、打印学生信息

@六、保存学生信息

@七、读取学生信息

@八、统计所有学生人数

@九、查找学生信息

@十、修改学生信息

@十一、删除学生信息

@十二、退出系统

@十三、出错

一、系统使用展示

二、系统功能

  1. 系统功能介绍
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1.录入学生信息:用户可以自由输入学生信息到系统中。
2.打印学生信息:格式化展示系统中的学生信息。
3.保存学生信息:将系统中的学生信息保存到本地文档。
4.读取学生信息:读取本地文档中的学生信息并显示。
5.统计所有学生人数
6.查找学生信息:根据用户给定的信息(学号)在系统中查找该学生的信息
7.修改学生信息
8.删除学生信息
0.退出系统
  1. 系统main函数,while循环在外,系统程序能够持续运行,switch判断语句进行功能选择与函数切换。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main() {
	while (1)
	{
		//打印菜单
		Menu();
		//读取一个字符 整数,字符在内存中映射为ASCII码
		char ch = _getch();

		switch (ch)
		{
		case '1'://1.录入学生信息
			InputStudent();
			break;
		case '2'://2.打印学生信息
			PrintStudent();
			break;
		case '3'://3.保存学生信息
			SaveStudent();
			break;
		case '4'://4.读取学生信息
			ReadStudent();
			break;
		case '5'://5.统计所有学生人数
			CountStudent();
			break;
		case '6'://6.查找学生信息
			FindStudent();
			break;
		case '7'://7.修改学生信息
			ChangeStudent();
			break;
		case '8'://8.删除学生信息
			DeleteStudent();
			break;
		case '0'://0.退出系统
			return 0;
			break;
		default:
			printf("输入有误,没有该功能\n\n");
			system("pause");  //暂停
			system("cls");    //清屏
			break;
		}
	}

	return 0;
}

三、菜单

  1. 菜单显示
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//菜单
void Menu() {
	printf("*************************************************\n");
	printf("*\t欢迎使用高校学生成绩管理系统V1.0\t*\n");
	printf("*\t\t请选择功能\t\t\t*\n");
	printf("*************************************************\n");
	printf("*\t\t1.录入学生信息\t\t\t*\n");
	printf("*\t\t2.打印学生信息\t\t\t*\n");
	printf("*\t\t3.保存学生信息\t\t\t*\n");
	printf("*\t\t4.读取学生信息\t\t\t*\n");
	printf("*\t\t5.统计所有学生人数\t\t*\n");
	printf("*\t\t6.查找学生信息\t\t\t*\n");
	printf("*\t\t7.修改学生信息\t\t\t*\n");
	printf("*\t\t8.删除学生信息\t\t\t*\n");
	printf("*\t\t0.退出系统\t\t\t*\n");
	printf("*************************************************\n");
}
  1. 打印菜单

scanf()、getchar()输入后均需要按enter,而getch()不用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	//打印菜单
	Menu();
	//读取一个字符 整数,字符在内存中映射为ASCII码
	char ch = _getch();

四、录入学生信息

  1. 定义学生结构体、链表节点结构体
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//定义一个学生
typedef struct tagStudent {
	char szName[20];	//姓名
	char szSex[4];		//性别
	int  nAge;			//年龄
	int  nStuNo;		//学号
	int  nScore;		//成绩
}Student;

//链表
//节点
typedef struct tagNode
{
	Student stu;			//学生信息
	struct tagNode* pNext;	//指向下一个节点
}Node;

//创建头节点
Node* g_pHead = NULL;		//指向头节点
  1. 利用学生结构体,以及链表操作输入学生信息
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//1.录入学生信息
void InputStudent() {
	//创建一个人,在堆中分配内存
	Node* pNewNode = (Node*)malloc(sizeof(Node));
	//指针下一个指向空
	pNewNode->pNext = NULL;

	//查找链表的尾结点
	Node* p = g_pHead;
	while (g_pHead != NULL && p->pNext != NULL)
	{
		p = p->pNext;
	}

	//把节点插到链表的尾节点
	if (g_pHead == NULL) {
		g_pHead = pNewNode;
	}
	else {
		p->pNext = pNewNode;
	}

	//录入学生信息
	printf("请输入学生姓名:\n");
	scanf_s("%s", pNewNode->stu.szName, sizeof(pNewNode->stu.szName));
	printf("请输入性别:\n");
	scanf_s("%s", pNewNode->stu.szSex, sizeof(pNewNode->stu.szSex));
	printf("请输入学生年龄:\n");
	scanf_s("%d", &pNewNode->stu.nAge);
	printf("请输入学号:\n");
	scanf_s("%d", &pNewNode->stu.nStuNo);
	printf("请输入成绩:\n");
	scanf_s("%d", &pNewNode->stu.nScore);

	printf("学生信息录入成功。\n\n");
	system("pause");
	system("cls");
}

五、打印学生信息

  1. 读取链表结构,输出学生信息。先进行判空处理,如果无学生信息则输出提示信息,反之则正确输出学生信息。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//2.打印学生信息
void PrintStudent() {

	system("cls");
	//遍历链表
	Node* p = g_pHead;
	if (p == NULL) {
		printf("系统中暂无学生信息,请录入后再来打印查看。\n\n");
	}
	else {
		printf("*********************************************************************************\n");
		printf("*\t\t\t欢迎使用高校学生成绩管理系统V1.0\t\t\t*\n");
		printf("*********************************************************************************\n");
		printf("*\t学号\t*\t姓名\t*\t性别\t*\t年龄\t*\t成绩\t*\n");
		printf("*********************************************************************************\n");

		while (p != NULL)
		{
			printf("*\t%d\t*\t%s\t*\t%s\t*\t%d\t*\t%d\t*\n",
				p->stu.nStuNo,
				p->stu.szName,
				p->stu.szSex,
				p->stu.nAge,
				p->stu.nScore
			);

			//下一个节点
			p = p->pNext;
			printf("*********************************************************************************\n");
		}
	}

	system("pause");
	system("cls");
}

六、保存学生信息

  1. 利用文件对学生信息进行存储
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//3.保存学生信息
void SaveStudent() {
	//打开文件
	FILE* pFile;
	pFile = fopen(".\\stuinfo.dat", "w");
	
	if (pFile == NULL) {
		printf("打开文件失败。\n");
		return;
	}

	//写入数据
	Node* p = g_pHead;
	while (p != NULL)
	{
		fwrite(&p->stu, sizeof(Node), 1, pFile);
		p = p->pNext;
	}

	//关闭文件
	fclose(pFile);

	printf("数据保存成功。\n");
	system("pause");
	system("cls");
}
  1. fopen在vs中会报错,解决方式

(1)按照vs的提示,将fopen换成fopen_s

(2)不修改函数,仅仅修改项目的属性。因为fopen_s是一种Microsoft的函数,若纯做Windows开发则直接改为_s也无妨,但是我们尽量还是用标准C++比较好,这样代码有较好的移植性。

具体操作:

右键工程名–>属性–>C/C++–>预处理器–>预处理器定义,编辑右边输入框加入: _CRT_SECURE_NO_WARNINGS

保存(注意用分号隔开)。

七、读取学生信息

  1. 打开存储学生信息的文本,单个单词读取,判断非分隔符或者空时则赋值给链表中的节点,读取完毕后,直接调用PrintStudent()函数进行打印结果。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//4.读取学生信息
void ReadStudent() {
	system("cls");

	//打开文件
	FILE* pFile;
	pFile = fopen(".\\stuinfo.dat", "r");

	if (pFile == NULL) {
		printf("打开文件失败。\n");
		return;
	}
	
	//创建一个人,在堆中分配内存
	Node* p = (Node*)malloc(sizeof(Node));
	p->pNext = NULL;
	//重新建立链表
	g_pHead = p;

	//逐个单词读入文本内容
	char str[200];
	int i = 0;
	while (fscanf(pFile, "%s", str) != EOF) {  //读文件 
		//单词不是*或者空时,进行赋值
		if (strcmp(str, "*") && str != NULL) {
			switch (i)
			{
			case 0:
				p->stu.nStuNo = atoi(str);
				break;
			case 1:
				strcpy(p->stu.szName, str);
				break;
			case 2:
				strcpy(p->stu.szSex, str);
				break;
			case 3:
				p->stu.nAge = atoi(str);
				break;
			case 4:
				p->stu.nScore = atoi(str);
				break;
			default:
				Node* pNewNode = (Node*)malloc(sizeof(Node));
				pNewNode->pNext = NULL;
				p->pNext = pNewNode;
				p = pNewNode;
				p->stu.nStuNo = atoi(str);
				i = 0;
				break;
			}
			i++;
		}
	}
	//打印读取结果
	PrintStudent();
}
  1. 读取文本时,将内容全部赋值给char数组,所有赋值时需特殊处理。
  • char数组赋值给整数 在<stdlib.h>头文件中有两个函数,int atoi(char *p)和char *itoa(int p),分别将装有整数的char数组转化为整数,和将整数按位数分解依次存入char数组中。
  • char数组赋值给char数组 用strcpy函数! 原型声明:extern char *strcpy(char *dest,char *src); 头文件:string.h 功能:把src所指由NULL结束的字符串复制到dest所指的数组中。 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回指向dest的指针。 注:不能使用memcpy(a, b, strlen(b)),会导致中文乱码。

八、统计所有学生人数

  1. 设置计数器,遍历链表
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//5.统计所有学生人数
void CountStudent() {
	int countStu = 0;

	//遍历链表
	Node* p = g_pHead;
	while (p != NULL)
	{
		countStu++;
		p = p->pNext;
	}
	printf("学生总人数:%d\n\n", countStu);

	system("pause");
	system("cls");
}

九、查找学生信息

  1. 本次查找以学号为示例,改用姓名等信息查询流程基本一致。 遍历链表,如果有符合信息的学生则打印,反之则继续下一个节点,若系统中无该学生信息,给予用户无结果提示。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//6.查找学生信息
void FindStudent() {
	system("cls");
	//以学号为查找示例,其他信息查找流程基本相似
	int stuNum;
	printf("请输入查找学生学号:");
	scanf("%d", &stuNum);
	//遍历链表查找,查找到后进行信息显示
	Node* p = g_pHead;
	//对表头进行展示一次
	bool isShowHead = false;
	//记录是否有找到该学号的学生信息
	bool isFindStu = false;
	while (p != NULL)
	{
		if (stuNum == p->stu.nStuNo) {
			if (!isShowHead) {
				printf("*********************************************************************************\n");
				printf("*\t学号\t*\t姓名\t*\t性别\t*\t年龄\t*\t成绩\t*\n");
				printf("*********************************************************************************\n");
				isShowHead = true;
			}
			printf("*\t%d\t*\t%s\t*\t%s\t*\t%d\t*\t%d\t*\n",
				p->stu.nStuNo,
				p->stu.szName,
				p->stu.szSex,
				p->stu.nAge,
				p->stu.nScore
			);
			isFindStu = true;
			printf("*********************************************************************************\n");
		}
		p = p->pNext;
	}

	if (!isFindStu) {
		printf("学号输入有误,系统中暂无该学生信息。\n\n");
	}

	system("pause");
	system("cls");
}

十、修改学生信息

  1. 可参考查找学生信息代码段,在查找后进行修改即可
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//7.修改学生信息
void ChangeStudent() {
	//以学号为查找示例,其他信息查找流程基本相似
	int stuNum;
	printf("请输入欲修改学生的学号:");
	scanf("%d", &stuNum);
	//遍历链表查找,查找到后进行信息显示
	Node* p = g_pHead;
	//对表头进行展示一次
	bool isShowHead = false;
	//记录是否有找到该学号的学生信息
	bool isFindStu = false;
	while (p != NULL)
	{
		if (stuNum == p->stu.nStuNo) {
			if (!isShowHead) {
				printf("*********************************************************************************\n");
				printf("*\t学号\t*\t姓名\t*\t性别\t*\t年龄\t*\t成绩\t*\n");
				printf("*********************************************************************************\n");
				isShowHead = true;
			}
			printf("*\t%d\t*\t%s\t*\t%s\t*\t%d\t*\t%d\t*\n",
				p->stu.nStuNo,
				p->stu.szName,
				p->stu.szSex,
				p->stu.nAge,
				p->stu.nScore
			);
			//修改学生信息
			printf("请输入学生姓名:\n");
			scanf_s("%s", p->stu.szName, sizeof(p->stu.szName));
			printf("请输入性别:\n");
			scanf_s("%s", p->stu.szSex, sizeof(p->stu.szSex));
			printf("请输入学生年龄:\n");
			scanf_s("%d", &p->stu.nAge);
			printf("请输入学号:\n");
			scanf_s("%d", &p->stu.nStuNo);
			printf("请输入成绩:\n");
			scanf_s("%d", &p->stu.nScore);
			isFindStu = true;
			printf("*********************************************************************************\n");
			printf("学生信息修改成功,请注意及时保存。\n\n");
		}
		p = p->pNext;
	}

	if (!isFindStu) {
		printf("学号输入有误,系统中暂无该学生信息,无法进行修改。\n\n");
	}

	system("pause");
	system("cls");
}

十一、删除学生信息

  1. 仍然以查找学生信息操作为基础,以学号为线索,查找到则进行删除,未查找到则进行错误提示,删除时需要区分当前节点是头结点、尾节点或者中间节点,不同节点操作不同,同时该删除仅作用于本次操作,需保存学生信息才能长久生效。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//8.删除学生信息
void DeleteStudent() {
	system("cls");
	//以学号为查找示例,其他信息查找流程基本相似
	int stuNum;
	printf("请输入删除学生的学号:");
	scanf("%d", &stuNum);
	//遍历链表查找,查找到后进行信息显示
	Node* p = g_pHead;
	//记录前一个节点,删除时方便操作
	Node* beforeNode = g_pHead;

	//对表头进行展示一次
	bool isShowHead = false;
	//记录是否有找到该学号的学生信息
	bool isFindStu = false;
	while (p != NULL)
	{
		if (stuNum == p->stu.nStuNo) {
			if (!isShowHead) {
				printf("*********************************************************************************\n");
				printf("*\t学号\t*\t姓名\t*\t性别\t*\t年龄\t*\t成绩\t*\n");
				printf("*********************************************************************************\n");
				isShowHead = true;
			}
			printf("*\t%d\t*\t%s\t*\t%s\t*\t%d\t*\t%d\t*\n",
				p->stu.nStuNo,
				p->stu.szName,
				p->stu.szSex,
				p->stu.nAge,
				p->stu.nScore
			);
			isFindStu = true;
			printf("*********************************************************************************\n");

			//删除节点为头节点
			if (p == g_pHead) {
				g_pHead = p->pNext;
			}
			//删除节点为尾节点
			else if (p->pNext == NULL) {
				p = beforeNode;
				p->pNext = NULL;
			}
			//删除节点为中间节点
			else {
				beforeNode->pNext = p->pNext;
			}
			printf("删除成功,请记得保存。\n\n");
		}
		beforeNode = p;
		p = p->pNext;
	}

	if (!isFindStu) {
		printf("学号输入有误,系统中暂无该学生信息,无法进行删除操作。\n\n");
	}

	system("pause");
	system("cls");
}

十二、退出系统

直接在选择0时,设置return即可。

十三、出错

用户输入有误时,进行提示信息输出即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	printf("输入有误,没有该功能\n\n");
	system("pause");  //暂停
	system("cls");    //清屏

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/151542.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
《Effective Objective-C》干货三部曲(一):概念篇
本书是iOS程序员入门的必读书籍,它讲述了在iOS开发中(Objective-C语言)可以遵循的规范和一些开发技巧。
用户2932962
2018/08/30
9750
《Effective Objective-C》干货三部曲(一):概念篇
< Effective Objective-C>读书笔记
将引入头文件的时机尽量延后,只在确有需要时才引入,这样就可以减少类的使用者所需要引入的头文件的数量:
stringwu
2022/08/12
5130
《Effective Objective-C 》干货三部曲(三):技巧篇
继上一篇《Effective Objective-C 》超级干货三部曲(二):规范篇之后,本篇即是三部曲的第三篇:技巧篇。本篇作为三部曲的最终篇,归纳讲解的是本书中关于Objective-C开发的技巧性知识。
用户2932962
2018/08/30
7930
《Effective Objective-C 》干货三部曲(三):技巧篇
协议与分类--27:Class-continuation分类隐藏实现细节
xy_ss
2023/11/22
1670
iOS-代码规范
利用上周的业余时间把这篇规范整理了出来,我会将这篇规范作为我们iOS团队的代码规范,并且还会根据读者的反馈,项目的实践和研究的深入做不定时更新,还希望各位朋友看了多多指正和批评。
用户1740424
2018/07/23
2.3K0
iOS-代码规范
Objective-C Runtime 的一些基本使用
在上一篇文章《Objective-C Runtime详解》中我们探讨了Runtime的基本原理,这篇文章我们将总结一下Runtime的一些基本使用 目录 查询方法 给分类添加属性 更换代码的实现方法 动态添加方法 字典转属性 先创建两个类 ClassA.h #import <Foundation/Foundation.h> @interface ClassA : NSObject { // 公有变量 NSString *_publicVar1; NSString *_publ
BY
2018/05/11
1.2K0
面经之《招聘一个靠谱的iOS》import "CYLBlockExecutor.h"import "CYLBlockExecutor.h"import "CYLNSObject+RunAtDeallo
什么情况使用 weak 关键字,相比 assign 有什么不同? 什么情况使用 weak 关键字? 在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: de
rectinajh
2018/05/17
1.1K0
iOS中的Category
xy_ss
2023/11/22
2100
iOS中的Category
iOS_Effective Objective-C 20 编写高质量iOS与OS X代码的52个有效方法
三读Objective-C2.0 笔记~(作为一个OC开发者,必读之书) gitbook地址
mikimo
2022/07/20
1.2K0
iOS_Effective Objective-C 20 编写高质量iOS与OS X代码的52个有效方法
[Objective-C] KVC 和 KVO
KVC是一种用间接方式访问类的属性的机制。比如你要给一个类中的属性赋值或者取值,可以直接通过类和点运算符实现,当然也可以使用KVC。不过对于私有属性,点运算符就不起作用,因为私有属性不暴露给调用者,不过使用KVC却依然可以实现对私有属性的读写。
wOw
2018/09/18
7260
Objective-C Copy
前提是实现NSCopying协议的copyWithZone:方法,否则会导致出现找不到selector的崩溃。**unrecognized selector sent to instance**
Helloted
2022/06/07
5300
Objective-C Copy
objective-C中的序列化(serialize)与反序列化(deserialize)
obj-c中有一类对象:NSArray,NSDictionary,NSString,NSNumber,NSDate,NSData以及它们的可变版本(指NSMutableArray,NSMutableDictionary...这一类) ,都可以方便的将自身的数据以某种格式(比如xml格式)序列化后保存成本地文件。 示例代码:NSArrayTest.h #import <Foundation/Foundation.h> #define FILE_NAME @"/tmp/data.txt" @interface
菩提树下的杨过
2018/01/22
2K0
objective-C中的序列化(serialize)与反序列化(deserialize)
iOS - 代码Review (三)
一·实例变量的属性Setter&Getter 对象内部访问属性 @interface Test : NSObject @property (nonatomic, copy) NSString *firstName; @property (nonatomic, copy) NSString *lastName; @end @implementation Test - (NSString *)fullName { return [NSString stringWithFormat:@"%@ %@",
Wilbur-L
2021/10/29
4740
iOS中setter方法 、getter方法、点语法、@property
属性是OC的一项特性,用于封装对象中的数据 OC对象通常会把其所需要的数据保存为各种属性 属性通过存取方法来访问(setter、getter)
xy_ss
2023/11/22
3510
协议与分类--24:分类(Category)
Category也称为分类、类目、类别等,Category可以在不修改原来类的基础上,为这个类补充一些方法
xy_ss
2023/11/22
2320
工匠人iOS 代码规范
在多个不同的运算符同时存在的时候应该合理使用括号,不要盲目依赖操作符优先级。 因为有的时候不能保证阅读你代码的人就一定能了解你写的算式里面所有操作符的优先级。
用户3098942
2020/09/14
1.1K0
工匠人iOS 代码规范
关于Objective C编码规范,这些你一定要会
背景:这里有些关于编码风格Apple官方文档,如果有些东西没有提及,可以在以下文档来查找更多细节:
iOSSir
2019/06/14
4710
GB代码规范1.0
对于如果导入是UIKit类就使用UIKIT_EXTERN 如果是Founction使用关键词FOUNDATION_EXTERN
君赏
2018/08/31
1.3K0
oc深坑測试题及其答案[通俗易懂]
一、选择题(共80题,每题1分) 1、 不会立马使引用计数器改变的是: 答案:(C) A、release B、alloc C、autorelease D、retain 2、 在OC中类的接口声明keyword为: 答案:(B) A、@import B、@interface C、@implemention D、@protocol 3、 NSString *name = [[NSString alloc]initWithString:@”张三”];NSLog(@”%d”,[name retainCount]);上述代码打印结果是: 答案:(A) A、-1 B、0 C、1 D、2 4、 下列选项中所有属于对象的是: 答案:(C) A、我的白色iPhone4s;Mac Mini B、狗;老虎 C、邻居家的猫咪“贝贝”;我的弟弟“张三” D、保时捷;犀利哥 5、 NSDictionary *dict = [NSDictionary dictionaryWithObject:@”a value” forKey:@”aKey”];NSLog(@”%@”,[dict objectForKey:@”aKey”]);[dict release];控制台中打印的最后一条信息会是: 答案:(C) A、a value B、aKey : a value C、崩溃信息 D、a value : aKey 6、 现有例如以下集合,能准确删除“张三”的代码是:NSMutableDictionary * peoples=[NSMutableDictionary dictionaryWithObjectsAndKeys:@”张三”,@”左护法”,@”李四”,@”右使”,@”唐sir”,@”老大哥”, nil]; 答案:(A) A、[peoples removeObjectForKey:@”左护法”]; B、[peoples removeObject:@”张三”]; C、[peoples removeObjectAtIndex:0]; D、[peoples removeAllObjects]; 7、 关于类和对象的概念,下列属于对象的是: 答案:(C) A、奥迪A6 B、保龄球 C、世界冠军刘翔 D、西红柿 8、 下面说法不对的是: 答案:(A) A、nonatomic:提供多线程保护,提高性能,在没有使用多线程的编程中能够选择使用。 B、assign:属性默认值。说明设置器直接进行赋值。针对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char)等等。
全栈程序员站长
2022/07/07
4830
JSONModel源码解析 原
    做移动端开发,解析网络数据是必不可少的工作之一。iOS原生框架很早前就已经提供了将JSON数据直接映射成数组或者字典对象的方法,并且结合KVC,也可以将字典数据直接赋值给对象。但是这种方式十分不灵活,例如如果网络数据中的字段与我们数据模型中的字段不一致,某些网络数据的字段可能为nil等等都需要开发者单独的处理。使用JSOMModel可以十分方便的处理映射过程中的各种情况。
珲少
2018/08/15
1.4K0
JSONModel源码解析
                                                                            原
推荐阅读
相关推荐
《Effective Objective-C》干货三部曲(一):概念篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验