大学C语言课后题---将随机生成的结构体文件储存到文件,并使用Excel打开查看

输入

输出

随机排列后的名单和平均分以及前三名的信息,生成一个students.csv的文件

输出案例

20220001        郑倩    18      425.5
20220002        周政    18      499.0
20220003        郑壮    18      492.5
20220004        韩浩宸  19      453.0
20220005        朱嘉萱  19      510.0
20220006        蒋雪莹  18      508.0
20220007        孙宸硕  19      450.0
20220008        施子喻  19      450.0
20220009        陈坚    19      421.0
20220010        秦婵    18      473.0

平均分为:468.1
前三甲为:
20220009        朱嘉萱  19      510.0
20220006        蒋雪莹  18      508.0
20220008        周政    18      499.0

文件:

打开后:

题目要求不是很难,我们只需要搞清楚C语言文件的生成,写入和关闭就行了。由于我们的文件指针变量要在两个函数之间使用,为了避免麻烦,我们直接使用全局变量。如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <fstream>

int s[10];
FILE* student;

然后我们使用fopen函数创建students.csv这一文件,然后使用fprintf()来写入数据。上代码:

fopen_s(&student,"students.csv", "w");

for (int i = 0; i < 10; ++i)
{

	fprintf(student,"%d,%s,%d,%.1lf\n", stu[i].num, stu[a[i]].name, stu[a[i]].age, stu[a[i]].grade);
	printf("%d\t%s\t%d\t%.1lf\n", stu[i].num, stu[a[i]].name, stu[a[i]].age, stu[a[i]].grade);
}

此时我们已经将数据写入文件students.csv了,这里有一个小细节,数据之间使用逗号分割,这是因为Excel表格识别到的数据以 ',' 为分割符,因此使用都好可以使两个数据分别生成在两个单元格中。这是效果:

到这里,我们的思路讲的已经差不多了,为了方便查看文件是否生成错误,我们可以在main()函数加一句system("start students.csv");这将使得程序运行后自动打开文档。如果电脑安装有Excel的话则是以Excel打开。

完整代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <fstream>

int s[10];
FILE* student;

struct students
{
	int num;
	char name[1][12];
	int age;
	double grade;

}stu[10] = {
	{20220001, "陈坚", 19, 421.0},

	{20220002, "郑倩", 18, 425.5},

	{20220003, "孙宸硕", 19, 450.0},

	{20220004, "韩浩宸", 19, 453.0},

	{20220005, "施子喻", 19, 450.0},

	{20220006, "蒋雪莹", 18, 508.0},

	{20220007, "秦婵", 18, 473.0},

	{20220008, "周政", 18, 499.0},

	{20220009, "朱嘉萱", 19, 510.0},

	{20220010, "郑壮", 18, 492.5}
};

void rand1(int a[10] = { })
{

	srand((unsigned)time(NULL));
	for (int i = 0; i <= 10; ++i)
	{
		int tmp = rand() % 10;
		if (a[i - 1] == tmp || a[i - 2] == tmp || a[i - 3] == tmp || a[i - 4] == tmp || a[i - 5] == tmp || a[i - 6] == tmp || a[i - 7] == tmp || a[i - 8] == tmp || a[i - 9] == tmp)
		{
			i = 0;
		}
		else {
			a[i] = tmp;
		}
	}

}

void max_to_min()
{
	for (int i = 0; i < 10; ++i)
	{
		for (int j = 0; j < 10; ++j)
		{
			if (s[i] > s[j])
			{
				int c = s[i];
				s[i] = s[j];
				s[j] = c;
			}

		}
	}
}
void func1()
{
	fopen_s(&student,"students.csv", "w");
	int a[11] = { };
	int b[11] = { };
	int c[11] = { };
	rand1(a);
	rand1(b);
	rand1(c);
	for (int i = 0; i < 10; ++i)
	{

		fprintf(student,"%d,%s,%d,%.1lf\n", stu[i].num, stu[a[i]].name, stu[a[i]].age, stu[a[i]].grade);
		printf("%d\t%s\t%d\t%.1lf\n", stu[i].num, stu[a[i]].name, stu[a[i]].age, stu[a[i]].grade);
	}
}
void func2()
{
	for (int i = 0; i < 10; ++i)
	{
		printf("%d\t%s\t%d\t%.1lf\n", stu[i].num, stu[i].name, stu[i].age, stu[i].grade);
	}
}
void func3()
{

	for (int i = 0; i < 10; ++i)
	{
		s[i] = (int)stu[i].grade;
	}
	max_to_min();

	double averange = 0.0;
	for (int i = 0; i <= 9; ++i)
	{
		averange += s[i] / 10.0;
	}
	fprintf(student,"平均分为:,%.1lf\n前三甲为:\n", averange);
	printf("平均分为:%.1lf\n前三甲为:\n", averange);
	for (int i = 0; i < 10; ++i)
	{
		if (stu[i].grade == s[0])
		{
			fprintf(student,"%d,%s,%d,%.1lf\n", stu[i].num, stu[i].name, stu[i].age, stu[i].grade);
			printf("%d\t%s\t%d\t%.1lf\n", stu[i].num, stu[i].name, stu[i].age, stu[i].grade);
		}
	}
	for (int i = 0; i < 10; ++i)
	{
		if (stu[i].grade == s[1])
		{
			fprintf(student, "%d,%s,%d,%.1lf\n", stu[i].num, stu[i].name, stu[i].age, stu[i].grade);
			printf("%d\t%s\t%d\t%.1lf\n", stu[i].num, stu[i].name, stu[i].age, stu[i].grade);
		}
	}
	for (int i = 0; i < 10; ++i)
	{
		if (stu[i].grade == s[2])
		{
			fprintf(student, "%d,%s,%d,%.1lf\n", stu[i].num, stu[i].name, stu[i].age, stu[i].grade);
			printf("%d\t%s\t%d\t%.1lf\n", stu[i].num, stu[i].name, stu[i].age, stu[i].grade);
		}
	}
	fclose(student);
}
int main()
{
	func1();
	printf("\n");
	func3();
	system("start students.csv");
}

这里有个小细节,关闭文件放在了func3里面,func1里面不关闭。

  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一种聪明的缘猿

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值