键盘输入6名学生信息(学号、姓名、专业、性别、班级、出生年月日、两门课程的成绩),计算每名学生总分,将原有数据和平均分存放在磁盘文件stu.txt中
基于new bing部分指引作答:
下面是一个简单的示例程序,用于从键盘录入6名学生信息,并将数据和平均数存储在磁盘文件stu.txt中。代码注释由助手为您提供。
#include <stdio.h>
#include <stdlib.h>
#define MAX_STUDENTS 6 // 最大学生数量
#define STR_LEN 20 // 字符串最大长度(包括末尾 '\0')
// 学生信息结构体
struct Student {
char id[STR_LEN]; // 学号
char name[STR_LEN]; // 姓名
char major[STR_LEN]; // 专业
char gender[STR_LEN]; // 性别
char classname[STR_LEN]; // 班级
char birthdate[STR_LEN]; // 出生年月日
float score1; // 第一门课程成绩
float score2; // 第二门课程成绩
float total_score; // 总分
};
int main() {
struct Student students[MAX_STUDENTS]; // 学生数组
// 录入学生信息
for (int i = 0; i < MAX_STUDENTS; i++) {
printf("请输入第 %d 个学生的信息:\n", i+1);
printf("学号:"); scanf("%s", students[i].id);
printf("姓名:"); scanf("%s", students[i].name);
printf("专业:"); scanf("%s", students[i].major);
printf("性别:"); scanf("%s", students[i].gender);
printf("班级:"); scanf("%s", students[i].classname);
printf("出生年月日:"); scanf("%s", students[i].birthdate);
printf("第一门课成绩:"); scanf("%f", &students[i].score1);
printf("第二门课成绩:"); scanf("%f", &students[i].score2);
// 计算总分
students[i].total_score = students[i].score1 + students[i].score2;
}
// 计算平均分
float avg_score = 0.0;
for (int i = 0; i < MAX_STUDENTS; i++) {
avg_score += students[i].total_score;
}
avg_score /= MAX_STUDENTS;
// 打开文件以保存结果
FILE *fp = fopen("stu.txt", "w");
if (fp == NULL) {
printf("打开文件失败!请检查权限或磁盘空间。\n");
return -1;
}
// 写入学生信息和平均分到文件中
fprintf(fp, "学号\t姓名\t专业\t性别\t班级\t出生年月日\t成绩1\t成绩2\t总分\n");
for (int i = 0; i < MAX_STUDENTS; i++) {
struct Student s = students[i];
fprintf(fp, "%s\t%s\t%s\t%s\t%s\t%s\t%.1f\t%.1f\t%.1f\n",
s.id, s.name, s.major, s.gender, s.classname, s.birthdate,
s.score1, s.score2, s.total_score);
}
fprintf(fp, "平均分:%.1f\n", avg_score);
// 关闭文件
fclose(fp);
printf("已将结果保存至stu.txt中。\n");
return 0;
}
请注意,此示例程序只是一个基本模板,您实际使用时应根据需要进行相应的修改和扩展。另外,该程序没有对输入数据的有效性进行严格检查,您可能需要添加一些范围和格式验证以防止非法输入。
#include <stdio.h>
#include <string.h>
//字符串转二进制编码
int str_to_bin_save(char *str)
{
//打开文件
FILE *fp;
if((fp = fopen("word.txt","w")) == NULL)
{
printf("Open file is failed");
return -1;
}
char len = strlen(str);
printf("len:%d\n",len);
char tmp;
for(int i=0;i<len;i++){
tmp = str[i];
for(int j=0;j<8;j++){
if(tmp & 0x80) { //1000,0000
//printf("1");
fputc('1',fp);
}
else{
//printf("0");
fputc('0',fp);
}
tmp = tmp << 1 ;
}
fprintf(fp,"\n");
//printf("\n") ;
}
fclose(fp);
return 0;
}
void str_to_bin_save_test()
{
char str[] = "Welcome to FPGA";
// char str[100];
// printf("please input:\n");
/* scanf()函数在读取字符串时以空格为分隔,
遇到空格就认为当前字符串结束了,
所以无法读取含有空格的字符串。*/
//scanf("%s",&str);
/* gets()函数认为空格也是字符串的一部分,只有遇到回车键时才认为字符串输入结束,
所以,不管输入了多少个空格,只要不按下回车键,对 gets() 来说就是一个完整的字符串。
换句话说,gets() 用来读取一整行字符串。*/
//gets(str);
str_to_bin_save(str);
}
int main()
{
str_to_bin_save_test();
return 0;
}
我们可以通过结构体来存储学生信息,文件保存使用二进制文件,计算总分和平均分时可以利用结构体中的信息。下面是示例代码:
#include <stdio.h>
#include <string.h>
#define STUDENT_NUM 6
/* 学生信息结构体 */
struct StudentInfo {
char num[10]; /* 学号 */
char name[20]; /* 姓名 */
char major[30]; /* 专业 */
char gender[10]; /* 性别 */
char class[20]; /* 班级 */
int year; /* 出生年份 */
int month; /* 出生月份 */
int day; /* 出生日期 */
int score1; /* 成绩1 */
int score2; /* 成绩2 */
};
/* 给学生信息结构体赋值 */
void SetStudentInfo(struct StudentInfo *info)
{
printf("请输入学号:");
scanf("%s", info->num);
printf("请输入姓名:");
scanf("%s", info->name);
printf("请输入专业:");
scanf("%s", info->major);
printf("请输入性别:");
scanf("%s", info->gender);
printf("请输入班级:");
scanf("%s", info->class);
printf("请输入出生年月日,格式如下:\n");
printf("年份:");
scanf("%d", &(info->year));
printf("月份:");
scanf("%d", &(info->month));
printf("日期:");
scanf("%d", &(info->day));
printf("请输入成绩1:");
scanf("%d", &(info->score1));
printf("请输入成绩2:");
scanf("%d", &(info->score2));
}
/* 计算某个学生的总分 */
int GetTotalScore(const struct StudentInfo *info)
{
return info->score1 + info->score2;
}
/* 计算某个学生的平均分 */
float GetAverageScore(const struct StudentInfo *info)
{
return (float)GetTotalScore(info) / 2;
}
/* 保存所有学生信息到文件 */
void SaveStudentInfoToFile(const struct StudentInfo *student, const char *file_path)
{
FILE *fp = fopen(file_path, "wb");
if (fp == NULL) {
printf("文件打开失败!\n");
return;
}
int i;
for (i = 0; i < STUDENT_NUM; i++) {
fwrite(&student[i], sizeof(struct StudentInfo), 1, fp);
}
fclose(fp);
}
int main()
{
struct StudentInfo student[STUDENT_NUM];
int i;
for (i = 0; i < STUDENT_NUM; i++) {
int index = i + 1;
printf("请输入第%d位学生的信息:\n", index);
SetStudentInfo(&student[i]);
}
SaveStudentInfoToFile(student, "student.dat");
for (i = 0; i < STUDENT_NUM; i++) {
int index = i + 1;
printf("学生%d的总分为%d,平均分为%.1f\n",
index, GetTotalScore(&student[i]), GetAverageScore(&student[i]));
}
return 0;
}
在运行程序时,需要依次输入每位学生的信息。例如:
请输入第1位学生的信息:
请输入学号:1001
请输入姓名:张三
请输入专业:计算机
请输入性别:男
请输入班级:1001
请输入出生年月日,格式如下:
年份:1999
月份:4
日期:20
请输入成绩1:80
请输入成绩2:90
请输入第2位学生的信息:
请输入学号:1002
请输入姓名:李四
请输入专业:网络工程
请输入性别:女
请输入班级:1002
请输入出生年月日,格式如下:
年份:2000
月份:5
日期:12
请输入成绩1:85
请输入成绩2:90
...
程序运行结束后,会在当前目录下生成一个 student.dat
的文件,其中保存了所有学生的信息。
同时,程序还会计算每个学生的总分和平均分,并输出到屏幕上。例如:
学生1的总分为170,平均分为85.0
学生2的总分为175,平均分为87.5
学生3的总分为170,平均分为85.0
学生4的总分为165,平均分为82.5
学生5的总分为160,平均分为80.0
学生6的总分为170,平均分为85.0