c语言学生信息管理系统(基于文件、链表)

2024-08-28 23:18

本文主要是介绍c语言学生信息管理系统(基于文件、链表),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/**************************************************************
要求:
1、管理学生的信息,包括,学号,姓名,各科成绩
2、将信息保存成文件,能反复使用
3、对信息操作,包括,添加学生信息,修改,删除,按学号、姓名查询学生信息
4、能进行科目成绩排序,科目分数段查询附data文件实例:
001  小黑  语文  60.00  英语  70.00  数学  90.00
002  小天  语文  70.00  英语  90.00  数学  80.00
003  小芳  语文  80.00  英语  80.00  数学  70.00
004  小鱼  语文  90.00  英语  70.00  数学 100.00
***************************************************************/#include<stdio.h>
#include<stdlib.h>
#include<string.h>//链表结点结构体声明
typedef struct subjects
{char name[20];float score;
}sub;typedef struct student
{int num;char name[20];sub  subject[3];struct student* next;
}stu,*pstu;#define SIZE sizeof(stu)//函数申明
pstu LoadInfo();
void PrintMenu();
pstu AddStu(pstu );
pstu DeleStu(pstu );
pstu RwrStu(pstu );
void FindStu(pstu , char );
void Count(pstu ,char * ,float ,float );
void Rank(pstu ,char * );
void SaveQuit(pstu );//主函数
int main()
{ float score1,score2;char n,j;char subname[20];pstu head,ptr;head = LoadInfo();ptr = head->next;//创建菜单,进入选择循环while(1){PrintMenu();printf("请输入您的选择编号:");scanf("%d",&n);getchar();   					//接收上次输入选择后的回车输入,不致影响下一次输入switch(n){case 1: {//信息管理system("cls");    			//清屏j=0;while(4!=j)		   	//循环进入子菜单选择{printf("欢迎进入信息管理版块!\n\n");printf("\025 1、添加学生\n");printf("\025 2、删除学生\n");printf("\025 3、修改学生信息\n");printf("\025 4、返回\n");printf("请输入您的选择编号:\n");scanf("%d",&j);getchar();if     ( 1 == j) head = AddStu(head);		//添加学生else if( 2 == j) head = DeleStu(head);		//删除学生else if( 3 == j) head = RwrStu(head);		//修改重写学生信息else if( 4 == j) ;else printf("输入有误,请重新输入!\n");}printf("请输入回车键返回主菜单!");     //此处本意按任意键返回,但是任意键的话,需要按键A,再按回车确定getchar();			//则会连续收到两个按键,造成错误读入,可以改进scanf接收字符串,system("cls");			//以下所有getchar()、system("cls")同理break;}case 2:{//信息查询system("cls");printf("欢迎进入信息查询版块!\n");printf("请输入要查询的学生编号:");scanf("%d",&j);getchar();//printf("%d\n",j);   		//检测输入是否成功,调试程序用FindStu(head,j);    		//查询并输出printf("\n请输入回车键返回主菜单!");getchar();system("cls");break;}case 3:{//成绩统计system("cls");printf("欢迎进入成绩统计版块!\n");printf("请输入科目:");scanf("%s",&subname);getchar();printf("请输入分数范围(score1,score2):");scanf("%f,%f",&score1,&score2);getchar();/*printf("%s %5.2f %5.2f\n",subname,score1,score2);   */          //检测输入是否成功,调试程序用Count(head,subname,score1,score2);   	   //统计并输出printf("请输入回车键返回主菜单!");getchar();system("cls");break;}case 4:{//成绩排序system("cls");printf("欢迎进入成绩排序版块,请输入科目:");scanf("%s",&subname);getchar();Rank(head,subname);  			//排序并输出printf("\n请输入回车键返回主菜单!\n");getchar();system("cls");break;}case 5:{//保存退出SaveQuit(head);				//文件操作,保存并退出free(head);return 0;}default: {printf("输入有误,按回车键重新选择!\n");	//主菜单错误输出检测getchar();system("cls");}}}}//加载data数据 ,文件操作
pstu LoadInfo()
{int   num;char name[20];char sub1[20];char sub2[20];char sub3[20];float score1;float score2;float score3;char filename[] = "D:\\编程学习\\编程实践\\c语言课程设计1 学生信息管理\\data.txt";  //文件名,此处为简化编程,采用固定地址名称,未作输入FILE *fp; pstu head,ptr;//创建带表头结点的空单链表head,用来存放载入信息head = (pstu)malloc(SIZE);ptr = head;ptr->next = NULL;//加载data文件,存入head链表if( NULL == (fp = fopen(filename,"r")) ) 			//判断文件是否存在及可读{ printf("error!"); exit(0); } while (!feof(fp)) { fscanf(fp,"%d %s %s %f %s %f %s %f\n",&num,&name,&sub1,&score1,&sub2,&score2,&sub3,&score3); //读取一行,采用格式化读取,避免了其他各种读取方法的数据处理问题//该方法缺点明显,对数据格式要求教研,故data文件规定数据格式ptr->next = (pstu)malloc(SIZE);ptr = ptr->next;ptr->next = NULL;ptr->num = num;strcpy(ptr->name,name);strcpy(ptr->subject[0].name,sub1);ptr->subject[0].score = score1;strcpy(ptr->subject[1].name,sub2);ptr->subject[1].score = score2;strcpy(ptr->subject[2].name,sub3);ptr->subject[2].score = score3;} fclose(fp);                     					//关闭文件,已得到保存data信息的链表headreturn head;
}//打印主菜单
void PrintMenu()    
{printf("***************************************\n");printf("           枫枫学生信息管理系统        \n");printf("***************************************\n");putchar('\n');printf("菜单\n");printf("\025 1、信息管理\n");printf("\025 2、信息查询\n");printf("\025 3、成绩统计\n");printf("\025 4、成绩排序\n");	printf("\025 5、保存退出\n");
}//添加学生
pstu AddStu(pstu x)  
{char namestu[20];char *p;char subname1[20],subname2[20],subname3[20];pstu head,ptr;head = x;ptr = head;while( NULL != ptr->next )					//遍历链表,找到链尾结点{ptr = ptr->next;}ptr->next = (pstu)malloc(SIZE);				//默认在链表末追加添加信息ptr = ptr->next;ptr->next = NULL;printf("请输入添加学生的信息:\n");printf("请输入添加学生的学号:");scanf("%d",&ptr->num);getchar();printf("请输入添加学生的姓名:");scanf("%s",namestu);getchar();p = namestu;strcpy(ptr->name,p);printf("请输入添加学生的科目1名称:");scanf("%s",&subname1);getchar();p = subname1;strcpy(ptr->subject[0].name,p);printf("请输入添加学生的科目1成绩:");scanf("%f",&ptr->subject[0].score);getchar();printf("请输入添加学生的科目2名称:");scanf("%s",&subname2);getchar();p = subname2;strcpy(ptr->subject[1].name,p);printf("请输入添加学生的科目2成绩:");scanf("%f",&ptr->subject[1].score);getchar();printf("请输入添加学生的科目3名称:");scanf("%s",&subname3);getchar();p = subname3;strcpy(ptr->subject[2].name,p);printf("请输入添加学生的科目3成绩:");scanf("%f",&ptr->subject[2].score);getchar();putchar('\n');return head;
}//删除学生
pstu DeleStu(pstu x)   
{int num;pstu head,ptr,qtr;head = x;ptr = head->next;qtr = head;printf("请输入要删除的学生的学号:");scanf("%d",&num);getchar();while(ptr!=NULL){if( ptr->num != num)				//遍历查找链表结点,未找到跳过该结点{ptr = ptr->next;qtr = qtr->next;}else						//找到则删除结点{ptr = ptr->next;qtr->next = ptr;break;}}printf("该学生信息已删除!\n\n");return head;
}//修改学生信息
pstu RwrStu(pstu x)   
{char namestu[20];char *p;char subname1[20],subname2[20],subname3[20];int num;pstu head,ptr;head = x;ptr = head->next;printf("请输入要修改的学生的学号:");scanf("%d",&num);getchar();while(ptr!=NULL){if( ptr->num == num ){printf("已找到该学生信息,请填入修改项目:");printf("请输入修改学生的姓名:");scanf("%s",namestu);getchar();p = namestu;strcpy(ptr->name,p);printf("请输入修改学生的科目1名称:");scanf("%s",subname1);getchar();p = subname1;strcpy(ptr->subject[0].name,p);printf("请输入修改学生的科目1成绩:");scanf("%f",&ptr->subject[0].score);getchar();printf("请输入修改学生的科目2名称:");scanf("%s",subname2);getchar();p = subname2;strcpy(ptr->subject[1].name,p);printf("请输入修改学生的科目2成绩:");scanf("%f",&ptr->subject[1].score);getchar();printf("请输入修改学生的科目3名称:");scanf("%s",subname3);getchar();p = subname3;strcpy(ptr->subject[2].name,p);printf("请输入修改学生的科目3成绩:");scanf("%f",&ptr->subject[2].score);getchar();printf("该学生信息已修改!\n\n");break;}else{ptr = ptr->next;}}return head;
}//查找学生,参数为链表指针,和学生学号
//不好,应该将学号输入放进子函数,简化主函数结构,减少子函数参数
void FindStu(pstu x,char y)    
{pstu head,ptr;head = x;ptr = head->next;while( ptr != NULL){if( ptr->num == (int)y)		//因主函数中为节省空间,学号输入采用char数据,故强行准换{printf("已找到该学生信息!\n如下:");printf("%03d  %s  %s  %5.2f  %s  %5.2f  %s  %5.2f\n",ptr->num,ptr->name,ptr->subject[0].name,ptr->subject[0].score,ptr->subject[1].name,ptr->subject[1].score,ptr->subject[2].name,ptr->subject[2].score);			break;			//注意此处找到并输出信息后要手动退出循环}else{ptr = ptr->next;}}if( ptr == NULL )				//查询成功检测,while循环中若找到,则ptr停留在当前学生的结点上{printf("未能找到该学生信息!\n");}
}//统计科目分数区间段的学生,参数为链表指针,科目名称,分数区间上下限
//同理,参数的录入应放入子函数,简化结构和编程
void Count(pstu x,char *y,float q,float p)    
{pstu head,ptr;char name[20];char flag=0;       			//手动设置的查找结果flaghead = x;ptr = head->next;strcpy(name,y);//printf("%s %5.2f %5.2f\n",name,q,p); 	//检测输入参数的传递,调试程序用while( ptr != NULL)			//开始查找统计,科目查找用strcmp函数比较科目字符串,返回值0为字符串相等{															//此处while循环体中,重复的查找步骤太多,应设置科目匹配flag,参照rank()函数if( strcmp(name,ptr->subject[0].name) == 0 )	 //通过flag将科目确认放在while之外,循环体内只做分数区间的扫描和输出{if( q <= ptr->subject[0].score && ptr->subject[0].score<= p ){printf("%03d  %s  %s  %5.2f\n",ptr->num,ptr->name,ptr->subject[0].name,ptr->subject[0].score);flag++;}}if( strcmp(name,ptr->subject[1].name) == 0 ){if( q <= ptr->subject[1].score && ptr->subject[1].score<= p ){printf("%03d  %s  %s  %5.2f\n",ptr->num,ptr->name,ptr->subject[1].name,ptr->subject[1].score);flag++;}}if( strcmp(name,ptr->subject[2].name) == 0 ){if( q <= ptr->subject[2].score && ptr->subject[2].score<= p ){printf("%03d  %s  %s  %5.2f\n",ptr->num,ptr->name,ptr->subject[2].name,ptr->subject[2].score);flag++;}}ptr = ptr->next;}if(flag==0){printf("未能找到该课程该区间分数段的学生!\n");}
}//学科成绩排名,采用交换数据的方法,参数为链表指针,科目名称
//同理参数问题
//链表排序问题,此处用交换结点数据方法,还有其他多种排序方法
//如,交换结点,辅助指针数组排序(未实现,过程繁杂),插入法排序等
void Rank(pstu x,char *y)     
{pstu head,ptr,qtr;char name[20];char len=0;char flag=0;    				//简化算法,设置科目查找结果判断值,flag=0表示科目输入为未知科目,不存在int i=0;													//i、j循环次数控制参数int j=0;  char temp_name[20];			//数据交换时的暂存信息变量float temp0,temp1,temp2;int temp_num;strcpy(name,y);head = x;ptr = head->next;while( ptr != NULL)   			//测链表长度,不包括表头结点{ptr = ptr->next;len++;}ptr = head->next;  			//指针ptr用过之后记得回原位//开始查找科目if( strcmp(name,ptr->subject[0].name) == 0)	flag=1; if( strcmp(name,ptr->subject[1].name) == 0)	flag=2;if( strcmp(name,ptr->subject[2].name) == 0)	flag=3;if( flag == 0){printf("未找到该科目!");return;}//开始排序,冒泡法比较各结点数据//此处3个并列的if用switch case更清晰结构if( n == 1 ){for( i=0;i<len;i++){ptr = head->next->next;	//每一次内循环之后,ptr、qtr必然在最后两个节点上qtr = head->next;		//故在进行内循环之前,要重新复位ptr、qtrfor( j=0;j<len-i-1;j++){if( qtr->subject[0].score < ptr->subject[0].score ){temp_num = qtr->num;	//交换数据,因数据格式(科目顺序)明确规定,故不再做科目名称的替换strcpy(temp_name,qtr->name);temp0 = qtr->subject[0].score;temp1 = qtr->subject[1].score;temp2 = qtr->subject[2].score;qtr->num = ptr->num;strcpy(qtr->name,ptr->name);qtr->subject[0].score = ptr->subject[0].score;qtr->subject[1].score = ptr->subject[1].score;qtr->subject[2].score = ptr->subject[2].score;ptr->num = temp_num;strcpy(ptr->name,temp_name);ptr->subject[0].score = temp0;ptr->subject[1].score = temp1;ptr->subject[2].score = temp2;}qtr = qtr->next;ptr = ptr->next;}}}if( n == 2 ){for( i=0;i<len;i++){ptr = head->next->next;qtr = head->next;for( j=0;j<len-i-1;j++){if( qtr->subject[1].score < ptr->subject[1].score ){temp_num = qtr->num;strcpy(temp_name,qtr->name);temp0 = qtr->subject[0].score;temp1 = qtr->subject[1].score;temp2 = qtr->subject[2].score;qtr->num = ptr->num;strcpy(qtr->name,ptr->name);qtr->subject[0].score = ptr->subject[0].score;qtr->subject[1].score = ptr->subject[1].score;qtr->subject[2].score = ptr->subject[2].score;ptr->num = temp_num;strcpy(ptr->name,temp_name);ptr->subject[0].score = temp0;ptr->subject[1].score = temp1;ptr->subject[2].score = temp2;}qtr = qtr->next;ptr = ptr->next;}}}if( n == 3 ){for( i=0;i<len;i++){ptr = head->next->next;qtr = head->next;for( j=0;j<len-i-1;j++){if( qtr->subject[2].score < ptr->subject[2].score ){temp_num = qtr->num;strcpy(temp_name,qtr->name);temp0 = qtr->subject[0].score;temp1 = qtr->subject[1].score;temp2 = qtr->subject[2].score;qtr->num = ptr->num;strcpy(qtr->name,ptr->name);qtr->subject[0].score = ptr->subject[0].score;qtr->subject[1].score = ptr->subject[1].score;qtr->subject[2].score = ptr->subject[2].score;ptr->num = temp_num;strcpy(ptr->name,temp_name);ptr->subject[0].score = temp0;ptr->subject[1].score = temp1;ptr->subject[2].score = temp2;}qtr = qtr->next;ptr = ptr->next;}}}//输出排序过后的链表ptr = head->next;while( ptr != NULL ){printf("%03d  %s  %s  %5.2f  %s  %5.2f  %s  %5.2f\n",ptr->num,ptr->name,ptr->subject[0].name,ptr->subject[0].score,ptr->subject[1].name,ptr->subject[1].score,ptr->subject[2].name,ptr->subject[2].score);ptr = ptr->next;}
}//保存文件并退出,文件操作
void SaveQuit(pstu x)    
{pstu head,ptr;FILE *fp;char filename[] = "D:\\编程学习\\编程实践\\c语言课程设计1 学生信息管理\\data.txt";head = x;ptr = head->next;if( NULL == (fp = fopen(filename,"w")) ) 			//判断文件是否存在及可读{ printf("error!"); exit(0); } while(ptr != NULL)						//遍历链表结点,按data约定格式输出数据{fprintf(fp,"%03d  %s  %s  %5.2f  %s  %5.2f  %s  %5.2f\r",ptr->num,ptr->name,ptr->subject[0].name,ptr->subject[0].score,
			ptr->subject[1].name,ptr->subject[1].score,ptr->subject[2].name,ptr->subject[2].score);ptr = ptr->next;} fclose(fp);    
}

 

小结:

断断续续快700行终于完成了,其实编码部分对新手而言不算慢,但是调试修改过程及其烦乱漫长,不过毕竟算是大一大二的内容,现在做有点不知道说啥了都。各模块的任务结构比较简单,也觉得本来应该是个很简单的系统,但是在编码过程中,遇到了很多问题,问题主要包括两类,一、思路不清晰,眼光不够高屋建瓴,原因是经验不够丰富。二、函数实现不够熟悉,很多时候在绕弯路,也有很多时候函数使用出错,语法理解不深。现从各小节细点逐步分析。


1、
typedef struct subjects
{
char name[20];
float score;
}sub;
typedef struct student
{
int num;
char name[20];
sub  subject[3];
struct student* next;
}stu,*pstu;
该格式的声明定义结构体是通过网络学到的,确实很好用,也算书本的实践运用

2、整个系统的主要流程:
start -> 文件操作:读取data - 新建linkedlist保存数据 -> 菜单循环,进入子模块
-> 信息处理:添删改,因为是对数据的物理操作,子函数有返回值,返回处理后的链表
-> 信息检索:查找、排序等,不改变源数据,故子函数void
-> 保存退出:文件操作

此处重大失策是各子函数的参数较多,因为我选择了在主函数中读入参数数据,再传入子函数,造成主函数臃肿繁琐,而且子函数参数增多,传递关系复杂,这一点真的是经验不足,应该让主函数尽可能简单,所以实现放入子函数中。

3、调试经验匮乏,遇到bug之后的排查能力弱,是效率低下的主要原因,虽然采用笨办法,在程序各执行各阶段插入调试检测步骤,但是不能根源上发现bug原因。
还有就是网络学习的重要性,一个是搜索,函数用法、实例,学习变为己用。二是具体问题的论坛讨论。

4、输入输出检测,因为缓冲的存在,造成不能精确读入。目前的理解是,输入时,完成预定输入后,需要追加输入一个回车,将之前放在输入缓冲中的数据输入到内存,同时计算机也会多记录那一次回车的输入,故采用每次scanf接收输入之后,用getchar接收屏蔽掉后缀的回车键。实例:谭浩强《c程序设计》p338例10.3。

5、为简化编程,系统排错能力较弱,只考虑模拟了主要可能发生情况

6、数组名即首元素地址。故 char p[20]; scanf("%s",&p); 此处 &p = p = &p[0],可不写&符。

7、经验:在大量编码中,遇到问题,重新建立一个工程,设置简单情景,只单独验证这一个问题,不然在大背景下很难排查问题。

8、文件读取问题,fopen参数的理解,feof在读取中的机制,尚未透彻理解,二进制文件与文本文件的差别至今不详。
数据读取的做法:
法一:(最初设想)按行读取fgets保存到str,(fgets的机制,按行读取,读到换行或EOF结束,做键盘输入读取时同gets用法,但是比gets安全,因为fgets指定长度,不像gets会溢出),再通过strtok函数分割str成各个子串数据,再将字串通过atoi、atof等转换成需要的类型,过程何其麻烦,而且strtok机制颇为诡异。最终整体调试阶段出现了问题,放弃,换方法删改。
法二:想到用fgetc一个一个接收字符,在处理,觉得工程量太繁杂,放弃。
法三:反复看书,找到了fscanf函数,问题迎刃而解,只怪之前看书不仔细,这里磨蹭这么久。

9、char a[20]; char b[20] = "xxxxxxx";   a = b错误,不能直接赋值,a、b此时都表示地址,应用字符串函数strcpy(a,b);    程序中void AddStu() 、void RwrStu两个子函数中有大量该库函数的繁琐用法如:
char *p;char a[20]; char b[20] = "xxxxxxx";  p = b; strcpy(a,p);

10、程序中辅助指针的位置每次用完之后都回到链表首位,不至于游离,再次使用的时候也清晰。但程序中内存的管理较差,malloc之后的要free释放,链表的删除应该是对每一个节点的free,而不只是头指针head,且free内存之后,注意当前定义过得指针出现野指针的情况。

11、程序中使用一些flag标志,能减少代码量,简化重复的算法。

12、字符串相等判断函数strcmp()的使用,如char a[20] = "1"; char b[30] = "1" ; strcmp(a,b)结果为0表示字符串相等,可见strcmp对比的是两个字符串中strlen范围内的字符,而与存储空间长度sizeof无关。
有趣的实验:char str[20] = "1\0abc";char stb[30] = "1";
printf("%d %d %d %d %d\n",sizeof(str),sizeof(stb),strlen(str),strlen(stb),strcmp(str,stb));
结果为:20 30 1 1 0  即strcmp比较时,对比各字符串,检测到字符串结束标志\0就不管后面的内容了。

13、链表排序问题,此处也花费我大量时间。
法一:(原先预想) 对比每个链表结点,然后交换两个结点位置,以冒泡法排序,这是最直观的方法,做了设想,并没有去编码,觉得有些复杂,因为要交换两个结点至少要4个指针。a、b交换,同时还要用到a的前一个结点,和b的下一个结点即b->next指针。于是就没有急于编码,而是上网求比较精妙的思想。
法二:(未能完成)在贴吧,我看到了另一种思维,将每一个结点的地址保存到一个指针数组中,通过该数组元素对应的结点数据对比,排列该数组,最后按照该数组,重新链接链表,实现了以空间换时间的的思想。其实仔细想想没有多简化算法,也没有多省事。按此方法编码,最终因为指针应用问题出现错误,论坛讨论说到这样排序链表尾结点会随机出现在某一个指针数组元素中,所以按数组重新链接链表的时候会中间就NULL中断,就会出现访问NULL->next这样的情况,会出现错误。我同意,但是没有去实验,就放弃,转而其他思路了。
法三:(最终方案)我采取了和交换结点异曲同工的方法,交换结点数据,因为结点元素少的情况下,交换结点元素内容要比交换结点简单,但是元素多的情况下不如法一,实现代码会比法一多,但是思维简单,不牵扯到链表的换位。
法四:(其他方案)以上方案都是基于冒泡法,所以效率较低,思路简单。其他方法还有选择排序,插入排序。

14、文件写入,根据fscanf要求相应用fprintf写入。

好吧, 这个总结真啰嗦,但愿一直有这精力。
加油,数据结构与算法。

 

这篇关于c语言学生信息管理系统(基于文件、链表)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1116166

相关文章

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

C语言中的浮点数存储详解

《C语言中的浮点数存储详解》:本文主要介绍C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、首先明确一个概念2、接下来,讲解C语言中浮点型数存储的规则2.1、可以将上述公式分为两部分来看2.2、问:十进制小数0.5该如何存储?2.3 浮点

基于Python实现多语言朗读与单词选择测验

《基于Python实现多语言朗读与单词选择测验》在数字化教育日益普及的今天,开发一款能够支持多语言朗读和单词选择测验的程序,对于语言学习者来说无疑是一个巨大的福音,下面我们就来用Python实现一个这... 目录一、项目概述二、环境准备三、实现朗读功能四、实现单词选择测验五、创建图形用户界面六、运行程序七、

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定