结构体练习题

1、结构体内的变量和指针

结构体内是变量

struct School
{
	char s_name[20];
	int s_age;
};

void Init_School(struct School *sx)
{
	char name[20] = "ligong";
	strcpy_s(sx->s_name, 20, name);
	sx->s_age = 90;
}

void Print_School(struct School *sx)
{
	printf("name:%s\n", sx->s_name);
	printf("age:%d\n", sx->s_age);
}

int main()
{
	struct School sx;

	Init_School(&sx);
	Print_School(&sx);
	return 0;
}

结构体内是指针

char name[20] = { "ligong" };
struct School
{
	char *s_name;
	int s_age;
};

void Init_School(struct School *sp)
{
	//static char name[20] = { "tulun" };//静态关键字static,使得变量name的生存期延长,
	sp->s_name = name;
	sp->s_age = 90;
}

void Print_School(struct School* sp)
{
	printf("name:%s\n", sp->s_name);
	printf("age:%d\n", sp->s_age);
}

int main()
{
	struct School sx;

	Init_School(&sx);
	Print_School(&sx);
	return 0;
}

2、学生结构体

1.编写函数打印学生信息
2.计算全班同学的总成绩、平均成绩和140分以下的人数。
3.按成绩升序排序,成绩相同按年龄降序排序。

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>

struct Student
{
	char s_name[20];
	int age;
	float score;
};
//打印学生信息
void Print_Cla(struct Student* cla, int n)
{
	for (int i = 0; i < n; ++i)
	{
		printf("第%d个学生:\n", i+1);
		printf("姓名:%s \n", cla[i].s_name);
		printf("年龄:%d \n", cla[i].age);
		printf("成绩:%3.1f \n", cla[i].score);
	}
}
//计算总成绩
float Sum(const struct Student* cla, int n)
{
	float sum = 0.0;
	for (int i = 0; i < n; ++i)
	{
		sum += cla[i].score;
	}
	return sum;
}
//计算平均成绩
float Aver(float sum, int n)
{
	float aver = 0.0;
	aver = sum / n;
	return aver;
}
//计算140分以下的人数
int Np(const struct Student* cla, int n)
{
	int np = 0;
	for (int i = 0; i < n; ++i)
	{
		if (cla[i].score < 140.0)
		{
			np += 1;
		}
	}
	return np;
}
//按成绩升序排序,成绩相同按年龄降序排序。
void Swap(struct Student* cla,int i,int j)
{
	struct Student tmp;
	tmp = cla[i];
	cla[i] = cla[j];
	cla[j] = tmp;
}

void Sort(struct Student* cla, int n)
{
	for (int i = 0; i < n; ++i)
	{
		for (int j = 0; j < n - i - 1; ++j)
		{
			if (cla[j].score > cla[j + 1].score)
			{
				Swap(cla, j, j + 1);
			}
		}
	}
	for (int i = 0; i < n - 1; ++i)
	{
		if (cla[i].score == cla[i + 1].score)
		{
			if (cla[i].age < cla[i + 1].age)
			{
				Swap(cla, i, i + 1);
			}
		}
	}
}

int main()
{
	struct Student cla[] =
	{
		{"Tu lun",    18, 145.5 },
		{"Cheng Lei", 20, 130.5 },
		{"Wang ling", 19, 140.0 },
		{"Zhang ping",17, 134.5 },
		{"Yang yang", 19, 135.0 },
		{"Hu Ming",   18, 140.0 },
	};
	int num = 0;
	float sum = 0.0;
	float aver = 0.0;
	int np = 0;

	num = sizeof(cla) / sizeof(cla[0]);
	printf("一共%d个学生。\n", num);
	Print_Cla(cla, num);
	printf("\n");//分隔
	sum = Sum(cla, num);
	printf("总成绩为:%5.1f\n", sum);
	printf("\n");//分隔
	aver = Aver(sum, num);
	printf("平均成绩为:%f\n", aver);
	printf("\n");//分隔
	np = Np(cla, num);
	printf("140分以下的人数为:%d\n", np);
	printf("\n");//分隔
	Sort(cla, num);
	printf("排序后;\n");
	Print_Cla(cla, num);

	return 0;
}

3、两数之和

给定一个有序数组,其中任意两个数相加的和各不相同。
给定一个数,进入数组查找是否有两个数之和等于目标数据。

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>

struct Coord
{
	int fir;
	int sec;
};

int Subscript_Top(int* ar, int n, int num)
{
	int m = 0;
	if (ar[n] < num)
	{
		m = n - 1;
	}
	else
	{
		for (int i = 0; i < n; ++i)
		{
			if (ar[i] < num && num < ar[i + 1])
			{
				m = i;
			}
		}
	}
	return m;
}

void Seek(int* ar, int t, int num, struct Coord *c)
{
	int l = 0;
	int r = t;
	c->fir = -1;
	c->sec = -1;
	while (l < r)
	{
		if (ar[l] + ar[r] == num)
		{
			c->fir = l;
			c->sec = r;
			break;
		}
		else if (ar[l] + ar[r] < num)
		{
			if (ar[l + 1] + ar[r] <= num)
			{
				l += 1;
			}
			else
			{
				r -= 1;
			}
		}
		else
		{
			r -= 1;
		}
	}
}

void Print(struct Coord* c,int num)
{
	if (-1 == (c->fir))
	{
		printf("%d not find!\n", num);
	}
	else
	{
		printf("ar[%d]+ar[%d]=%d\n", c->fir, c->sec, num);
	}
}

int main()
{
	const int n = 10;
	int ar[n] = { 1,2,4,8,16,32,64,128,256,512 };
	int num = 0;
	struct Coord c = { 0,0 };
	int t = 0;
	int d = 0;

	num = 1;
	t = Subscript_Top(ar, n, num);
	Seek(ar, t, num, &c);
	Print(&c, num);

	num = 3;
	t = Subscript_Top(ar, n, num);
	Seek(ar, t, num, &c);
	Print(&c, num);

	num = 79;
	t = Subscript_Top(ar, n, num);
	Seek(ar, t, num, &c);
	Print(&c, num);

	num = 80;
	t = Subscript_Top(ar, n, num);
	Seek(ar, t, num, &c);
	Print(&c, num);

	num = 768;
	t = Subscript_Top(ar, n, num);
	Seek(ar, t, num, &c);
	Print(&c, num);

	num = 900;
	t = Subscript_Top(ar, n, num);
	Seek(ar, t, num, &c);
	Print(&c, num);

	return 0;
}
  • 2
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值