输入
无
输出
随机排列后的名单和平均分以及前三名的信息,生成一个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里面不关闭。