C语言【练习结构体指针,指针数组】

该程序接收10名学生的分数,找出最低分并将其存储到新的数组中。使用两个不同的实现方式展示了如何遍历数组并复制最低分的记录。程序最后输出最低分学生的信息。

找出最低分数的同学,储存到h指向的结构体数组 

#include<stdio.h>
#include<math.h>
#define N 10
#define eps 1e-4
struct stu
{
	double num;
	float score;
};
int main() 
{
	struct stu s[N],low[N],*Q=s,*h=low;
	int i;float min=100.0; 
	for(i=0;i<N;i++)
	{
		scanf("%lf %f",&(Q+i)->num,&(Q+i)->score);
		if(min>(Q+i)->score) min=(Q+i)->score;//输入的同时找最低分数 
	}
	int fun(struct stu *,struct stu *,float);
	int sum=fun(Q,h,min);
	printf("分数最低的同学有%d个\n",sum);
	for(i=0;i<sum;i++)
	{
		printf("%0.0lf\t%0.1f\n",(h+i)->num,(h+i)->score);
	}return 0;
} 
int fun(struct stu *Q,struct stu *h,float min)
{
	int sum=0,i;
	for(i=0;i<N;i++)
	{
		if(fabs(min-(Q+i)->score)<eps)//遍历s[N]若某元素分数最低, 
		{
			sum++;
			*(h++)=*(Q+i);//将数据放到h所指的数组中 
		}
	}return sum;
}
/*202101 98.4
202102 97.1
202103 98.2
202104 97.1
202105 100
202106 97.1
202107 99.5
202108 100
202109 97.2
202110 97.1*/

 以h[0]为例,h[0]是一个指针,在未执行h[0]=s+i前,h[0]的值为任意值,未指向任何变量,因此*h[0]并不能被赋值,如果代码里用了*h[j++]=*(s+i),与此类似。而h[j++]=s+i则是对指针h[j++]赋值了明确的地址,*h[j++]此时才变得有意义

#include<stdio.h>
#include<math.h>
#define N 10
#define eps 1e-4
typedef struct stu
{
	long num;
	float score;
}STU;int i; 
int main()
{
	STU s[N],*h[N];
	int i;float min=100;
	for(i=0;i<N;i++)
	{
		scanf("%ld %f",&s[i].num,&s[i].score);
		if(min>(s+i)->score) min=(s+i)->score;
	}
	int fun(STU *h[],const STU s[],const float);
	int num=fun(h,s,min);
	printf("\n分数最低的学生有%d个:\n",num);
	for(i=0;i<num;i++)
	printf("%ld\t%.1f\n",h[i]->num,h[i]->score);
	return 0;
}
int fun(STU *h[],const STU s[],const float min)
{
	int num=0;
	for(i=0;i<N;i++)
	{
	if(fabs(min-(s+i)->score)<eps) h[num++]=s+i;
	}
 return num;
}
/*202101 98.4
202102 97.1
202103 98.2
202104 97.1
202105 100
202106 97.1
202107 99.5
202108 100
202109 97.2
202110 97.1*/

效果 

 

 

### 1. 结构体指针遍历结构体数组 在这个练习中,需要定义一个结构体来表示学生信息,创建一个包含多个学生信息的结构体数组,然后使用结构体指针来遍历这个数组并输出每个学生的信息。 ```c #include <stdio.h> // 定义学生结构体 struct Student { int id; char name[20]; float score; }; int main() { // 创建包含多个学生信息的结构体数组 struct Student students[3] = { {1, "Alice", 85.5}, {2, "Bob", 90.0}, {3, "Charlie", 78.5} }; // 定义结构体指针 struct Student *ptr; // 让指针指向数组首地址 ptr = students; // 使用指针遍历数组并输出信息 for (int i = 0; i < 3; i++) { printf("ID: %d, Name: %s, Score: %.2f\n", ptr->id, ptr->name, ptr->score); ptr++; } return 0; } ``` ### 2. 指针操作数组元素 此练习要求创建一个整数数组,使用指针来访问数组的元素,并且实现对数组元素的修改。 ```c #include <stdio.h> int main() { int arr[5] = {1, 2, 3, 4, 5}; int *ptr = arr; // 使用指针访问并修改数组元素 for (int i = 0; i < 5; i++) { *(ptr + i) *= 2; } // 输出修改后的数组元素 for (int i = 0; i < 5; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; } ``` ### 3. 枚举类型的使用 练习定义一个枚举类型来表示一周的七天,然后编写一个函数,根据传入的枚举值输出对应的星期名称。 ```c #include <stdio.h> // 定义枚举类型表示一周的七天 enum Weekday { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }; // 函数根据枚举值输出对应的星期名称 void printWeekday(enum Weekday day) { switch (day) { case MONDAY: printf("Monday\n"); break; case TUESDAY: printf("Tuesday\n"); break; case WEDNESDAY: printf("Wednesday\n"); break; case THURSDAY: printf("Thursday\n"); break; case FRIDAY: printf("Friday\n"); break; case SATURDAY: printf("Saturday\n"); break; case SUNDAY: printf("Sunday\n"); break; default: printf("Invalid day\n"); } } int main() { enum Weekday today = WEDNESDAY; printWeekday(today); return 0; } ``` ### 4. 结构体嵌套指针操作 该练习定义一个包含结构体嵌套的结构体,使用指针来访问和修改嵌套结构体的成员。 ```c #include <stdio.h> // 定义地址结构体 struct Address { char street[50]; char city[20]; }; // 定义人员结构体,包含地址结构体 struct Person { char name[20]; int age; struct Address address; }; int main() { // 创建人员结构体变量 struct Person p = { "David", 22, {"123 Main St", "New York"} }; // 定义指向人员结构体指针 struct Person *ptr = &p; // 使用指针访问和修改嵌套结构体的成员 printf("Name: %s, Age: %d\n", ptr->name, ptr->age); printf("Street: %s, City: %s\n", ptr->address.street, ptr->address.city); // 修改地址信息 ptr->address.street = "456 Elm St"; ptr->address.city = "Los Angeles"; printf("Updated Street: %s, Updated City: %s\n", ptr->address.street, ptr->address.city); return 0; } ``` ### 5. 数组指针函数 此练习编写一个函数,接受一个数组指针数组长度作为参数,在函数内部计算数组元素的总和并返回结果。 ```c #include <stdio.h> // 函数计算数组元素总和 int sumArray(int (*arr)[5], int len) { int sum = 0; for (int i = 0; i < len; i++) { for (int j = 0; j < 5; j++) { sum += (*arr)[j]; } arr++; } return sum; } int main() { int arr[3][5] = { {1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15} }; int total = sumArray(arr, 3); printf("Sum of array elements: %d\n", total); return 0; } ```
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

*Min*

写的不好多多包涵~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值