学习嵌入式第十五天之结构体

用变量a给出下面的定义

  • a) 一个整型数
  • (An integer) //int a;
  • b) 一个指向整型数的指针
  • (A pointer to an integer) //int *a;
  • c) 一个指向指针的的指针,它指向的指针是指向一个整型数
  • (A pointer to a pointer to an integer) //int * *a;(二级指针)
  • d) 一个有10个整型数的数组
  • (An array of 10 integers) //int a[10];
  • e) 一个有10个指针的数组,该指针是指向一个整型数的
  • (An array of 10 pointers to integers) //int *a[10];
  • f) 一个指向有10个整型数数组的指针
  • (A pointer to an array of 10 integers) //int (*a)[10];
  • g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数
  • (A pointer to a function that takes an integer as an argument and returns an integer) //int (*a)(int)
  • h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
  • ( An array of ten pointers to functions that take an integer argument and return an integer ) //int (*a[10])(int)

函数传参-----值传递

总结:

1.指针概念

2.指针定义

3.核心用途

4.指针运算

5.指针

一维

6.指针+二维数组

7.指针+函数

8.指针+指针

结构体、共用体、枚举

数据类型:

基本数据类型:整型 浮点型 字符型 枚举类型

构造类型:数组类型

指针类型

void类型

例子:统计全校同学信息

//记录统计学生信息

//姓名

//班级

//性别

//成绩

//年龄......

记录姓名--------char s[][100] = {"Tom","Gerry"};

记录班级---------char class[][100] = {"......"};

......

为了更好的描述 有一种专门的数据类型来描述

结构体 struct

描述一些原先基本数据类型不好描述的复杂数据类型

语法

struct 结构体类型名

{

数据成员列表 //成员变量

};

//一上这种形式就是定义了一个"数据类型"-----用户可以自定义

eg:描述学生这种类型

struct student

{

char name [20];

unsigned char age;

float score;

}; //注意:结束要用分号 表示结构体类定义完成

结构体的对齐规则:

1.在32位的平台上,默认都是按4字节对齐的。

2.对于成员变量,

各自在自己的自然边界上对齐。

3.如果 成员变量中有比4字节大。

此时整个结构体按照4字节对齐。

4.如果成员变量中没有有比4字节大。

此时整个结构体按照最大的那个成员对齐。

练习:

用结构体打印老师的姓名、工号、工资:

#include <stdio.h>
#if 0
struct teacher
{
	char name[10];
	int Jobnum;
	int salary;
};


void Peintf_Teacher(struct teacher *a)
{
	printf("-|name-|\t|-Jobnum-|\t|-salary|-\n");
	printf("-|%s-|\t|-%d-|\t|-%d-|-\t\n",a->name,a->Jobnum,a->salary);
}




int main(void)
{
	struct teacher a={"Liuyang",88888,88488};
#if 0
	printf("-|name-|\t|-Jobnum-|\t|-salary|-\n");
	printf("-|%s-|\t|-%d-|\t|-%d-|-\t\n",a.name,a.Jobnum,a.salary);
#endif

	printf ("name: \n");
	scanf("%s",a.name);
	printf ("Jobnum: \n");
	scanf("%d",&a.Jobnum);
	printf ("salary: \n");
	scanf("%d",&a.salary);

	Peintf_Teacher(&a);

	return 0;
}

结构体搭建学生信息查询系统

#include <stdio.h>
#include <stdlib.h>
struct student
{
	char name[20];
	int sno;
	float score;
};


void inputStuInfo(struct student *p,int len)
{
	int i = 0;
	for (i = 0; i < len;++i)
	{
		printf("name:");
		scanf("%s",(p+i)->name);
		printf("sno :");
		scanf("%d",&(p+i)->sno); //p[i].name
		printf("score:");
		scanf("%f",&(p+i)->score);
	}
}

void outputStuInfo(struct student *p,int len)
{
	
	int i = 0;
	printf("%10s|%10s|%10s\n","name","sno","score");
	for (i = 0; i < len;++i)
	{
		printf("%10s",p->name);
		printf("%10d",p->sno);
		printf("%10.2f\n",p->score);
		p++;
	}
}


void printMenu(void)
{
	printf("-----Welcome Use Student info System-----\n");
	printf("1 选择输入的学生人数\n");
	printf("2 输入信息\n");
	printf("3 查看学生信息\n");
	printf("0 退出 \n");
	printf(">");
}
int main(void)
{
	int n;
	int len = 0;
	struct student *s;

	while (1)
	{
		printMenu();
		scanf("%d",&n);
		switch(n)
		{
		case 0:
			  printf("exit----\n");
			  return 0;
		case 1:
			printf(">");
			scanf("%d",&len);
			s = malloc(len*sizeof(struct student));
			break;
		case 2:
			inputStuInfo(s,len);
			break;
		case 3:
			outputStuInfo(s,len);
			break;
		}
	}



	return 0;
}

注意:

1.结构体------是用来实现自定义数据类型

2.用结构体

a.先构造出数据类型

b.用数据类型定义变量、数组、指针

访问结构体

. //结构体成员运算符

--->用与结构体类型的指针变量

eg. p--->name

作业:

有一个班的4个学生,有5门课程。

1、求第一门课的平均分; struct Stu s[4]; s[i].score[0] int averageOneClass(struct Stu *s,int len,int classNo)

2、找出有两门以上课程不及格的学生, 输出他们的学号和全部课程成绩及平均分 printfStuInfoFailTwoClass()

{ 1.统计学生不及格课程数 2.打印学生信息 3.求平均分的功能 }

3、找出平均分在90分以上或全部课程成绩在85分以上的学生。 分别编写三个函数来实现以上三个要求

#include <stdio.h>

struct Stu              //结构体函数
{
	char name[10];
	int num;
	float yuwen;
	float yingyu;
	float shuxue;
	float wuli;
	float huaxue;
};
//****************************************************************
void Intput_Stu(struct Stu *s,int len)       //输入各项元素
{
	int i=0;
	for (i=0;i<len;++i)
	{
	printf ("name: ");
	scanf("%s",(s+i)->name);
	printf ("num: ");
	scanf("%d",&(s+i)->num);
	printf ("yuwen: ");
	scanf("%f",&(s+i)->yuwen);
	printf ("yingyu: ");
	scanf("%f",&(s+i)->yingyu);
	printf ("shuxue: ");
	scanf("%f",&(s+i)->shuxue);
	printf ("wuli: ");
	scanf("%f",&(s+i)->wuli);
	printf ("huaxue: ");
	scanf("%f",&(s+i)->huaxue);
	}
}
//*********************************************************
void Puts_Stu(struct Stu *s,int len)        //输出
{
	int i=0;
	for (i=0;i<len;++i)
	{
		printf ("%s\t",s->name);
		printf ("%d\t",s->num);
		printf ("%.1f\t",s->yuwen);
		printf ("%.1f\t",s->yingyu);
		printf ("%.1f\t",s->shuxue);
		printf ("%.1f\t",s->wuli);
		printf ("%.1f\n",s->huaxue);
		s++;
	}
}

//****************************************************
float Pingjun_Stu(struct Stu *s,int len)
{
	int i=0;                          
	float sum=0;
                                                 //单科语文平均数计算
	for (i=0;i<len;++i)
	{
		sum += (s+i)->yuwen;
	}
   return sum/len;
}

//***************************************************************************************************************************
void Flunk_Stu(struct Stu *s,int len)
{
	int i=0;                                  //求不及格学生的科目和成绩及其平均分
	int j=0;
	float sum=0;
	for (i=0;i<len;++i)
	{
		if ((s+i)->yuwen<60)
		{
			++j;
		}
		if ((s+i)->yingyu<60)
		{
			++j;
		}
		if ((s+i)->shuxue<60)
		{
			++j;
		}
		if ((s+i)->wuli<60)
		{
			++j;
		}
		if ((s+i)->huaxue<60)
		{
			++j;
		}
		if (j>=2)
		{
			printf("两门以上不及格的同学:num:%d  yuwen:%.1f  yingyu:%.1f  shuxue:%.1f  wuli:%.1f  huaxue:%.1f\n",(s+i)->num,(s+i)->yuwen,(s+i)->yingyu,(s+i)->shuxue,(s+i)->wuli,(s+i)->huaxue);
			sum=(s+i)->yuwen+(s+i)->yingyu+(s+i)->shuxue+(s+i)->wuli+(s+i)->huaxue;
			printf("这位同学的平均分是:%.1f\n",sum/5);
        	printf("不及格有%d门\n",j);
		}
		j=0;
	}
		
}

//*****************************************************************
void CHAzhao_Stu(struct Stu *s,int len)      
{                                             //查找成绩优异的同学
	int i=0;
	int sum=0;

	for (i=0;i<len;++i)
	{
		sum=(s+i)->yuwen+(s+i)->yingyu+(s+i)->shuxue+(s+i)->wuli+(s+i)->huaxue;

		if (((s+i)->yuwen>85 && (s+i)->yingyu>85 && (s+i)->shuxue>85 && (s+i)->wuli>85 && (s+i)->huaxue>85) || sum/5>95)
		{
			printf("成绩优异的同学:name:%s num:%d yuwen:%.1f yingyu:%.1f shuxue:%.1f wuli:%.1f huaxue:%.1f\n",(s+i)->name,(s+i)->num,(s+i)->yuwen,(s+i)->yingyu,(s+i)->shuxue,(s+i)->wuli,(s+i)->huaxue);
		}
		
	}
}

//*****************************************************
int main (void)
{
	struct Stu s[4];
	int len=4;

	Intput_Stu(s,len);

	printf ("--------------------统计表-------------------\n");
	printf ("name\tnum\tyuwen\tyingyu\tshuxue\twuli\thuaxue\n");
	Puts_Stu(s,len);
//	float p=Pingjun_Stu(s,len);   //调用平均数函数

//	printf ("语文平均分是:%.1f\n",p);     //打印出平均数的结果
    
//	Flunk_Stu(s,len);   // 调用求不及格科目的函数
    CHAzhao_Stu(s,4);
	return 0;
}
相关推荐
A charmer1 分钟前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq3 分钟前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
wheeldown30 分钟前
【数据结构】选择排序
数据结构·算法·排序算法
hikktn2 小时前
如何在 Rust 中实现内存安全:与 C/C++ 的对比分析
c语言·安全·rust
观音山保我别报错2 小时前
C语言扫雷小游戏
c语言·开发语言·算法
dsywws2 小时前
Linux学习笔记之vim入门
linux·笔记·学习
晨曦_子画3 小时前
3种最难学习和最容易学习的 3 种编程语言
学习
TangKenny3 小时前
计算网络信号
java·算法·华为
景鹤3 小时前
【算法】递归+深搜:814.二叉树剪枝
算法
iiFrankie3 小时前
SCNU习题 总结与复习
算法