9.结构体+冒泡排序

【结构体】
		1.为什么需要结构体
			为了表示一些复杂的事物,而普通的基本类型无法满足实际要求
		2.什么叫结构体
			把一些基本数据类型组合在一起形成的一个新的复合数据类型叫做结构体
		3.如何定义结构体:
			有三种方式:
				第一种方式:   //这只是定义了一个新的数据类型,并没有定义变量
					struct Student 
		        {              
		        	int age;     
		        	float score; 
		        	char sex;    
		        };                        //最好也最常用的是第一种方式
		    第二种方式:
		    		struct Student2
		        {             
		         	int age;     
		         	float score; 
		         	char sex;    
		        } 	st2;            
		 	第三种方式:
		 			struct 
		        {               
		          	int age;      
		          	float score;  
		          	char sex;     
		        } 	st3;          
		4.如何使用结构体变量:
			赋值和初始化
				定义的同时可以整体赋初值
				如果定义完之后,则只能单个的赋初值
			----------------------------------------
			#include <stdio.h>
			struct Student 
		    {              
		        int age;     
		        float score; 
		        char sex;    
		   	};
		    int main(void)                         
			{                                      
				struct Student st = {80, 66.6, 'F'}; //初始化,定义的同时赋初值
				struct Student st2;
				st2.age = 10;
				st2.score = 99;       
				st2.sex = 'F';       //像这样,定义完之后,就只能单个的赋初值

				printf("%d %f %c\n",st.age,st.score,st.sex);
				printf("%d %f %c\n",st2.age,st2.score,st2.sex);
                                      
				return 0;                            
			}
			-------------------------------------------------------               	
		5.如何取出结构体变量中的每一个成员
			5.1 结构体变量名.成员名
			5.2 指针变量->成员名   这种方式更常用
					在计算机内部会被转化成 (*指针变量).变量名 的方式来执行

			-----------------------------------
			#include <stdio.h>
			struct Student            
		    {              									
		        int age;     								
		        float score;  《======= 定义的结构体部分  	
		        char sex;    								
		   	};			  //分号千万不能省			  
		    int main(void)                         
			{                                      
				struct Student st = {80, 66.6F, 'F'}; //初始化,定义的同时赋初值,st是结构体struct Student定义的变量
				struct Student *pst = &st; //&st不能改成st  
										//可以把 struct Student * 类似于是指针变量名左边的 int * 
				pst->age = 99; //指针的这种方式,也是第二种方式
				st.score = 66.6f; //直接赋值这种方式,是第一种方式  
								//66.6在c语言中默认是double,如果希望默认一个实数是float类型,则必须在末尾加f或者F
								//因此66.6是double,66.6f或66.6F是float类型

				printf("%d %f\n",st.age,pst->score);
				return 0;                            
			}
			解析:
				1.pst->age 在计算机内部会被转化成(*pst).age   这是一种硬性的规定
				2.pst->age 等价于 (*pst).age 也等价于 st.age
				3.所以pst->age = 99;就相当于 st.age = 99;
				4.pst->age 的含义:
						pas所指向的是struct Student结构体变量中的age这个成员

		6.结构体变量的运算
			结构体变量不能相加,不能相减,也不能相互乘除
			但结构体变量可以相互赋值:
			--------------------------
			struct Student st1,st2;
			st1 + st2   st1 * st2   st1 / st2 都是错误的
			st1 = st2 或者 st2 = st1 都是正确的
			---------------------------------------------------
		7.结构体变量和结构体变量指针作为函数参数传递的问题
					推荐使用结构体变量作为函数参数来传递
			-----------------------------------------------------
			通过函数完成对结构体变量的输入和输出:
			#include <stdio.h>
			#include <string.h>
			struct Student            
		    {              									
		        int age;     								
		        char sex;    	
		        char name[100];    								
		   	};			  //分号千万不能省
		   	void InputStudent(struct Student *);   //InputStudent函数的声明
		   	void OutputStudent(struct Student *);  //OutputStudent函数的声明
		    int main(void)                         
			{                                      
				struct Student st;    //第12行
				
				InputStudent(&st); //对结构体变量输入 必须发送st的地址
			//	printf("%d %c %s\n",st.age, st.sex, st.name);
				OutputStudent(&st);  //对结构体变量输出  可以发送st的弟子也可以直接发送st的内容
									//但为了减少内存的耗费,也为了提高执行速度,推荐发送地址
				return 0;                            
			}
			void InputStudent(struct Student *pstu)    //pstu只占4个字节
			{
				(*pstu).age = 10;
				pstu->sex = 'F';
				strcpy(pstu->name,"张三");   //或者可以写成 strcpy((*pstu).name ="张三");
			}
			void OutputStudent(struct Student *ss)
			{
				printf("%d %c %s\n",ss->age, ss->sex, ss->name);
			}


			/*本函数无法修改主函数第12行st的值,所以本函数是错误的
			void InputStudent(struct Student stu)
			{
				stu.age =10;
				strcpy(stu.name,"张三");  //不能写成stu.name = "张三",必须通过<string.h>的头文件来实现
				stu.sex = 'F';
			}
			*/

		8.举例:
				动态构造存放学生信息的结构体数组
					动态构造一个数组,存放学生的信息
					然后按分数排序输出
				------------------------------------------------------------------------
				#include <stdio.h>
				#include <malloc.h>
				struct Student
				{
				        int age;
				        float score;
				        char name[100];
				};
				int main(void)
				{
				        int len;
				        struct Student *prr;
				        int i,j;
				        struct Student t;

				        //动态的构造一维数组
				        printf("请输入学生的个数:\n");
				        printf("len = ");
				        scanf("%d",&len);
				        prr = (struct Student *)malloc(len*sizeof(struct Student));   //为输入的学生数量动态分配内存空间
				        				//一个结构体是struct Student,代表一个学生,所有需要(申请学生数量 * 请求单个学生内存)

				        //学生信息录入
				        for(i=0;i<len;++i)
				        {
				                printf("请输入第%d个学生的信息:\n",i+1);
				                printf("Student age = ");
				                scanf("%d",&prr[i].age);

				                printf("Student score = ");
				                scanf("%f",&prr[i].score);

				                printf("Student name = ");
				                scanf("%s",prr[i].name);  //name是数组名,本身就已经是数组首元素的地址,所以不用再前面加取地址符&
				        }
				        //对录入的学生成绩进行升排序
				        for (i=0;i<len-1;++i)
				        {
				                for(j=0;j<len-1-i;++j)
				                {
				                        if(prr[j].score >prr[j+1].score)    //大于 > 表示升序,小于 < 表示降序
				                        {
				                                t=prr[j];                      //默认互换的是整体
				                                prr[j]=prr[j+1];
				                                prr[j+1]=t;
				                        }
				                }

				        }
				        //输出
				        printf("\n\n学生的信息是:\n");
				        for(i=0;i<len;++i)
				        {
				                printf("第%d个学生的信息是:\n",i+1);
				                printf("Student age = %d\n",prr[i].age);
				                printf("Student score = %f\n",prr[i].score);
				                printf("Student name = %s\n",prr[i].name);
				        }
				        return 0;
				}
				程序运行的结果为:
				-------------------------------------------------------------------------------------------------------------------
				请输入学生的个数:
				len = 3
				请输入第1个学生的信息:
				Student age = 10
				Student score = 20
				Student name = zhangsan
				请输入第2个学生的信息:
				Student age = 20
				Student score = 50
				Student name = lisi
				请输入第3个学生的信息:
				Student age = 30
				Student score = 10
				Student name = wangwu


				学生的信息是:
				第1个学生的信息是:
				Student age = 30
				Student score = 10.000000
				Student name = wangwu
				第2个学生的信息是:
				Student age = 10
				Student score = 20.000000
				Student name = zhangsan
				第3个学生的信息是:
				Student age = 20
				Student score = 50.000000
				Student name = lisi
				-------------------------------------------------------
				【冒泡排序】
				#include <stdio.h>
				void sort(int *a, int len)
				{
					int i,j;
					for (i=0;i<len-1;++i)
					{
						for(j=0;j<len-1-i;++j)
						{
							if(a[j]>a[j+1])     //大于 > 表示升序,小于 < 表示降序
							{
								t=a[j];
								a[j]=a[j+1];
								a[j+1]=t;
							}

						}

					}	

				}
				int main(void)
				{
					int a[6] = {10,2,8,-8,11,0}
					int i = 0;

					sort(a,6);

					for(i=0;i<6;++i)
					{
						printf("%d",a[i]);
					}
					printf("\n");

					return 0;
				}
				-------------------------------------------------------------------------

		9.枚举
			什么是枚举
				把一个事物所有可能的取值一一列举出来
			怎样使用枚举
			----------------------------------------------
			#include <stdio.h>
			enum WeekDay
			{
				MonDay,TuesDay,WednesDay,ThursDay,FriDay,SaturDay,SunDay
			};
			int main(void)
			{
				//int day; //day定义成int类型不合适
				enum WeekDay day = WednesDay;  //赋值不能直接写成数字2,因为不符合逻辑
				printf("%d\n",day);  //这里输出的值是2,如果是上面赋值为SunDay,则为6
				return 0;
			}
			------------------------------------------------------------------------------

			枚举的优缺点
				代码更安全
				书写麻烦





  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值