C基础_复合类型

结构体

struct stul
{
	char name[21];
	float scores[3];
};
int main03()
{
	struct stul s[3];
	for (int i = 0; i < 3; i++)
	{
		printf("请输入学生姓名: 成绩: \n");
		scanf("%s%f%f%f", s[i].name, &s[i].scores[0], &s[i].scores[1], &s[i].scores[2]);
	}

	for (int i = 0; i < 3; i++)
	{
		printf("姓名:%s\n",s[i].name);
		printf("成绩:%.1f %.1f %.1f\n", s[i].scores[0], s[i].scores[1], s[i].scores[2]);
	}

}

堆空间开辟结构体

struct tec
{
	char *name;//4
	int age;//4
}t;

int main04()
{
	struct tec * p = (struct tec *)malloc(sizeof(t));
	p->name = (char*)malloc(sizeof(char) * 21);

	strcpy(p->name, "张三");
	p->age = 18;

	printf("%s  %d\n", p->name, p->age);

	if (p->name != NULL)
	{
		free(p->name);
		p->name = NULL;
	}
	if(p)
	{
		free(p);
		p = NULL;
	}

	printf("%d\n", sizeof(struct tec*));
		
}

结构体和函数

struct info
{
	char name[21];
	int age;
};

void fun01(struct info s)//结构体作为形参
{
	strcpy(s.name, "lisi");
	s.age = 20;

	printf("%s  %d\n", s.name, s.age);

}//形参

void fun02(struct info *s)//结构体指针作为形参
{
	strcpy(s->name, "lisi");
	s->age = 20;

	//printf("%s  %d\n", s.name, s.age);
}

struct info fun03()//结构体作为返回值
{
	struct info s;
	strcpy(s.name, "lisi");
	s.age = 20;

	return s;
};

struct info * fun04()//结构体指针作为返回值
{
	struct info s;
	strcpy(s.name, "lisi");
	s.age = 20;

	return &s;
};

int main05()
{
	struct info s = { "zhangsan",18 };

	fun02(&s);//实参

	printf("%s %d\n", s.name, s.age);

}

结构体嵌套结构体

struct info
{
	char name[21];
	int age;
};

void fun01(struct info s)//结构体作为形参
{
	strcpy(s.name, "lisi");
	s.age = 20;

	printf("%s  %d\n", s.name, s.age);

}//形参

void fun02(struct info *s)//结构体指针作为形参
{
	strcpy(s->name, "lisi");
	s->age = 20;

	//printf("%s  %d\n", s.name, s.age);
}

struct info fun03()//结构体作为返回值
{
	struct info s;
	strcpy(s.name, "lisi");
	s.age = 20;

	return s;
};

struct info * fun04()//结构体指针作为返回值
{
	struct info s;
	strcpy(s.name, "lisi");
	s.age = 20;

	return &s;
};

int main05()
{
	struct info s = { "zhangsan",18 };

	fun02(&s);//实参

	printf("%s %d\n", s.name, s.age);

}

共用体

//共用体 union:共用体名称 成员列表 共用体变量名
//少用 会很乱 优点是省内存
union vars
{
	double a;
	float b;
	int c;//如果是c[10]的话,大小就是40(8的倍数);如果是c[11]的话(44),大小就是48(加到8的倍数)
	short d;
	char f;
	//char arr[12];
}var;

int main08()
{
	printf("%d\n", sizeof(var));
	var.a = 100;
	var.b = 3.14;
	printf("%f\n", var.a);
	printf("%f\n", var.b);
	//最新读数准,之前的不准
}

枚举

/*
	用途(工作中常用):
	例 银行取钱

	插卡      比如 clo=0 代表插上
	输入密码  clo=1
	锁定      clo=2
	取款      clo=3
	查询      clo=4
	退卡      clo=5
	锁定解除

	例 游戏中
	移动      clo=10
	攻击	  clo=11  (自增长1)
	技能	  clo=20
	死亡	  clo=21

*/
enum colors
{
	red,blue,yellow,black,white,green
}clo;

int main09()
{
	int val;
	scanf("%d\n",&val);
	switch (val)
	{
	case red:
		printf("red");
		break;
	case blue:
		break;
	case yellow:
		break;
	case black:
		break;
	case white:
		break;
	case green:
		break;
	default:
		break;
	}
}

typedef

//用途:给长变量起名字  
//或用在头文件起名 直接在.c文件中#$include"studentsInfoList.h"引用
typedef unsigned long long ull;

struct studentsInfoList
{
	char name[20];
	char sex;

};
typedef struct studentsInfoList sf;

int main10()
{
	sf s1;
	s1.name;
	s1.sex;
}

学生成绩结构体函数实现

struct stu
{
	char* name;
	float* scores;

};

void bubble_sort(struct stu *p,int len)
{
	//冒泡排序
	for (int i = 0; i < len - 1; i++)
	{
		for (int j = 0; j < len - i - 1; j++)
		{
			float sum1 = p[j].scores[0] + p[j].scores[1] + p[j].scores[2];
			float sum2 = p[j + 1].scores[0] + p[j + 1].scores[1] + p[j + 1].scores[2];
			if (sum1 > sum2)
			{
				struct stu temp = p[j];
				p[j] = p[j + 1];
				p[j + 1] = temp;
			}
		}
	}
}

int main06()
{
	struct stu* p = (struct stu*)malloc(sizeof(struct stu) * 3);
	for (int i = 0; i < 3; i++)
	{
		p[i].name = (char*)malloc(sizeof(char) * 21);
		p[i].scores = (float*)malloc(sizeof(float) * 3);

		printf("请输入学生姓名 成绩:\n");
		scanf("%s%f%f%f", p[i].name, &p[i].scores[0], &p[i].scores[1], &p[i].scores[2] );
	}

	bubble_sort(p, 3);

	for (int i = 0; i < 3; i++)
	{
		printf("姓名:%s\n", p[i].name);
		printf("成绩:%.1f %.1f %.1f\n", p[i].scores[0], p[i].scores[1], p[i].scores[2]);
	}

	//释放
	for (int i = 0; i < 3; i++)
	{
		free(p[i].name);
		free(p[i].scores);

	}
	free(p);
}

打字游戏

void tips()
{
	printf("======打字游戏=========\n");
	printf("======按任意键继续=====\n");
	printf("======按ESC退出========\n");
	char ch = _getch();
	if (ch == 27)
	{
		exit(0);
	}
}

void rand_ch(char* arr)
{
	srand((unsigned int)time(NULL));//随机
	for (int i = 0; i < 50; i++)
	{
		arr[i] = rand() % 26 + 'a';
	}
}

void printf_ch(char* arr)
{
	//变量 计时器 开始 结束   计数器 val
	unsigned int start_time;
	unsigned int end_time;
	int val = 0;
	for (int i = 0; i < 50; i++)
	{
		char ch = _getch();
		if (i == 0)
		{
			start_time = time(NULL);
		}
		if (ch == arr[i])
		{
			printf("%c", ch);
			val++;
		}
		else
		{
			printf("_");
		}
	}
	end_time = time(NULL);

	printf("用时:%d\n", end_time - start_time);
	printf("正确率:%.1f%%\n", val * 1.0 / 50 * 100);
	if (val * 1.0 / 50 * 100 > 80)
	{
		printf("厉害了我的哥!");
	}
}

int main11()
{
	//字库
	char arr[51];
	memset(arr, 0, 51);

	while (1)
	{
		//1.提示
		tips();
		//2.随机字符
		rand_ch(arr);
		printf("%s\n", arr);
		//3.输入字符
		printf_ch(arr);

	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值